{"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":"import os\nimport pydicom\n\nimport pandas as pd\nimport numpy as np\n\nimport torch\nfrom torch import nn\nimport torch.nn.functional as F\nfrom torch import optim\nfrom torchvision import transforms\n\nimport matplotlib.pyplot as plt\n\nfrom joblib import Parallel, delayed\nimport sys\n\nfrom tqdm import tqdm","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-09-25T03:56:54.771115Z","iopub.execute_input":"2023-09-25T03:56:54.771768Z","iopub.status.idle":"2023-09-25T03:56:54.779722Z","shell.execute_reply.started":"2023-09-25T03:56:54.771726Z","shell.execute_reply":"2023-09-25T03:56:54.778213Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAIN_ROOT = '/kaggle/input/rsna-2023-abdominal-trauma-detection/train_images'\nTRAIN_PATHS = '/kaggle/input/rsna-train-paths/train_paths.csv'\nTRAIN_SERIES = '/kaggle/input/rsna-2023-abdominal-trauma-detection/train_series_meta.csv'\n\nCHANNELS = 128\nWIDTH = 64\nHEIGHT = 64","metadata":{"execution":{"iopub.status.busy":"2023-09-25T03:54:27.742585Z","iopub.execute_input":"2023-09-25T03:54:27.74298Z","iopub.status.idle":"2023-09-25T03:54:27.748559Z","shell.execute_reply.started":"2023-09-25T03:54:27.74295Z","shell.execute_reply":"2023-09-25T03:54:27.74751Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def dicom_to_image(dcm):\n    \n    pixel_array = dcm.pixel_array\n    \n    if dcm.PixelRepresentation == 1:\n        bit_shift = dcm.BitsAllocated - dcm.BitsStored\n        dtype = pixel_array.dtype \n        pixel_array = (pixel_array << bit_shift).astype(dtype) >>  bit_shift\n        \n    if dcm.PhotometricInterpretation == \"MONOCHROME1\":\n        pixel_array = 1 - pixel_array\n        \n    intercept = dcm.RescaleIntercept\n    slope = dcm.RescaleSlope\n    pixel_array = pixel_array * slope + intercept\n    \n    window_center = 50\n    window_width = 400\n    img_min = window_center - window_width // 2\n    img_max = window_center + window_width // 2\n    pixel_array = pixel_array.copy()\n    pixel_array[pixel_array < img_min] = img_min\n    pixel_array[pixel_array > img_max] = img_max\n    \n    pixel_array = (pixel_array - img_min)/(img_max-img_min)\n        \n    return pixel_array","metadata":{"execution":{"iopub.status.busy":"2023-09-25T03:54:27.885119Z","iopub.execute_input":"2023-09-25T03:54:27.885878Z","iopub.status.idle":"2023-09-25T03:54:27.895224Z","shell.execute_reply.started":"2023-09-25T03:54:27.885843Z","shell.execute_reply":"2023-09-25T03:54:27.89365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_dicom_image(entry):\n    path = os.path.join(TRAIN_ROOT, str(entry.patient_id), str(entry.series_id), str(entry.instance_id)+'.dcm')\n    \n    dcm = pydicom.dcmread(path)\n    \n    return dicom_to_image(dcm)","metadata":{"execution":{"iopub.status.busy":"2023-09-25T03:54:28.026604Z","iopub.execute_input":"2023-09-25T03:54:28.027298Z","iopub.status.idle":"2023-09-25T03:54:28.033763Z","shell.execute_reply.started":"2023-09-25T03:54:28.027256Z","shell.execute_reply":"2023-09-25T03:54:28.032412Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_volume(group):\n\n    instances = train_paths[train_paths.group_by == group]\n    instances = instances.sort_values('instance_id')\n\n    images = instances.apply(read_dicom_image, axis=1).values\n\n    images = np.stack(images)\n    images = torch.Tensor(images)\n\n    images = images.unsqueeze(dim=0).unsqueeze(dim=0)\n    images = F.interpolate(images, [CHANNELS, WIDTH, HEIGHT]).squeeze()\n        \n    return images","metadata":{"execution":{"iopub.status.busy":"2023-09-25T03:59:39.075258Z","iopub.execute_input":"2023-09-25T03:59:39.075658Z","iopub.status.idle":"2023-09-25T03:59:39.08378Z","shell.execute_reply.started":"2023-09-25T03:59:39.075601Z","shell.execute_reply":"2023-09-25T03:59:39.082672Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_dicom_image(entry):\n    path = os.path.join(TRAIN_ROOT, str(entry.patient_id), str(entry.series_id), str(entry.instance_id)+'.dcm')\n    \n    dcm = pydicom.dcmread(path)\n    \n    return dicom_to_image(dcm)","metadata":{"execution":{"iopub.status.busy":"2023-09-25T03:59:39.315891Z","iopub.execute_input":"2023-09-25T03:59:39.316254Z","iopub.status.idle":"2023-09-25T03:59:39.323788Z","shell.execute_reply.started":"2023-09-25T03:59:39.316226Z","shell.execute_reply":"2023-09-25T03:59:39.321963Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_paths = pd.read_csv('/kaggle/input/rsna-train-paths/train_paths.csv')\ntrain_paths['group_by'] = train_paths.patient_id.astype(str) + '_' + train_paths.series_id.astype(str)","metadata":{"execution":{"iopub.status.busy":"2023-09-25T03:59:39.534313Z","iopub.execute_input":"2023-09-25T03:59:39.535451Z","iopub.status.idle":"2023-09-25T03:59:42.801767Z","shell.execute_reply.started":"2023-09-25T03:59:39.535399Z","shell.execute_reply":"2023-09-25T03:59:42.800522Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def process_volume(i, group):\n    images = get_volume(group)\n    torch.save(images, f'{group}.pt')\n        \n    print(i)\n    sys.stdout.flush() ","metadata":{"execution":{"iopub.status.busy":"2023-09-25T03:59:42.804449Z","iopub.execute_input":"2023-09-25T03:59:42.80496Z","iopub.status.idle":"2023-09-25T03:59:42.812126Z","shell.execute_reply.started":"2023-09-25T03:59:42.804916Z","shell.execute_reply":"2023-09-25T03:59:42.810852Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"series = train_paths.group_by.unique()\n\n# for group in tqdm(series):\n#     process_volume(group)\n\n_ = Parallel(n_jobs=4)(\n    delayed(process_volume)(i, group)\n    for i, group in enumerate(series)\n)","metadata":{"execution":{"iopub.status.busy":"2023-09-25T03:59:42.813868Z","iopub.execute_input":"2023-09-25T03:59:42.814327Z","iopub.status.idle":"2023-09-25T04:00:27.738461Z","shell.execute_reply.started":"2023-09-25T03:59:42.814285Z","shell.execute_reply":"2023-09-25T04:00:27.736487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}