{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":99552,"databundleVersionId":13747926,"sourceType":"competition"}],"dockerImageVersionId":31090,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# kiểm tra GPU\n!python - <<'PY'\nimport torch, sys\nprint(\"cuda available:\", torch.cuda.is_available())\nprint(torch.cuda.get_device_name(0) if torch.cuda.is_available() else \"No GPU\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-09-16T08:02:41.890127Z","iopub.execute_input":"2025-09-16T08:02:41.890378Z","iopub.status.idle":"2025-09-16T08:02:46.462536Z","shell.execute_reply.started":"2025-09-16T08:02:41.890352Z","shell.execute_reply":"2025-09-16T08:02:46.461704Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os, shutil, subprocess, nibabel as nib\nimport numpy as np\n\n# -------------------------\n# Đường dẫn\n# -------------------------\nsegment_dir = \"/kaggle/input/rsna-intracranial-aneurysm-detection/segmentations\"\ndicom_base  = \"/kaggle/input/rsna-intracranial-aneurysm-detection/series\"\n\nNNUNET_RAW_DATA_BASE = \"/kaggle/working/nnUNet_raw\"\ntask_id    = \"Dataset177_RSNA\"\ntask_folder = os.path.join(NNUNET_RAW_DATA_BASE, task_id)\n\n# -------------------------\n# Tạo cấu trúc nnUNet\n# -------------------------\nos.makedirs(os.path.join(task_folder, \"imagesTr\"), exist_ok=True)\nos.makedirs(os.path.join(task_folder, \"labelsTr\"), exist_ok=True)\nos.makedirs(os.path.join(task_folder, \"imagesTs\"), exist_ok=True)\n\n# -------------------------\n# Lấy danh sách series từ segmentation (bỏ _cowseg)\n# -------------------------\nseries_list = []\nfor f in os.listdir(segment_dir):\n    sid = os.path.splitext(f)[0]\n    if sid.endswith(\"_cowseg\"):\n        sid = sid.replace(\"_cowseg\", \"\")\n    series_list.append(sid)\nseries_list = list(set(series_list))\n\nprint(\"Tổng số series cần xử lý:\", len(series_list))\n\n# -------------------------\n# Pipeline convert + copy\n# -------------------------\nn_case = 0\nfor i, sid in enumerate(series_list, start=1):\n    dicom_path = os.path.join(segment_dir, f\"{sid}.nii\")\n    lbl_path   = os.path.join(segment_dir, f\"{sid}_cowseg.nii\")\n\n    if not os.path.exists(dicom_path):\n        print(f\"❌ Không tìm thấy series: {dicom_path}\")\n        continue\n\n    if not os.path.exists(lbl_path):\n        print(f\"❌ Thiếu label cho {sid}\")\n        continue\n\n    n_case += 1\n    case_id = f\"case{n_case:04d}\"\n    \n    dicom = nib.load(dicom_path)\n    dicom_out = nib.Nifti1Image(dicom.get_fdata().astype(np.uint8), dicom.affine)\n    dst_dicom = os.path.join(task_folder, \"imagesTr\", f\"{case_id}_0000.nii.gz\")\n    nib.save(dicom_out, dst_dicom)\n    \n\n    seg = nib.load(lbl_path)\n    seg_out = nib.Nifti1Image(seg.get_fdata().astype(np.uint8), seg.affine)\n    dst_lbl = os.path.join(task_folder, \"labelsTr\", f\"{case_id}.nii.gz\")\n    nib.save(seg_out, dst_lbl)\n\nprint(f\"✅ Đã xử lý xong {n_case} case hợp lệ. Lưu tại {task_folder}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-16T08:03:14.140969Z","iopub.execute_input":"2025-09-16T08:03:14.141325Z","iopub.status.idle":"2025-09-16T08:19:09.100838Z","shell.execute_reply.started":"2025-09-16T08:03:14.141301Z","shell.execute_reply":"2025-09-16T08:19:09.100117Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport json\n\n# === CONFIG ===\ntask_id = \"Dataset177_RSNA\"\nnnunet_raw = \"/kaggle/working/nnUNet_raw\"\ntask_folder = os.path.join(nnunet_raw, task_id)\n\n# labels RSNA (13 + background)\nlabels = {\n    \"background\": 0,\n    \"Other Posterior Circulation\": 1,\n    \"Basilar Tip\": 2,\n    \"Right Posterior Communicating Artery\": 3,\n    \"Left Posterior Communicating Artery\": 4,\n    \"Right Infraclinoid Internal Carotid Artery\": 5,\n    \"Left Infraclinoid Internal Carotid Artery\": 6,\n    \"Right Supraclinoid Internal Carotid Artery\": 7,\n    \"Left Supraclinoid Internal Carotid Artery\": 8,\n    \"Right Middle Cerebral Artery\": 9,\n    \"Left Middle Cerebral Artery\": 10,\n    \"Anterior Communicating Artery\": 11,\n    \"Right Anterior Cerebral Artery\": 12,\n    \"Left Anterior Cerebral Artery\": 13\n}\n\n# channel_names: chỉnh sửa nếu có nhiều modality\nchannel_names = {\n    \"0\": \"CT\"\n}\n\n# === COUNT TRAINING CASES ===\nimagesTr = os.path.join(task_folder, \"imagesTr\")\nn_train = len([f for f in os.listdir(imagesTr) if f.endswith(\".nii.gz\") and \"_0000\" in f])\n\nprint(f\"Tìm thấy {n_train} case training trong {imagesTr}\")\n\n# === BUILD JSON ===\ndataset_dict = {\n    \"channel_names\": channel_names,\n    \"labels\": labels,\n    \"numTraining\": n_train,\n    \"file_ending\": \".nii\"\n}\n\n# === SAVE JSON ===\njson_path = os.path.join(task_folder, \"dataset.json\")\nwith open(json_path, \"w\") as f:\n    json.dump(dataset_dict, f, indent=4)\n\nprint(f\"✅ Saved dataset.json vào {json_path}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-16T08:19:09.101932Z","iopub.execute_input":"2025-09-16T08:19:09.102167Z","iopub.status.idle":"2025-09-16T08:19:09.110456Z","shell.execute_reply.started":"2025-09-16T08:19:09.102148Z","shell.execute_reply":"2025-09-16T08:19:09.109742Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}