{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "ffa49be9", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/zhu.henian/projects/bouncing-target-reference/.venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n" ] } ], "source": [ "import random\n", "from pathlib import Path\n", "\n", "import cv2\n", "import gradio as gr\n", "import numpy as np\n", "import SimpleITK\n", "from huggingface_hub import hf_hub_download, list_repo_files\n", "from skimage import segmentation\n", "\n", "IMAGES_REPO = \"LMUK-RADONC-PHYS-RES/TrackRAD2025\"\n", "DATASET_REPO_TYPE = \"dataset\"\n", "LABELED_FOLDER = \"trackrad2025_labeled_training_data\"\n", "\n", "OUT_DIR = Path(\"tmp/videos\")\n", "\n", "\n", "def get_images() -> list[str]:\n", " images_repo_files = list_repo_files(\n", " repo_id=IMAGES_REPO,\n", " repo_type=DATASET_REPO_TYPE,\n", " )\n", " image_files = [\n", " fname\n", " for fname in images_repo_files\n", " if fname.startswith(LABELED_FOLDER) and fname.endswith(\"frames.mha\")\n", " ]\n", " return image_files\n", "\n", "\n", "def download_image_files(image_file: str) -> dict[str, str]:\n", " filename = image_file.split(\"/\")[-1]\n", " patient = filename.rsplit(\"_\", 1)[0] # e.g., \"A_033_frames.mha\" -> \"A_033\"\n", " frames_idx = \"\"\n", " frames_file = hf_hub_download(\n", " repo_id=IMAGES_REPO,\n", " repo_type=DATASET_REPO_TYPE,\n", " filename=f\"{LABELED_FOLDER}/{patient}/images/{patient}_frames{frames_idx}.mha\",\n", " )\n", " labels_file = hf_hub_download(\n", " repo_id=IMAGES_REPO,\n", " repo_type=DATASET_REPO_TYPE,\n", " filename=f\"{LABELED_FOLDER}/{patient}/targets/{patient}_labels{frames_idx}.mha\",\n", " )\n", " field_strength_file = hf_hub_download(\n", " repo_id=IMAGES_REPO,\n", " repo_type=DATASET_REPO_TYPE,\n", " filename=f\"{LABELED_FOLDER}/{patient}/b-field-strength.json\",\n", " )\n", " scanned_region_file = hf_hub_download(\n", " repo_id=IMAGES_REPO,\n", " repo_type=DATASET_REPO_TYPE,\n", " filename=f\"{LABELED_FOLDER}/{patient}/scanned-region{frames_idx}.json\",\n", " )\n", " frame_rate_file = hf_hub_download(\n", " repo_id=IMAGES_REPO,\n", " repo_type=DATASET_REPO_TYPE,\n", " filename=f\"{LABELED_FOLDER}/{patient}/frame-rate{frames_idx}.json\",\n", " )\n", " return {\n", " \"frames_file\": frames_file,\n", " \"labels_file\": labels_file,\n", " \"field_strength_file\": field_strength_file,\n", " \"scanned_region_file\": scanned_region_file,\n", " \"frame_rate_file\": frame_rate_file,\n", " }\n", "\n", "\n", "def overlay_labels_on_frames(\n", " frames_array, labels_array, overlay_color=\"green\", alpha=1\n", "):\n", " \"\"\"\n", " Overlay binary labels on grayscale frames with a bright color.\n", "\n", " Parameters:\n", " -----------\n", " frames_array : numpy.ndarray\n", " Grayscale image sequence of shape [X, Y, T]\n", " labels_array : numpy.ndarray\n", " Binary labels of shape [X, Y, T]\n", " overlay_color : str or tuple\n", " Color for the overlay ('red', 'green', 'blue', 'yellow', 'cyan', 'magenta')\n", " or RGB tuple (r, g, b) with values 0-1\n", " alpha : float\n", " Transparency of the overlay (0=transparent, 1=opaque)\n", "\n", " Returns:\n", " --------\n", " overlaid_frames : numpy.ndarray\n", " RGB frames with labels overlaid, shape [X, Y, T, 3]\n", " \"\"\"\n", "\n", " # Normalize frames to 0-1 range if not already\n", " frames_norm = frames_array.astype(np.float32)\n", " if frames_norm.max() > 1.0:\n", " frames_norm = frames_norm / frames_norm.max()\n", "\n", " # Convert grayscale to RGB by repeating across 3 channels\n", " rgb_frames = np.stack([frames_norm] * 3, axis=-1) # Shape: [X, Y, T, 3]\n", "\n", " # Define color mapping\n", " color_map = {\n", " \"red\": (1.0, 0.0, 0.0),\n", " \"green\": (0.0, 1.0, 0.0),\n", " \"blue\": (0.0, 0.0, 1.0),\n", " \"yellow\": (1.0, 1.0, 0.0),\n", " \"cyan\": (0.0, 1.0, 1.0),\n", " \"magenta\": (1.0, 0.0, 1.0),\n", " }\n", "\n", " if overlay_color in color_map:\n", " r, g, b = color_map[overlay_color]\n", " else:\n", " raise ValueError(\n", " f\"Unknown color '{overlay_color}'. Use: {list(color_map.keys())} or RGB tuple\"\n", " )\n", "\n", " # Create the overlaid frames\n", " overlaid_frames = rgb_frames.copy()\n", "\n", " # Apply overlay where labels are True (assuming binary labels are 0/1 or False/True)\n", " mask = segmentation.find_boundaries(labels_array, mode=\"thick\").astype(bool)\n", "\n", " # Blend the colors using alpha blending\n", " overlaid_frames[mask, 0] = (1 - alpha) * rgb_frames[mask, 0] + alpha * r\n", " overlaid_frames[mask, 1] = (1 - alpha) * rgb_frames[mask, 1] + alpha * g\n", " overlaid_frames[mask, 2] = (1 - alpha) * rgb_frames[mask, 2] + alpha * b\n", "\n", " return overlaid_frames\n", "\n", "\n", "def overlay_video(files: dict[str, str]):\n", " frames = SimpleITK.ReadImage(files[\"frames_file\"])\n", " frames_array = SimpleITK.GetArrayFromImage(frames)\n", " # frames_array = [X,Y,T]\n", " frames_array = np.flip(frames_array, axis=0)\n", "\n", " labels = SimpleITK.ReadImage(files[\"labels_file\"])\n", " labels_array = SimpleITK.GetArrayFromImage(labels)\n", " # labels_array = [X,Y,T]\n", " labels_array = np.flip(labels_array, axis=0)\n", "\n", " overlaid_array = overlay_labels_on_frames(frames_array, labels_array)\n", " with open(files[\"frame_rate_file\"]) as f:\n", " fps_raw = f.read().strip()\n", " fps = int(float(fps_raw))\n", " output_path = numpy_to_video_opencv(\n", " overlaid_array, files[\"frames_file\"].split(\"/\")[-1], fps=fps\n", " )\n", " return output_path\n", "\n", "\n", "def numpy_to_video_opencv(array: np.ndarray, output_prefix: str, fps: int) -> str:\n", " limit = 10 * fps\n", " array_clip = array[:, :, :limit] # 10s of video\n", " p99: float = np.percentile(array_clip, 99) # type: ignore\n", " array_clip_normalized = cv2.convertScaleAbs(array_clip, alpha=(255.0 / p99))\n", "\n", " OUT_DIR.mkdir(parents=True, exist_ok=True)\n", " output_path = str((OUT_DIR / output_prefix).with_suffix(\".mp4\"))\n", "\n", " # Define codec and create VideoWriter\n", " # VP90 is supported by browsers and is available in the pip-installed opencv\n", " fourcc = cv2.VideoWriter.fourcc(*\"avc1\")\n", " X, Y, T, _ = array_clip.shape\n", " bgr_frames = array_clip_normalized[:, :, :, [2, 1, 0]]\n", " out = cv2.VideoWriter(output_path, fourcc, fps, (X, Y))\n", " # Write frames\n", " for t in range(T):\n", " frame = bgr_frames[:, :, t, :]\n", " # OpenCV expects frames in BGR format, but for grayscale we can use as-is\n", " out.write(frame)\n", "\n", " out.release()\n", " return output_path\n", "\n", "\n", "choices = [\n", " \"trackrad2025_labeled_training_data/A_001/images/A_001_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_003/images/A_003_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_004/images/A_004_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_005/images/A_005_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_006/images/A_006_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_007/images/A_007_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_008/images/A_008_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_010/images/A_010_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_011/images/A_011_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_012/images/A_012_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_013/images/A_013_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_014/images/A_014_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_016/images/A_016_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_019/images/A_019_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_020/images/A_020_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_021/images/A_021_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_022/images/A_022_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_023/images/A_023_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_024/images/A_024_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_025/images/A_025_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_026/images/A_026_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_027/images/A_027_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_028/images/A_028_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_029/images/A_029_frames.mha\",\n", " \"trackrad2025_labeled_training_data/A_032/images/A_032_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_002/images/B_002_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_003/images/B_003_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_006/images/B_006_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_007/images/B_007_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_008/images/B_008_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_010/images/B_010_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_012/images/B_012_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_017/images/B_017_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_019/images/B_019_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_021/images/B_021_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_022/images/B_022_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_023/images/B_023_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_024/images/B_024_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_025/images/B_025_frames.mha\",\n", " \"trackrad2025_labeled_training_data/B_026/images/B_026_frames.mha\",\n", " \"trackrad2025_labeled_training_data/C_001/images/C_001_frames.mha\",\n", " \"trackrad2025_labeled_training_data/C_004/images/C_004_frames.mha\",\n", " \"trackrad2025_labeled_training_data/C_005/images/C_005_frames.mha\",\n", " \"trackrad2025_labeled_training_data/C_006/images/C_006_frames.mha\",\n", " \"trackrad2025_labeled_training_data/C_008/images/C_008_frames.mha\",\n", " \"trackrad2025_labeled_training_data/C_009/images/C_009_frames.mha\",\n", " \"trackrad2025_labeled_training_data/C_010/images/C_010_frames.mha\",\n", " \"trackrad2025_labeled_training_data/C_011/images/C_011_frames.mha\",\n", " \"trackrad2025_labeled_training_data/C_012/images/C_012_frames.mha\",\n", " \"trackrad2025_labeled_training_data/C_016/images/C_016_frames.mha\",\n", "]" ] }, { "cell_type": "code", "execution_count": 2, "id": "7f135ad4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_001/images/A_001_frames.mha -> tmp/videos/A_001_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_003/images/A_003_frames.mha -> tmp/videos/A_003_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_004/images/A_004_frames.mha -> tmp/videos/A_004_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_005/images/A_005_frames.mha -> tmp/videos/A_005_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_006/images/A_006_frames.mha -> tmp/videos/A_006_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_007/images/A_007_frames.mha -> tmp/videos/A_007_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_008/images/A_008_frames.mha -> tmp/videos/A_008_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_010/images/A_010_frames.mha -> tmp/videos/A_010_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_011/images/A_011_frames.mha -> tmp/videos/A_011_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_012/images/A_012_frames.mha -> tmp/videos/A_012_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_013/images/A_013_frames.mha -> tmp/videos/A_013_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_014/images/A_014_frames.mha -> tmp/videos/A_014_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_016/images/A_016_frames.mha -> tmp/videos/A_016_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_019/images/A_019_frames.mha -> tmp/videos/A_019_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_020/images/A_020_frames.mha -> tmp/videos/A_020_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_021/images/A_021_frames.mha -> tmp/videos/A_021_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_022/images/A_022_frames.mha -> tmp/videos/A_022_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_023/images/A_023_frames.mha -> tmp/videos/A_023_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_024/images/A_024_frames.mha -> tmp/videos/A_024_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_025/images/A_025_frames.mha -> tmp/videos/A_025_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_026/images/A_026_frames.mha -> tmp/videos/A_026_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_027/images/A_027_frames.mha -> tmp/videos/A_027_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_028/images/A_028_frames.mha -> tmp/videos/A_028_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_029/images/A_029_frames.mha -> tmp/videos/A_029_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/A_032/images/A_032_frames.mha -> tmp/videos/A_032_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_002/images/B_002_frames.mha -> tmp/videos/B_002_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_003/images/B_003_frames.mha -> tmp/videos/B_003_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_006/images/B_006_frames.mha -> tmp/videos/B_006_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_007/images/B_007_frames.mha -> tmp/videos/B_007_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_008/images/B_008_frames.mha -> tmp/videos/B_008_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_010/images/B_010_frames.mha -> tmp/videos/B_010_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_012/images/B_012_frames.mha -> tmp/videos/B_012_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_017/images/B_017_frames.mha -> tmp/videos/B_017_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_019/images/B_019_frames.mha -> tmp/videos/B_019_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_021/images/B_021_frames.mha -> tmp/videos/B_021_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_022/images/B_022_frames.mha -> tmp/videos/B_022_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_023/images/B_023_frames.mha -> tmp/videos/B_023_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_024/images/B_024_frames.mha -> tmp/videos/B_024_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_025/images/B_025_frames.mha -> tmp/videos/B_025_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/B_026/images/B_026_frames.mha -> tmp/videos/B_026_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/C_001/images/C_001_frames.mha -> tmp/videos/C_001_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/C_004/images/C_004_frames.mha -> tmp/videos/C_004_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/C_005/images/C_005_frames.mha -> tmp/videos/C_005_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/C_006/images/C_006_frames.mha -> tmp/videos/C_006_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/C_008/images/C_008_frames.mha -> tmp/videos/C_008_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/C_009/images/C_009_frames.mha -> tmp/videos/C_009_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/C_010/images/C_010_frames.mha -> tmp/videos/C_010_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/C_011/images/C_011_frames.mha -> tmp/videos/C_011_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/C_012/images/C_012_frames.mha -> tmp/videos/C_012_frames.mp4\n", "Processed /Users/zhu.henian/.cache/huggingface/hub/datasets--LMUK-RADONC-PHYS-RES--TrackRAD2025/snapshots/25d11e5a3f58187e40a92ef5558d965f2ee7d809/trackrad2025_labeled_training_data/C_016/images/C_016_frames.mha -> tmp/videos/C_016_frames.mp4\n" ] } ], "source": [ "regions = []\n", "for choice in choices:\n", " files = download_image_files(choice)\n", " output_path = overlay_video(files)\n", " print(f\"Processed {files['frames_file']} -> {output_path}\")" ] } ], "metadata": { "kernelspec": { "display_name": "bouncing-target-reference", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.16" } }, "nbformat": 4, "nbformat_minor": 5 }