Raffael-Kultyshev commited on
Commit
1985afa
·
1 Parent(s): a3c5d38

Add Gradio visualizer with pipeline data

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
.gitattributes CHANGED
@@ -33,3 +33,6 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ *.png filter=lfs diff=lfs merge=lfs -text
37
+ *.jpg filter=lfs diff=lfs merge=lfs -text
38
+ *.json filter=lfs diff=lfs merge=lfs -text
app.py ADDED
@@ -0,0 +1,267 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Dynamic Intelligence - Human Demo Visualizer
3
+ Egocentric hand tracking dataset visualizer for robot training data
4
+ """
5
+
6
+ import gradio as gr
7
+ import json
8
+ import os
9
+ from pathlib import Path
10
+
11
+ # Load pipeline data
12
+ DATA_DIR = Path(__file__).parent / "data"
13
+
14
+ def load_json_safe(path):
15
+ try:
16
+ with open(path, 'r') as f:
17
+ return json.load(f)
18
+ except:
19
+ return {}
20
+
21
+ # Load data
22
+ metadata = load_json_safe(DATA_DIR / "metadata.json")
23
+ end_effector = load_json_safe(DATA_DIR / "end_effector.json")
24
+ actions = load_json_safe(DATA_DIR / "actions.json")
25
+ hands_2d = load_json_safe(DATA_DIR / "hands_2d.json")
26
+
27
+ # Stats
28
+ total_frames = len(metadata.get('poses', []))
29
+ fps = metadata.get('fps', 60)
30
+ hand_detection_rate = len(hands_2d) / max(1, total_frames) * 100
31
+ left_poses = sum(1 for f in end_effector.values() if f.get('left_hand'))
32
+ right_poses = sum(1 for f in end_effector.values() if f.get('right_hand'))
33
+
34
+ def get_frame_info(frame_idx):
35
+ """Get info for a specific frame."""
36
+ frame_key = str(frame_idx)
37
+
38
+ # Hand detection status
39
+ hand_data = hands_2d.get(frame_key, {})
40
+ left_detected = hand_data.get('left_hand') is not None
41
+ right_detected = hand_data.get('right_hand') is not None
42
+
43
+ # End effector pose
44
+ ee_data = end_effector.get(frame_key, {})
45
+ left_pose = ee_data.get('left_hand', {}).get('pose_6dof', None)
46
+ right_pose = ee_data.get('right_hand', {}).get('pose_6dof', None)
47
+
48
+ # Action
49
+ action_data = actions.get(frame_key, {})
50
+ left_action = action_data.get('left_hand_action', None)
51
+ camera_action = action_data.get('camera_action', None)
52
+
53
+ # Format output
54
+ info = f"""### Frame {frame_idx} / {total_frames - 1}
55
+ **Time:** {frame_idx / fps:.2f}s
56
+
57
+ ---
58
+
59
+ #### 🖐️ Hand Detection
60
+ - **Left Hand:** {'✅ Detected' if left_detected else '❌ Not Detected'}
61
+ - **Right Hand:** {'✅ Detected' if right_detected else '❌ Not Detected'}
62
+
63
+ ---
64
+
65
+ #### 📍 End-Effector Pose (6DoF)
66
+ """
67
+
68
+ if left_pose:
69
+ info += f"""
70
+ **Left Hand:**
71
+ - Position: X={left_pose[0]*100:.1f}cm, Y={left_pose[1]*100:.1f}cm, Z={left_pose[2]*100:.1f}cm
72
+ - Rotation: Roll={left_pose[3]*57.3:.1f}°, Pitch={left_pose[4]*57.3:.1f}°, Yaw={left_pose[5]*57.3:.1f}°
73
+ """
74
+ else:
75
+ info += "\n**Left Hand:** No pose available\n"
76
+
77
+ if right_pose:
78
+ info += f"""
79
+ **Right Hand:**
80
+ - Position: X={right_pose[0]*100:.1f}cm, Y={right_pose[1]*100:.1f}cm, Z={right_pose[2]*100:.1f}cm
81
+ - Rotation: Roll={right_pose[3]*57.3:.1f}°, Pitch={right_pose[4]*57.3:.1f}°, Yaw={right_pose[5]*57.3:.1f}°
82
+ """
83
+
84
+ info += "\n---\n\n#### 🎯 Actions (Delta per frame)\n"
85
+
86
+ if left_action:
87
+ mag = (left_action[0]**2 + left_action[1]**2 + left_action[2]**2)**0.5 * 100
88
+ info += f"**Left Hand Movement:** {mag:.2f} cm\n"
89
+
90
+ if camera_action:
91
+ cam_mag = (camera_action[0]**2 + camera_action[1]**2 + camera_action[2]**2)**0.5 * 100
92
+ info += f"**Camera Movement:** {cam_mag:.2f} cm\n"
93
+
94
+ return info
95
+
96
+ def get_frame_image(frame_idx):
97
+ """Get RGB frame image path."""
98
+ frame_path = DATA_DIR / "frames" / f"{frame_idx}.jpg"
99
+ if frame_path.exists():
100
+ return str(frame_path)
101
+ return None
102
+
103
+ def update_display(frame_idx):
104
+ """Update frame display."""
105
+ img = get_frame_image(int(frame_idx))
106
+ info = get_frame_info(int(frame_idx))
107
+ return img, info
108
+
109
+ # Build Gradio Interface
110
+ with gr.Blocks(
111
+ title="DI Human Demo Visualizer",
112
+ theme=gr.themes.Soft(
113
+ primary_hue="cyan",
114
+ secondary_hue="purple",
115
+ ),
116
+ css="""
117
+ .header { text-align: center; margin-bottom: 20px; }
118
+ .stat-box {
119
+ background: linear-gradient(135deg, #1a1a2e, #16213e);
120
+ padding: 20px;
121
+ border-radius: 12px;
122
+ text-align: center;
123
+ color: white;
124
+ }
125
+ .stat-value { font-size: 32px; font-weight: bold; color: #00d4ff; }
126
+ .stat-label { font-size: 14px; color: #888; }
127
+ """
128
+ ) as demo:
129
+
130
+ # Header
131
+ gr.Markdown("""
132
+ # 🤖 Dynamic Intelligence - Human Demo Visualizer
133
+
134
+ **Egocentric hand tracking dataset for humanoid robot training**
135
+
136
+ This visualizer shows the processed output of our LiDAR-based hand tracking pipeline:
137
+ - RGB video from iPhone LiDAR camera
138
+ - 21 hand joints tracked via MediaPipe
139
+ - 6DoF end-effector pose computed from 3 key joints
140
+ - Actions (delta movements) for robot learning
141
+ """)
142
+
143
+ # Stats row
144
+ with gr.Row():
145
+ with gr.Column(scale=1):
146
+ gr.Markdown(f"""
147
+ <div class="stat-box">
148
+ <div class="stat-value">{total_frames}</div>
149
+ <div class="stat-label">Total Frames</div>
150
+ </div>
151
+ """)
152
+ with gr.Column(scale=1):
153
+ gr.Markdown(f"""
154
+ <div class="stat-box">
155
+ <div class="stat-value">{hand_detection_rate:.1f}%</div>
156
+ <div class="stat-label">Hand Detection Rate</div>
157
+ </div>
158
+ """)
159
+ with gr.Column(scale=1):
160
+ gr.Markdown(f"""
161
+ <div class="stat-box">
162
+ <div class="stat-value">{left_poses}</div>
163
+ <div class="stat-label">Left Hand Poses</div>
164
+ </div>
165
+ """)
166
+ with gr.Column(scale=1):
167
+ gr.Markdown(f"""
168
+ <div class="stat-box">
169
+ <div class="stat-value">{fps}</div>
170
+ <div class="stat-label">FPS</div>
171
+ </div>
172
+ """)
173
+
174
+ gr.Markdown("---")
175
+
176
+ # Main content
177
+ with gr.Row():
178
+ # Left: Video frame
179
+ with gr.Column(scale=2):
180
+ gr.Markdown("### 📹 RGB Frame")
181
+ frame_image = gr.Image(
182
+ label="Frame",
183
+ type="filepath",
184
+ height=400
185
+ )
186
+ frame_slider = gr.Slider(
187
+ minimum=0,
188
+ maximum=total_frames - 1,
189
+ step=1,
190
+ value=0,
191
+ label="Frame",
192
+ info="Drag to scrub through video"
193
+ )
194
+
195
+ # Right: Frame info
196
+ with gr.Column(scale=1):
197
+ frame_info = gr.Markdown(get_frame_info(0))
198
+
199
+ gr.Markdown("---")
200
+
201
+ # Plots
202
+ gr.Markdown("### 📊 Validation Plots")
203
+
204
+ with gr.Row():
205
+ gr.Image(
206
+ value=str(DATA_DIR / "plots" / "camera_trajectory.png"),
207
+ label="Camera Trajectory (World Frame)",
208
+ height=300
209
+ )
210
+ gr.Image(
211
+ value=str(DATA_DIR / "plots" / "left_hand_trajectory.png"),
212
+ label="Left Hand Trajectory (Camera Frame)",
213
+ height=300
214
+ )
215
+
216
+ with gr.Row():
217
+ gr.Image(
218
+ value=str(DATA_DIR / "plots" / "hand_pose_vs_time.png"),
219
+ label="Hand 6DoF Pose vs Time",
220
+ height=300
221
+ )
222
+ gr.Image(
223
+ value=str(DATA_DIR / "plots" / "actions_histogram.png"),
224
+ label="Actions Distribution",
225
+ height=300
226
+ )
227
+
228
+ # Physics validation
229
+ gr.Markdown("""
230
+ ---
231
+
232
+ ### ✅ Physics Validation Results
233
+
234
+ | Check | Status | Details |
235
+ |-------|--------|---------|
236
+ | Camera Trajectory | ✅ PASS | Smooth movement, ~40cm total range |
237
+ | Hand Depth Range | ✅ PASS | 15-60cm from camera (realistic) |
238
+ | Action Magnitudes | ✅ PASS | Median 0.34cm/frame (no tracking errors) |
239
+ | Outlier Detection | ✅ PASS | No large jumps detected |
240
+ | 6DoF Rotations | ✅ PASS | Natural hand movement patterns |
241
+
242
+ ---
243
+
244
+ ### 📋 Dataset Info
245
+
246
+ - **Source:** iPhone 12 Pro+ LiDAR camera (Record3D app)
247
+ - **Pipeline:** MediaPipe hand tracking → Depth lookup → 6DoF computation
248
+ - **Format:** Compatible with Physical Intelligence / LeRobot training
249
+ - **Organization:** [Dynamic Intelligence](https://huggingface.co/DynamicIntelligence)
250
+ """)
251
+
252
+ # Event handler
253
+ frame_slider.change(
254
+ fn=update_display,
255
+ inputs=[frame_slider],
256
+ outputs=[frame_image, frame_info]
257
+ )
258
+
259
+ # Initialize
260
+ demo.load(
261
+ fn=lambda: update_display(0),
262
+ outputs=[frame_image, frame_info]
263
+ )
264
+
265
+ if __name__ == "__main__":
266
+ demo.launch()
267
+
data/actions.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:69aa1206d44f13f794e5cb9f9099a1f32b4e6d95490a7e0be58a9826ce3f8b1b
3
+ size 534384
data/end_effector.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:efdca95bf448637843f7b1bc756de9ecaa76a1d8f92fe5e284112d34a60995f9
3
+ size 505857
data/frames/0.jpg ADDED

Git LFS Details

  • SHA256: cf68df32583bba02c5e9d7334165b3ef170b9ca7b6212a4ea223d2a737a3719e
  • Pointer size: 130 Bytes
  • Size of remote file: 35.4 kB
data/frames/10.jpg ADDED

Git LFS Details

  • SHA256: 07051b7828cf60401a6d6db0427851d05cfe914ba6f06f09e700e12d3d56859b
  • Pointer size: 130 Bytes
  • Size of remote file: 35.6 kB
data/frames/100.jpg ADDED

Git LFS Details

  • SHA256: 2b0e88aadd1e28e4c5b6b6cc6ff56a908511cb903ff01524ae96800b140e00e7
  • Pointer size: 130 Bytes
  • Size of remote file: 34.2 kB
data/frames/1000.jpg ADDED

Git LFS Details

  • SHA256: 2e3c2408e2d6540f320fab83aac12d2286379a849c54e4fbb46ccb3983e9a212
  • Pointer size: 130 Bytes
  • Size of remote file: 38 kB
data/frames/1010.jpg ADDED

Git LFS Details

  • SHA256: 65d25ec38c40f4822e4115b166a5f0333c602a7c9dfb2a6979608e517a8b040b
  • Pointer size: 130 Bytes
  • Size of remote file: 38.8 kB
data/frames/1020.jpg ADDED

Git LFS Details

  • SHA256: a67ea38ecbad71243475ba1d1b390d5c3bc3bc2ebf8a547e5411e96ffc318fbf
  • Pointer size: 130 Bytes
  • Size of remote file: 39.1 kB
data/frames/1030.jpg ADDED

Git LFS Details

  • SHA256: e27a825e4252155057cb725947366f9a1e483b5e91bf232fd5e0d3b331df438d
  • Pointer size: 130 Bytes
  • Size of remote file: 39.4 kB
data/frames/1040.jpg ADDED

Git LFS Details

  • SHA256: c8a93399cd306c7b8afce6b3e68bab1c0661526c890dc48cac7b98fd27b6e8c5
  • Pointer size: 130 Bytes
  • Size of remote file: 38.6 kB
data/frames/1050.jpg ADDED

Git LFS Details

  • SHA256: f4ab1754b7f4db1e7a7bb01ed8c448847d8b93892e2a8061dfff3981f52068d7
  • Pointer size: 130 Bytes
  • Size of remote file: 37.9 kB
data/frames/1060.jpg ADDED

Git LFS Details

  • SHA256: 7f01a25bbcafce6a64e50fd154a4c49f9f4d077f104d32991bf2119991edfae2
  • Pointer size: 130 Bytes
  • Size of remote file: 37.9 kB
data/frames/1070.jpg ADDED

Git LFS Details

  • SHA256: 00705c5c90d32ca2d625402a642972b922f8d91af6b744dd90d8d9d978bb2c54
  • Pointer size: 130 Bytes
  • Size of remote file: 37.9 kB
data/frames/110.jpg ADDED

Git LFS Details

  • SHA256: 4900f776d281448734eff83b44f451c58b2a85f25e32c06ae40ca6da055a69fc
  • Pointer size: 130 Bytes
  • Size of remote file: 35.3 kB
data/frames/120.jpg ADDED

Git LFS Details

  • SHA256: b7b28589bdf3f22fa41a5aed0eee855bd13d2bb5dd9b07b3d502d9e40780ff72
  • Pointer size: 130 Bytes
  • Size of remote file: 36.1 kB
data/frames/130.jpg ADDED

Git LFS Details

  • SHA256: b3df5169feef66ed10a69b0dc090f4fa8cf9b7e032a898132cd6af162284935b
  • Pointer size: 130 Bytes
  • Size of remote file: 35.9 kB
data/frames/140.jpg ADDED

Git LFS Details

  • SHA256: 32ddfefbc36ef048dd8389f314bc63a85c9f5647511657b1eeb38c9488e2a297
  • Pointer size: 130 Bytes
  • Size of remote file: 35.9 kB
data/frames/150.jpg ADDED

Git LFS Details

  • SHA256: 98fa4bff07de0b8a14acce3d1fbb30834c81f43319656eb2fa93c5eb4b6bb0c2
  • Pointer size: 130 Bytes
  • Size of remote file: 35.9 kB
data/frames/160.jpg ADDED

Git LFS Details

  • SHA256: 1c21e5337c59fa4dde1ef544fbf9db2fb7f020ee7abdfd66b05d460d7885d383
  • Pointer size: 130 Bytes
  • Size of remote file: 35.6 kB
data/frames/170.jpg ADDED

Git LFS Details

  • SHA256: b963220ff035622e0dbc8b36caac204bdec6c4f701fd2bd17a2bf7b03ff4a2ef
  • Pointer size: 130 Bytes
  • Size of remote file: 35.7 kB
data/frames/180.jpg ADDED

Git LFS Details

  • SHA256: 77f852a0bb40f1137b57f5952d2ee87795f8a5bebc898c19f2d29453308066e7
  • Pointer size: 130 Bytes
  • Size of remote file: 36.4 kB
data/frames/190.jpg ADDED

Git LFS Details

  • SHA256: 23ea62d1cff6117356a6050bd7f740fa856c4e90a12e6dff30df269be13f80a7
  • Pointer size: 130 Bytes
  • Size of remote file: 36.7 kB
data/frames/20.jpg ADDED

Git LFS Details

  • SHA256: 9841d8673adde8d0323bbb7bbf95b06752e68cf98d23a40df3cd4787e36b027f
  • Pointer size: 130 Bytes
  • Size of remote file: 35.7 kB
data/frames/200.jpg ADDED

Git LFS Details

  • SHA256: 9c023952803ed6de8a6b73f47ff696b5f2db3757e0c1f98c8a7f15db297b4a6d
  • Pointer size: 130 Bytes
  • Size of remote file: 37.5 kB
data/frames/210.jpg ADDED

Git LFS Details

  • SHA256: 095c2975bc1fbcf5730ff4d28dd7a3ecbe057fd192cb2fcf7458fec5c55a92e9
  • Pointer size: 130 Bytes
  • Size of remote file: 38.5 kB
data/frames/220.jpg ADDED

Git LFS Details

  • SHA256: 2dab168f3df90cbac7c3046c315fc0916cea33fdbc5a1a72f465a2aaf6f016c6
  • Pointer size: 130 Bytes
  • Size of remote file: 37.5 kB
data/frames/230.jpg ADDED

Git LFS Details

  • SHA256: d4b838891052a1b9220b3933eb89359d474d86487dc255b5762dde7f27b00e18
  • Pointer size: 130 Bytes
  • Size of remote file: 38.3 kB
data/frames/240.jpg ADDED

Git LFS Details

  • SHA256: 16d73398723c6d09dd77439c9a3fec73764057de16ce33c057ceece695f51650
  • Pointer size: 130 Bytes
  • Size of remote file: 38.4 kB
data/frames/250.jpg ADDED

Git LFS Details

  • SHA256: 73b03c254d4fd5b6ad039b30f63b14e734b0d5ebea299a8f024bb7dd6c842688
  • Pointer size: 130 Bytes
  • Size of remote file: 38 kB
data/frames/260.jpg ADDED

Git LFS Details

  • SHA256: 3a135259915671351c3cec2a0899cbb1b6663a8ad8a3420720825c8f1a3bdf7b
  • Pointer size: 130 Bytes
  • Size of remote file: 36.8 kB
data/frames/270.jpg ADDED

Git LFS Details

  • SHA256: 748e09fa8b449a05a696578be6a6454a7605cce8bd4f0dfb3e87cd3072492377
  • Pointer size: 130 Bytes
  • Size of remote file: 37.1 kB
data/frames/280.jpg ADDED

Git LFS Details

  • SHA256: 354a81cefbb5050e2d40c047396942d04d3ef1c0dd693e955c2c05449f64a21c
  • Pointer size: 130 Bytes
  • Size of remote file: 36.4 kB
data/frames/290.jpg ADDED

Git LFS Details

  • SHA256: 48f4d9bdb60b4fe19aa19892e36741a08aa3719073fd7e1f2e49e7490d0f9b6b
  • Pointer size: 130 Bytes
  • Size of remote file: 35.7 kB
data/frames/30.jpg ADDED

Git LFS Details

  • SHA256: ec9803857842d8bdeafb8f4a372dd5246d06a4acb793e81be8cf9cb584d8c626
  • Pointer size: 130 Bytes
  • Size of remote file: 35.8 kB
data/frames/300.jpg ADDED

Git LFS Details

  • SHA256: 00271b04da49575f4edb49d2f3a8b6ba619037d67babbea95d667acf9e862a51
  • Pointer size: 130 Bytes
  • Size of remote file: 35.6 kB
data/frames/310.jpg ADDED

Git LFS Details

  • SHA256: f0a801f32fe23f6241e0bdc2a47e3e140ccc10c5111dedba26a030b40126b296
  • Pointer size: 130 Bytes
  • Size of remote file: 34.7 kB
data/frames/320.jpg ADDED

Git LFS Details

  • SHA256: 55f01e57cb63ab6e7d03fb1b6058db5f73957580205378d80aee239bb0138b6e
  • Pointer size: 130 Bytes
  • Size of remote file: 33.9 kB
data/frames/330.jpg ADDED

Git LFS Details

  • SHA256: 4afa83e69b9a237efd35217386c3df63d6d157e2613fa1a0eeac70498508c48d
  • Pointer size: 130 Bytes
  • Size of remote file: 33.8 kB
data/frames/340.jpg ADDED

Git LFS Details

  • SHA256: c7d7e975e24b86a9e70672a85ee6650c8a1dc9d496a3928ea4e1253e6c929017
  • Pointer size: 130 Bytes
  • Size of remote file: 32 kB
data/frames/350.jpg ADDED

Git LFS Details

  • SHA256: 677e80ee06247ead2b889a2c1011dc9fb69a96283d3e74c03c6ab4990a294b83
  • Pointer size: 130 Bytes
  • Size of remote file: 32.1 kB
data/frames/360.jpg ADDED

Git LFS Details

  • SHA256: e54f8f1e09330a2c38523280eda9f5113d92596063ca6389951b337c37e8dfcf
  • Pointer size: 130 Bytes
  • Size of remote file: 30.6 kB
data/frames/370.jpg ADDED

Git LFS Details

  • SHA256: 97969bc2def2eaf153bd8a3bcfe683d664cbe68d1161fbc396aa153cfa586018
  • Pointer size: 130 Bytes
  • Size of remote file: 30.6 kB
data/frames/380.jpg ADDED

Git LFS Details

  • SHA256: de2fbaab2906fd70ccb8e3e934479a70087b5d6abe66996d3397b1d5a69392fa
  • Pointer size: 130 Bytes
  • Size of remote file: 30.9 kB
data/frames/390.jpg ADDED

Git LFS Details

  • SHA256: 5d13f0beab4fb78eab701ea99271fe7106a8f439330fbea1617d54df87f2e6a3
  • Pointer size: 130 Bytes
  • Size of remote file: 31.9 kB
data/frames/40.jpg ADDED

Git LFS Details

  • SHA256: 9d10c3883c9c079c7d65acbe53fb2acc9f5dd7ce58f4190f8737f200af374fea
  • Pointer size: 130 Bytes
  • Size of remote file: 35.3 kB
data/frames/400.jpg ADDED

Git LFS Details

  • SHA256: 20326c6191ee99622ff765a16b9166db0fae5c362518c781681492fd36f4e016
  • Pointer size: 130 Bytes
  • Size of remote file: 33.4 kB
data/frames/410.jpg ADDED

Git LFS Details

  • SHA256: cfc023d9c763e3d62593148b9941a70ee8db8c8ffaa4b4208e20b4bb0798172e
  • Pointer size: 130 Bytes
  • Size of remote file: 35.5 kB
data/frames/420.jpg ADDED

Git LFS Details

  • SHA256: 940b1c18bfc7123853b2b622ddcea4939df91a177bc74b2950db54ebf00e45b3
  • Pointer size: 130 Bytes
  • Size of remote file: 36.6 kB