{"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":"Modeling is good. but visualization is still interesting. Let's draw a 3D graph as a time to take a break.\n\nWe just use only 4 cells and 1 class. Let's go.","metadata":{}},{"cell_type":"code","source":"import os\nfrom glob import glob\n\nimport pandas as pd\nimport numpy as np☕️\n\nimport cv2☕️\nimport pydicom # for reading dicom files at train, test datasets\nimport nibabel as nib # for reading nii files at segmentations dataset\nimport matplotlib.pyplot as plt\nplt.style.use('dark_background')","metadata":{"execution":{"iopub.status.busy":"2022-08-01T13:30:08.243562Z","iopub.execute_input":"2022-08-01T13:30:08.244838Z","iopub.status.idle":"2022-08-01T13:30:08.253607Z","shell.execute_reply.started":"2022-08-01T13:30:08.244785Z","shell.execute_reply":"2022-08-01T13:30:08.252455Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_folder = '../input/rsna-2022-cervical-spine-fracture-detection/'\nnii_dir = data_folder + 'segmentations/'","metadata":{"execution":{"iopub.status.busy":"2022-08-01T13:35:29.331728Z","iopub.execute_input":"2022-08-01T13:35:29.332222Z","iopub.status.idle":"2022-08-01T13:35:29.338804Z","shell.execute_reply.started":"2022-08-01T13:35:29.332188Z","shell.execute_reply":"2022-08-01T13:35:29.337006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"nii_paths = glob(nii_dir + '*.nii')\nprint(f'counts: {len(nii_paths)}')\nprint(f'sample: {nii_paths[0]}')","metadata":{"execution":{"iopub.status.busy":"2022-08-01T13:27:53.857169Z","iopub.execute_input":"2022-08-01T13:27:53.858152Z","iopub.status.idle":"2022-08-01T13:27:53.866614Z","shell.execute_reply.started":"2022-08-01T13:27:53.858098Z","shell.execute_reply":"2022-08-01T13:27:53.865351Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class DrawMaskSample():\n    def __init__(self, nii_paths, i, ax):\n        self.i = i\n        self.ax = ax\n        self.nii_sample = nib.load(nii_paths[self.i]).get_fdata()\n        print(f'sample({i+1}) shape: {self.nii_sample.shape}')\n        self.get_xyz()\n        self.draw_sample_3d()\n        \n    def get_xyz(self):\n        self.xyz_li = []\n        cnt = 0\n        max_cnt = self.nii_sample.shape[-1]\n        for iter_z, (iter_img) in enumerate(self.nii_sample.transpose(2,0,1)):\n            for iter_x, iter_arr_y in enumerate(iter_img):\n                iter_arr_y = np.where(iter_arr_y)[0]\n                if len(iter_arr_y) >= 1:\n                    iter_arr_y = list(set([iter_arr_y.max(), iter_arr_y.min()]))\n                    xyz = [(iter_x, iter_y, iter_z) for iter_y in iter_arr_y if np.any(iter_y)]\n                    self.xyz_li.append(xyz)\n            cnt += 1\n            if (cnt % 100 == 0) | (cnt == max_cnt):\n                print(f'iteration: ({cnt} / {max_cnt})')\n\n    def draw_sample_3d(self):\n        xyz_matrix = np.array(list(itertools.chain.from_iterable(self.xyz_li)))\n        X = xyz_matrix[:,0]\n        Y = xyz_matrix[:,1]\n        Z = xyz_matrix[:,2]\n\n        self.ax.scatter(X, Y, Z, s=1, alpha=0.04, color='beige')\n        xlim, ylim, zlim = self.nii_sample.shape\n        self.ax.set_xlim(0, xlim)\n        self.ax.set_ylim(0, ylim)\n        self.ax.set_zlim(0, zlim)\n        self.ax.set_title(f'sample - ({self.i+1})')","metadata":{"execution":{"iopub.status.busy":"2022-08-01T13:30:14.376469Z","iopub.execute_input":"2022-08-01T13:30:14.376835Z","iopub.status.idle":"2022-08-01T13:30:14.394782Z","shell.execute_reply.started":"2022-08-01T13:30:14.376804Z","shell.execute_reply":"2022-08-01T13:30:14.393509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = plt.figure(figsize=(16,16))\nfor i in range(9):\n    ax = fig.add_subplot(int(f'33{i+1}'), projection='3d')\n    DrawMaskSample(nii_paths, i, ax)\n\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-01T13:30:16.463859Z","iopub.execute_input":"2022-08-01T13:30:16.464616Z","iopub.status.idle":"2022-08-01T13:30:57.646661Z","shell.execute_reply.started":"2022-08-01T13:30:16.46458Z","shell.execute_reply":"2022-08-01T13:30:57.64546Z"},"trusted":true},"execution_count":null,"outputs":[]}]}