{"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 required packages\nimport os\nimport glob\nimport random\n\nimport torch\nimport pydicom\nimport nibabel as nib\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom mpl_toolkits.mplot3d import Axes3D\n\nfrom tqdm.notebook import tqdm\nfrom joblib import Parallel, delayed","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:08:53.810544Z","iopub.execute_input":"2023-08-18T22:08:53.810983Z","iopub.status.idle":"2023-08-18T22:08:58.239383Z","shell.execute_reply.started":"2023-08-18T22:08:53.810947Z","shell.execute_reply":"2023-08-18T22:08:58.238158Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# read the training data\ntrain_df = pd.read_csv('/kaggle/input/rsna-2023-abdominal-trauma-detection/train.csv')","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:08:58.243538Z","iopub.execute_input":"2023-08-18T22:08:58.244226Z","iopub.status.idle":"2023-08-18T22:08:58.272701Z","shell.execute_reply.started":"2023-08-18T22:08:58.24419Z","shell.execute_reply":"2023-08-18T22:08:58.271575Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:08:58.274539Z","iopub.execute_input":"2023-08-18T22:08:58.274999Z","iopub.status.idle":"2023-08-18T22:08:58.305823Z","shell.execute_reply.started":"2023-08-18T22:08:58.274956Z","shell.execute_reply":"2023-08-18T22:08:58.304544Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_count = train_df.iloc[:, 1:].sum()\nsns.barplot(x=train_count.index, y=train_count.values, palette='plasma')\n\n# plt.xlabel('Columns')\nplt.ylabel('Count')\nplt.title('Frequency Distribution of the Injury')\n\nplt.xticks(rotation=90)  \nplt.grid(axis='y')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:08:58.326836Z","iopub.execute_input":"2023-08-18T22:08:58.327159Z","iopub.status.idle":"2023-08-18T22:08:58.79495Z","shell.execute_reply.started":"2023-08-18T22:08:58.32713Z","shell.execute_reply":"2023-08-18T22:08:58.793773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(8, 6)) \nsns.heatmap(train_df.iloc[:,1:-1].corr(), cmap='coolwarm', center=0)\nplt.title('Correlation Heatmap')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:08:58.796492Z","iopub.execute_input":"2023-08-18T22:08:58.796856Z","iopub.status.idle":"2023-08-18T22:08:59.358062Z","shell.execute_reply.started":"2023-08-18T22:08:58.796795Z","shell.execute_reply":"2023-08-18T22:08:59.356893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAIN_PATH = '/kaggle/input/rsna-2023-abdominal-trauma-detection/train_images'\nTEST_PATH =  '/kaggle/input/rsna-2023-abdominal-trauma-detection/test_images'","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:08:59.359608Z","iopub.execute_input":"2023-08-18T22:08:59.360731Z","iopub.status.idle":"2023-08-18T22:08:59.366183Z","shell.execute_reply.started":"2023-08-18T22:08:59.360688Z","shell.execute_reply":"2023-08-18T22:08:59.364887Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('No. of Train Patients: ', len(os.listdir(TRAIN_PATH)))\nprint('No. of Test Patients: ', len(os.listdir(TEST_PATH)))","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:08:59.36777Z","iopub.execute_input":"2023-08-18T22:08:59.368219Z","iopub.status.idle":"2023-08-18T22:08:59.492569Z","shell.execute_reply.started":"2023-08-18T22:08:59.36818Z","shell.execute_reply":"2023-08-18T22:08:59.491252Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"count = []\nfor patient in os.listdir(TRAIN_PATH):\n    for series in os.listdir(os.path.join(TRAIN_PATH, patient)):\n        count.append(len(glob.glob(os.path.join(TRAIN_PATH, patient, series, '*.dcm'))))","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:08:59.496234Z","iopub.execute_input":"2023-08-18T22:08:59.49671Z","iopub.status.idle":"2023-08-18T22:15:04.206853Z","shell.execute_reply.started":"2023-08-18T22:08:59.496666Z","shell.execute_reply":"2023-08-18T22:15:04.20531Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Min Instances: {}'.format(min(count)))\nprint('Max Instances: {}'.format(max(count)))\nplt.title('KDE of Num. of Instances')\nsns.histplot(count, kde = True);","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:45:06.6902Z","iopub.execute_input":"2023-08-18T22:45:06.691603Z","iopub.status.idle":"2023-08-18T22:45:07.162204Z","shell.execute_reply.started":"2023-08-18T22:45:06.691539Z","shell.execute_reply":"2023-08-18T22:45:07.161057Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def standardize_pixel_array(dicom_image):\n    \"\"\"\n    Read the dicom file and preprocess appropriately.\n    \"\"\"\n    pixel_array = dicom_image.pixel_array\n    \n    if dicom_image.PixelRepresentation == 1:\n        bit_shift = dicom_image.BitsAllocated - dicom_image.BitsStored\n        dtype = pixel_array.dtype \n        new_array = (pixel_array << bit_shift).astype(dtype) >>  bit_shift\n        pixel_array = pydicom.pixel_data_handlers.util.apply_modality_lut(new_array, dicom_image)\n    \n    if dicom_image.PhotometricInterpretation == \"MONOCHROME1\":\n        pixel_array = 1 - pixel_array\n    \n    # transform to hounsfield units\n    intercept = dicom_image.RescaleIntercept\n    slope = dicom_image.RescaleSlope\n    pixel_array = pixel_array * slope + intercept\n    \n    # windowing\n    window_center = int(dicom_image.WindowCenter)\n    window_width = int(dicom_image.WindowWidth)\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    # normalization\n    pixel_array = (pixel_array - pixel_array.min())/(pixel_array.max() - pixel_array.min())\n    \n    return pixel_array\n\ndef read_volume(paths):\n    \"\"\"\n    Read the dicom slices and return a 3d volume.\n    \"\"\"\n    images = []\n    for path in tqdm(paths):\n        image = pydicom.dcmread(path)\n        image = standardize_pixel_array(image)\n        images.append(image)\n    return np.stack(images)\n\ndef create_3D_segmentations(filepath):\n    \"\"\"\n    Read the .nii file and return 3d volume of segmentation.\n    \"\"\"\n    img = nib.load(filepath).get_fdata()\n    img = np.transpose(img, [1, 0, 2])\n    img = np.rot90(img, 1, (1,2))\n    img = img[::-1,:,:]\n    img = np.transpose(img, [1, 0, 2])\n    return img","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:15:04.714515Z","iopub.execute_input":"2023-08-18T22:15:04.715054Z","iopub.status.idle":"2023-08-18T22:15:04.728378Z","shell.execute_reply.started":"2023-08-18T22:15:04.715021Z","shell.execute_reply":"2023-08-18T22:15:04.727508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"scans_path = os.path.join(TRAIN_PATH, '10004/21057')\nimage_paths = []\nfor img in os.listdir(scans_path):\n    image_paths.append(int(img.split('.')[0]))\nimage_paths = sorted(image_paths)\nimage_paths = [os.path.join(scans_path, str(img) + '.dcm') for img in image_paths]","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:15:04.748698Z","iopub.execute_input":"2023-08-18T22:15:04.749006Z","iopub.status.idle":"2023-08-18T22:15:04.773438Z","shell.execute_reply.started":"2023-08-18T22:15:04.74898Z","shell.execute_reply":"2023-08-18T22:15:04.7723Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_scan = [image_paths[i] for i in range(0,9*50, 50)]\n\nfig, ax = plt.subplots(3,3, figsize=(9, 9))\nfor i in range(9):\n    image = pydicom.dcmread(sample_scan[i])\n    image = standardize_pixel_array(image)\n    ax[i//3, i%3].imshow(image, cmap = 'gray')\n    ax[i//3, i%3].set_xticks([])\n    ax[i//3, i%3].set_yticks([])\n    ax[i//3, i%3].set_xticklabels([])\n    ax[i//3, i%3].set_yticklabels([])\nplt.suptitle('Dicom Images');","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:15:04.774447Z","iopub.execute_input":"2023-08-18T22:15:04.774769Z","iopub.status.idle":"2023-08-18T22:15:06.093935Z","shell.execute_reply.started":"2023-08-18T22:15:04.77474Z","shell.execute_reply":"2023-08-18T22:15:06.092706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_volume = read_volume(image_paths)\nsample_seg = create_3D_segmentations('/kaggle/input/rsna-2023-abdominal-trauma-detection/segmentations/21057.nii')","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:15:06.095668Z","iopub.execute_input":"2023-08-18T22:15:06.09604Z","iopub.status.idle":"2023-08-18T22:15:47.930104Z","shell.execute_reply.started":"2023-08-18T22:15:06.096007Z","shell.execute_reply":"2023-08-18T22:15:47.928905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_seg_map(sample_volume, seg=None):\n    \n    \"\"\"\n    Plot random slices in the 3d scan with axial, coronal and sagittal orientations.\n    \"\"\"\n    \n    coronal_index = sample_volume.shape[2]//2\n    axial_index = sample_volume.shape[2]//2\n    sagittal_index = sample_volume.shape[2]//2\n\n    # Get slices for different orientations\n    coronal_slice = sample_volume.transpose([1,0,2])[coronal_index, :, :]\n    coronal_seg = seg.transpose([1,0,2])\n    axial_slice = sample_volume[axial_index, :, :]\n    axial_seg = seg\n    sagittal_slice = sample_volume.transpose([2,0,1])[sagittal_index, :, :]\n    sagittal_seg = seg.transpose([2,0,1])\n    \n    coronal_seg = np.where(coronal_seg[coronal_index, :, :], coronal_seg[coronal_index, :, :], np.nan)\n    axial_seg = np.where(axial_seg[axial_index, :, :], axial_seg[axial_index, :, :], np.nan)\n    sagittal_seg = np.where(sagittal_seg[sagittal_index, :, :], sagittal_seg[sagittal_index, :, :], np.nan)\n\n    # Create subplots for each orientation\n    fig, axes = plt.subplots(1, 3, figsize=(15, 5))\n\n    # Plot coronal orientation\n    axes[0].imshow(coronal_slice, cmap='viridis')\n    axes[0].imshow(coronal_seg, cmap='Set1')\n    axes[0].set_title('Coronal Slice')\n    axes[0].axis('off')\n\n    # Plot axial orientation\n    axes[1].imshow(axial_slice, cmap='viridis')\n    axes[1].imshow(axial_seg, cmap='Set1')\n    axes[1].set_title('Axial Slice')\n    axes[1].axis('off')\n\n    # Plot sagittal orientation\n    axes[2].imshow(sagittal_slice, cmap='viridis')\n    axes[2].imshow(sagittal_seg, cmap='Set1')\n    axes[2].set_title('Sagittal Slice')\n    axes[2].axis('off')\n\n    # Adjust layout\n    plt.tight_layout()\n\n    # Show the plot\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:43:26.717633Z","iopub.execute_input":"2023-08-18T22:43:26.718067Z","iopub.status.idle":"2023-08-18T22:43:26.736192Z","shell.execute_reply.started":"2023-08-18T22:43:26.718036Z","shell.execute_reply":"2023-08-18T22:43:26.73468Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_seg_map(sample_volume, sample_seg)","metadata":{"execution":{"iopub.status.busy":"2023-08-18T22:43:28.154706Z","iopub.execute_input":"2023-08-18T22:43:28.155123Z","iopub.status.idle":"2023-08-18T22:43:29.330049Z","shell.execute_reply.started":"2023-08-18T22:43:28.155091Z","shell.execute_reply":"2023-08-18T22:43:29.328872Z"},"trusted":true},"execution_count":null,"outputs":[]}]}