{"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":"markdown","source":"**PLEASE UPVOTE: https://www.kaggle.com/code/parhammostame/real-3d-interactive-visualization-of-organs?scriptVersionId=140614710**","metadata":{}},{"cell_type":"code","source":"import warnings\nwarnings.simplefilter('ignore')","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:02.51688Z","iopub.execute_input":"2023-08-26T06:35:02.517317Z","iopub.status.idle":"2023-08-26T06:35:02.561319Z","shell.execute_reply.started":"2023-08-26T06:35:02.517282Z","shell.execute_reply":"2023-08-26T06:35:02.560169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_images_path = '/kaggle/input/rsna-2023-abdominal-trauma-detection/train_images'\nsegmentations_path = '/kaggle/input/rsna-2023-abdominal-trauma-detection/segmentations'","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:02.563819Z","iopub.execute_input":"2023-08-26T06:35:02.56474Z","iopub.status.idle":"2023-08-26T06:35:02.57069Z","shell.execute_reply.started":"2023-08-26T06:35:02.564691Z","shell.execute_reply":"2023-08-26T06:35:02.569312Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n\ntrain_images_patient_Ids = os.listdir(train_images_path)\nsegmentations_patient_series_ids = os.listdir(segmentations_path)\n","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:02.572577Z","iopub.execute_input":"2023-08-26T06:35:02.573422Z","iopub.status.idle":"2023-08-26T06:35:02.683359Z","shell.execute_reply.started":"2023-08-26T06:35:02.573378Z","shell.execute_reply":"2023-08-26T06:35:02.681862Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_images_segmentations_exist_paths = []\n\nfor train_images_patient_Id in train_images_patient_Ids:\n    \n    train_images_segmentations_exist_path = os.path.join(train_images_path, train_images_patient_Id )\n    patient_series_ids = os.listdir(train_images_segmentations_exist_path)\n    \n    NOT_EXISTS = True\n\n    for patient_series_id in patient_series_ids:\n\n        for segmentations_patient_series_id in segmentations_patient_series_ids:\n\n            if int(patient_series_id) == int(segmentations_patient_series_id.split('.')[0]):\n                \n                train_images_segmentations_exist_paths.append(train_images_segmentations_exist_path)\n\n                NOT_EXISTS = False\n                \n                print(40 * '=')\n                print(f'PATIENT_ID: {train_images_patient_Id}')\n                print(f'PATIENT_SERIES_ID: {patient_series_id}')\n                print(f'SEGMENTATION_patient_series_ids: {segmentations_patient_series_id.split(\".\")[0]}')\n                print(40 * '=')\n\n#     if NOT_EXISTS:\n#         print(f'{train_images_patient_Id}: PATIENT_SERIES_ID DO NOT EXIST IN SEGMENTATION_patient_series_ids')\n#         print(70 * '-')\n\n","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:02.686402Z","iopub.execute_input":"2023-08-26T06:35:02.687056Z","iopub.status.idle":"2023-08-26T06:35:10.036692Z","shell.execute_reply.started":"2023-08-26T06:35:02.687012Z","shell.execute_reply":"2023-08-26T06:35:10.035715Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_images_segmentations_exist_paths[:10]","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:10.038025Z","iopub.execute_input":"2023-08-26T06:35:10.039138Z","iopub.status.idle":"2023-08-26T06:35:10.048311Z","shell.execute_reply.started":"2023-08-26T06:35:10.039105Z","shell.execute_reply":"2023-08-26T06:35:10.047322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"RANDOM_PATH_INDEX = 0\ntrain_images_random_path = train_images_segmentations_exist_paths[RANDOM_PATH_INDEX]\ntrain_images_random_path","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:10.052389Z","iopub.execute_input":"2023-08-26T06:35:10.053599Z","iopub.status.idle":"2023-08-26T06:35:10.065648Z","shell.execute_reply.started":"2023-08-26T06:35:10.053551Z","shell.execute_reply":"2023-08-26T06:35:10.06458Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"segmentation_dict = {}\nsegmentation_dict['segmentation_class_to_inx'] = {'background': 0, 'liver': 1, 'spleen': 2, 'kidney_left': 3, 'kidney_right': 4, 'bowel': 5}","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:10.067166Z","iopub.execute_input":"2023-08-26T06:35:10.067976Z","iopub.status.idle":"2023-08-26T06:35:10.083501Z","shell.execute_reply.started":"2023-08-26T06:35:10.067939Z","shell.execute_reply":"2023-08-26T06:35:10.0819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"patient_series_ids = os.listdir(train_images_random_path)\npatient_series_ids","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:10.086076Z","iopub.execute_input":"2023-08-26T06:35:10.087403Z","iopub.status.idle":"2023-08-26T06:35:10.108424Z","shell.execute_reply.started":"2023-08-26T06:35:10.087351Z","shell.execute_reply":"2023-08-26T06:35:10.106441Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"segmentations_patient_series_ids = os.listdir(segmentations_path)\nsegmentations_patient_series_ids[:20]","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:10.110312Z","iopub.execute_input":"2023-08-26T06:35:10.110817Z","iopub.status.idle":"2023-08-26T06:35:10.12713Z","shell.execute_reply.started":"2023-08-26T06:35:10.110782Z","shell.execute_reply":"2023-08-26T06:35:10.125801Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import nibabel as nib\nimport numpy as np\n\ndef create_3D_segmentations(nii_path, downsample_rate=2):\n    \n    img = nib.load(nii_path).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    img = img[::downsample_rate, ::downsample_rate, ::downsample_rate]\n    \n    return img","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:10.132959Z","iopub.execute_input":"2023-08-26T06:35:10.133385Z","iopub.status.idle":"2023-08-26T06:35:10.448813Z","shell.execute_reply.started":"2023-08-26T06:35:10.133352Z","shell.execute_reply":"2023-08-26T06:35:10.44763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def one_hot_3d(volume_nii, segmentation_class_to_inx=None):\n    \n    if segmentation_class_to_inx is None:\n        segmentation_class_to_inx = {key: key for key in np.unique(volume_nii.flatten())}\n        \n    volume_nii_segmentations = {}\n    for key, val in segmentation_class_to_inx.items():\n        volume_nii_segmentations[key] = (volume_nii == val).astype(np.int8)\n        \n    return volume_nii_segmentations","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:10.449929Z","iopub.execute_input":"2023-08-26T06:35:10.45024Z","iopub.status.idle":"2023-08-26T06:35:10.457253Z","shell.execute_reply.started":"2023-08-26T06:35:10.450197Z","shell.execute_reply":"2023-08-26T06:35:10.456131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"volume_niis = [None] * len(patient_series_ids)\nRANDOM_NIIS_INDEX = 0\n    \nnii_paths = [os.path.join(segmentations_path, patient_series_id + '.nii') for patient_series_id in patient_series_ids]\nfor i, (patient_series_id, nii_path) in enumerate( zip(patient_series_ids, nii_paths) ):\n    \n    volume_niis[i] = create_3D_segmentations(nii_path, downsample_rate=2)\n        \nvolume_niis_len = len(volume_niis)\nif RANDOM_NIIS_INDEX < volume_niis_len:\n        \n    volume_nii_segmentations = one_hot_3d(volume_niis[RANDOM_NIIS_INDEX], segmentation_class_to_inx=segmentation_dict['segmentation_class_to_inx'])","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:10.458777Z","iopub.execute_input":"2023-08-26T06:35:10.459184Z","iopub.status.idle":"2023-08-26T06:35:16.533125Z","shell.execute_reply.started":"2023-08-26T06:35:10.459144Z","shell.execute_reply":"2023-08-26T06:35:16.531324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import ipywidgets as widgets\nimport matplotlib.pyplot as plt\n\ndef rotate_axis(h_angle=0, v_angle=0):\n    \n    fig = plt.figure()\n    \n    ax = fig.add_subplot(projection='3d')\n#     cm = plt.colormaps['Accent']\n    cm = plt.cm.get_cmap('Dark2')\n    \n    for i, k in enumerate( list(segmentation_dict['segmentation_class_to_inx'].keys())[1:] ):\n        \n        volume_nii_segmentation = volume_nii_segmentations[k]\n        z, x, y = np.where(volume_nii_segmentation == 1)\n        xs = volume_nii_segmentation.shape[1] - x[::-40]\n        ys = y[::40]\n        zs = volume_nii_segmentation.shape[0] - z[::40]\n        ax.scatter(\n            xs, \n            ys,  \n            zs,\n            s=4,\n            alpha=0.1,\n            color=cm.colors[i + 3], marker=i) \n        \n    _ = ax.set_zlim([0, volume_nii_segmentation.shape[0]])\n    _ = ax.set_xlim([0, volume_nii_segmentation.shape[1]])\n    _ = ax.set_ylim([0, volume_nii_segmentation.shape[2]])\n    \n    ax.set_xlabel('X')\n    ax.set_ylabel('Y')\n    \n    plt.show()\n    \n    ax.view_init(v_angle, h_angle)\n    \nhangle = widgets.IntSlider(0, -180, 180, 10)\nvangle = widgets.IntSlider(0, -180, 180, 10)\n\n_ = widgets.interact(rotate_axis, h_angle=hangle, v_angle=vangle)","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:16.535282Z","iopub.execute_input":"2023-08-26T06:35:16.535769Z","iopub.status.idle":"2023-08-26T06:35:17.750149Z","shell.execute_reply.started":"2023-08-26T06:35:16.535719Z","shell.execute_reply":"2023-08-26T06:35:17.748799Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\ntrain = pd.read_csv('/kaggle/input/rsna-2023-abdominal-trauma-detection/train.csv')\ntrain.head(2)","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:17.751951Z","iopub.execute_input":"2023-08-26T06:35:17.752442Z","iopub.status.idle":"2023-08-26T06:35:17.803376Z","shell.execute_reply.started":"2023-08-26T06:35:17.7524Z","shell.execute_reply":"2023-08-26T06:35:17.801933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features = [col for col in train.columns if col != 'patient_id']\nfeatures","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:17.804857Z","iopub.execute_input":"2023-08-26T06:35:17.805229Z","iopub.status.idle":"2023-08-26T06:35:17.813902Z","shell.execute_reply.started":"2023-08-26T06:35:17.805182Z","shell.execute_reply":"2023-08-26T06:35:17.812664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.read_csv('/kaggle/input/rsna-2023-abdominal-trauma-detection/sample_submission.csv')\nsubmission[features] = train[features].mean().tolist()\n\nfor feature in features:\n    if feature.split('_')[1] == 'low' or feature == 'bowel_injury':\n        submission[feature] *= 4\n    elif feature.split('_')[1] == 'high':\n        submission[feature] *= 6\n    elif feature.split('_')[1] == 'injury' and feature != 'bowel_injury':\n        submission[feature] *= 24\n        \n\nsubmission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:17.815929Z","iopub.execute_input":"2023-08-26T06:35:17.81658Z","iopub.status.idle":"2023-08-26T06:35:17.851796Z","shell.execute_reply.started":"2023-08-26T06:35:17.816537Z","shell.execute_reply":"2023-08-26T06:35:17.850627Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pd.DataFrame(submission)","metadata":{"execution":{"iopub.status.busy":"2023-08-26T06:35:17.853451Z","iopub.execute_input":"2023-08-26T06:35:17.853825Z","iopub.status.idle":"2023-08-26T06:35:17.875689Z","shell.execute_reply.started":"2023-08-26T06:35:17.853794Z","shell.execute_reply":"2023-08-26T06:35:17.874434Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}