{"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":"!pip uninstall keras -y\n!pip install git+https://github.com/qubvel/segmentation_models\n!git clone https://github.com/SlinkoIgor/ImageDataAugmentor.git\n    ","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:33:34.821078Z","iopub.execute_input":"2021-08-03T11:33:34.821453Z","iopub.status.idle":"2021-08-03T11:33:46.688396Z","shell.execute_reply.started":"2021-08-03T11:33:34.82142Z","shell.execute_reply":"2021-08-03T11:33:46.687404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# training images}","metadata":{}},{"cell_type":"code","source":"import nibabel as nib\nimport skimage.io as io\nimport numpy as np\nimg_tr=nib.load('/kaggle/input/segmentation-data/tr_im.nii')\nimg_tr_arr=img_tr.get_fdata()\nimg_tr_arr=np.squeeze(img_tr_arr)\nimg_tr_arr.shape","metadata":{"execution":{"iopub.status.busy":"2021-08-03T10:48:03.465138Z","iopub.execute_input":"2021-08-03T10:48:03.465411Z","iopub.status.idle":"2021-08-03T10:48:04.01489Z","shell.execute_reply.started":"2021-08-03T10:48:03.465382Z","shell.execute_reply":"2021-08-03T10:48:04.014192Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training masks","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt","metadata":{"execution":{"iopub.status.busy":"2021-07-22T05:26:08.210355Z","iopub.execute_input":"2021-07-22T05:26:08.212847Z","iopub.status.idle":"2021-07-22T05:26:08.219105Z","shell.execute_reply.started":"2021-07-22T05:26:08.212791Z","shell.execute_reply":"2021-07-22T05:26:08.218022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(img_tr_arr[:,:,12])","metadata":{"execution":{"iopub.status.busy":"2021-07-22T05:26:08.224155Z","iopub.execute_input":"2021-07-22T05:26:08.22658Z","iopub.status.idle":"2021-07-22T05:26:08.504552Z","shell.execute_reply.started":"2021-07-22T05:26:08.226541Z","shell.execute_reply":"2021-07-22T05:26:08.503661Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import nibabel as nib\nimport skimage.io as io\nimport numpy as np\nimg_mask=nib.load('/kaggle/input/segmentation-data/tr_mask.nii')\nimg_mask_arr=img_mask.get_fdata()\nimg_mask_arr=np.squeeze(img_mask_arr)\nimg_mask_arr.shape","metadata":{"execution":{"iopub.status.busy":"2021-07-22T05:26:08.508923Z","iopub.execute_input":"2021-07-22T05:26:08.511597Z","iopub.status.idle":"2021-07-22T05:26:08.53056Z","shell.execute_reply.started":"2021-07-22T05:26:08.511544Z","shell.execute_reply":"2021-07-22T05:26:08.529596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(img_mask_arr[:,:,12])","metadata":{"execution":{"iopub.status.busy":"2021-07-22T05:26:08.535366Z","iopub.execute_input":"2021-07-22T05:26:08.538082Z","iopub.status.idle":"2021-07-22T05:26:08.774118Z","shell.execute_reply.started":"2021-07-22T05:26:08.538032Z","shell.execute_reply":"2021-07-22T05:26:08.772705Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import json","metadata":{"execution":{"iopub.status.busy":"2021-07-22T05:26:08.776213Z","iopub.execute_input":"2021-07-22T05:26:08.776513Z","iopub.status.idle":"2021-07-22T05:26:08.783462Z","shell.execute_reply.started":"2021-07-22T05:26:08.776484Z","shell.execute_reply":"2021-07-22T05:26:08.779368Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"j = open('/kaggle/input/jsonnew/959830.json')\ndata = json.load(j)","metadata":{"execution":{"iopub.status.busy":"2021-07-22T05:26:08.785321Z","iopub.execute_input":"2021-07-22T05:26:08.785724Z","iopub.status.idle":"2021-07-22T05:26:08.810757Z","shell.execute_reply.started":"2021-07-22T05:26:08.785676Z","shell.execute_reply":"2021-07-22T05:26:08.809935Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        #print(os.path.join(dirname, filename))\n\n# You can write up to 5GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-07-22T05:26:08.812382Z","iopub.execute_input":"2021-07-22T05:26:08.812875Z","iopub.status.idle":"2021-07-22T05:26:08.819758Z","shell.execute_reply.started":"2021-07-22T05:26:08.812838Z","shell.execute_reply":"2021-07-22T05:26:08.81831Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os \nimport numpy as np\nimport pandas as pd","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:33:46.690499Z","iopub.execute_input":"2021-08-03T11:33:46.690894Z","iopub.status.idle":"2021-08-03T11:33:46.696722Z","shell.execute_reply.started":"2021-08-03T11:33:46.690843Z","shell.execute_reply":"2021-08-03T11:33:46.694656Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prefix = '/kaggle/input/covid-segmentation/'\n\nimages_radiopedia = np.load(os.path.join(prefix, 'images_radiopedia.npy')).astype(np.float32)\nmasks_radiopedia = np.load(os.path.join(prefix, 'masks_radiopedia.npy')).astype(np.int8)\nimages_medseg = np.load(os.path.join(prefix, 'images_medseg.npy')).astype(np.float32)\nmasks_medseg = np.load(os.path.join(prefix, 'masks_medseg.npy')).astype(np.int8)\n\ntest_images_medseg = np.load(os.path.join(prefix, 'test_images_medseg.npy')).astype(np.float32)","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:33:46.698631Z","iopub.execute_input":"2021-08-03T11:33:46.698987Z","iopub.status.idle":"2021-08-03T11:34:04.569729Z","shell.execute_reply.started":"2021-08-03T11:33:46.698948Z","shell.execute_reply":"2021-08-03T11:34:04.568685Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport numpy as np\n\n\ndef visualize(image_batch, mask_batch=None, pred_batch=None, num_samples=2):\n    num_classes = mask_batch.shape[-1] if mask_batch is not None else 0\n    fix, ax = plt.subplots(num_classes + 1, num_samples, figsize=(num_samples * 2, (num_classes + 1) * 2))\n\n    for i in range(num_samples):\n        ax_image = ax[0, i] if num_classes > 0 else ax[i]\n        ax_image.imshow(image_batch[i,:,:,0], cmap='Greys')\n        ax_image.set_xticks([]) \n        ax_image.set_yticks([])\n        \n        if mask_batch is not None:\n            for j in range(num_classes):\n                if pred_batch is None:\n                    mask_to_show = mask_batch[i,:,:,j]\n                else:\n                    mask_to_show = np.zeros(shape=(*mask_batch.shape[1:-1], 3)) \n                    mask_to_show[..., 0] = pred_batch[i,:,:,j] > 0.5\n                    mask_to_show[..., 1] = mask_batch[i,:,:,j]\n                ax[j + 1, i].imshow(mask_to_show, vmin=0, vmax=1)\n                ax[j + 1, i].set_xticks([]) \n                ax[j + 1, i].set_yticks([]) \n\n    plt.tight_layout()\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:04.571163Z","iopub.execute_input":"2021-08-03T11:34:04.571512Z","iopub.status.idle":"2021-08-03T11:34:04.587951Z","shell.execute_reply.started":"2021-08-03T11:34:04.571475Z","shell.execute_reply":"2021-08-03T11:34:04.587228Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Images from radiopedia are full CT volumes:\nClass 0 is \"ground glass\"<br>\nClass 1 is \"consolidations\"<br>\nClass 2 is \"lungs other\" – it doesn't mean that it is healthy lungs (you don't need to predict this class)<br>\nClass 3 is \"background\" – not lungs (you don't need to predict this class)<br>","metadata":{}},{"cell_type":"code","source":"images_radiopedia.shape","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:04.591333Z","iopub.execute_input":"2021-08-03T11:34:04.591908Z","iopub.status.idle":"2021-08-03T11:34:04.598515Z","shell.execute_reply.started":"2021-08-03T11:34:04.591869Z","shell.execute_reply":"2021-08-03T11:34:04.597637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(images_radiopedia[100,:,:,0])","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:04.601858Z","iopub.execute_input":"2021-08-03T11:34:04.602239Z","iopub.status.idle":"2021-08-03T11:34:04.812027Z","shell.execute_reply.started":"2021-08-03T11:34:04.6022Z","shell.execute_reply":"2021-08-03T11:34:04.811145Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"visualize(images_radiopedia[20:], masks_radiopedia[20:])","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:04.813281Z","iopub.execute_input":"2021-08-03T11:34:04.813654Z","iopub.status.idle":"2021-08-03T11:34:05.378432Z","shell.execute_reply.started":"2021-08-03T11:34:04.813615Z","shell.execute_reply":"2021-08-03T11:34:05.377611Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Images from medseg are individual axial slices:\nClasses are same as in radiopedia part","metadata":{}},{"cell_type":"markdown","source":"### Images from radiopedia are full CT volumes:\nClass 0 is \"ground glass\"<br>\nClass 1 is \"consolidations\"<br>\nClass 2 is \"lungs other\" – it doesn't mean that it is healthy lungs (you don't need to predict this class)<br>\nClass 3 is \"background\" – not lungs (you don't need to predict this class)<br>","metadata":{}},{"cell_type":"code","source":"visualize(images_medseg, masks_medseg)","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:05.379809Z","iopub.execute_input":"2021-08-03T11:34:05.380181Z","iopub.status.idle":"2021-08-03T11:34:05.866188Z","shell.execute_reply.started":"2021-08-03T11:34:05.380141Z","shell.execute_reply":"2021-08-03T11:34:05.86531Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Test images from medseg are individual axial slices:\nYou should make predictions for class 0 \"ground glass\" and class 1 \"consolidation\"","metadata":{}},{"cell_type":"code","source":"visualize(test_images_medseg)","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:05.867604Z","iopub.execute_input":"2021-08-03T11:34:05.867952Z","iopub.status.idle":"2021-08-03T11:34:05.981636Z","shell.execute_reply.started":"2021-08-03T11:34:05.867916Z","shell.execute_reply":"2021-08-03T11:34:05.98081Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(test_images_medseg[9,:,:,0])","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:05.982951Z","iopub.execute_input":"2021-08-03T11:34:05.983321Z","iopub.status.idle":"2021-08-03T11:34:06.13682Z","shell.execute_reply.started":"2021-08-03T11:34:05.983283Z","shell.execute_reply":"2021-08-03T11:34:06.135951Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_hists(images1, images2=None):\n    plt.hist(images1.ravel(), bins=100, density=True, color='b', alpha=1 if images2 is None else 0.5)\n    if images2 is not None:\n        plt.hist(images2.ravel(), bins=100, density=True, alpha=0.5, color='orange')\n    plt.show();","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:06.138456Z","iopub.execute_input":"2021-08-03T11:34:06.138812Z","iopub.status.idle":"2021-08-03T11:34:06.146613Z","shell.execute_reply.started":"2021-08-03T11:34:06.138773Z","shell.execute_reply":"2021-08-03T11:34:06.145568Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Plot images hists:\nHU (Hounsfield scale) of radiopedia data (blue) vs medseg data (orange):","metadata":{}},{"cell_type":"code","source":"plot_hists(images_radiopedia, images_medseg)","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:06.148343Z","iopub.execute_input":"2021-08-03T11:34:06.148831Z","iopub.status.idle":"2021-08-03T11:34:09.520096Z","shell.execute_reply.started":"2021-08-03T11:34:06.148793Z","shell.execute_reply":"2021-08-03T11:34:09.519356Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"HU (Hounsfield scale) of test medseg data (blue) vs medseg data (orange):","metadata":{}},{"cell_type":"code","source":"plot_hists(test_images_medseg, images_medseg)","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:09.521538Z","iopub.execute_input":"2021-08-03T11:34:09.521887Z","iopub.status.idle":"2021-08-03T11:34:10.666227Z","shell.execute_reply.started":"2021-08-03T11:34:09.521858Z","shell.execute_reply":"2021-08-03T11:34:10.665366Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Preprocess images:","metadata":{}},{"cell_type":"code","source":"def preprocess_images(images_arr, mean_std=None):\n    images_arr[images_arr > 500] = 500\n    images_arr[images_arr < -1500] = -1500\n    min_perc, max_perc = np.percentile(images_arr, 5), np.percentile(images_arr, 95)\n    images_arr_valid = images_arr[(images_arr > min_perc) & (images_arr < max_perc)]\n    mean, std = (images_arr_valid.mean(), images_arr_valid.std()) if mean_std is None else mean_std\n    images_arr = (images_arr - mean) / std\n    print(f'mean {mean}, std {std}')\n    return images_arr, (mean, std)\n\nimages_radiopedia, mean_std = preprocess_images(images_radiopedia)\nimages_medseg, _ = preprocess_images(images_medseg, mean_std)\ntest_images_medseg, _ = preprocess_images(test_images_medseg, mean_std)","metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","execution":{"iopub.status.busy":"2021-08-03T11:34:10.669737Z","iopub.execute_input":"2021-08-03T11:34:10.670041Z","iopub.status.idle":"2021-08-03T11:34:16.080037Z","shell.execute_reply.started":"2021-08-03T11:34:10.670009Z","shell.execute_reply":"2021-08-03T11:34:16.079101Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images_radiopedia.shape","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:16.08156Z","iopub.execute_input":"2021-08-03T11:34:16.082094Z","iopub.status.idle":"2021-08-03T11:34:16.088209Z","shell.execute_reply.started":"2021-08-03T11:34:16.08204Z","shell.execute_reply":"2021-08-03T11:34:16.087333Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images_medseg.shape","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:16.089488Z","iopub.execute_input":"2021-08-03T11:34:16.090007Z","iopub.status.idle":"2021-08-03T11:34:16.103653Z","shell.execute_reply.started":"2021-08-03T11:34:16.089958Z","shell.execute_reply":"2021-08-03T11:34:16.102357Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_images_medseg.shape","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:16.10539Z","iopub.execute_input":"2021-08-03T11:34:16.10575Z","iopub.status.idle":"2021-08-03T11:34:16.115295Z","shell.execute_reply.started":"2021-08-03T11:34:16.105711Z","shell.execute_reply":"2021-08-03T11:34:16.114438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Normalized values of radiopedia data (blue) vs medseg data (orange):","metadata":{}},{"cell_type":"code","source":"plot_hists(images_radiopedia, images_medseg)","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:16.11675Z","iopub.execute_input":"2021-08-03T11:34:16.117203Z","iopub.status.idle":"2021-08-03T11:34:19.57103Z","shell.execute_reply.started":"2021-08-03T11:34:16.117164Z","shell.execute_reply":"2021-08-03T11:34:19.570075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\nNormalized values of test medseg data (blue) vs medseg data (orange):","metadata":{}},{"cell_type":"code","source":"plot_hists(test_images_medseg, images_medseg)","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:19.572691Z","iopub.execute_input":"2021-08-03T11:34:19.57305Z","iopub.status.idle":"2021-08-03T11:34:20.409368Z","shell.execute_reply.started":"2021-08-03T11:34:19.573011Z","shell.execute_reply":"2021-08-03T11:34:20.408213Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Split train / val:","metadata":{}},{"cell_type":"code","source":"val_indexes, train_indexes = list(range(24)), list(range(24, 100))\n\ntrain_images = np.concatenate((images_medseg[train_indexes], images_radiopedia))\ntrain_masks = np.concatenate((masks_medseg[train_indexes], masks_radiopedia))\nval_images = images_medseg[val_indexes]\nval_masks = masks_medseg[val_indexes]\n\nbatch_size = len(val_masks)\n\ndel images_radiopedia\ndel masks_radiopedia\ndel images_medseg\ndel masks_medseg","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:20.410987Z","iopub.execute_input":"2021-08-03T11:34:20.411523Z","iopub.status.idle":"2021-08-03T11:34:21.22724Z","shell.execute_reply.started":"2021-08-03T11:34:20.411472Z","shell.execute_reply":"2021-08-03T11:34:21.226226Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_images.shape","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:21.232477Z","iopub.execute_input":"2021-08-03T11:34:21.235173Z","iopub.status.idle":"2021-08-03T11:34:21.24708Z","shell.execute_reply.started":"2021-08-03T11:34:21.235125Z","shell.execute_reply":"2021-08-03T11:34:21.245835Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_masks.shape","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:21.252754Z","iopub.execute_input":"2021-08-03T11:34:21.255373Z","iopub.status.idle":"2021-08-03T11:34:21.266275Z","shell.execute_reply.started":"2021-08-03T11:34:21.255301Z","shell.execute_reply":"2021-08-03T11:34:21.265132Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_images.shape","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:21.269418Z","iopub.execute_input":"2021-08-03T11:34:21.272029Z","iopub.status.idle":"2021-08-03T11:34:21.281971Z","shell.execute_reply.started":"2021-08-03T11:34:21.271964Z","shell.execute_reply":"2021-08-03T11:34:21.280879Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(val_images[0,:,:,0])","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:21.283793Z","iopub.execute_input":"2021-08-03T11:34:21.28527Z","iopub.status.idle":"2021-08-03T11:34:21.513955Z","shell.execute_reply.started":"2021-08-03T11:34:21.284456Z","shell.execute_reply":"2021-08-03T11:34:21.512945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_masks.shape","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:21.515294Z","iopub.execute_input":"2021-08-03T11:34:21.515648Z","iopub.status.idle":"2021-08-03T11:34:21.522079Z","shell.execute_reply.started":"2021-08-03T11:34:21.515611Z","shell.execute_reply":"2021-08-03T11:34:21.520984Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(val_masks[0,:,:,0])","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:21.527279Z","iopub.execute_input":"2021-08-03T11:34:21.527779Z","iopub.status.idle":"2021-08-03T11:34:21.687023Z","shell.execute_reply.started":"2021-08-03T11:34:21.527734Z","shell.execute_reply":"2021-08-03T11:34:21.685787Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\n\n# Display\nfrom IPython.display import Image, display\nimport matplotlib.pyplot as plt\nimport matplotlib.cm as cm\n\nimport numpy as np\nimport os\nimport time\nimport pickle\nimport cv2\n%matplotlib inline\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nfrom tensorflow.keras import backend as K\nfrom tensorflow.keras import applications\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras import optimizers\nfrom tensorflow.keras.models import Sequential, Model, load_model \nfrom tensorflow.keras.layers import Dropout, Flatten, Dense, GlobalAveragePooling2D, Input\nfrom tensorflow.keras import backend as k \nfrom tensorflow.keras.callbacks import ModelCheckpoint, LearningRateScheduler, TensorBoard, EarlyStopping\nfrom tensorflow.keras.optimizers import Adam, RMSprop, SGD\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.model_selection import KFold\nfrom sklearn.model_selection import GridSearchCV\nfrom sklearn.model_selection import cross_val_score\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.svm import SVC\nfrom sklearn.preprocessing import LabelEncoder\nfrom skimage.transform import resize\nfrom sklearn.svm import SVC\nfrom sklearn.metrics import accuracy_score, confusion_matrix,classification_report\nfrom tensorflow.keras.applications.resnet50 import ResNet50\nfrom tensorflow.keras.preprocessing import image\nfrom tensorflow.keras.applications.resnet50 import *\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.applications.vgg19 import VGG19\nimport os\nfrom xgboost import XGBClassifier\n#os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,2,3'\nimport pickle\nfrom datetime import datetime\nimport cv2\nimport math\nimport numpy as np\nimport os\nfrom sklearn.metrics import confusion_matrix\nfrom sklearn.model_selection import train_test_split\nimport seaborn as sns\nimport PIL\nimport torch\nimport torch.utils.data as data\nfrom torch.utils.data import Dataset, DataLoader, Subset\nfrom torch.utils.tensorboard import SummaryWriter\nfrom torch.optim import lr_scheduler\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.nn import functional as F\nfrom torch.nn import init\nfrom torch.autograd import Variable\nimport torchvision\nfrom torchvision import datasets, models, transforms\nfrom torch import nn\nimport time, copy, argparse\nimport multiprocessing\nfrom matplotlib import pyplot as plt\nfrom sklearn.metrics import f1_score, accuracy_score\nfrom torch import FloatTensor\nfrom sklearn.model_selection import KFold\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.model_selection import cross_val_score\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.metrics import f1_score,recall_score,precision_score\nfrom sklearn.ensemble import ExtraTreesClassifier\nfrom sklearn import svm\nimport random\nimport functools\nimport joblib\nimport pickle\nimport os\nimport cv2\nfrom glob import glob\nfrom random import shuffle\n","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:21.68924Z","iopub.execute_input":"2021-08-03T11:34:21.689759Z","iopub.status.idle":"2021-08-03T11:34:29.963361Z","shell.execute_reply.started":"2021-08-03T11:34:21.689678Z","shell.execute_reply":"2021-08-03T11:34:29.962497Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def data_prep():\n  root_folder = '/kaggle/input/large-covid19-ct-slice-dataset/curated_data/curated_data'\n  diction = {}\n\n  \n\n  dir_images = []\n  dir_label = []\n  \n  count_covid = 0\n  count_non_covid = 0\n    \n  for subdir in os.listdir(root_folder)[1:]:\n          print('subdir',os.path.join(root_folder, subdir))\n          for file_count, file_name in enumerate( sorted(glob(os.path.join(root_folder, subdir)+ '/*'),key=len) ):\n              \n              img = cv2.imread(file_name)\n              img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n              dir_images.append(img)\n              dir_label.append(subdir)\n              if subdir =='1NonCOVID':\n                  count_non_covid +=1\n                  if count_non_covid ==1500:\n                    break\n              elif subdir == '2COVID':\n                  count_covid +=1\n                  if count_covid == 1500:\n                    break\n              \n\n  diction_train = {}\n  diction_test = {}\n  dir_label_shuf_train = []\n  dir_images_shuf_train = []\n  index_shuf = list(range(len(dir_label)))\n  shuffle(index_shuf)\n\n  train_shuf = index_shuf[0:int(len(index_shuf))]\n  \n\n  for i in train_shuf:\n      dir_label_shuf_train.append(dir_label[i])\n      dir_images_shuf_train.append(dir_images[i])    \n          \n  diction_train['X_tr'] = dir_images_shuf_train\n  diction_train['y_tr'] = dir_label_shuf_train\n\n\n\n        \n        \n  print(len(diction_train['X_tr']))\n  ##print(diction_train['y_tr'])\n  print(diction_train['X_tr'][0].shape)\n\n\n  \n\n  with open('training.pickle', 'wb') as handle:\n      pickle.dump(diction_train, handle, protocol=pickle.HIGHEST_PROTOCOL)\n\n  \n\n  nrows=224\n  ncolumns=224\n  channels=1\n\n  batch_size=16\n  epochs=1\n  # Number of classes\n  num_cpu = multiprocessing.cpu_count()\n  num_classes = 2\n  torch.manual_seed(8)\n  torch.cuda.manual_seed(8)\n  np.random.seed(8)\n  random.seed(8)\n\n\n\n\n  device = torch.device(\"cpu\")\n\n  dbfile = open('training.pickle', 'rb')      \n  db = pickle.load(dbfile) \n  X_train,y_train = db['X_tr'],db['y_tr']\n\n  X = []\n  #X_train=np.reshape(np.array(X_train),[len(X_train),])\n  for img in list(range(0,len(X_train))):\n    if X_train[img].ndim>=3:\n        X.append(np.moveaxis(cv2.resize(X_train[img][:,:,:3], (nrows,ncolumns),interpolation=cv2.INTER_CUBIC), -1, 0))\n    else:\n        smimg= cv2.cvtColor(X_train[img],cv2.COLOR_GRAY2RGB)\n        X.append(np.moveaxis(cv2.resize(smimg, (nrows,ncolumns),interpolation=cv2.INTER_CUBIC), -1, 0))\n    \n    if y_train[img]=='2COVID':\n        y_train[img]=1\n    elif y_train[img]=='1NonCOVID' :\n        y_train[img]=0\n    else:\n        continue\n\n  x = np.array(X)\n  y_train = np.array(y_train)\n\n\n  outputs_all = []\n  labels_all = []\n\n  X_train, X_val, y_train, y_val = train_test_split(x, y_train, test_size=0.2, random_state=2)\n\n  #base_model = tf.keras.applications.VGG19(weights = 'imagenet')\n  #model = Model(inputs=base_model.input,outputs = base_model.get_layer('block5_pool').output)\n  base_model = tf.keras.applications.ResNet50(weights = 'imagenet')\n  model = Model(inputs=base_model.input,outputs = base_model.get_layer('avg_pool').output)\n  #base_model = tf.keras.applications.DenseNet121(weights='imagenet')\n  #model = Model(inputs=base_model.input,outputs = base_model.get_layer('avg_pool').output)\n  #base_model = tf.keras.applications.InceptionResNetV2(weights='imagenet')\n  #model = Model(inputs=base_model.input,outputs = base_model.get_layer('avg_pool').output)\n\n  feature_dict={0:[],1:[]}\n  feature_dict_val={0:[],1:[]}\n  classes=['0','1']\n  for j in range(len(X_train)):\n    xx = X_train[j].transpose(2,1,0)\n    xx = np.expand_dims(xx,axis=0)\n  \n    feature_dict[y_train[j]].append(model.predict(xx))\n\n\n  for j in range(len(X_val)):\n    xx = X_val[j].transpose(2,1,0)\n    xx = np.expand_dims(xx,axis=0)\n  \n    feature_dict_val[y_val[j]].append(model.predict(xx))\n\n\n  pickle.dump(feature_dict, open('features_till_flatten.pkl', \"wb\" ))\n  pickle.dump(feature_dict_val, open('features_till_flatten_val.pkl', \"wb\" ))\n\n\n\n  labels = []\n  feature_list = []\n  feature_dict=pickle.load(open('features_till_flatten.pkl','rb'))\n  names = [0,1]\n  for cat,features  in feature_dict.items():\n      labels.extend([int(cat)] * len(features))\n      feature_list.append(features)\n  feature_list = np.concatenate(feature_list)\n  feature_list1=[]\n  for i in range(0,len(feature_list)):\n      feature_list1.append(feature_list[i].ravel())\n  \n\n  labels2 = []\n  feature_list_val = []\n  feature_dict_val=pickle.load(open('features_till_flatten_val.pkl','rb'))\n  names = [0,1]\n  for cat,features  in feature_dict_val.items():\n      labels2.extend([int(cat)] * len(features))\n      feature_list_val.append(features)\n  feature_list_val = np.concatenate(feature_list_val)\n  feature_list2=[]\n  for i in range(0,len(feature_list_val)):\n      feature_list2.append(feature_list_val[i].ravel())\n\n  scaler = StandardScaler().fit(feature_list1)\n  rescaledX = scaler.transform(feature_list1)\n  rescaledX_validation = scaler.transform(feature_list2)\n  \n  return rescaledX, rescaledX_validation, labels, labels2 \n","metadata":{"execution":{"iopub.status.busy":"2021-07-19T10:31:26.339741Z","iopub.execute_input":"2021-07-19T10:31:26.34008Z","iopub.status.idle":"2021-07-19T10:31:26.37938Z","shell.execute_reply.started":"2021-07-19T10:31:26.340052Z","shell.execute_reply":"2021-07-19T10:31:26.378365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"rescaledX, rescaledX_validation, labels,labels2 = data_prep()","metadata":{"execution":{"iopub.status.busy":"2021-07-19T10:31:41.634541Z","iopub.execute_input":"2021-07-19T10:31:41.634889Z","iopub.status.idle":"2021-07-19T10:34:49.909537Z","shell.execute_reply.started":"2021-07-19T10:31:41.634859Z","shell.execute_reply":"2021-07-19T10:34:49.908461Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"root_folder = '/kaggle/input/large-covid19-ct-slice-dataset/curated_data/curated_data'\ndiction = {}\n\n\n\ndir_images = []\ndir_label = []\n\ncount_covid = 0\ncount_non_covid = 0\n\nfor subdir in os.listdir(root_folder)[1:]:\n      print('subdir',os.path.join(root_folder, subdir))\n      for file_count, file_name in enumerate( sorted(glob(os.path.join(root_folder, subdir)+ '/*'),key=len) ):\n\n          img = cv2.imread(file_name)\n          img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n          dir_images.append(img)\n          dir_label.append(subdir)\n          if subdir =='1NonCOVID':\n              count_non_covid +=1\n              if count_non_covid ==1500:\n                break\n          elif subdir == '2COVID':\n              count_covid +=1\n              if count_covid == 1500:\n                break\n\n\ndiction_train = {}\ndiction_test = {}\ndir_label_shuf_train = []\ndir_images_shuf_train = []\nindex_shuf = list(range(len(dir_label)))\nshuffle(index_shuf)\n\ntrain_shuf = index_shuf[0:int(len(index_shuf))]\n\n\nfor i in train_shuf:\n  dir_label_shuf_train.append(dir_label[i])\n  dir_images_shuf_train.append(dir_images[i])    \n\ndiction_train['X_tr'] = dir_images_shuf_train\ndiction_train['y_tr'] = dir_label_shuf_train\n\n\n\n\n\nprint(len(diction_train['X_tr']))\n##print(diction_train['y_tr'])\nprint(diction_train['X_tr'][0].shape)\n\n\n\n\nwith open('training.pickle', 'wb') as handle:\n  pickle.dump(diction_train, handle, protocol=pickle.HIGHEST_PROTOCOL)\n\n\n\nnrows=224\nncolumns=224\nchannels=1\n\nbatch_size=16\nepochs=1\n# Number of classes\nnum_cpu = multiprocessing.cpu_count()\nnum_classes = 2\ntorch.manual_seed(8)\ntorch.cuda.manual_seed(8)\nnp.random.seed(8)\nrandom.seed(8)\n\n\n\n\ndevice = torch.device(\"cpu\")\n\ndbfile = open('training.pickle', 'rb')      \ndb = pickle.load(dbfile) \nX_train,y_train = db['X_tr'],db['y_tr']\n\nX = []\n#X_train=np.reshape(np.array(X_train),[len(X_train),])\nfor img in list(range(0,len(X_train))):\n    if X_train[img].ndim>=3:\n        X.append(np.moveaxis(cv2.resize(X_train[img][:,:,:3], (nrows,ncolumns),interpolation=cv2.INTER_CUBIC), -1, 0))\n    else:\n        smimg= cv2.cvtColor(X_train[img],cv2.COLOR_GRAY2RGB)\n        X.append(np.moveaxis(cv2.resize(smimg, (nrows,ncolumns),interpolation=cv2.INTER_CUBIC), -1, 0))\n\n    if y_train[img]=='2COVID':\n        y_train[img]=1\n    elif y_train[img]=='1NonCOVID' :\n        y_train[img]=0\n    else:\n        continue\n\nx = np.array(X)\ny_train = np.array(y_train)\n\n\noutputs_all = []\nlabels_all = []\n\nX_train, X_val, y_train, y_val = train_test_split(x, y_train, test_size=0.2, random_state=2)\n\n#base_model = tf.keras.applications.VGG19(weights = 'imagenet')\n#model = Model(inputs=base_model.input,outputs = base_model.get_layer('block5_pool').output)\nbase_model = tf.keras.applications.ResNet50(weights = 'imagenet')\nmodel = Model(inputs=base_model.input,outputs = base_model.get_layer('avg_pool').output)\n#base_model = tf.keras.applications.DenseNet121(weights='imagenet')\n#model = Model(inputs=base_model.input,outputs = base_model.get_layer('avg_pool').output)\n#base_model = tf.keras.applications.InceptionResNetV2(weights='imagenet')\n#model = Model(inputs=base_model.input,outputs = base_model.get_layer('avg_pool').output)\n\nfeature_dict={0:[],1:[]}\nfeature_dict_val={0:[],1:[]}\nclasses=['0','1']\nfor j in range(len(X_train)):\n    xx = X_train[j].transpose(2,1,0)\n    xx = np.expand_dims(xx,axis=0)\n\n    feature_dict[y_train[j]].append(model.predict(xx))\n\n\nfor j in range(len(X_val)):\n    xx = X_val[j].transpose(2,1,0)\n    xx = np.expand_dims(xx,axis=0)\n\n    feature_dict_val[y_val[j]].append(model.predict(xx))\n\n\npickle.dump(feature_dict, open('features_till_flatten.pkl', \"wb\" ))\npickle.dump(feature_dict_val, open('features_till_flatten_val.pkl', \"wb\" ))\n\n\n\nlabels = []\nfeature_list = []\nfeature_dict=pickle.load(open('features_till_flatten.pkl','rb'))\nnames = [0,1]\nfor cat,features  in feature_dict.items():\n  labels.extend([int(cat)] * len(features))\n  feature_list.append(features)\nfeature_list = np.concatenate(feature_list)\nfeature_list1=[]\nfor i in range(0,len(feature_list)):\n  feature_list1.append(feature_list[i].ravel())\n\n\nlabels2 = []\nfeature_list_val = []\nfeature_dict_val=pickle.load(open('features_till_flatten_val.pkl','rb'))\nnames = [0,1]\nfor cat,features  in feature_dict_val.items():\n  labels2.extend([int(cat)] * len(features))\n  feature_list_val.append(features)\nfeature_list_val = np.concatenate(feature_list_val)\nfeature_list2=[]\nfor i in range(0,len(feature_list_val)):\n  feature_list2.append(feature_list_val[i].ravel())\n\nscaler = StandardScaler().fit(feature_list1)\nrescaledX = scaler.transform(feature_list1)\nrescaledX_validation = scaler.transform(feature_list2)","metadata":{"execution":{"iopub.status.busy":"2021-07-19T10:43:42.716229Z","iopub.execute_input":"2021-07-19T10:43:42.71659Z","iopub.status.idle":"2021-07-19T10:46:41.802424Z","shell.execute_reply.started":"2021-07-19T10:43:42.716558Z","shell.execute_reply":"2021-07-19T10:46:41.801483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_img = []\nfor i,j in enumerate(train_images):\n    xx = j.transpose(2,0,1)\n    train_img.append(xx)\ntrain_img = np.array(train_img)\n\nnrows = 224\nncolumns = 224\nX = []\n#X_train=np.reshape(np.array(X_train),[len(X_train),])\nfor img in list(range(0,len(train_img))):\n    if train_img[img].ndim>=3:\n        X.append(np.moveaxis(cv2.resize(train_img[img][:,:,:3], (nrows,ncolumns),interpolation=cv2.INTER_CUBIC), -1, 0))\n    else:\n        smimg= cv2.cvtColor(train_img[img],cv2.COLOR_GRAY2RGB)\n        X.append(np.moveaxis(cv2.resize(smimg, (nrows,ncolumns),interpolation=cv2.INTER_CUBIC), -1, 0))\n\n   \n\nx = np.array(X)\nX_train = x\n\n\noutputs_all = []\nlabels_all = []\n\n\n\n#base_model = tf.keras.applications.VGG19(weights = 'imagenet')\n#model = Model(inputs=base_model.input,outputs = base_model.get_layer('block5_pool').output)\nbase_model = tf.keras.applications.ResNet50(weights = 'imagenet')\nmodel = Model(inputs=base_model.input,outputs = base_model.get_layer('avg_pool').output)\n#base_model = tf.keras.applications.DenseNet121(weights='imagenet')\n#model = Model(inputs=base_model.input,outputs = base_model.get_layer('avg_pool').output)\n#base_model = tf.keras.applications.InceptionResNetV2(weights='imagenet')\n#model = Model(inputs=base_model.input,outputs = base_model.get_layer('avg_pool').output)\n\nfeature_dict={0:[]}\n\n\nfor j in range(len(X_train)):\n    xx = X_train[j].transpose(2,1,0)\n    xx = np.expand_dims(xx,axis=0)\n\n    feature_dict[0].append(model.predict(xx))\n\n\n\n\npickle.dump(feature_dict, open('features_till_flatten.pkl', \"wb\" ))\n\n\n\n\n\nfeature_list = []\nfeature_dict=pickle.load(open('features_till_flatten.pkl','rb'))\n\nfor cat,features  in feature_dict.items():\n  #labels.extend([int(cat)] * len(features))\n  feature_list.append(features)\nfeature_list = np.concatenate(feature_list)\nfeature_list1=[]\nfor i in range(0,len(feature_list)):\n  feature_list1.append(feature_list[i].ravel())\n\n\n\n\nscaler = StandardScaler().fit(feature_list1)\nrescaledX_train = scaler.transform(feature_list1)\n\n\n","metadata":{"execution":{"iopub.status.busy":"2021-07-19T11:26:08.31243Z","iopub.execute_input":"2021-07-19T11:26:08.312769Z","iopub.status.idle":"2021-07-19T11:26:48.538004Z","shell.execute_reply.started":"2021-07-19T11:26:08.312738Z","shell.execute_reply":"2021-07-19T11:26:48.537039Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"rescaledX_train.shape","metadata":{"execution":{"iopub.status.busy":"2021-07-19T11:26:59.600915Z","iopub.execute_input":"2021-07-19T11:26:59.601239Z","iopub.status.idle":"2021-07-19T11:26:59.606221Z","shell.execute_reply.started":"2021-07-19T11:26:59.601209Z","shell.execute_reply":"2021-07-19T11:26:59.605338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn import svm\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.ensemble import AdaBoostClassifier\nfrom sklearn.datasets import make_classification\nfrom sklearn.naive_bayes import GaussianNB\nfrom xgboost import XGBClassifier","metadata":{"execution":{"iopub.status.busy":"2021-07-19T11:27:28.769453Z","iopub.execute_input":"2021-07-19T11:27:28.769849Z","iopub.status.idle":"2021-07-19T11:27:28.961081Z","shell.execute_reply.started":"2021-07-19T11:27:28.769816Z","shell.execute_reply":"2021-07-19T11:27:28.960295Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"clf_model = XGBClassifier()","metadata":{"execution":{"iopub.status.busy":"2021-07-19T11:27:32.347917Z","iopub.execute_input":"2021-07-19T11:27:32.348256Z","iopub.status.idle":"2021-07-19T11:27:32.352502Z","shell.execute_reply.started":"2021-07-19T11:27:32.348224Z","shell.execute_reply":"2021-07-19T11:27:32.351665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"clf_model.fit(rescaledX,labels)","metadata":{"execution":{"iopub.status.busy":"2021-07-19T11:27:40.22487Z","iopub.execute_input":"2021-07-19T11:27:40.225191Z","iopub.status.idle":"2021-07-19T11:28:06.121335Z","shell.execute_reply.started":"2021-07-19T11:27:40.225162Z","shell.execute_reply":"2021-07-19T11:28:06.120643Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_train = clf_model.predict(rescaledX_train)","metadata":{"execution":{"iopub.status.busy":"2021-07-19T11:30:52.732143Z","iopub.execute_input":"2021-07-19T11:30:52.732476Z","iopub.status.idle":"2021-07-19T11:30:52.769323Z","shell.execute_reply.started":"2021-07-19T11:30:52.732448Z","shell.execute_reply":"2021-07-19T11:30:52.768533Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.savetxt(\"results.csv\", preds_train, delimiter=\",\")","metadata":{"execution":{"iopub.status.busy":"2021-07-19T11:38:15.402051Z","iopub.execute_input":"2021-07-19T11:38:15.402381Z","iopub.status.idle":"2021-07-19T11:38:15.414006Z","shell.execute_reply.started":"2021-07-19T11:38:15.402351Z","shell.execute_reply":"2021-07-19T11:38:15.413144Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_images.shape","metadata":{"execution":{"iopub.status.busy":"2021-07-19T11:31:04.156474Z","iopub.execute_input":"2021-07-19T11:31:04.156811Z","iopub.status.idle":"2021-07-19T11:31:04.164811Z","shell.execute_reply.started":"2021-07-19T11:31:04.156782Z","shell.execute_reply":"2021-07-19T11:31:04.16394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import gc\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2021-08-03T10:48:59.531302Z","iopub.execute_input":"2021-08-03T10:48:59.53164Z","iopub.status.idle":"2021-08-03T10:48:59.612867Z","shell.execute_reply.started":"2021-08-03T10:48:59.53161Z","shell.execute_reply":"2021-08-03T10:48:59.610966Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_train.shape","metadata":{"execution":{"iopub.status.busy":"2021-07-19T11:31:10.662385Z","iopub.execute_input":"2021-07-19T11:31:10.662889Z","iopub.status.idle":"2021-07-19T11:31:10.673803Z","shell.execute_reply.started":"2021-07-19T11:31:10.662845Z","shell.execute_reply":"2021-07-19T11:31:10.672751Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Data generator and augmentations:","metadata":{}},{"cell_type":"code","source":"import tensorflow\n\nimport albumentations\nimport cv2\n\nSOURCE_SIZE = 512\nTARGET_SIZE = 256\n\ntrain_augs = albumentations.Compose([\n    albumentations.Rotate(limit=360, p=0.9, border_mode=cv2.BORDER_REPLICATE),\n    albumentations.RandomSizedCrop((int(SOURCE_SIZE * 0.75), SOURCE_SIZE), \n                                   TARGET_SIZE, \n                                   TARGET_SIZE, \n                                   interpolation=cv2.INTER_NEAREST),\n    albumentations.HorizontalFlip(p=0.5),\n\n])\n\nval_augs = albumentations.Compose([\n    albumentations.Resize(TARGET_SIZE, TARGET_SIZE, interpolation=cv2.INTER_NEAREST)\n])","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:57.615477Z","iopub.execute_input":"2021-08-03T11:34:57.615833Z","iopub.status.idle":"2021-08-03T11:34:57.822123Z","shell.execute_reply.started":"2021-08-03T11:34:57.6158Z","shell.execute_reply":"2021-08-03T11:34:57.821155Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Dataset:   \n    def __init__(\n            self, \n            images, \n            masks,\n            augmentations=None\n    ):\n        self.images = images\n        self.masks = masks\n        self.augmentations = augmentations\n    \n    def __getitem__(self, i):\n        image = self.images[i]\n        mask = self.masks[i]\n        \n        if self.augmentations:\n            sample = self.augmentations(image=image, mask=mask)\n            image, mask = sample['image'], sample['mask']\n        return image, mask\n        \n    def __len__(self):\n        return len(self.images)\n    \n    \nclass Dataloder(tensorflow.keras.utils.Sequence):\n    \"\"\"Load data from dataset and form batches\n    \n    Args:\n        dataset: instance of Dataset class for image loading and preprocessing.\n        batch_size: Integet number of images in batch.\n        shuffle: Boolean, if `True` shuffle image indexes each epoch.\n    \"\"\"\n    \n    def __init__(self, dataset, batch_size=1, shuffle=False):\n        self.dataset = dataset\n        self.batch_size = batch_size\n        self.shuffle = shuffle\n        self.indexes = np.arange(len(dataset))\n\n        self.on_epoch_end()\n\n    def __getitem__(self, i):\n        \n        # collect batch data\n        start = i * self.batch_size\n        stop = (i + 1) * self.batch_size\n        images = []\n        masks = []\n        for j in range(start, stop):\n            image, mask = self.dataset[self.indexes[j]]\n            images.append(image)\n            masks.append(mask)\n        \n        images = np.stack(images, axis=0)\n        masks = np.stack(masks, axis=0).astype(np.float32)\n        \n        return (images, masks)\n    \n    def __len__(self):\n        \"\"\"Denotes the number of batches per epoch\"\"\"\n        return len(self.indexes) // self.batch_size\n    \n    def on_epoch_end(self):\n        \"\"\"Callback function to shuffle indexes each epoch\"\"\"\n        if self.shuffle:\n            self.indexes = np.random.permutation(self.indexes)\n            \ntrain_dataset = Dataset(train_images, train_masks, train_augs)\nval_dataset = Dataset(val_images, val_masks, val_augs)\n\ntrain_dataloader = Dataloder(train_dataset, batch_size=batch_size, shuffle=True)\nval_dataloader = Dataloder(val_dataset, batch_size=batch_size, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:58.281716Z","iopub.execute_input":"2021-08-03T11:34:58.282049Z","iopub.status.idle":"2021-08-03T11:34:58.302067Z","shell.execute_reply.started":"2021-08-03T11:34:58.282015Z","shell.execute_reply":"2021-08-03T11:34:58.30102Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"assert train_dataloader[0][0].shape == (batch_size, TARGET_SIZE, TARGET_SIZE, 1)\nassert train_dataloader[0][1].shape == (batch_size, TARGET_SIZE, TARGET_SIZE, 4)","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:59.286858Z","iopub.execute_input":"2021-08-03T11:34:59.287212Z","iopub.status.idle":"2021-08-03T11:34:59.469996Z","shell.execute_reply.started":"2021-08-03T11:34:59.287179Z","shell.execute_reply":"2021-08-03T11:34:59.469186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"visualize(*next(iter(train_dataloader)))\nvisualize(*next(iter(val_dataloader)))","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:34:59.639911Z","iopub.execute_input":"2021-08-03T11:34:59.640252Z","iopub.status.idle":"2021-08-03T11:35:00.63883Z","shell.execute_reply.started":"2021-08-03T11:34:59.640221Z","shell.execute_reply":"2021-08-03T11:35:00.637741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Metrics:","metadata":{}},{"cell_type":"code","source":"def fscore_glass(y_true, y_pred):\n    return sm.metrics.f1_score(y_true[..., 0:1], \n                               y_pred[..., 0:1])\n    \ndef fscore_consolidation(y_true, y_pred):\n    return sm.metrics.f1_score(y_true[..., 1:2], \n                               y_pred[..., 1:2])\n\ndef fscore_lungs_other(y_true, y_pred):\n    return sm.metrics.f1_score(y_true[..., 2:3], \n                               y_pred[..., 2:3])\n\ndef fscore_glass_and_consolidation(y_true, y_pred):\n    return sm.metrics.f1_score(y_true[..., :2], \n                               y_pred[..., :2])","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:35:04.890974Z","iopub.execute_input":"2021-08-03T11:35:04.891456Z","iopub.status.idle":"2021-08-03T11:35:04.906316Z","shell.execute_reply.started":"2021-08-03T11:35:04.891415Z","shell.execute_reply":"2021-08-03T11:35:04.905203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from segmentation_models import Unet\nimport segmentation_models as sm\n\nfrom tensorflow.keras.layers import Input, Conv2D\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import ModelCheckpoint\nnp.random.seed(0)\n\nbase_model = Unet(backbone_name='efficientnetb1',\n                  encoder_weights='imagenet',\n                  classes=4, \n                  activation='softmax')\n\nmodel = Sequential([Input(shape=(TARGET_SIZE, TARGET_SIZE, 1)),\n                    Conv2D(3, (1, 1)),  # map N channels data to 3 channels\n                    base_model])\n    \nmodel.compile(Adam(learning_rate=0.001, amsgrad=True),\n              loss=sm.losses.categorical_crossentropy,\n              metrics=[fscore_glass, fscore_consolidation, fscore_lungs_other, fscore_glass_and_consolidation])\n\ncheckpoint_callback = ModelCheckpoint('best_model',\n                                      monitor='fscore_glass_and_consolidation',\n                                      mode='max',\n                                      save_best_only=True)\n\nmodel.fit(\n    train_dataloader,\n    steps_per_epoch=len(train_dataloader) * 6,\n    epochs=20,\n    validation_data=val_dataloader,\n    validation_steps=len(val_dataloader),\n    callbacks=[checkpoint_callback],\n    workers=4)","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:38:45.940395Z","iopub.execute_input":"2021-08-03T11:38:45.940851Z","iopub.status.idle":"2021-08-03T11:46:55.0971Z","shell.execute_reply.started":"2021-08-03T11:38:45.940811Z","shell.execute_reply":"2021-08-03T11:46:55.093647Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TARGET_SIZE","metadata":{"execution":{"iopub.status.busy":"2021-07-21T12:49:32.161522Z","iopub.execute_input":"2021-07-21T12:49:32.161875Z","iopub.status.idle":"2021-07-21T12:49:32.167116Z","shell.execute_reply.started":"2021-07-21T12:49:32.161845Z","shell.execute_reply":"2021-07-21T12:49:32.16626Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from segmentation_models import Unet\nimport segmentation_models as sm\n\nfrom tensorflow.keras.layers import Input, Conv2D\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import ModelCheckpoint\nnp.random.seed(0)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Load best model and visualize predicions on val:","metadata":{}},{"cell_type":"code","source":"del train_images\ndel train_masks","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:47:05.458241Z","iopub.execute_input":"2021-08-03T11:47:05.458579Z","iopub.status.idle":"2021-08-03T11:47:05.462888Z","shell.execute_reply.started":"2021-08-03T11:47:05.458551Z","shell.execute_reply":"2021-08-03T11:47:05.461933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = tensorflow.keras.models.load_model('best_model/',\n                                           compile=False,\n                                           custom_objects={\n                                                'categorical_crossentropy': sm.losses.categorical_crossentropy,\n                                                'fscore_consolidation': fscore_consolidation, \n                                                'fscore_glass': fscore_glass, \n                                                'fscore_lungs_other': fscore_lungs_other,\n                                                'fscore_glass_and_consolidation': fscore_glass_and_consolidation})\n\nmodel.compile(Adam(learning_rate=0.001, amsgrad=True),\n              loss=sm.losses.jaccard_loss)","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:47:05.7221Z","iopub.execute_input":"2021-08-03T11:47:05.722429Z","iopub.status.idle":"2021-08-03T11:47:32.169351Z","shell.execute_reply.started":"2021-08-03T11:47:05.722399Z","shell.execute_reply":"2021-08-03T11:47:32.168289Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import gc\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:47:39.332635Z","iopub.execute_input":"2021-08-03T11:47:39.332979Z","iopub.status.idle":"2021-08-03T11:47:40.882746Z","shell.execute_reply.started":"2021-08-03T11:47:39.332948Z","shell.execute_reply":"2021-08-03T11:47:40.881538Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(tf.__version__)","metadata":{"execution":{"iopub.status.busy":"2021-07-21T12:59:16.575654Z","iopub.execute_input":"2021-07-21T12:59:16.576038Z","iopub.status.idle":"2021-07-21T12:59:16.580609Z","shell.execute_reply.started":"2021-07-21T12:59:16.576007Z","shell.execute_reply":"2021-07-21T12:59:16.57955Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install tensorflow==2.5.0\n","metadata":{"execution":{"iopub.status.busy":"2021-07-21T13:13:38.20352Z","iopub.execute_input":"2021-07-21T13:13:38.203901Z","iopub.status.idle":"2021-07-21T13:14:32.371551Z","shell.execute_reply.started":"2021-07-21T13:13:38.203869Z","shell.execute_reply":"2021-07-21T13:14:32.370657Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras","metadata":{"execution":{"iopub.status.busy":"2021-07-21T13:04:15.770536Z","iopub.execute_input":"2021-07-21T13:04:15.770939Z","iopub.status.idle":"2021-07-21T13:04:15.774965Z","shell.execute_reply.started":"2021-07-21T13:04:15.770905Z","shell.execute_reply":"2021-07-21T13:04:15.774037Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nfrom keras.utils import get_custom_objects\nfrom keras import backend as K\nfrom keras.layers import Activation\n\ndef swish_activation(x):\n        return (K.sigmoid(x) * x)\n\nget_custom_objects().update({'swish_activation': Activation(swish_activation)})","metadata":{"execution":{"iopub.status.busy":"2021-07-21T13:23:42.189719Z","iopub.execute_input":"2021-07-21T13:23:42.190065Z","iopub.status.idle":"2021-07-21T13:23:42.224147Z","shell.execute_reply.started":"2021-07-21T13:23:42.190035Z","shell.execute_reply":"2021-07-21T13:23:42.222407Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow import keras","metadata":{"execution":{"iopub.status.busy":"2021-07-21T13:22:58.636153Z","iopub.execute_input":"2021-07-21T13:22:58.636672Z","iopub.status.idle":"2021-07-21T13:22:58.64762Z","shell.execute_reply.started":"2021-07-21T13:22:58.63662Z","shell.execute_reply":"2021-07-21T13:22:58.646505Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.backend import sigmoid\n  \ndef swish(x, beta = 1):\n    return (x * sigmoid(beta * x))","metadata":{"execution":{"iopub.status.busy":"2021-07-21T13:23:57.127033Z","iopub.execute_input":"2021-07-21T13:23:57.127389Z","iopub.status.idle":"2021-07-21T13:23:57.9364Z","shell.execute_reply.started":"2021-07-21T13:23:57.127356Z","shell.execute_reply":"2021-07-21T13:23:57.934796Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nfrom tensorflow.keras.preprocessing import image\nfrom tf.keras.activations import swish\n\npb_model_dir = \"best_model/\"\nh5_model = \"mymodel.h5\"\n\n# Loading the Tensorflow Saved Model (PB)\ninput_shape = (1,256,256,1)\n\nmodel = tf.keras.models.load_model(pb_model_dir)\nmodel.build(input_shape)\nprint(model.summary())\n\n# Saving the Model in H5 Format\ntf.keras.models.save_model(model, h5_model)\n\n# Loading the H5 Saved Model\nloaded_model_from_h5 = tf.keras.models.load_model(h5_model)\nprint(loaded_model_from_h5.summary())","metadata":{"execution":{"iopub.status.busy":"2021-07-21T13:17:11.683464Z","iopub.execute_input":"2021-07-21T13:17:11.683815Z","iopub.status.idle":"2021-07-21T13:17:11.719751Z","shell.execute_reply.started":"2021-07-21T13:17:11.683782Z","shell.execute_reply":"2021-07-21T13:17:11.718369Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"input = val_dataloader[0]\nimage_batch, mask_batch = input\n\npreds = model.predict_on_batch(image_batch)\nvisualize(image_batch, mask_batch, pred_batch=preds)\n\n# yellow is TP, red is FP, green is FN","metadata":{"execution":{"iopub.status.busy":"2021-07-21T13:27:09.088135Z","iopub.execute_input":"2021-07-21T13:27:09.088473Z","iopub.status.idle":"2021-07-21T13:27:14.657519Z","shell.execute_reply.started":"2021-07-21T13:27:09.088442Z","shell.execute_reply":"2021-07-21T13:27:14.656534Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Test preds:","metadata":{}},{"cell_type":"code","source":"image_batch = np.stack([val_augs(image=img)['image'] for img in test_images_medseg], axis=0)\ntest_preds = model.predict_on_batch(image_batch)\ntest_masks_prediction = test_preds > 0.5\nvisualize(image_batch, test_masks_prediction, num_samples=len(test_images_medseg))","metadata":{"execution":{"iopub.status.busy":"2021-08-03T11:47:53.972674Z","iopub.execute_input":"2021-08-03T11:47:53.973065Z","iopub.status.idle":"2021-08-03T11:48:04.755275Z","shell.execute_reply.started":"2021-08-03T11:47:53.973017Z","shell.execute_reply":"2021-08-03T11:48:04.752174Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Resize prediction to original size:","metadata":{}},{"cell_type":"code","source":"plt.imshow(test_images_medseg[2,:,:,0])","metadata":{"execution":{"iopub.status.busy":"2021-07-21T13:33:37.796977Z","iopub.execute_input":"2021-07-21T13:33:37.797323Z","iopub.status.idle":"2021-07-21T13:33:37.96398Z","shell.execute_reply.started":"2021-07-21T13:33:37.79729Z","shell.execute_reply":"2021-07-21T13:33:37.962958Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(test_preds[2,:,:,0])","metadata":{"execution":{"iopub.status.busy":"2021-07-21T13:33:32.583361Z","iopub.execute_input":"2021-07-21T13:33:32.583742Z","iopub.status.idle":"2021-07-21T13:33:32.734887Z","shell.execute_reply.started":"2021-07-21T13:33:32.583703Z","shell.execute_reply":"2021-07-21T13:33:32.734083Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import scipy\ntest_masks_prediction_original_size = scipy.ndimage.zoom(test_masks_prediction[..., :-2], (1, 2, 2, 1), order=0)\ntest_masks_prediction_original_size.shape","metadata":{"execution":{"iopub.status.busy":"2021-07-21T13:27:43.208613Z","iopub.execute_input":"2021-07-21T13:27:43.209045Z","iopub.status.idle":"2021-07-21T13:27:43.318336Z","shell.execute_reply.started":"2021-07-21T13:27:43.209008Z","shell.execute_reply":"2021-07-21T13:27:43.317033Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"execution":{"iopub.status.busy":"2021-07-21T13:30:17.056597Z","iopub.execute_input":"2021-07-21T13:30:17.057031Z","iopub.status.idle":"2021-07-21T13:30:17.213242Z","shell.execute_reply.started":"2021-07-21T13:30:17.056992Z","shell.execute_reply":"2021-07-21T13:30:17.212306Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\npd.DataFrame(\n             data=np.stack((np.arange(len(test_masks_prediction_original_size.ravel())), \n                            test_masks_prediction_original_size.ravel().astype(int)),\n                            axis=-1), \n             columns=['Id', 'Predicted'])\\\n.set_index('Id').to_csv('submission.csv')","metadata":{"execution":{"iopub.status.busy":"2021-07-19T12:08:45.848639Z","iopub.execute_input":"2021-07-19T12:08:45.848998Z","iopub.status.idle":"2021-07-19T12:08:57.518884Z","shell.execute_reply.started":"2021-07-19T12:08:45.848966Z","shell.execute_reply":"2021-07-19T12:08:57.517678Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}