{"metadata":{"kernelspec":{"display_name":"Python 3","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.12"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"}],"dockerImageVersionId":30919,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true},"papermill":{"default_parameters":{},"duration":824.454474,"end_time":"2025-02-18T06:23:21.035530","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2025-02-18T06:09:36.581056","version":"2.6.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"id":"95b935dd","cell_type":"code","source":"import pydicom\nimport glob, os\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport numpy as np\nimport cv2\nfrom tqdm import tqdm\nimport re\nimport shutil\nimport os","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":1.860137,"end_time":"2025-02-18T06:09:41.210359","exception":false,"start_time":"2025-02-18T06:09:39.350222","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T08:28:07.383493Z","iopub.execute_input":"2025-03-02T08:28:07.383722Z","iopub.status.idle":"2025-03-02T08:28:09.327108Z","shell.execute_reply.started":"2025-03-02T08:28:07.383701Z","shell.execute_reply":"2025-03-02T08:28:09.326149Z"}},"outputs":[],"execution_count":null},{"id":"d4010aea","cell_type":"code","source":"rd='/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification'","metadata":{"execution":{"iopub.status.busy":"2025-03-02T08:28:09.327951Z","iopub.execute_input":"2025-03-02T08:28:09.328442Z","iopub.status.idle":"2025-03-02T08:28:09.332442Z","shell.execute_reply.started":"2025-03-02T08:28:09.328418Z","shell.execute_reply":"2025-03-02T08:28:09.331515Z"},"papermill":{"duration":0.011394,"end_time":"2025-02-18T06:09:41.227136","exception":false,"start_time":"2025-02-18T06:09:41.215742","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"a370a527","cell_type":"code","source":"def atoi(text):\n    return int(text) if text.isdigit() else text\n\ndef natural_keys(text):\n    return [ atoi(c) for c in re.split(r'(\\d+)', text) ]","metadata":{"execution":{"iopub.status.busy":"2025-03-02T08:28:09.333399Z","iopub.execute_input":"2025-03-02T08:28:09.333692Z","iopub.status.idle":"2025-03-02T08:28:09.350759Z","shell.execute_reply.started":"2025-03-02T08:28:09.333662Z","shell.execute_reply":"2025-03-02T08:28:09.349884Z"},"papermill":{"duration":0.012444,"end_time":"2025-02-18T06:09:41.244330","exception":false,"start_time":"2025-02-18T06:09:41.231886","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"03a53b7d","cell_type":"code","source":"dfc = pd.read_csv(f\"{rd}/train_label_coordinates.csv\")","metadata":{"execution":{"iopub.status.busy":"2025-03-02T08:28:09.352634Z","iopub.execute_input":"2025-03-02T08:28:09.352836Z","iopub.status.idle":"2025-03-02T08:28:09.519177Z","shell.execute_reply.started":"2025-03-02T08:28:09.352818Z","shell.execute_reply":"2025-03-02T08:28:09.518228Z"},"papermill":{"duration":0.150671,"end_time":"2025-02-18T06:09:41.399779","exception":false,"start_time":"2025-02-18T06:09:41.249108","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"fe9d0bb2","cell_type":"code","source":"df = pd.read_csv(f'{rd}/train_series_descriptions.csv')\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2025-03-02T08:28:09.520757Z","iopub.execute_input":"2025-03-02T08:28:09.521102Z","iopub.status.idle":"2025-03-02T08:28:09.557012Z","shell.execute_reply.started":"2025-03-02T08:28:09.521077Z","shell.execute_reply":"2025-03-02T08:28:09.556199Z"},"papermill":{"duration":0.044285,"end_time":"2025-02-18T06:09:41.448832","exception":false,"start_time":"2025-02-18T06:09:41.404547","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"f903dabd","cell_type":"code","source":"df['series_description'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2025-03-02T08:28:09.558020Z","iopub.execute_input":"2025-03-02T08:28:09.558331Z","iopub.status.idle":"2025-03-02T08:28:09.568917Z","shell.execute_reply.started":"2025-03-02T08:28:09.558298Z","shell.execute_reply":"2025-03-02T08:28:09.568239Z"},"papermill":{"duration":0.019688,"end_time":"2025-02-18T06:09:41.473515","exception":false,"start_time":"2025-02-18T06:09:41.453827","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"5a51f2ac","cell_type":"code","source":"df[df['study_id']==4003253]","metadata":{"execution":{"iopub.status.busy":"2025-03-02T08:28:09.569780Z","iopub.execute_input":"2025-03-02T08:28:09.570121Z","iopub.status.idle":"2025-03-02T08:28:09.594962Z","shell.execute_reply.started":"2025-03-02T08:28:09.570090Z","shell.execute_reply":"2025-03-02T08:28:09.594263Z"},"papermill":{"duration":0.020227,"end_time":"2025-02-18T06:09:41.498859","exception":false,"start_time":"2025-02-18T06:09:41.478632","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"db13f577","cell_type":"code","source":"def imread_and_imwirte(src_path, dst_path):\n    dicom_data = pydicom.dcmread(src_path)\n    image = dicom_data.pixel_array\n    image = (image - image.min()) / (image.max() - image.min() +1e-6) * 255\n    img = cv2.resize(image, (512, 512),interpolation=cv2.INTER_CUBIC)\n    assert img.shape==(512,512)\n    cv2.imwrite(dst_path, img)","metadata":{"execution":{"iopub.status.busy":"2025-03-02T08:28:09.595880Z","iopub.execute_input":"2025-03-02T08:28:09.596177Z","iopub.status.idle":"2025-03-02T08:28:09.600818Z","shell.execute_reply.started":"2025-03-02T08:28:09.596146Z","shell.execute_reply":"2025-03-02T08:28:09.600073Z"},"papermill":{"duration":0.013049,"end_time":"2025-02-18T06:09:41.517090","exception":false,"start_time":"2025-02-18T06:09:41.504041","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"e261da5a","cell_type":"code","source":"st_ids = df['study_id'].unique()\nst_ids[:3], len(st_ids)","metadata":{"execution":{"iopub.status.busy":"2025-03-02T08:28:09.601719Z","iopub.execute_input":"2025-03-02T08:28:09.601959Z","iopub.status.idle":"2025-03-02T08:28:09.619032Z","shell.execute_reply.started":"2025-03-02T08:28:09.601938Z","shell.execute_reply":"2025-03-02T08:28:09.618240Z"},"papermill":{"duration":0.01639,"end_time":"2025-02-18T06:09:41.538647","exception":false,"start_time":"2025-02-18T06:09:41.522257","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"04381743","cell_type":"code","source":"desc = list(df['series_description'].unique())\ndesc","metadata":{"execution":{"iopub.status.busy":"2025-03-02T08:28:09.619884Z","iopub.execute_input":"2025-03-02T08:28:09.620206Z","iopub.status.idle":"2025-03-02T08:28:09.636356Z","shell.execute_reply.started":"2025-03-02T08:28:09.620175Z","shell.execute_reply":"2025-03-02T08:28:09.635582Z"},"papermill":{"duration":0.017326,"end_time":"2025-02-18T06:09:41.561350","exception":false,"start_time":"2025-02-18T06:09:41.544024","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"06bd4f1e","cell_type":"code","source":"st_ids = st_ids[:500]\nfor idx, si in enumerate(tqdm(st_ids, total=len(st_ids))):\n    pdf = df[df['study_id']==si]\n    for ds in desc:\n        ds_ = ds.replace('/', '_')\n        pdf_ = pdf[pdf['series_description']==ds]\n        os.makedirs(f'mri_png/{si}/{ds_}', exist_ok=True)\n        allimgs = []\n        for i, row in pdf_.iterrows():\n            pimgs = glob.glob(f'{rd}/train_images/{row[\"study_id\"]}/{row[\"series_id\"]}/*.dcm')\n            pimgs = sorted(pimgs, key=natural_keys)\n            allimgs.extend(pimgs)\n\n        if len(allimgs)==0:\n            print(si, ds, 'has no images')\n            continue\n\n        if ds == 'Axial T2':\n            for j, impath in enumerate(allimgs):\n                dst = f'mri_png/{si}/{ds}/{j:03d}.png'\n                imread_and_imwirte(impath, dst)\n\n        elif ds == 'Sagittal T2/STIR':\n\n            step = len(allimgs) / 10.0\n            st = len(allimgs)/2.0 - 4.0*step\n            end = len(allimgs)+0.0001\n            for j, i in enumerate(np.arange(st, end, step)):\n                dst = f'mri_png/{si}/{ds_}/{j:03d}.png'\n                ind2 = max(0, int((i-0.5001).round()))\n                imread_and_imwirte(allimgs[ind2], dst)\n\n            assert len(glob.glob(f'mri_png/{si}/{ds_}/*.png'))==10\n\n        elif ds == 'Sagittal T1':\n            step = len(allimgs) / 10.0\n            st = len(allimgs)/2.0 - 4.0*step\n            end = len(allimgs)+0.0001\n            for j, i in enumerate(np.arange(st, end, step)):\n                dst = f'mri_png/{si}/{ds}/{j:03d}.png'\n                ind2 = max(0, int((i-0.5001).round()))\n                imread_and_imwirte(allimgs[ind2], dst)\n\n            assert len(glob.glob(f'mri_png/{si}/{ds}/*.png'))==10","metadata":{"execution":{"iopub.status.busy":"2025-03-02T08:28:39.980519Z","iopub.execute_input":"2025-03-02T08:28:39.980809Z","iopub.status.idle":"2025-03-02T08:39:42.440733Z","shell.execute_reply.started":"2025-03-02T08:28:39.980788Z","shell.execute_reply":"2025-03-02T08:39:42.439928Z"},"papermill":{"duration":817.495242,"end_time":"2025-02-18T06:23:19.062058","exception":false,"start_time":"2025-02-18T06:09:41.566816","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"37af730d","cell_type":"code","source":"rd = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification'\ndes = '/kaggle/working/'\n\nshutil.copy(f\"{rd}/train_label_coordinates.csv\", des)\nshutil.copy(f\"{rd}/train_series_descriptions.csv\", des)\nshutil.copy(f\"{rd}/train.csv\", des)\nprint(\"File moved to output directory.\")","metadata":{"execution":{"iopub.status.busy":"2025-03-02T08:49:00.166869Z","iopub.execute_input":"2025-03-02T08:49:00.167204Z","iopub.status.idle":"2025-03-02T08:49:00.185785Z","shell.execute_reply.started":"2025-03-02T08:49:00.167178Z","shell.execute_reply":"2025-03-02T08:49:00.185137Z"},"papermill":{"duration":0.105828,"end_time":"2025-02-18T06:23:19.199973","exception":false,"start_time":"2025-02-18T06:23:19.094145","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"bcde27b3","cell_type":"code","source":"df = pd.read_csv(f'{des}/train.csv')\ndf = df.iloc[:500]\ndf.to_csv(f'{des}/train_500.csv', index=False)","metadata":{"papermill":{"duration":0.064727,"end_time":"2025-02-18T06:23:19.296376","exception":false,"start_time":"2025-02-18T06:23:19.231649","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T08:49:00.976665Z","iopub.execute_input":"2025-03-02T08:49:00.977010Z","iopub.status.idle":"2025-03-02T08:49:00.998532Z","shell.execute_reply.started":"2025-03-02T08:49:00.976959Z","shell.execute_reply":"2025-03-02T08:49:00.997843Z"}},"outputs":[],"execution_count":null},{"id":"929b3723","cell_type":"code","source":"import pandas as pd\nimport os\n\n# Load the primary dataset\nprimary_df = pd.read_csv(f'{des}/train_500.csv')\n\n# Get the list of valid study_id values\nvalid_study_ids = primary_df['study_id'].unique()\n\n# Define the target directory\ntarget_directory = '/kaggle/working/'\n\n# Process each CSV file in the directory\nfor filename in os.listdir(target_directory):\n    if filename.endswith('.csv'):\n        file_path = os.path.join(target_directory, filename)\n        \n        df = pd.read_csv(file_path)\n        \n        if 'study_id' in df.columns:\n            # Keep only rows with study_id values present in train_500.csv\n            df_filtered = df[df['study_id'].isin(valid_study_ids)]\n            \n            df_filtered.to_csv(file_path, index=False)\n            print(f\"Updated {filename}: Kept only rows with study_id present in train_500.csv.\")\n        else:\n            print(f\"'study_id' column not found in {filename}. Skipping this file.\")\n","metadata":{"papermill":{"duration":0.221974,"end_time":"2025-02-18T06:23:19.634729","exception":false,"start_time":"2025-02-18T06:23:19.412755","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T08:49:02.622327Z","iopub.execute_input":"2025-03-02T08:49:02.622597Z","iopub.status.idle":"2025-03-02T08:49:02.778170Z","shell.execute_reply.started":"2025-03-02T08:49:02.622577Z","shell.execute_reply":"2025-03-02T08:49:02.777333Z"}},"outputs":[],"execution_count":null},{"id":"db0924bf","cell_type":"code","source":"target_directory = '/kaggle/working/mri_png'\ndirectory_count = 0\n\nwith os.scandir(target_directory) as entries:\n    for entry in entries:\n        if entry.is_dir():\n            directory_count += 1\n\nprint(f'Total number of directories in \"{target_directory}\": {directory_count}')","metadata":{"papermill":{"duration":0.039955,"end_time":"2025-02-18T06:23:20.144378","exception":false,"start_time":"2025-02-18T06:23:20.104423","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T08:49:52.416811Z","iopub.execute_input":"2025-03-02T08:49:52.417145Z","iopub.status.idle":"2025-03-02T08:49:52.422506Z","shell.execute_reply.started":"2025-03-02T08:49:52.417117Z","shell.execute_reply":"2025-03-02T08:49:52.421624Z"}},"outputs":[],"execution_count":null},{"id":"a8e68883","cell_type":"code","source":"primary_df['study_id'].nunique()","metadata":{"papermill":{"duration":0.032297,"end_time":"2025-02-18T06:23:20.281701","exception":false,"start_time":"2025-02-18T06:23:20.249404","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T08:49:49.772782Z","iopub.execute_input":"2025-03-02T08:49:49.773109Z","iopub.status.idle":"2025-03-02T08:49:49.778610Z","shell.execute_reply.started":"2025-03-02T08:49:49.773083Z","shell.execute_reply":"2025-03-02T08:49:49.777883Z"}},"outputs":[],"execution_count":null},{"id":"55bc0c92-247b-405d-9151-3f791b163ab6","cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}