{"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":"# plot subjects & outliers\n\nThis notebook is used to plot certain StudyInstance, and find outliers manually  \nPlease let me know in the comments if I've done something wrong.  \nIt will be great if you have other outliers to share.  \n\nThank you\n\n## EDITS\nThanks to [SolverWorld](https://www.kaggle.com/solverworld)'s comment, I've changed ```apply_voi_lut``` into ```manual_convert``` as in cell 6. I've also removed those that were not actually outliers from the list.","metadata":{}},{"cell_type":"markdown","source":"### installs & imports","metadata":{}},{"cell_type":"code","source":"!pip install \"python-gdcm\" pydicom pylibjpeg","metadata":{"execution":{"iopub.status.busy":"2022-09-28T23:33:52.556859Z","iopub.execute_input":"2022-09-28T23:33:52.557297Z","iopub.status.idle":"2022-09-28T23:34:07.229349Z","shell.execute_reply.started":"2022-09-28T23:33:52.557207Z","shell.execute_reply":"2022-09-28T23:34:07.22776Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pydicom\n# from pydicom.pixel_data_handlers.util import apply_voi_lut\nimport nibabel as nib\nimport os\nimport numpy as np\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt\nimport matplotlib.animation as animation\nfrom IPython.display import HTML","metadata":{"execution":{"iopub.status.busy":"2022-09-28T23:34:07.232494Z","iopub.execute_input":"2022-09-28T23:34:07.233336Z","iopub.status.idle":"2022-09-28T23:34:07.593921Z","shell.execute_reply.started":"2022-09-28T23:34:07.233274Z","shell.execute_reply":"2022-09-28T23:34:07.592711Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### small experiment I did to make sure if ImagePositionPatient is reliable","metadata":{}},{"cell_type":"code","source":"# increasing = []\n# UIDs = os.listdir('../input/rsna-2022-cervical-spine-fracture-detection/train_images')\n# for UID in (tqdm(UIDs)):\n#     dcm_dir =f'../input/rsna-2022-cervical-spine-fracture-detection/train_images/{UID}'\n#     dcm_files = sorted(os.listdir(dcm_dir), key= lambda x: int(x.rstrip('.dcm')))\n#     datasets = [pydicom.dcmread(os.path.join(dcm_dir,dcm_files[i])) for i in [0,-1]]\n#     #print(f'{iter_}/{len(UIDs)}, {datasets[0].ImagePositionPatient}, {datasets[-1].ImagePositionPatient}')\n#     if datasets[0].ImagePositionPatient[2] < datasets[-1].ImagePositionPatient[2] :\n#         increasing.append(UID)","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2022-09-28T23:34:07.59525Z","iopub.execute_input":"2022-09-28T23:34:07.595689Z","iopub.status.idle":"2022-09-28T23:34:07.601305Z","shell.execute_reply.started":"2022-09-28T23:34:07.595629Z","shell.execute_reply":"2022-09-28T23:34:07.600069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# print(len(increasing))\n# print(increasing[168:192])","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2022-09-28T23:34:07.604099Z","iopub.execute_input":"2022-09-28T23:34:07.604467Z","iopub.status.idle":"2022-09-28T23:34:07.612937Z","shell.execute_reply.started":"2022-09-28T23:34:07.604433Z","shell.execute_reply":"2022-09-28T23:34:07.611823Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.figure(figsize=(10,8))\n# for i, UID in enumerate(increasing[192:]):\n#     dcm_dir =f'../input/rsna-2022-cervical-spine-fracture-detection/train_images/{UID}'\n#     dcm_files = sorted(os.listdir(dcm_dir), key= lambda x: int(x.rstrip('.dcm')))\n#     datasets = [pydicom.dcmread(os.path.join(dcm_dir,dcm_files[i])) for i in [10,-10]]\n#     imgs = [apply_voi_lut(dset.pixel_array, dset)[::4,::4] for dset in datasets]\n#     plt.subplot(6,8,2*i+1)\n#     plt.axis('off')\n#     plt.imshow(imgs[0])\n#     plt.subplot(6,8,2*i+2)\n#     plt.axis('off')\n#     plt.imshow(imgs[1])\n# plt.show()","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2022-09-28T23:34:07.614119Z","iopub.execute_input":"2022-09-28T23:34:07.614466Z","iopub.status.idle":"2022-09-28T23:34:07.626539Z","shell.execute_reply.started":"2022-09-28T23:34:07.614434Z","shell.execute_reply":"2022-09-28T23:34:07.625454Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### plotting function\nplots animation of axial view of patient, in C1->C7 order.","metadata":{}},{"cell_type":"code","source":"def manual_convert(arr, dset):\n    return (arr.astype(np.float64)*dset.RescaleSlope + dset.RescaleIntercept).clip(-2000,2000)\n\ndef get_axial_animation(UID: str):\n    dcm_dir =f'../input/rsna-2022-cervical-spine-fracture-detection/train_images/{UID}'\n    dcm_files = sorted(os.listdir(dcm_dir), key= lambda x: int(x.rstrip('.dcm')))\n    datasets = [pydicom.dcmread(os.path.join(dcm_dir,dcm_files[i])) for i in range(1,len(dcm_files),2)]\n    # re-order using ImagePositionPatient\n    if datasets[0].ImagePositionPatient[2] < datasets[-1].ImagePositionPatient[2]:\n        imgs = [manual_convert(dset.pixel_array,dset)[::4,::4] for dset in reversed(datasets)]\n    else:\n        imgs = [manual_convert(dset.pixel_array,dset)[::4,::4] for dset in datasets]\n    fig = plt.figure()\n    imgs = [[plt.imshow(img,cmap='gray',animated=True)] for img in imgs]\n    ani = animation.ArtistAnimation(fig, imgs, interval=500, repeat_delay=1000, blit=True)\n    return ani\n\ndef get_axial_segmentation_animation(UID: str):\n    nii_dir =f'../input/rsna-2022-cervical-spine-fracture-detection/segmentations/{UID}.nii'\n    imgs = nib.load(nii_dir).get_fdata()[:,::-1,::-1].transpose(2,1,0)\n    fig = plt.figure()\n    imgs = [[plt.imshow(img[::4,::4],cmap='gray',animated=True)] for img in imgs[::2]]\n    ani = animation.ArtistAnimation(fig, imgs, interval=500, repeat_delay=1000, blit=True)\n    return ani","metadata":{"execution":{"iopub.status.busy":"2022-09-28T23:34:07.62845Z","iopub.execute_input":"2022-09-28T23:34:07.628944Z","iopub.status.idle":"2022-09-28T23:34:07.642962Z","shell.execute_reply.started":"2022-09-28T23:34:07.628911Z","shell.execute_reply":"2022-09-28T23:34:07.641467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Outliers I've found & sample plot","metadata":{}},{"cell_type":"code","source":"# weird samples\n# 1.2.826.0.1.3680043.20574 does not contain full cervical spine\n# 1.2.826.0.1.3680043.20756 duplicated slice\n# 1.2.826.0.1.3680043.29952 head-up pose?\n# 1.2.826.0.1.3680043.8362 head-up pose\n\n# ones with 700+ size : 8858, 22678","metadata":{"execution":{"iopub.status.busy":"2022-09-28T23:34:07.644628Z","iopub.execute_input":"2022-09-28T23:34:07.645098Z","iopub.status.idle":"2022-09-28T23:34:07.659588Z","shell.execute_reply.started":"2022-09-28T23:34:07.645065Z","shell.execute_reply":"2022-09-28T23:34:07.658414Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"HTML(get_axial_animation('1.2.826.0.1.3680043.8362').to_jshtml())","metadata":{"execution":{"iopub.status.busy":"2022-09-28T23:34:07.66176Z","iopub.execute_input":"2022-09-28T23:34:07.663263Z","iopub.status.idle":"2022-09-28T23:34:38.896866Z","shell.execute_reply.started":"2022-09-28T23:34:07.663225Z","shell.execute_reply":"2022-09-28T23:34:38.895925Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# HTML(get_axial_segmentation_animation('1.2.826.0.1.3680043.8362').to_jshtml())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### etc ","metadata":{}},{"cell_type":"code","source":"# print(pydicom.dcmread('../input/rsna-2022-cervical-spine-fracture-detection/train_images/1.2.826.0.1.3680043.10001/10.dcm'))","metadata":{"execution":{"iopub.status.busy":"2022-09-27T06:32:03.701719Z","iopub.execute_input":"2022-09-27T06:32:03.702058Z","iopub.status.idle":"2022-09-27T06:32:03.726089Z","shell.execute_reply.started":"2022-09-27T06:32:03.702031Z","shell.execute_reply":"2022-09-27T06:32:03.725365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def manual_convert(arr, dset):\n#     return arr.astype(np.float64)*dset.RescaleSlope + dset.RescaleIntercept\n# mins = []\n# maxs = []\n# means = []\n# # avoid = [20574,20756,29952,8362,   2374,23904,25493,28355,\n# #          8907,8884,29630,14059,24049,8089,19381,16548,27962,14847,31621,18010]\n# avoid = [8858, 22678]\n# plt.figure()\n# for UID in tqdm(os.listdir('../input/rsna-2022-cervical-spine-fracture-detection/train_images')):\n# #     UID = UID.rstrip('.nii')\n#     if int(UID.split('.')[-1]) in avoid:\n#         continue\n#     dcm_files = os.listdir(os.path.join(\n#             '../input/rsna-2022-cervical-spine-fracture-detection/train_images',\n#             UID))\n#     dcm_file = sorted(dcm_files,key=lambda x:int(x.rstrip('.dcm')))[len(dcm_files)//2]\n#     dcm = pydicom.dcmread(os.path.join(\n#         '../input/rsna-2022-cervical-spine-fracture-detection/train_images',\n#         UID,dcm_file))\n#     a = manual_convert(dcm.pixel_array, dcm).flatten()\n#     a = a.clip(-2000, 2000)\n# #     mins.append(np.min(a))\n# #     means.append(np.mean(a))\n# #     maxs.append(np.max(a))\n# #     if np.min(a) < -5000 or np.min(a) > 5000 or np.max(a) > 10000:\n# #         continue\n# #     topcount = np.sum(a > np.min(a)*0.01+np.max(a)*0.99)\n# #     if topcount >= len(a)*0.2 or topcount < len(a)*0.1:\n# #         continue\n# #     a -= np.min(a)\n# #     a /= np.max(a)/256\n# #     print(UID, int(np.min(a)), int(np.mean(a)))\n#     a.sort()\n#     plt.plot(a[::4].copy())\n# # plt.plot(mins)\n# # plt.plot(means)\n# # plt.plot(maxs)\n# plt.show()\n# # 3048 2719 2475","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# HTML(get_axial_animation('1.2.826.0.1.3680043.8884').to_jshtml())","metadata":{"execution":{"iopub.status.busy":"2022-09-27T03:42:09.101873Z","iopub.execute_input":"2022-09-27T03:42:09.102419Z","iopub.status.idle":"2022-09-27T03:42:22.386392Z","shell.execute_reply.started":"2022-09-27T03:42:09.102376Z","shell.execute_reply":"2022-09-27T03:42:22.385127Z"},"trusted":true},"execution_count":null,"outputs":[]}]}