{"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"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install monai[pydicom]==1.0.0\n# refer to: https://www.kaggle.com/competitions/rsna-2022-cervical-spine-fracture-detection/discussion/341412\n!pip install -qU \"python-gdcm\" pydicom pylibjpeg","metadata":{"execution":{"iopub.status.busy":"2022-09-23T09:06:16.527176Z","iopub.execute_input":"2022-09-23T09:06:16.52796Z","iopub.status.idle":"2022-09-23T09:06:45.688169Z","shell.execute_reply.started":"2022-09-23T09:06:16.527853Z","shell.execute_reply":"2022-09-23T09:06:45.687013Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport gc\nimport torch\nfrom monai.transforms import LoadImaged, EnsureChannelFirstd, ResampleToMatchd, Orientationd, SaveImaged, Lambdad, AsDiscreted, Spacingd, Compose\nfrom tqdm import tqdm\nimport multiprocessing\nimport monai\nfrom monai.data import NibabelWriter\nimport numpy as np\nfrom ipywidgets import interactive, widgets, fixed","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-09-23T09:06:45.691357Z","iopub.execute_input":"2022-09-23T09:06:45.69181Z","iopub.status.idle":"2022-09-23T09:06:52.941587Z","shell.execute_reply.started":"2022-09-23T09:06:45.691766Z","shell.execute_reply":"2022-09-23T09:06:52.939897Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_dir = \"../input/rsna-2022-cervical-spine-fracture-detection/train_images/\"\nmask_dir = \"../input/rsna-2022-cervical-spine-fracture-detection/segmentations/\"\nmask_list = os.listdir(mask_dir)\nimage_list = os.listdir(image_dir)\n\n# disk is not enough to save all images, thus just save 87 images that have masks\nimage_list = [l for l in image_list if f\"{l}.nii\" in mask_list]\nprint(len(image_list))","metadata":{"execution":{"iopub.status.busy":"2022-09-23T09:07:24.771731Z","iopub.execute_input":"2022-09-23T09:07:24.772573Z","iopub.status.idle":"2022-09-23T09:07:24.891183Z","shell.execute_reply.started":"2022-09-23T09:07:24.77253Z","shell.execute_reply":"2022-09-23T09:07:24.889986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform = Compose(\n    [\n        LoadImaged(reader=\"pydicomreader\", keys=\"image\"),\n    ]\n)","metadata":{"execution":{"iopub.status.busy":"2022-09-23T09:07:30.071352Z","iopub.execute_input":"2022-09-23T09:07:30.0718Z","iopub.status.idle":"2022-09-23T09:07:30.081425Z","shell.execute_reply.started":"2022-09-23T09:07:30.071765Z","shell.execute_reply":"2022-09-23T09:07:30.080482Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"save_dir = \"train_images_nii/\"\n\nos.makedirs(save_dir, exist_ok=True)","metadata":{"execution":{"iopub.status.busy":"2022-09-23T09:07:32.727955Z","iopub.execute_input":"2022-09-23T09:07:32.729496Z","iopub.status.idle":"2022-09-23T09:07:32.735183Z","shell.execute_reply.started":"2022-09-23T09:07:32.729449Z","shell.execute_reply":"2022-09-23T09:07:32.733996Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def save_nii_image(i):\n    image_sample = image_list[i]\n    data = {\"image\": os.path.join(image_dir, image_sample)}\n    output = transform(data)\n    writer = NibabelWriter()\n    writer.set_data_array(output[\"image\"], channel_dim=None)\n    writer.set_metadata({\"affine\": output[\"image\"].meta[\"affine\"], \"original_affine\": output[\"image\"].meta[\"original_affine\"]})\n    writer.write(f\"{save_dir}/{image_sample}.nii.gz\", verbose=False)\n    \n    print(output[\"image\"].shape)","metadata":{"execution":{"iopub.status.busy":"2022-09-23T09:08:13.073482Z","iopub.execute_input":"2022-09-23T09:08:13.07396Z","iopub.status.idle":"2022-09-23T09:08:13.083537Z","shell.execute_reply.started":"2022-09-23T09:08:13.073921Z","shell.execute_reply":"2022-09-23T09:08:13.082234Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"idxs = list(range(len(image_list)))\nwith multiprocessing.Pool(2) as pool:\n    imap = pool.imap(save_nii_image, idxs)\n    results = list(tqdm(imap, total=len(idxs)))","metadata":{"execution":{"iopub.status.busy":"2022-09-23T09:08:14.913928Z","iopub.execute_input":"2022-09-23T09:08:14.915127Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}