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
|