add files
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitattributes +1 -0
- .python-version +1 -0
- README.md +3 -3
- app-download-image.py +256 -0
- app.py +87 -0
- assets/A_001_frames.mp4 +3 -0
- assets/A_003_frames.mp4 +3 -0
- assets/A_004_frames.mp4 +3 -0
- assets/A_005_frames.mp4 +3 -0
- assets/A_006_frames.mp4 +3 -0
- assets/A_007_frames.mp4 +3 -0
- assets/A_008_frames.mp4 +3 -0
- assets/A_010_frames.mp4 +3 -0
- assets/A_011_frames.mp4 +3 -0
- assets/A_012_frames.mp4 +3 -0
- assets/A_013_frames.mp4 +3 -0
- assets/A_014_frames.mp4 +3 -0
- assets/A_016_frames.mp4 +3 -0
- assets/A_019_frames.mp4 +3 -0
- assets/A_020_frames.mp4 +3 -0
- assets/A_021_frames.mp4 +3 -0
- assets/A_022_frames.mp4 +3 -0
- assets/A_023_frames.mp4 +3 -0
- assets/A_024_frames.mp4 +3 -0
- assets/A_025_frames.mp4 +3 -0
- assets/A_026_frames.mp4 +3 -0
- assets/A_027_frames.mp4 +3 -0
- assets/A_028_frames.mp4 +3 -0
- assets/A_029_frames.mp4 +3 -0
- assets/A_032_frames.mp4 +3 -0
- assets/B_002_frames.mp4 +3 -0
- assets/B_003_frames.mp4 +3 -0
- assets/B_006_frames.mp4 +3 -0
- assets/B_007_frames.mp4 +3 -0
- assets/B_008_frames.mp4 +3 -0
- assets/B_010_frames.mp4 +3 -0
- assets/B_012_frames.mp4 +3 -0
- assets/B_017_frames.mp4 +3 -0
- assets/B_019_frames.mp4 +3 -0
- assets/B_021_frames.mp4 +3 -0
- assets/B_022_frames.mp4 +3 -0
- assets/B_023_frames.mp4 +3 -0
- assets/B_024_frames.mp4 +3 -0
- assets/B_025_frames.mp4 +3 -0
- assets/B_026_frames.mp4 +3 -0
- assets/C_001_frames.mp4 +3 -0
- assets/C_004_frames.mp4 +3 -0
- assets/C_005_frames.mp4 +3 -0
- assets/C_006_frames.mp4 +3 -0
- assets/C_008_frames.mp4 +3 -0
.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:
|
5 |
-
colorTo:
|
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
|