{"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 numpy as np\nimport pandas as pd\nfrom pathlib import Path\nimport plotly.express as px\nimport plotly.graph_objects as go","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:20.815145Z","iopub.execute_input":"2023-07-31T21:06:20.815768Z","iopub.status.idle":"2023-07-31T21:06:20.823266Z","shell.execute_reply.started":"2023-07-31T21:06:20.81573Z","shell.execute_reply":"2023-07-31T21:06:20.821117Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# read DataFrames\nsrc = Path('/kaggle/input/rsna-2023-abdominal-trauma-detection')\n\ndf_image_level_labels = pd.read_csv(src / 'image_level_labels.csv')\ndf_sample_submission = pd.read_csv(src / 'sample_submission.csv')\ndf_test_series_meta = pd.read_csv(src / 'test_series_meta.csv')\ndf_train = pd.read_csv(src / 'train.csv')\ndf_train_series_meta = pd.read_csv(src / 'train_series_meta.csv')","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:20.826775Z","iopub.execute_input":"2023-07-31T21:06:20.828429Z","iopub.status.idle":"2023-07-31T21:06:20.9318Z","shell.execute_reply.started":"2023-07-31T21:06:20.828374Z","shell.execute_reply":"2023-07-31T21:06:20.93026Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# DataFrames","metadata":{}},{"cell_type":"code","source":"df_train.head(10)","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:20.935695Z","iopub.execute_input":"2023-07-31T21:06:20.937192Z","iopub.status.idle":"2023-07-31T21:06:20.971733Z","shell.execute_reply.started":"2023-07-31T21:06:20.937136Z","shell.execute_reply":"2023-07-31T21:06:20.970468Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"organs1 = ['bowel', 'extravasation']\norgans2 = ['kidney', 'liver', 'spleen']\n\nx = organs1 + organs2\nfig = go.Figure(go.Bar(x=x, y=[df_train[o + '_healthy'].sum() for o in organs1 + organs2], name='healthy'))\nfig.add_trace(go.Bar(x=x, y=[df_train[o + '_injury'].sum() for o in organs1] + [0, 0, 0], name='injury'))\nfig.add_trace(go.Bar(x=x, y=[0, 0] + [df_train[o + '_low'].sum() for o in organs2], name='low'))\nfig.add_trace(go.Bar(x=x, y=[0, 0] + [df_train[o + '_high'].sum() for o in organs2], name='high'))\n\nfig.update_layout(barmode='stack', xaxis={'categoryorder':'array', 'categoryarray':x},\n                 title='Histogram of injury in the train DataFrame')\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:20.973844Z","iopub.execute_input":"2023-07-31T21:06:20.974769Z","iopub.status.idle":"2023-07-31T21:06:21.216648Z","shell.execute_reply.started":"2023-07-31T21:06:20.97472Z","shell.execute_reply":"2023-07-31T21:06:21.215048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_series_meta.head(10)","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:21.220816Z","iopub.execute_input":"2023-07-31T21:06:21.222021Z","iopub.status.idle":"2023-07-31T21:06:21.238405Z","shell.execute_reply.started":"2023-07-31T21:06:21.221974Z","shell.execute_reply":"2023-07-31T21:06:21.237085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_image_level_labels.head(10)","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:21.24004Z","iopub.execute_input":"2023-07-31T21:06:21.241001Z","iopub.status.idle":"2023-07-31T21:06:21.261745Z","shell.execute_reply.started":"2023-07-31T21:06:21.240954Z","shell.execute_reply":"2023-07-31T21:06:21.260287Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test_series_meta.head(10)","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:21.263762Z","iopub.execute_input":"2023-07-31T21:06:21.264271Z","iopub.status.idle":"2023-07-31T21:06:21.287842Z","shell.execute_reply.started":"2023-07-31T21:06:21.264224Z","shell.execute_reply":"2023-07-31T21:06:21.286494Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_sample_submission.head(10)","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:21.289842Z","iopub.execute_input":"2023-07-31T21:06:21.290295Z","iopub.status.idle":"2023-07-31T21:06:21.319613Z","shell.execute_reply.started":"2023-07-31T21:06:21.290254Z","shell.execute_reply":"2023-07-31T21:06:21.318131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dicom Files","metadata":{}},{"cell_type":"code","source":"import pydicom\nimport xarray as xr\nimport plotly.express as px","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:21.32136Z","iopub.execute_input":"2023-07-31T21:06:21.322023Z","iopub.status.idle":"2023-07-31T21:06:21.490016Z","shell.execute_reply.started":"2023-07-31T21:06:21.321986Z","shell.execute_reply":"2023-07-31T21:06:21.488881Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"patient_id = '34409'\nseries_id = '10252'\n\nimgs = []\nfiles = sorted(\n    list((src / 'train_images' / patient_id / series_id).glob('*.dcm')),\n    key=lambda x: int(x.stem)\n)\nfor f in files:\n    imgs.append(pydicom.dcmread(f).pixel_array)\nimgs = np.stack(imgs)","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:21.491396Z","iopub.execute_input":"2023-07-31T21:06:21.492001Z","iopub.status.idle":"2023-07-31T21:06:23.624773Z","shell.execute_reply.started":"2023-07-31T21:06:21.491968Z","shell.execute_reply":"2023-07-31T21:06:23.623423Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"xarr_imgs = xr.DataArray(\n    imgs[::len(imgs)//50],\n    dims = ['file', 'height', 'width'],\n    coords = [\n        [f.name for f in files][::len(imgs)//50],\n        [i for i in range(512)],\n        [i for i in range(512)],\n    ]\n)","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:23.626591Z","iopub.execute_input":"2023-07-31T21:06:23.626994Z","iopub.status.idle":"2023-07-31T21:06:23.63543Z","shell.execute_reply.started":"2023-07-31T21:06:23.62696Z","shell.execute_reply":"2023-07-31T21:06:23.634178Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = px.imshow(\n    xarr_imgs, animation_frame='file',\n    width=600, height=600,\n)\nfig.update_layout(title=f'patient_id = {patient_id}, series_id = {series_id}')\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:23.637329Z","iopub.execute_input":"2023-07-31T21:06:23.637895Z","iopub.status.idle":"2023-07-31T21:06:27.770837Z","shell.execute_reply.started":"2023-07-31T21:06:23.637848Z","shell.execute_reply":"2023-07-31T21:06:27.769933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Segmentations","metadata":{}},{"cell_type":"code","source":"import shutil\nimport nibabel as nib","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:27.772086Z","iopub.execute_input":"2023-07-31T21:06:27.772916Z","iopub.status.idle":"2023-07-31T21:06:27.942327Z","shell.execute_reply.started":"2023-07-31T21:06:27.772882Z","shell.execute_reply":"2023-07-31T21:06:27.941258Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"src = Path('/kaggle/input/rsna-2023-abdominal-trauma-detection')\nworking = Path('/kaggle/working')\nmask_file = '10252'\n\nshutil.copy(src / 'segmentations' / mask_file, working / f'{mask_file}.nii')\nmasks = nib.load(working / f'{mask_file}.nii').get_fdata()\nmasks = masks.transpose((2, 1, 0))[::-1, ::-1, :]","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:27.946077Z","iopub.execute_input":"2023-07-31T21:06:27.947025Z","iopub.status.idle":"2023-07-31T21:06:28.767704Z","shell.execute_reply.started":"2023-07-31T21:06:27.946989Z","shell.execute_reply":"2023-07-31T21:06:28.766399Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dicom_path = list((src / 'train_images').glob(f'*/{mask_file}'))[0]\npatient_id, series_id = dicom_path.parent.name, dicom_path.name\nprint(patient_id, series_id)","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:28.769336Z","iopub.execute_input":"2023-07-31T21:06:28.769725Z","iopub.status.idle":"2023-07-31T21:06:35.673508Z","shell.execute_reply.started":"2023-07-31T21:06:28.769692Z","shell.execute_reply":"2023-07-31T21:06:35.672123Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"imgs = []\nfiles = sorted(\n    list((src / 'train_images' / patient_id / series_id).glob('*.dcm')),\n    key=lambda x: int(x.stem)\n)\nfor f in files:\n    imgs.append(pydicom.dcmread(f).pixel_array)\nimgs = np.stack(imgs)","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:35.675199Z","iopub.execute_input":"2023-07-31T21:06:35.676453Z","iopub.status.idle":"2023-07-31T21:06:37.19334Z","shell.execute_reply.started":"2023-07-31T21:06:35.676404Z","shell.execute_reply":"2023-07-31T21:06:37.192115Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"xarr_imgs = xr.DataArray(\n    imgs[::len(imgs)//50],\n    dims = ['file', 'height', 'width'],\n    coords = [\n        [f.name for f in files][::len(imgs)//50],\n        [i for i in range(512)],\n        [i for i in range(512)],\n    ]\n)\n\nxarr_mask = xr.DataArray(\n    masks[::len(masks)//50],\n    dims = ['file', 'height', 'width'],\n    coords = [\n        [f.name for f in files][::len(imgs)//50],\n        [i for i in range(512)],\n        [i for i in range(512)],\n    ]\n)","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:37.194692Z","iopub.execute_input":"2023-07-31T21:06:37.195105Z","iopub.status.idle":"2023-07-31T21:06:37.208697Z","shell.execute_reply.started":"2023-07-31T21:06:37.195072Z","shell.execute_reply":"2023-07-31T21:06:37.207372Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = px.imshow(\n    xarr_mask, animation_frame='file',\n    width=600, height=600,\n)\nfig.update_layout(title=f'Segmentation Mask patient_id = {patient_id}, series_id = {series_id}')\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:37.210472Z","iopub.execute_input":"2023-07-31T21:06:37.210844Z","iopub.status.idle":"2023-07-31T21:06:39.890565Z","shell.execute_reply.started":"2023-07-31T21:06:37.210813Z","shell.execute_reply":"2023-07-31T21:06:39.889059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from plotly.subplots import make_subplots\nimport plotly.graph_objects as go\n\nfrom skimage import data, filters, measure\n\nvis_idx = ['38.dcm', '64.dcm', '93.dcm', '108.dcm']\n\nlabel2color = {\n    1: 'darkviolet',\n    2: 'lightblue',\n    3: 'lime',\n    4: 'silver',\n    5: 'pink',\n}\n\nfig = make_subplots(\n        rows=2, cols=2,\n        subplot_titles=vis_idx)\n\nfor i, idx in enumerate(vis_idx):\n    \n    img = xarr_imgs.loc[idx].to_numpy()\n    mask = xarr_mask.loc[idx].to_numpy()\n    \n    fig.add_trace(px.imshow(img).data[0], row=1+i//2, col=1+i%2)\n\n    for label in range(1, 6):\n        contours = measure.find_contours(mask == label, 0.5)\n        hoverinfo = \"<br>\".join([f\"label: {label}\"])\n        for contour in contours:\n            y, x = contour.T\n            fig.add_scatter(\n                    x=x,\n                    y=y,\n                    mode=\"lines\",\n                    fill=\"toself\",\n                    fillcolor=label2color[label],\n                    showlegend=False,\n                    opacity=0.5,\n                    hovertemplate=hoverinfo,\n                    hoveron=\"points+fills\",\n                    row=1+i//2, col=1+i%2\n                )\nfig.update_layout(height=800, width=800, \n                  title_text=f\"Dicom patient_id = {patient_id}, series_id = {series_id} with Segmentation Mask\")\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-31T21:06:39.89193Z","iopub.execute_input":"2023-07-31T21:06:39.892337Z","iopub.status.idle":"2023-07-31T21:06:41.203431Z","shell.execute_reply.started":"2023-07-31T21:06:39.892303Z","shell.execute_reply":"2023-07-31T21:06:41.201842Z"},"trusted":true},"execution_count":null,"outputs":[]}]}