{"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":"","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-10-06T18:16:00.069585Z","iopub.execute_input":"2021-10-06T18:16:00.070336Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport tensorflow as tf\nimport matplotlib.pyplot as plt\n\nfrom skimage import io\n\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.datasets import mnist\nfrom tensorflow.keras.models import Model\n\nfrom tqdm import tqdm\n\n\ndef noise(array):\n    \"\"\"\n    Adds random noise to each image in the supplied array.\n    \"\"\"\n\n    noise_factor = 0.1\n    noisy_array = array + noise_factor * np.random.normal(\n        loc=0.0, scale=1.0, size=array.shape\n    )\n\n    return np.clip(noisy_array, 0.0, 1.0)\n\n\ndef display(array1, array2):\n    \"\"\"\n    Displays ten random images from each one of the supplied arrays.\n    \"\"\"\n\n    n = 10\n\n    indices = np.random.randint(len(array1), size=n)\n    images1 = array1[indices, :]\n    images2 = array2[indices, :]\n\n    plt.figure(figsize=(20, 4))\n    for i, (image1, image2) in enumerate(zip(images1, images2)):\n        ax = plt.subplot(2, n, i + 1)\n        plt.imshow(image1.reshape(256, 256))\n        plt.gray()\n        ax.get_xaxis().set_visible(False)\n        ax.get_yaxis().set_visible(False)\n\n        ax = plt.subplot(2, n, i + 1 + n)\n        plt.imshow(image2.reshape(256, 256))\n        plt.gray()\n        ax.get_xaxis().set_visible(False)\n        ax.get_yaxis().set_visible(False)\n\n    plt.show()\n\n    \n    \nimport os\nimport sys\nimport random\nimport warnings\n\nimport numpy as np\nimport pandas as pd\n\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nfrom tqdm import tqdm\nfrom itertools import chain\nfrom skimage.io import imread, imshow, imread_collection, concatenate_images\nfrom skimage.transform import resize\nfrom skimage.morphology import label\nfrom PIL import ImageFile\n\nfrom tensorflow.keras.models import Model, load_model\nfrom tensorflow.keras.layers import Input\nfrom tensorflow.keras.layers import Dropout, Lambda\nfrom tensorflow.keras.layers import Conv2D, Conv2DTranspose, BatchNormalization\nfrom tensorflow.keras.layers import MaxPooling2D\nfrom tensorflow.keras.layers import concatenate\nfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint\nfrom tensorflow.keras import backend as K\n\nimport tensorflow as tf","metadata":{"execution":{"iopub.status.busy":"2021-10-06T21:23:30.767305Z","iopub.execute_input":"2021-10-06T21:23:30.767918Z","iopub.status.idle":"2021-10-06T21:23:30.782589Z","shell.execute_reply.started":"2021-10-06T21:23:30.767879Z","shell.execute_reply":"2021-10-06T21:23:30.781821Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from glob import glob        \nfrom skimage import data, color\nfrom skimage.transform import rescale, resize, downscale_local_mean\nfrom numpy import reshape\n\n\ntrain_filenames = glob('/kaggle/input/chest-xray-pneumonia/chest_xray/train/NORMAL/*.jpeg')\ntest_filenames = glob('/kaggle/input/chest-xray-pneumonia/chest_xray/train/PNEUMONIA/*.jpeg')","metadata":{"execution":{"iopub.status.busy":"2021-10-06T20:18:20.279685Z","iopub.execute_input":"2021-10-06T20:18:20.280341Z","iopub.status.idle":"2021-10-06T20:18:21.009146Z","shell.execute_reply.started":"2021-10-06T20:18:20.280299Z","shell.execute_reply":"2021-10-06T20:18:21.008266Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = []\ntest = []\n\nfor each in tqdm(train_filenames):\n    each = io.imread(each)\n    each = resize(each, (256, 256), anti_aliasing=True)\n    train.append(each)\n    \nfor each in tqdm(test_filenames):\n    each = io.imread(each)\n    each = resize(each, (256, 256), anti_aliasing=True)\n    test.append(each)","metadata":{"execution":{"iopub.status.busy":"2021-10-06T20:18:23.429427Z","iopub.execute_input":"2021-10-06T20:18:23.430256Z","iopub.status.idle":"2021-10-06T20:26:41.785452Z","shell.execute_reply.started":"2021-10-06T20:18:23.430212Z","shell.execute_reply":"2021-10-06T20:26:41.784473Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"xtrain = np.expand_dims(train, -1)","metadata":{"execution":{"iopub.status.busy":"2021-10-06T20:26:41.790237Z","iopub.execute_input":"2021-10-06T20:26:41.790539Z","iopub.status.idle":"2021-10-06T20:26:42.035568Z","shell.execute_reply.started":"2021-10-06T20:26:41.790501Z","shell.execute_reply":"2021-10-06T20:26:42.034778Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = xtrain[:1000]\nvalid_data = xtrain[1000:]","metadata":{"execution":{"iopub.status.busy":"2021-10-06T20:26:42.037127Z","iopub.execute_input":"2021-10-06T20:26:42.037406Z","iopub.status.idle":"2021-10-06T20:26:42.043984Z","shell.execute_reply.started":"2021-10-06T20:26:42.037370Z","shell.execute_reply":"2021-10-06T20:26:42.043054Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.shape(train_data)","metadata":{"execution":{"iopub.status.busy":"2021-10-06T20:26:42.046456Z","iopub.execute_input":"2021-10-06T20:26:42.046729Z","iopub.status.idle":"2021-10-06T20:26:42.056612Z","shell.execute_reply.started":"2021-10-06T20:26:42.046694Z","shell.execute_reply":"2021-10-06T20:26:42.055795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras import layers\n\n\ninput = layers.Input(shape=(256, 256, 1))\n\n# Encoder\nx = layers.Conv2D(32, (3, 3), activation=\"relu\", padding=\"same\")(input)\nx = layers.MaxPooling2D((2, 2), padding=\"same\")(x)\nx = layers.Conv2D(32, (3, 3), activation=\"relu\", padding=\"same\")(x)\nx = layers.MaxPooling2D((2, 2), padding=\"same\")(x)\n\n# Decoder\nx = layers.Conv2DTranspose(32, (3, 3), strides=2, activation=\"relu\", padding=\"same\")(x)\nx = layers.Conv2DTranspose(32, (3, 3), strides=2, activation=\"relu\", padding=\"same\")(x)\nx = layers.Conv2D(1, (3, 3), activation=\"sigmoid\", padding=\"same\")(x)\n\n# Autoencoder\nautoencoder = Model(input, x)\nautoencoder.compile(optimizer=\"adam\", loss=\"mse\")\nautoencoder.summary()\n","metadata":{"execution":{"iopub.status.busy":"2021-10-06T20:06:01.295136Z","iopub.execute_input":"2021-10-06T20:06:01.295397Z","iopub.status.idle":"2021-10-06T20:06:01.370803Z","shell.execute_reply.started":"2021-10-06T20:06:01.295367Z","shell.execute_reply":"2021-10-06T20:06:01.369777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install keras-unet","metadata":{"execution":{"iopub.status.busy":"2021-10-06T20:26:42.058065Z","iopub.execute_input":"2021-10-06T20:26:42.058430Z","iopub.status.idle":"2021-10-06T20:26:50.235292Z","shell.execute_reply.started":"2021-10-06T20:26:42.058395Z","shell.execute_reply":"2021-10-06T20:26:50.234265Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Unet model: https://www.kaggle.com/advaitsave/tensorflow-2-nuclei-segmentation-unet\n# Any UNET implementation will work. I chose this one because it written using simple logics. \n\n\ninputs = Input((256, 256, 1))\n\n\nc1 = Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (inputs)\nc1 = BatchNormalization()(c1)\nc1 = Dropout(0.1) (c1)\nc1 = Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (c1)\nc1 = BatchNormalization()(c1)\np1 = MaxPooling2D((2, 2)) (c1)\n\nc2 = Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (p1)\nc2 = BatchNormalization()(c2)\nc2 = Dropout(0.1) (c2)\nc2 = Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (c2)\nc2 = BatchNormalization()(c2)\np2 = MaxPooling2D((2, 2)) (c2)\n\nc3 = Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (p2)\nc3 = BatchNormalization()(c3)\nc3 = Dropout(0.2) (c3)\nc3 = Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (c3)\nc3 = BatchNormalization()(c3)\np3 = MaxPooling2D((2, 2)) (c3)\n\nc4 = Conv2D(256, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (p3)\nc4 = BatchNormalization()(c4)\nc4 = Dropout(0.2) (c4)\nc4 = Conv2D(256, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (c4)\nc4 = BatchNormalization()(c4)\np4 = MaxPooling2D(pool_size=(2, 2)) (c4)\n\nc5 = Conv2D(512, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (p4)\nc5 = BatchNormalization()(c5)\nc5 = Dropout(0.3) (c5)\nc5 = Conv2D(512, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (c5)\nc5 = BatchNormalization()(c5)\n\nu6 = Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same') (c5)\nu6 = concatenate([u6, c4])\nc6 = Conv2D(256, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (u6)\nc6 = BatchNormalization()(c6)\nc6 = Dropout(0.2) (c6)\nc6 = Conv2D(256, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (c6)\nc6 = BatchNormalization()(c6)\n\nu7 = Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same') (c6)\nu7 = concatenate([u7, c3])\nc7 = Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (u7)\nc7 = BatchNormalization()(c7)\nc7 = Dropout(0.2) (c7)\nc7 = Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (c7)\nc7 = BatchNormalization()(c7)\n\nu8 = Conv2DTranspose(32, (2, 2), strides=(2, 2), padding='same') (c7)\nu8 = concatenate([u8, c2])\nc8 = Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (u8)\nc8 = BatchNormalization()(c8)\nc8 = Dropout(0.1) (c8)\nc8 = Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (c8)\nc8 = BatchNormalization()(c8)\n\nu9 = Conv2DTranspose(16, (2, 2), strides=(2, 2), padding='same') (c8)\nu9 = concatenate([u9, c1], axis=3)\nc9 = Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (u9)\nc9 = BatchNormalization()(c9)\nc9 = Dropout(0.1) (c9)\nc9 = Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same') (c9)\nc9 = BatchNormalization()(c9)\n\noutputs = Conv2D(1, (1, 1), activation='sigmoid') (c9)","metadata":{"execution":{"iopub.status.busy":"2021-10-06T20:49:41.290878Z","iopub.execute_input":"2021-10-06T20:49:41.291177Z","iopub.status.idle":"2021-10-06T20:49:41.703720Z","shell.execute_reply.started":"2021-10-06T20:49:41.291146Z","shell.execute_reply":"2021-10-06T20:49:41.702874Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Model(inputs=[inputs], outputs=[outputs])\nmodel.compile(optimizer='adam', loss='mse', metrics=['accuracy'])\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-10-06T20:50:15.269902Z","iopub.execute_input":"2021-10-06T20:50:15.270580Z","iopub.status.idle":"2021-10-06T20:50:15.321319Z","shell.execute_reply.started":"2021-10-06T20:50:15.270540Z","shell.execute_reply":"2021-10-06T20:50:15.319363Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# pre training\n\nmodel.fit(\n    x=train_data,\n    y=train_data,\n    epochs=200,\n    batch_size=4,\n    shuffle=True,\n    validation_data=(valid_data, valid_data),\n)","metadata":{"execution":{"iopub.status.busy":"2021-10-06T20:50:26.746404Z","iopub.execute_input":"2021-10-06T20:50:26.746692Z","iopub.status.idle":"2021-10-06T21:02:23.924992Z","shell.execute_reply.started":"2021-10-06T20:50:26.746660Z","shell.execute_reply":"2021-10-06T21:02:23.924064Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"noisy_train_data = noise(train_data)\nnoisy_valid_data = noise(valid_data)","metadata":{"execution":{"iopub.status.busy":"2021-10-06T21:23:41.057547Z","iopub.execute_input":"2021-10-06T21:23:41.058478Z","iopub.status.idle":"2021-10-06T21:23:45.498006Z","shell.execute_reply.started":"2021-10-06T21:23:41.058436Z","shell.execute_reply":"2021-10-06T21:23:45.496761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(\n    x=noisy_train_data,\n    y=train_data,\n    epochs=100,\n    batch_size=4,\n    shuffle=True,\n    validation_data=(noisy_valid_data, valid_data),\n)","metadata":{"execution":{"iopub.status.busy":"2021-10-06T21:25:17.336201Z","iopub.execute_input":"2021-10-06T21:25:17.336529Z","iopub.status.idle":"2021-10-06T21:45:59.241811Z","shell.execute_reply.started":"2021-10-06T21:25:17.336496Z","shell.execute_reply":"2021-10-06T21:45:59.240217Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = model.predict(noisy_valid_data)\n#display(noisy_test_data, predictions)","metadata":{"execution":{"iopub.status.busy":"2021-10-06T21:46:05.979008Z","iopub.execute_input":"2021-10-06T21:46:05.979587Z","iopub.status.idle":"2021-10-06T21:46:06.970785Z","shell.execute_reply.started":"2021-10-06T21:46:05.979547Z","shell.execute_reply":"2021-10-06T21:46:06.969871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"io.imshow(predictions[150])","metadata":{"execution":{"iopub.status.busy":"2021-10-06T23:20:41.060408Z","iopub.execute_input":"2021-10-06T23:20:41.061566Z","iopub.status.idle":"2021-10-06T23:20:41.412411Z","shell.execute_reply.started":"2021-10-06T23:20:41.061518Z","shell.execute_reply":"2021-10-06T23:20:41.411364Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"io.imshow(noisy_valid_data[150])","metadata":{"execution":{"iopub.status.busy":"2021-10-06T23:20:45.944322Z","iopub.execute_input":"2021-10-06T23:20:45.944662Z","iopub.status.idle":"2021-10-06T23:20:46.282875Z","shell.execute_reply.started":"2021-10-06T23:20:45.944625Z","shell.execute_reply":"2021-10-06T23:20:46.281914Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"io.imshow(valid_data[150])","metadata":{"execution":{"iopub.status.busy":"2021-10-06T23:20:49.863600Z","iopub.execute_input":"2021-10-06T23:20:49.864505Z","iopub.status.idle":"2021-10-06T23:20:50.191079Z","shell.execute_reply.started":"2021-10-06T23:20:49.864454Z","shell.execute_reply":"2021-10-06T23:20:50.190034Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"type(list(predictions))","metadata":{"execution":{"iopub.status.busy":"2021-10-06T22:49:32.612484Z","iopub.execute_input":"2021-10-06T22:49:32.612967Z","iopub.status.idle":"2021-10-06T22:49:32.619681Z","shell.execute_reply.started":"2021-10-06T22:49:32.612930Z","shell.execute_reply":"2021-10-06T22:49:32.618424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from skimage.metrics import structural_similarity as ssim\n\nssimArr = []\n\nfor idx, each in enumerate(predictions):\n    ssimArr.append(ssim(each, valid_data[idx], data_range=1.0 - 0.0, multichannel=True))\n\nnp.mean(ssimArr)","metadata":{"execution":{"iopub.status.busy":"2021-10-06T23:08:29.891928Z","iopub.execute_input":"2021-10-06T23:08:29.892938Z","iopub.status.idle":"2021-10-06T23:08:32.744580Z","shell.execute_reply.started":"2021-10-06T23:08:29.892876Z","shell.execute_reply":"2021-10-06T23:08:32.743556Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n    ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"execution":{"iopub.status.busy":"2021-10-06T22:27:30.071116Z","iopub.execute_input":"2021-10-06T22:27:30.071443Z","iopub.status.idle":"2021-10-06T22:27:30.077975Z","shell.execute_reply.started":"2021-10-06T22:27:30.071406Z","shell.execute_reply":"2021-10-06T22:27:30.077110Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}