{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pydicom\nimport glob, os\nimport pandas as pd\nimport numpy as np\nimport cv2\nfrom tqdm import tqdm\nimport re\nfrom multiprocessing import Pool","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"path = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification'","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dfd = pd.read_csv(f'{path}/train_series_descriptions.csv')\ndfd.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"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)]\n\ndef imread_and_imwrite(src_dst):\n    src_path, dst_path = src_dst\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).astype(np.uint8)\n    img = cv2.resize(image, (512, 512), interpolation=cv2.INTER_CUBIC)\n    cv2.imwrite(dst_path, img)\n\ndef process_study(si, desc, path):\n    pdf = dfd[dfd['study_id'] == si]\n    for ds in desc:\n        ds_ = ds.replace('/', '_')\n        pdf_ = pdf[pdf['series_description'] == ds]\n        os.makedirs(f'cvt_png/{si}/{ds_}', exist_ok=True)\n        allimgs = []\n\n        for _, row in pdf_.iterrows():\n            pimgs = sorted(\n                glob.glob(f'{path}/train_images/{row[\"study_id\"]}/{row[\"series_id\"]}/*.dcm'),\n                key=natural_keys,\n            )\n            allimgs.extend(pimgs)\n\n        if not allimgs:\n            print(si, ds, 'has no images')\n            continue\n\n        tasks = []\n        if ds == 'Axial T2':\n            for j, impath in enumerate(allimgs):\n                dst = f'cvt_png/{si}/{ds}/{j:03d}.png'\n                tasks.append((impath, dst))\n\n        elif ds in {'Sagittal T2/STIR', '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'cvt_png/{si}/{ds_}/{j:03d}.png'\n                ind2 = max(0, int(round(i - 0.5001)))\n                tasks.append((allimgs[ind2], dst))\n            assert len(tasks) == 10\n\n        with Pool(processes=8) as pool:  # Adjust the number of processes based on CPU cores\n            pool.map(imread_and_imwrite, tasks)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"st_ids = dfd['study_id'].unique()\ndesc = list(dfd['series_description'].unique()) #['Sagittal T2/STIR', 'Sagittal T1', 'Axial T2']\nfor si in tqdm(st_ids, total=len(st_ids)):\n    process_study(si, desc, path)","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}