mzhu22 commited on
Commit
6c74986
·
1 Parent(s): 81d0ba5
This view is limited to 50 files because it contains too many changes.   See raw diff
.gitattributes CHANGED
@@ -33,3 +33,4 @@ 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
+ assets/* filter=lfs diff=lfs merge=lfs -text
.python-version ADDED
@@ -0,0 +1 @@
 
 
1
+ 3.10
README.md CHANGED
@@ -1,8 +1,8 @@
1
  ---
2
  title: Bouncing Target Reference
3
- emoji: 📉
4
- colorFrom: pink
5
- colorTo: green
6
  sdk: gradio
7
  sdk_version: 5.36.2
8
  app_file: app.py
 
1
  ---
2
  title: Bouncing Target Reference
3
+ emoji: 🏃
4
+ colorFrom: blue
5
+ colorTo: indigo
6
  sdk: gradio
7
  sdk_version: 5.36.2
8
  app_file: app.py
app-download-image.py ADDED
@@ -0,0 +1,256 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import random
2
+ from pathlib import Path
3
+
4
+ import cv2
5
+ import gradio as gr
6
+ import numpy as np
7
+ import SimpleITK
8
+ from huggingface_hub import hf_hub_download, list_repo_files
9
+
10
+ IMAGES_REPO = "LMUK-RADONC-PHYS-RES/TrackRAD2025"
11
+ DATASET_REPO_TYPE = "dataset"
12
+ LABELED_FOLDER = "trackrad2025_labeled_training_data"
13
+
14
+ OUT_DIR = Path("tmp/videos")
15
+
16
+
17
+ def get_images() -> list[str]:
18
+ images_repo_files = list_repo_files(
19
+ repo_id=IMAGES_REPO,
20
+ repo_type=DATASET_REPO_TYPE,
21
+ )
22
+ image_files = [
23
+ fname
24
+ for fname in images_repo_files
25
+ if fname.startswith(LABELED_FOLDER) and fname.endswith("frames.mha")
26
+ ]
27
+ return image_files
28
+
29
+
30
+ def download_image_files(image_file: str) -> dict[str, str]:
31
+ filename = image_file.split("/")[-1]
32
+ patient = filename.rsplit("_", 1)[0] # e.g., "A_033_frames.mha" -> "A_033"
33
+ frames_idx = ""
34
+ frames_file = hf_hub_download(
35
+ repo_id=IMAGES_REPO,
36
+ repo_type=DATASET_REPO_TYPE,
37
+ filename=f"{LABELED_FOLDER}/{patient}/images/{patient}_frames{frames_idx}.mha",
38
+ )
39
+ labels_file = hf_hub_download(
40
+ repo_id=IMAGES_REPO,
41
+ repo_type=DATASET_REPO_TYPE,
42
+ filename=f"{LABELED_FOLDER}/{patient}/targets/{patient}_labels{frames_idx}.mha",
43
+ )
44
+ field_strength_file = hf_hub_download(
45
+ repo_id=IMAGES_REPO,
46
+ repo_type=DATASET_REPO_TYPE,
47
+ filename=f"{LABELED_FOLDER}/{patient}/b-field-strength.json",
48
+ )
49
+ scanned_region_file = hf_hub_download(
50
+ repo_id=IMAGES_REPO,
51
+ repo_type=DATASET_REPO_TYPE,
52
+ filename=f"{LABELED_FOLDER}/{patient}/scanned-region{frames_idx}.json",
53
+ )
54
+ frame_rate_file = hf_hub_download(
55
+ repo_id=IMAGES_REPO,
56
+ repo_type=DATASET_REPO_TYPE,
57
+ filename=f"{LABELED_FOLDER}/{patient}/frame-rate{frames_idx}.json",
58
+ )
59
+ return {
60
+ "frames_file": frames_file,
61
+ "labels_file": labels_file,
62
+ "field_strength_file": field_strength_file,
63
+ "scanned_region_file": scanned_region_file,
64
+ "frame_rate_file": frame_rate_file,
65
+ }
66
+
67
+
68
+ def overlay_labels_on_frames(
69
+ frames_array, labels_array, overlay_color="green", alpha=0.2
70
+ ):
71
+ """
72
+ Overlay binary labels on grayscale frames with a bright color.
73
+
74
+ Parameters:
75
+ -----------
76
+ frames_array : numpy.ndarray
77
+ Grayscale image sequence of shape [X, Y, T]
78
+ labels_array : numpy.ndarray
79
+ Binary labels of shape [X, Y, T]
80
+ overlay_color : str or tuple
81
+ Color for the overlay ('red', 'green', 'blue', 'yellow', 'cyan', 'magenta')
82
+ or RGB tuple (r, g, b) with values 0-1
83
+ alpha : float
84
+ Transparency of the overlay (0=transparent, 1=opaque)
85
+
86
+ Returns:
87
+ --------
88
+ overlaid_frames : numpy.ndarray
89
+ RGB frames with labels overlaid, shape [X, Y, T, 3]
90
+ """
91
+
92
+ # Normalize frames to 0-1 range if not already
93
+ frames_norm = frames_array.astype(np.float32)
94
+ if frames_norm.max() > 1.0:
95
+ frames_norm = frames_norm / frames_norm.max()
96
+
97
+ # Convert grayscale to RGB by repeating across 3 channels
98
+ rgb_frames = np.stack([frames_norm] * 3, axis=-1) # Shape: [X, Y, T, 3]
99
+
100
+ # Define color mapping
101
+ color_map = {
102
+ "red": (1.0, 0.0, 0.0),
103
+ "green": (0.0, 1.0, 0.0),
104
+ "blue": (0.0, 0.0, 1.0),
105
+ "yellow": (1.0, 1.0, 0.0),
106
+ "cyan": (0.0, 1.0, 1.0),
107
+ "magenta": (1.0, 0.0, 1.0),
108
+ }
109
+
110
+ if overlay_color in color_map:
111
+ r, g, b = color_map[overlay_color]
112
+ else:
113
+ raise ValueError(
114
+ f"Unknown color '{overlay_color}'. Use: {list(color_map.keys())} or RGB tuple"
115
+ )
116
+
117
+ # Create the overlaid frames
118
+ overlaid_frames = rgb_frames.copy()
119
+
120
+ # Apply overlay where labels are True (assuming binary labels are 0/1 or False/True)
121
+ mask = labels_array.astype(bool)
122
+
123
+ # Blend the colors using alpha blending
124
+ overlaid_frames[mask, 0] = (1 - alpha) * rgb_frames[mask, 0] + alpha * r
125
+ overlaid_frames[mask, 1] = (1 - alpha) * rgb_frames[mask, 1] + alpha * g
126
+ overlaid_frames[mask, 2] = (1 - alpha) * rgb_frames[mask, 2] + alpha * b
127
+
128
+ return overlaid_frames
129
+
130
+
131
+ def overlay_video(files: dict[str, str]):
132
+ frames = SimpleITK.ReadImage(files["frames_file"])
133
+ frames_array = SimpleITK.GetArrayFromImage(frames)
134
+ # frames_array = [X,Y,T]
135
+ frames_array = np.flip(frames_array, axis=0)
136
+
137
+ labels = SimpleITK.ReadImage(files["labels_file"])
138
+ labels_array = SimpleITK.GetArrayFromImage(labels)
139
+ # labels_array = [X,Y,T]
140
+ labels_array = np.flip(labels_array, axis=0)
141
+
142
+ overlaid_array = overlay_labels_on_frames(frames_array, labels_array)
143
+ output_path = numpy_to_video_opencv(overlaid_array, "tmp_video", fps=8)
144
+ return output_path
145
+
146
+
147
+ def numpy_to_video_opencv(array: np.ndarray, output_prefix: str, fps: int) -> str:
148
+ limit = 10 * fps
149
+ array_clip = array[:, :, :limit] # 10s of video
150
+ p99: float = np.percentile(array_clip, 99) # type: ignore
151
+ array_clip_normalized = cv2.convertScaleAbs(array_clip, alpha=(255.0 / p99))
152
+
153
+ OUT_DIR.mkdir(parents=True, exist_ok=True)
154
+ output_path = str((OUT_DIR / output_prefix).with_suffix(".webm"))
155
+
156
+ # Define codec and create VideoWriter
157
+ # VP90 is supported by browsers and is available in the pip-installed opencv
158
+ fourcc = cv2.VideoWriter.fourcc(*"VP90")
159
+ X, Y, T, _ = array_clip.shape
160
+ bgr_frames = array_clip_normalized[:, :, :, [2, 1, 0]]
161
+ out = cv2.VideoWriter(output_path, fourcc, fps, (X, Y))
162
+ # Write frames
163
+ for t in range(T):
164
+ frame = bgr_frames[:, :, t, :]
165
+ # OpenCV expects frames in BGR format, but for grayscale we can use as-is
166
+ out.write(frame)
167
+
168
+ out.release()
169
+ return output_path
170
+
171
+
172
+ choices = [
173
+ "trackrad2025_labeled_training_data/A_001/images/A_001_frames.mha",
174
+ "trackrad2025_labeled_training_data/A_003/images/A_003_frames.mha",
175
+ "trackrad2025_labeled_training_data/A_004/images/A_004_frames.mha",
176
+ "trackrad2025_labeled_training_data/A_005/images/A_005_frames.mha",
177
+ "trackrad2025_labeled_training_data/A_006/images/A_006_frames.mha",
178
+ "trackrad2025_labeled_training_data/A_007/images/A_007_frames.mha",
179
+ "trackrad2025_labeled_training_data/A_008/images/A_008_frames.mha",
180
+ "trackrad2025_labeled_training_data/A_010/images/A_010_frames.mha",
181
+ "trackrad2025_labeled_training_data/A_011/images/A_011_frames.mha",
182
+ "trackrad2025_labeled_training_data/A_012/images/A_012_frames.mha",
183
+ "trackrad2025_labeled_training_data/A_013/images/A_013_frames.mha",
184
+ "trackrad2025_labeled_training_data/A_014/images/A_014_frames.mha",
185
+ "trackrad2025_labeled_training_data/A_016/images/A_016_frames.mha",
186
+ "trackrad2025_labeled_training_data/A_019/images/A_019_frames.mha",
187
+ "trackrad2025_labeled_training_data/A_020/images/A_020_frames.mha",
188
+ "trackrad2025_labeled_training_data/A_021/images/A_021_frames.mha",
189
+ "trackrad2025_labeled_training_data/A_022/images/A_022_frames.mha",
190
+ "trackrad2025_labeled_training_data/A_023/images/A_023_frames.mha",
191
+ "trackrad2025_labeled_training_data/A_024/images/A_024_frames.mha",
192
+ "trackrad2025_labeled_training_data/A_025/images/A_025_frames.mha",
193
+ "trackrad2025_labeled_training_data/A_026/images/A_026_frames.mha",
194
+ "trackrad2025_labeled_training_data/A_027/images/A_027_frames.mha",
195
+ "trackrad2025_labeled_training_data/A_028/images/A_028_frames.mha",
196
+ "trackrad2025_labeled_training_data/A_029/images/A_029_frames.mha",
197
+ "trackrad2025_labeled_training_data/A_032/images/A_032_frames.mha",
198
+ "trackrad2025_labeled_training_data/B_002/images/B_002_frames.mha",
199
+ "trackrad2025_labeled_training_data/B_003/images/B_003_frames.mha",
200
+ "trackrad2025_labeled_training_data/B_006/images/B_006_frames.mha",
201
+ "trackrad2025_labeled_training_data/B_007/images/B_007_frames.mha",
202
+ "trackrad2025_labeled_training_data/B_008/images/B_008_frames.mha",
203
+ "trackrad2025_labeled_training_data/B_010/images/B_010_frames.mha",
204
+ "trackrad2025_labeled_training_data/B_012/images/B_012_frames.mha",
205
+ "trackrad2025_labeled_training_data/B_017/images/B_017_frames.mha",
206
+ "trackrad2025_labeled_training_data/B_019/images/B_019_frames.mha",
207
+ "trackrad2025_labeled_training_data/B_021/images/B_021_frames.mha",
208
+ "trackrad2025_labeled_training_data/B_022/images/B_022_frames.mha",
209
+ "trackrad2025_labeled_training_data/B_023/images/B_023_frames.mha",
210
+ "trackrad2025_labeled_training_data/B_024/images/B_024_frames.mha",
211
+ "trackrad2025_labeled_training_data/B_025/images/B_025_frames.mha",
212
+ "trackrad2025_labeled_training_data/B_026/images/B_026_frames.mha",
213
+ "trackrad2025_labeled_training_data/C_001/images/C_001_frames.mha",
214
+ "trackrad2025_labeled_training_data/C_004/images/C_004_frames.mha",
215
+ "trackrad2025_labeled_training_data/C_005/images/C_005_frames.mha",
216
+ "trackrad2025_labeled_training_data/C_006/images/C_006_frames.mha",
217
+ "trackrad2025_labeled_training_data/C_008/images/C_008_frames.mha",
218
+ "trackrad2025_labeled_training_data/C_009/images/C_009_frames.mha",
219
+ "trackrad2025_labeled_training_data/C_010/images/C_010_frames.mha",
220
+ "trackrad2025_labeled_training_data/C_011/images/C_011_frames.mha",
221
+ "trackrad2025_labeled_training_data/C_012/images/C_012_frames.mha",
222
+ "trackrad2025_labeled_training_data/C_016/images/C_016_frames.mha",
223
+ ]
224
+
225
+
226
+ def play_video(fname: str):
227
+ files = download_image_files(fname)
228
+ output_path = overlay_video(files)
229
+ return output_path
230
+
231
+
232
+ demo = gr.Interface(
233
+ play_video,
234
+ [
235
+ gr.Dropdown(
236
+ choices=choices,
237
+ label="Select an MR sequence",
238
+ value=random.choice(choices),
239
+ )
240
+ ],
241
+ gr.Video(
242
+ height=500,
243
+ autoplay=True,
244
+ loop=True,
245
+ label="MR Sequence",
246
+ ),
247
+ live=True,
248
+ title="TrackRAD2025 Labeled Data Viewer",
249
+ examples=[[random.choice(choices)]],
250
+ cache_examples=True,
251
+ preload_example=0,
252
+ flagging_mode="never",
253
+ )
254
+
255
+
256
+ demo.launch()
app.py ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import random
2
+
3
+ import gradio as gr
4
+
5
+ choices = [
6
+ "A_001_frames",
7
+ "A_003_frames",
8
+ "A_004_frames",
9
+ "A_005_frames",
10
+ "A_006_frames",
11
+ "A_007_frames",
12
+ "A_008_frames",
13
+ "A_010_frames",
14
+ "A_011_frames",
15
+ "A_012_frames",
16
+ "A_013_frames",
17
+ "A_014_frames",
18
+ "A_016_frames",
19
+ "A_019_frames",
20
+ "A_020_frames",
21
+ "A_021_frames",
22
+ "A_022_frames",
23
+ "A_023_frames",
24
+ "A_024_frames",
25
+ "A_025_frames",
26
+ "A_026_frames",
27
+ "A_027_frames",
28
+ "A_028_frames",
29
+ "A_029_frames",
30
+ "A_032_frames",
31
+ "B_002_frames",
32
+ "B_003_frames",
33
+ "B_006_frames",
34
+ "B_007_frames",
35
+ "B_008_frames",
36
+ "B_010_frames",
37
+ "B_012_frames",
38
+ "B_017_frames",
39
+ "B_019_frames",
40
+ "B_021_frames",
41
+ "B_022_frames",
42
+ "B_023_frames",
43
+ "B_024_frames",
44
+ "B_025_frames",
45
+ "B_026_frames",
46
+ "C_001_frames",
47
+ "C_004_frames",
48
+ "C_005_frames",
49
+ "C_006_frames",
50
+ "C_008_frames",
51
+ "C_009_frames",
52
+ "C_010_frames",
53
+ "C_011_frames",
54
+ "C_012_frames",
55
+ "C_016_frames",
56
+ ]
57
+
58
+
59
+ def load_video(choice: str):
60
+ return f"assets/{choice}.mp4"
61
+
62
+
63
+ demo = gr.Interface(
64
+ load_video,
65
+ [
66
+ gr.Dropdown(
67
+ choices=choices,
68
+ label="Select an MR sequence",
69
+ value=random.choice(choices),
70
+ )
71
+ ],
72
+ gr.Video(
73
+ height=500,
74
+ autoplay=True,
75
+ loop=True,
76
+ label="MR Sequence",
77
+ ),
78
+ live=True,
79
+ title="TrackRAD2025 Labeled Data Viewer",
80
+ examples=[[random.choice(choices)]],
81
+ cache_examples=True,
82
+ preload_example=0,
83
+ flagging_mode="never",
84
+ )
85
+
86
+
87
+ demo.launch()
assets/A_001_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a81aacc7625d39b368abfc1848f966245f6723fe1c514e41962955f4eba19611
3
+ size 201787
assets/A_003_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:daba14404240ffd75f622436fcf2e942e51f0afc5eec26d526410765ff7ccbdd
3
+ size 239363
assets/A_004_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4f2c73a8bd239a82f42f2007124ce19e291a7fe55aea49dab0f22ee03b3ad2ae
3
+ size 198642
assets/A_005_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f36b7f1f70f588d0e8a9b54504a2bc88e52c510c87e7815cc85dd73ccf647616
3
+ size 293647
assets/A_006_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:afd63b56513a6f2d40629ae4a88b4b9efb61dafb1508b7dda277e849ebfbe5ed
3
+ size 325129
assets/A_007_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:03437c21f7443d8615ca8356115ba7511c13cdc9af7c89d597afd5d31d6719aa
3
+ size 414738
assets/A_008_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9ab4fde42faf4acf1f637ab2c96dc858fcf163e262a36a58b62f56099854e02b
3
+ size 405714
assets/A_010_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9b688b21338277611f358a2f6350a5570b2b47d30d631f2d71674dbb7728d38c
3
+ size 183782
assets/A_011_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8d410cb495697ef79efb294d8aa183fc827c89d6750e695a1ae2c021212dbcbe
3
+ size 286934
assets/A_012_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e703e1aec2ce8274e9cd9d3a6615ecf8dd03a0a158051fc66984e379baabe911
3
+ size 115615
assets/A_013_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a943a23d3e1c047bc4550b20d891e51ea24501b5704e0ed3214975646da76e0f
3
+ size 203468
assets/A_014_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4f57bd5617a44659164d97256b9e7d97018324b5d1b73f8887b7193713704030
3
+ size 104066
assets/A_016_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:deacdf17cfbbb22ced51be228d2c79f32faf1e611d0ed74cd6a0f21a0f47b4ae
3
+ size 112557
assets/A_019_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:05ecd1acb44b954d23725dde32df740f78e1863c812a4859be38d9c1ef98c070
3
+ size 135921
assets/A_020_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:aff9afedc5a70a8237c18537865656f0a7d330463f064a66f861708b9545839f
3
+ size 147347
assets/A_021_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4050d53688b5c50414664047243d11031bccf61c843100b75b9c8c93a0442daa
3
+ size 194332
assets/A_022_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8cc8854b22e9fcb603ce3824084fc21b266e8bdc053630c39f993286cad58731
3
+ size 98690
assets/A_023_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:edd100e47e4bc45ba911cfd648ccc0960d678edbee80a55b3376bdd956ff5076
3
+ size 249778
assets/A_024_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:772e009dfc96daf606d95fa5c4e7c9332431966e7b8070d5a61cff93a044b46b
3
+ size 299860
assets/A_025_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:94326696ba2bc990c32e2f2a68c55ba0fffe8dffa670b36efad88a35b62a9f01
3
+ size 324114
assets/A_026_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f8bcf6f2d011bd1b7762029001226c3325ba1ebe9729cdbfa0f98b9e05eed0d3
3
+ size 147579
assets/A_027_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:98439c809d304b003fe9c83309a4e84a40ae3d8c218f55143a1f16b0431b1c33
3
+ size 172465
assets/A_028_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:95a06ea8f58a7e367c09666a45f71a0ff5de00897ef77280b262cbe0be153a9f
3
+ size 216583
assets/A_029_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:da87c1f65b0a7ec1016c9fa7138c9705ceb19f30edc566d9637fb6f678c3c68c
3
+ size 247740
assets/A_032_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:900333195dbf876a177c37fd4c7984673c23e41137db672924d73eb53dbc3924
3
+ size 182023
assets/B_002_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6f62fefa52298f0be0f97fb650100c9f776d518fba9b7c1d1f4bf7755a2bd847
3
+ size 339033
assets/B_003_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3a7e814e585e235ee7320df8a21ea267b6c210d28afe7273adf74c69e596f798
3
+ size 306336
assets/B_006_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f4564064b2eb877424e207bdaaed8c00225c28cec4fd0c0f0d6f67e60e6e7a85
3
+ size 208025
assets/B_007_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0e49ebf38df373e0baa38d57b5894f8c745fe029b80c515217ab4a818bad80be
3
+ size 205187
assets/B_008_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ae4af2b18475cb6bcfd4893c4cedcb4a0cb970bbde329800314f197d01b1ae90
3
+ size 249127
assets/B_010_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:886a0c77b6d58b0fcf2af4468f069867ae9f2b9c2d7e300901d747d8a0697d7e
3
+ size 198480
assets/B_012_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:53552ef001fdddbe4fbf8df17b83b53c3aa47656a2e0dc397bbc0e47ceca4051
3
+ size 301686
assets/B_017_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7408d118f0cf74e4a075cb3e6292e956c8f00e6a6e64b9d49ce988a77cbbb31b
3
+ size 64224
assets/B_019_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2a04dbd1e339fee3389f6af05fb7205c956e2aab0930d09b98a6655dfbdc4c59
3
+ size 77983
assets/B_021_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:531f2092603d43362a5b34af5d27ec19640038771a752ae29343157d30cf64ce
3
+ size 233264
assets/B_022_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:378651654fe50b512bc56d76f310a73b05e8d90996d977d3783f488bf7371bcb
3
+ size 269794
assets/B_023_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b7722ea6d5a0e2bfe5cfaa225b641d7fff72bbeda0522cd1b4a17e5cc27d4a10
3
+ size 229056
assets/B_024_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:81d9cb77bed7e2e1e1bc59d262fa6528d8ea524a3ba55c72fd10c89ec7655cbe
3
+ size 171381
assets/B_025_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9848bf22beb0f77ac27a782636c1ef60e6fc8ccee23424ada6e397796ad11cc1
3
+ size 197984
assets/B_026_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c24672196afe6bcef362c5b6106943ec4e19778d502eabfa156d7daa9f398415
3
+ size 252827
assets/C_001_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:de48c5fb4b3cde93bcf07bfc6b735d282572e9c70d7ff62a195ffa86153a1ff4
3
+ size 124255
assets/C_004_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:73e6d0ec28b44e3b8495e273e2240d45d3890617b6a88d083d840dfbce28d9ef
3
+ size 109078
assets/C_005_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b314cc1b1e6217d6d9a396abe2ac2b7a4f4d6bee24776342d80046b411627658
3
+ size 107668
assets/C_006_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:051ee9fa06746a38d4c82aedd90be24f45be407b1afe0749ded5ea586b566930
3
+ size 73197
assets/C_008_frames.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:29471aee1aa41d4bc67464e69af40747a71c23ad6bf35898d774afc0c954dcea
3
+ size 106673