{"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":"# Cell Instance Segmentation Unet","metadata":{"papermill":{"duration":0.022685,"end_time":"2021-11-28T17:29:54.421365","exception":false,"start_time":"2021-11-28T17:29:54.39868","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"This notebook referred to the following notebook.<br/>\nhttps://www.kaggle.com/arunamenon/cell-instance-segmentation-unet-eda<br/>\nhttps://www.kaggle.com/karan23258/cell-instance-segmentation-unetfromscratch<br/>\nhttps://www.kaggle.com/evangelou/sartorius-unet-pytorch-from-scratch","metadata":{"papermill":{"duration":0.020856,"end_time":"2021-11-28T17:29:54.46392","exception":false,"start_time":"2021-11-28T17:29:54.443064","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"# Import packages","metadata":{"papermill":{"duration":0.020769,"end_time":"2021-11-28T17:29:54.506563","exception":false,"start_time":"2021-11-28T17:29:54.485794","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport imageio\nimport matplotlib.pyplot as plt\nimport cv2\nfrom skimage.io import imread, imshow, imread_collection, concatenate_images\nfrom skimage.transform import resize\nfrom tqdm import tqdm\nfrom keras.models import Model, load_model\nfrom keras.layers import Input\nfrom keras.layers.core import Dropout, Lambda\nfrom keras.layers.convolutional import Conv2D, Conv2DTranspose\nfrom keras.layers.pooling import MaxPooling2D\nfrom keras.layers.merge import concatenate\nfrom keras.callbacks import EarlyStopping, ModelCheckpoint\nfrom keras import backend as K\nimport tensorflow as tf\nfrom skimage.morphology import label\nimport random","metadata":{"papermill":{"duration":6.077976,"end_time":"2021-11-28T17:30:00.605534","exception":false,"start_time":"2021-11-28T17:29:54.527558","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:25:47.633057Z","iopub.execute_input":"2021-12-01T08:25:47.633472Z","iopub.status.idle":"2021-12-01T08:25:54.083335Z","shell.execute_reply.started":"2021-12-01T08:25:47.633395Z","shell.execute_reply":"2021-12-01T08:25:54.082564Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load input files","metadata":{"papermill":{"duration":0.020842,"end_time":"2021-11-28T17:30:00.648062","exception":false,"start_time":"2021-11-28T17:30:00.62722","status":"completed"},"tags":[]}},{"cell_type":"code","source":"train_data = pd.read_csv('../input/sartorius-cell-instance-segmentation/train.csv')","metadata":{"papermill":{"duration":0.525357,"end_time":"2021-11-28T17:30:01.194115","exception":false,"start_time":"2021-11-28T17:30:00.668758","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:25:54.084759Z","iopub.execute_input":"2021-12-01T08:25:54.085025Z","iopub.status.idle":"2021-12-01T08:25:54.565019Z","shell.execute_reply.started":"2021-12-01T08:25:54.084973Z","shell.execute_reply":"2021-12-01T08:25:54.564268Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_data.shape)\ntrain_data.head()","metadata":{"papermill":{"duration":0.043956,"end_time":"2021-11-28T17:30:01.3015","exception":false,"start_time":"2021-11-28T17:30:01.257544","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:25:54.566132Z","iopub.execute_input":"2021-12-01T08:25:54.566385Z","iopub.status.idle":"2021-12-01T08:25:54.589781Z","shell.execute_reply.started":"2021-12-01T08:25:54.566352Z","shell.execute_reply":"2021-12-01T08:25:54.589085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_data['cell_type'].unique().tolist())","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:25:54.591741Z","iopub.execute_input":"2021-12-01T08:25:54.591994Z","iopub.status.idle":"2021-12-01T08:25:54.606043Z","shell.execute_reply.started":"2021-12-01T08:25:54.59196Z","shell.execute_reply":"2021-12-01T08:25:54.605273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_data[train_data['cell_type']=='shsy5y']['id'].tolist()[0])\nprint(train_data[train_data['cell_type']=='astro']['id'].tolist()[0])\nprint(train_data[train_data['cell_type']=='cort']['id'].tolist()[0])","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:25:54.607877Z","iopub.execute_input":"2021-12-01T08:25:54.608183Z","iopub.status.idle":"2021-12-01T08:25:54.654387Z","shell.execute_reply.started":"2021-12-01T08:25:54.608147Z","shell.execute_reply":"2021-12-01T08:25:54.653612Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## rle_decode","metadata":{}},{"cell_type":"code","source":"# Reference: https://www.kaggle.com/ihelon/cell-segmentation-run-length-decoding\n\ndef rle_decode(mask_rle, shape, color=3):     #color=1,3\n    '''\n    mask_rle: run-length as string formated (start length)\n    shape: (height, width, channels) of array to return \n    color: color for the mask\n    Returns numpy array (mask)\n    '''\n    s = mask_rle.split()\n    \n    starts = list(map(lambda x: int(x) - 1, s[0::2]))\n    lengths = list(map(int, s[1::2]))\n    ends = [x + y for x, y in zip(starts, lengths)]\n    \n    img = np.zeros((shape[0] * shape[1], shape[2]), dtype=np.float32)\n            \n    for start, end in zip(starts, ends):\n        img[start : end] = color\n    \n    return img.reshape(shape)\n","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:25:54.655519Z","iopub.execute_input":"2021-12-01T08:25:54.655756Z","iopub.status.idle":"2021-12-01T08:25:54.662789Z","shell.execute_reply.started":"2021-12-01T08:25:54.655725Z","shell.execute_reply":"2021-12-01T08:25:54.662017Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## plot_masks","metadata":{}},{"cell_type":"code","source":"def plot_masks(image_id, colors=True):\n    labels = train_data[train_data[\"id\"] == image_id][\"annotation\"].tolist()\n\n    if colors:\n        mask = np.zeros((520, 704, 3))\n        for label in labels:\n            mask += rle_decode(label, shape=(520, 704, 3), color=np.random.rand(3))\n    else:\n        mask = np.zeros((520, 704, 1))\n        for label in labels:\n            mask += rle_decode(label, shape=(520, 704, 1))\n    mask = mask.clip(0, 1)\n\n    image = cv2.imread(f\"../input/sartorius-cell-instance-segmentation/train/{image_id}.png\")\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n\n    plt.figure(figsize=(18,6))\n    plt.subplot(1, 3, 1)\n    plt.imshow(image)\n    plt.title('Input image')\n    plt.axis(\"off\")\n    \n    plt.subplot(1, 3, 2)\n    plt.imshow(image)\n    plt.imshow(mask, alpha=0.1)\n    plt.title('Input image with mask')\n    plt.axis(\"off\")\n    \n    plt.subplot(1, 3, 3)\n    plt.imshow(mask)\n    plt.title('Only mask')\n    plt.axis(\"off\")\n    \n    plt.show();","metadata":{"papermill":{"duration":0.040033,"end_time":"2021-11-28T17:30:01.903185","exception":false,"start_time":"2021-11-28T17:30:01.863152","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:25:54.664272Z","iopub.execute_input":"2021-12-01T08:25:54.66474Z","iopub.status.idle":"2021-12-01T08:25:54.675957Z","shell.execute_reply.started":"2021-12-01T08:25:54.664704Z","shell.execute_reply":"2021-12-01T08:25:54.67519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_ids = ['0030fd0e6378','0140b3c8f445','01ae5a43a2ab']\n\nfor sample_id in sample_ids:\n    celltype=train_data[train_data['id']==sample_id]['cell_type'].tolist()[0]\n    file_path = '../input/sartorius-cell-instance-segmentation/train/' + sample_id + '.png'\n    image_df = imageio.imread(file_path)\n    print('ID:', sample_id, ', CellType:',celltype)\n    plot_masks(sample_id, colors=False)","metadata":{"papermill":{"duration":1.292814,"end_time":"2021-11-28T17:30:03.220044","exception":false,"start_time":"2021-11-28T17:30:01.92723","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:25:54.678488Z","iopub.execute_input":"2021-12-01T08:25:54.678698Z","iopub.status.idle":"2021-12-01T08:25:56.332856Z","shell.execute_reply.started":"2021-12-01T08:25:54.678664Z","shell.execute_reply":"2021-12-01T08:25:56.332257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Modelling","metadata":{"papermill":{"duration":0.061034,"end_time":"2021-11-28T17:30:06.526519","exception":false,"start_time":"2021-11-28T17:30:06.465485","status":"completed"},"tags":[]}},{"cell_type":"code","source":"sample_submission=pd.read_csv('../input/sartorius-cell-instance-segmentation/sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:25:56.333889Z","iopub.execute_input":"2021-12-01T08:25:56.334273Z","iopub.status.idle":"2021-12-01T08:25:56.345225Z","shell.execute_reply.started":"2021-12-01T08:25:56.334239Z","shell.execute_reply":"2021-12-01T08:25:56.344191Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Reference: https://www.kaggle.com/keegil/keras-u-net-starter-lb-0-277\nIMG_HEIGHT = 256\nIMG_WIDTH = 256\nIMG_CHANNELS = 1\nTRAIN_PATH = '../input/sartorius-cell-instance-segmentation/train/'\n\ntrain_ids = train_data['id'].unique().tolist()\ntest_ids = sample_submission['id'].unique().tolist()\n\n# Get and resize train images and masks\nX_train = np.zeros((train_data['id'].nunique(), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)\nY_train = np.zeros((train_data['id'].nunique(), IMG_HEIGHT, IMG_WIDTH, 1), dtype=np.bool)","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:25:56.348556Z","iopub.execute_input":"2021-12-01T08:25:56.348814Z","iopub.status.idle":"2021-12-01T08:25:56.372831Z","shell.execute_reply.started":"2021-12-01T08:25:56.34878Z","shell.execute_reply":"2021-12-01T08:25:56.37225Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for n, id_ in tqdm(enumerate(train_ids), total=len(train_ids)):\n    path = TRAIN_PATH + id_\n    img = imread(path + '.png')[:,:]\n    img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)\n    img = np.expand_dims(img, axis = 2)\n    X_train[n] = img\n    \n    labels = train_data[train_data[\"id\"] == id_][\"annotation\"].tolist()\n    mask = np.zeros((520, 704, 1))\n    for label in labels:\n        mask += rle_decode(label, shape=(520, 704, 1), color = 1)\n    mask = mask.clip(0, 1)\n    mask = mask[:,:,0]\n\n    mask = np.expand_dims(resize(mask, (IMG_HEIGHT, IMG_WIDTH), mode='constant', \n                                  preserve_range=True), axis=-1)\n    \n    Y_train[n] = mask","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:25:56.374041Z","iopub.execute_input":"2021-12-01T08:25:56.37442Z","iopub.status.idle":"2021-12-01T08:27:25.690191Z","shell.execute_reply.started":"2021-12-01T08:25:56.374387Z","shell.execute_reply":"2021-12-01T08:27:25.686266Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Get and resize test images\nX_test = np.zeros((sample_submission['id'].nunique(), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)\n\nfor n, id_ in tqdm(enumerate(test_ids), total=len(test_ids)):\n    path = TRAIN_PATH.replace('train', 'test') + id_\n    img = imread(path + '.png')[:,:]\n    img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)\n    img = np.expand_dims(img, axis = 2)\n    X_test[n] = img","metadata":{"papermill":{"duration":90.06187,"end_time":"2021-11-28T17:31:36.643849","exception":false,"start_time":"2021-11-28T17:30:06.581979","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:27:25.691498Z","iopub.execute_input":"2021-12-01T08:27:25.691828Z","iopub.status.idle":"2021-12-01T08:27:25.79909Z","shell.execute_reply.started":"2021-12-01T08:27:25.69179Z","shell.execute_reply":"2021-12-01T08:27:25.796745Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(X_train.shape,Y_train.shape,X_test.shape)","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:27:25.800301Z","iopub.execute_input":"2021-12-01T08:27:25.800746Z","iopub.status.idle":"2021-12-01T08:27:25.807585Z","shell.execute_reply.started":"2021-12-01T08:27:25.800708Z","shell.execute_reply":"2021-12-01T08:27:25.806528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_id_num = 40\nplt.imshow(X_train[sample_id_num][:,:,0], cmap = 'gray')\nplt.show()\nplt.imshow(Y_train[sample_id_num][:,:,0])\nplt.show()\n\nprint('Input image:','Min:', X_train[sample_id_num][:,:,0].min(), '; Max:', X_train[sample_id_num][:,:,0].max(), '; Mean:', X_train[sample_id_num][:,:,0].mean())\nprint('Mask:','Min:', Y_train[sample_id_num][:,:,0].min(), '; Max:', Y_train[sample_id_num][:,:,0].max(), '; Mean:', Y_train[sample_id_num][:,:,0].mean())","metadata":{"papermill":{"duration":0.554336,"end_time":"2021-11-28T17:31:37.495502","exception":false,"start_time":"2021-11-28T17:31:36.941166","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:27:25.80904Z","iopub.execute_input":"2021-12-01T08:27:25.809491Z","iopub.status.idle":"2021-12-01T08:27:26.210595Z","shell.execute_reply.started":"2021-12-01T08:27:25.809455Z","shell.execute_reply":"2021-12-01T08:27:26.209918Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.to_int32 = lambda x: tf.cast(x, tf.int32)\n\ndef mean_iou(y_true, y_pred, smooth=1):\n    intersection = K.sum(K.abs(y_true * y_pred), axis=[1,2,3])\n    union = K.sum(y_true,[1,2,3])+K.sum(y_pred,[1,2,3])-intersection\n    iou = K.mean((intersection + smooth) / (union + smooth), axis=0)\n    return tf.convert_to_tensor(iou)","metadata":{"papermill":{"duration":0.192306,"end_time":"2021-11-28T17:31:37.872241","exception":false,"start_time":"2021-11-28T17:31:37.679935","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:27:26.211795Z","iopub.execute_input":"2021-12-01T08:27:26.212069Z","iopub.status.idle":"2021-12-01T08:27:26.219823Z","shell.execute_reply.started":"2021-12-01T08:27:26.212033Z","shell.execute_reply":"2021-12-01T08:27:26.218042Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## dice_coefficient","metadata":{}},{"cell_type":"code","source":"def dice_coefficient(y_true, y_pred):\n    numerator = 2 * tf.reduce_sum(y_true * y_pred)\n    denominator = tf.reduce_sum(y_true + y_pred)\n    return numerator / (denominator + tf.keras.backend.epsilon())","metadata":{"papermill":{"duration":0.191789,"end_time":"2021-11-28T17:31:38.245624","exception":false,"start_time":"2021-11-28T17:31:38.053835","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:27:26.220809Z","iopub.execute_input":"2021-12-01T08:27:26.221153Z","iopub.status.idle":"2021-12-01T08:27:26.228302Z","shell.execute_reply.started":"2021-12-01T08:27:26.221113Z","shell.execute_reply":"2021-12-01T08:27:26.227392Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Reference: 'U-Net: Convolutional Networks for Biomedical Image Segmentation'\nhttps://arxiv.org/pdf/1505.04597.pdf","metadata":{"papermill":{"duration":0.192324,"end_time":"2021-11-28T17:31:38.622535","exception":false,"start_time":"2021-11-28T17:31:38.430211","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Build U-Net model\ninputs = Input((IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS))\ns = Lambda(lambda x: x / 255) (inputs)\n\nc1 = Conv2D(16, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (s)\nc1 = Dropout(0.1) (c1)\nc1 = Conv2D(16, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (c1)\np1 = MaxPooling2D((2, 2)) (c1)\n\nc2 = Conv2D(32, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (p1)\nc2 = Dropout(0.1) (c2)\nc2 = Conv2D(32, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (c2)\np2 = MaxPooling2D((2, 2)) (c2)\n\nc3 = Conv2D(64, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (p2)\nc3 = Dropout(0.2) (c3)\nc3 = Conv2D(64, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (c3)\np3 = MaxPooling2D((2, 2)) (c3)\n\nc4 = Conv2D(128, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (p3)\nc4 = Dropout(0.2) (c4)\nc4 = Conv2D(128, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (c4)\np4 = MaxPooling2D(pool_size=(2, 2)) (c4)\n\nc5 = Conv2D(256, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (p4)\nc5 = Dropout(0.3) (c5)\nc5 = Conv2D(256, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (c5)\n\nu6 = Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same') (c5)\nu6 = concatenate([u6, c4])\nc6 = Conv2D(128, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (u6)\nc6 = Dropout(0.2) (c6)\nc6 = Conv2D(128, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (c6)\n\nu7 = Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same') (c6)\nu7 = concatenate([u7, c3])\nc7 = Conv2D(64, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (u7)\nc7 = Dropout(0.2) (c7)\nc7 = Conv2D(64, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (c7)\n\nu8 = Conv2DTranspose(32, (2, 2), strides=(2, 2), padding='same') (c7)\nu8 = concatenate([u8, c2])\nc8 = Conv2D(32, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (u8)\nc8 = Dropout(0.1) (c8)\nc8 = Conv2D(32, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (c8)\n\nu9 = Conv2DTranspose(16, (2, 2), strides=(2, 2), padding='same') (c8)\nu9 = concatenate([u9, c1], axis=3)\nc9 = Conv2D(16, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (u9)\nc9 = Dropout(0.1) (c9)\nc9 = Conv2D(16, (3, 3), activation='elu', kernel_initializer='he_normal', padding='same') (c9)\n\noutputs = Conv2D(1, (1, 1), activation='sigmoid') (c9)\n\nmodel = Model(inputs=[inputs], outputs=[outputs])\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=[dice_coefficient])\n#model.summary()","metadata":{"papermill":{"duration":2.564169,"end_time":"2021-11-28T17:31:41.380279","exception":false,"start_time":"2021-11-28T17:31:38.81611","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:27:26.230023Z","iopub.execute_input":"2021-12-01T08:27:26.230312Z","iopub.status.idle":"2021-12-01T08:27:28.821207Z","shell.execute_reply.started":"2021-12-01T08:27:26.230261Z","shell.execute_reply":"2021-12-01T08:27:28.820446Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Fit model\nearlystopper = EarlyStopping(patience=20, verbose=1)\ncheckpointer = ModelCheckpoint('best_model.h5', verbose=1, save_best_only=True)\nresults = model.fit(X_train, Y_train, validation_split=0.15, batch_size=5, epochs=50, \n                    callbacks=[earlystopper, checkpointer])","metadata":{"papermill":{"duration":83.997261,"end_time":"2021-11-28T17:33:05.566561","exception":false,"start_time":"2021-11-28T17:31:41.5693","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:27:28.82263Z","iopub.execute_input":"2021-12-01T08:27:28.822876Z","iopub.status.idle":"2021-12-01T08:29:52.66947Z","shell.execute_reply.started":"2021-12-01T08:27:28.822843Z","shell.execute_reply":"2021-12-01T08:29:52.668611Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12,4))\nplt.plot(results.history['loss'])\nplt.plot(results.history['val_loss'])\nplt.title('model loss')\nplt.ylabel('Loss')\nplt.xlabel('epoch')\nplt.legend(['train', 'val'], loc='upper right')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:29:52.671603Z","iopub.execute_input":"2021-12-01T08:29:52.672053Z","iopub.status.idle":"2021-12-01T08:29:52.894827Z","shell.execute_reply.started":"2021-12-01T08:29:52.671987Z","shell.execute_reply":"2021-12-01T08:29:52.894045Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12,4))\nplt.plot(results.history['dice_coefficient'])\nplt.plot(results.history['val_dice_coefficient'])\nplt.title('dice_coefficient')\nplt.ylabel('dice_coefficient')\nplt.xlabel('epoch')\nplt.legend(['train', 'val'], loc='upper left')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:29:52.896078Z","iopub.execute_input":"2021-12-01T08:29:52.896348Z","iopub.status.idle":"2021-12-01T08:29:53.108701Z","shell.execute_reply.started":"2021-12-01T08:29:52.896314Z","shell.execute_reply":"2021-12-01T08:29:53.108032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prediction","metadata":{"papermill":{"duration":0.466159,"end_time":"2021-11-28T17:33:07.937211","exception":false,"start_time":"2021-11-28T17:33:07.471052","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Predict on train, val and test\nmodel = load_model('best_model.h5', custom_objects={'dice_coefficient': dice_coefficient})\npreds_train = model.predict(X_train[:int(X_train.shape[0]*0.9)], verbose=1)\npreds_val = model.predict(X_train[int(X_train.shape[0]*0.9):], verbose=1)\npreds_test = model.predict(X_test, verbose=1)\n\n# Threshold predictions\npreds_train_t = (preds_train > 0.5).astype(np.uint8)\npreds_val_t = (preds_val > 0.5).astype(np.uint8)\npreds_test_t = (preds_test > 0.5).astype(np.uint8)\n\n# Create list of upsampled test masks\npreds_test_upsampled = []\nfor i in range(len(preds_test)):\n    preds_test_upsampled.append(resize(np.squeeze(preds_test[i]), \n                                    (IMG_HEIGHT, IMG_WIDTH), \n                                    mode='constant', preserve_range=True))","metadata":{"papermill":{"duration":3.222074,"end_time":"2021-11-28T17:33:11.623059","exception":false,"start_time":"2021-11-28T17:33:08.400985","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:29:53.110042Z","iopub.execute_input":"2021-12-01T08:29:53.11053Z","iopub.status.idle":"2021-12-01T08:29:56.298789Z","shell.execute_reply.started":"2021-12-01T08:29:53.110492Z","shell.execute_reply":"2021-12-01T08:29:56.297762Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Perform a sanity check on some random training samples\nix = random.randint(0, len(preds_train_t))\nimshow(X_train[ix])\nplt.show()\nimshow(np.squeeze(Y_train[ix]))\nplt.show()\nimshow(np.squeeze(preds_train_t[ix]))\nplt.show()","metadata":{"papermill":{"duration":1.216413,"end_time":"2021-11-28T17:33:13.374434","exception":false,"start_time":"2021-11-28T17:33:12.158021","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:29:56.30031Z","iopub.execute_input":"2021-12-01T08:29:56.300757Z","iopub.status.idle":"2021-12-01T08:29:57.052531Z","shell.execute_reply.started":"2021-12-01T08:29:56.300716Z","shell.execute_reply":"2021-12-01T08:29:57.051818Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Perform a sanity check on some random validation samples\nix = random.randint(0, len(preds_val_t))\nimshow(X_train[int(X_train.shape[0]*0.9):][ix])\nplt.show()\nimshow(np.squeeze(Y_train[int(Y_train.shape[0]*0.9):][ix]))\nplt.show()\nimshow(np.squeeze(preds_val_t[ix]))\nplt.show()","metadata":{"papermill":{"duration":1.354289,"end_time":"2021-11-28T17:33:15.206283","exception":false,"start_time":"2021-11-28T17:33:13.851994","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:29:57.053898Z","iopub.execute_input":"2021-12-01T08:29:57.054181Z","iopub.status.idle":"2021-12-01T08:29:57.778798Z","shell.execute_reply.started":"2021-12-01T08:29:57.054145Z","shell.execute_reply":"2021-12-01T08:29:57.778073Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Test samples\nix = random.randint(0, len(preds_test_t)-1)\nimshow(X_test[ix])\nplt.show()\nimshow(np.squeeze(preds_test_t[ix]))\nplt.show()","metadata":{"papermill":{"duration":0.999414,"end_time":"2021-11-28T17:33:16.829229","exception":false,"start_time":"2021-11-28T17:33:15.829815","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-12-01T08:29:57.779981Z","iopub.execute_input":"2021-12-01T08:29:57.780254Z","iopub.status.idle":"2021-12-01T08:29:58.282364Z","shell.execute_reply.started":"2021-12-01T08:29:57.7802Z","shell.execute_reply":"2021-12-01T08:29:58.281623Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## rle_encoding","metadata":{}},{"cell_type":"code","source":"def rle_encoding(x):\n    dots = np.where(x.flatten() == 1)[0]\n    run_lengths = []\n    prev = -2\n    for b in dots:\n        if (b>prev+1): run_lengths.extend((b + 1, 0))\n        run_lengths[-1] += 1\n        prev = b\n    return ' '.join(map(str, run_lengths))","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:29:58.283662Z","iopub.execute_input":"2021-12-01T08:29:58.284073Z","iopub.status.idle":"2021-12-01T08:29:58.290387Z","shell.execute_reply.started":"2021-12-01T08:29:58.284035Z","shell.execute_reply":"2021-12-01T08:29:58.28974Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for pred in preds_test_t:\n    plt.imshow(pred)\n    plt.title('pred before resize')\n    plt.axis(\"off\")\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:29:58.291432Z","iopub.execute_input":"2021-12-01T08:29:58.291856Z","iopub.status.idle":"2021-12-01T08:29:58.63497Z","shell.execute_reply.started":"2021-12-01T08:29:58.29182Z","shell.execute_reply":"2021-12-01T08:29:58.634178Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#test_mask: after reshape before fix_overlapping\nfor pred in preds_test_t:\n    print(pred.shape)\n    test_mask=cv2.resize(pred,dsize=(704,520),interpolation=cv2.INTER_CUBIC).reshape(520,704,1)\n    print(test_mask.shape)\n        \n    plt.imshow(test_mask)\n    plt.title('pred after resize')\n    plt.axis(\"off\")\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:29:58.636194Z","iopub.execute_input":"2021-12-01T08:29:58.636466Z","iopub.status.idle":"2021-12-01T08:29:59.119333Z","shell.execute_reply.started":"2021-12-01T08:29:58.63643Z","shell.execute_reply":"2021-12-01T08:29:59.118452Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_masks = [cv2.resize(pred,dsize=(704,520),interpolation=cv2.INTER_CUBIC).reshape(520,704,1) for pred in preds_test_t]\nprint(test_masks[0].shape)\nprint(test_masks[1].shape)\nprint(test_masks[2].shape)","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:29:59.123724Z","iopub.execute_input":"2021-12-01T08:29:59.123921Z","iopub.status.idle":"2021-12-01T08:29:59.132508Z","shell.execute_reply.started":"2021-12-01T08:29:59.123896Z","shell.execute_reply":"2021-12-01T08:29:59.131623Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## fix_overlap\nhttps://www.kaggle.com/c/sartorius-cell-instance-segmentation/discussion/279995","metadata":{}},{"cell_type":"code","source":"def check_overlap(msk):\n    msk = msk.astype(np.bool).astype(np.uint8)\n    return np.any(np.sum(msk, axis=-1)>1)","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:29:59.134001Z","iopub.execute_input":"2021-12-01T08:29:59.13455Z","iopub.status.idle":"2021-12-01T08:29:59.139811Z","shell.execute_reply.started":"2021-12-01T08:29:59.134514Z","shell.execute_reply":"2021-12-01T08:29:59.138848Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def fix_overlap(msk):\n    \"\"\"\n    Args:\n        mask: multi-channel mask, each channel is an instance of cell, shape:(520,704,None)\n    Returns:\n        multi-channel mask with non-overlapping values, shape:(520,704,None)\n    \"\"\"\n    msk = np.array(msk)\n    msk = np.pad(msk, [[0,0],[0,0],[1,0]])\n    ins_len = msk.shape[-1]\n    msk = np.argmax(msk,axis=-1)\n    msk = tf.keras.utils.to_categorical(msk, num_classes=ins_len)\n    msk = msk[...,1:]\n    msk = msk[...,np.any(msk, axis=(0,1))]\n    return msk","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:29:59.141023Z","iopub.execute_input":"2021-12-01T08:29:59.141808Z","iopub.status.idle":"2021-12-01T08:29:59.149605Z","shell.execute_reply.started":"2021-12-01T08:29:59.141773Z","shell.execute_reply":"2021-12-01T08:29:59.148916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### When prediction resulted in failure, error message said ValueError: cannot reshape array of size 0 into shape (520,704,1)","metadata":{}},{"cell_type":"code","source":"for test_mask in test_masks:\n    overlap_test_masks=check_overlap(test_mask)\n    print(overlap_test_masks)","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:29:59.152034Z","iopub.execute_input":"2021-12-01T08:29:59.15249Z","iopub.status.idle":"2021-12-01T08:29:59.163088Z","shell.execute_reply.started":"2021-12-01T08:29:59.152452Z","shell.execute_reply":"2021-12-01T08:29:59.162348Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#test_mask2: after reshape after fix_overlapping\ntest_masks2=[]\nfor test_mask in test_masks:\n    test_mask2 = fix_overlap(test_mask).reshape(520,704,1)\n    print(test_mask2.shape)\n    test_masks2+=[test_mask2]","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:29:59.164556Z","iopub.execute_input":"2021-12-01T08:29:59.16492Z","iopub.status.idle":"2021-12-01T08:29:59.18782Z","shell.execute_reply.started":"2021-12-01T08:29:59.164886Z","shell.execute_reply":"2021-12-01T08:29:59.187115Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for test_mask2 in test_masks2:\n    overlap_test_masks2=check_overlap(test_mask2)\n    print(overlap_test_masks2)","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:29:59.189022Z","iopub.execute_input":"2021-12-01T08:29:59.189403Z","iopub.status.idle":"2021-12-01T08:29:59.19803Z","shell.execute_reply.started":"2021-12-01T08:29:59.189369Z","shell.execute_reply":"2021-12-01T08:29:59.19717Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"predicted = [rle_encoding(test_mask) for test_mask in test_masks]\nprint(predicted[0])","metadata":{}},{"cell_type":"code","source":"predicted2 = [rle_encoding(test_mask2) for test_mask2 in test_masks2]\n#print(predicted2[0])","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:48:54.101105Z","iopub.execute_input":"2021-12-01T08:48:54.101912Z","iopub.status.idle":"2021-12-01T08:48:54.350699Z","shell.execute_reply.started":"2021-12-01T08:48:54.101856Z","shell.execute_reply":"2021-12-01T08:48:54.349962Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submit = sample_submission.copy()\nsubmit['predicted'] = predicted2\nsubmit.to_csv('submission.csv', index=False)\nsubmit","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ids=sample_submission['id'].tolist()\nprint(ids)\nsubmit2=pd.DataFrame(columns=sample_submission.columns)  \n\nfor idi, test_mask2 in zip(ids,test_masks2):\n    annos=rle_encoding(test_mask2)\n    annos2=annos.split(' ')\n    annos4=[]\n    for i in range(len(annos2)//100):\n        annos3=''\n        for j in range(100):\n            annos3+=annos2[i*100+j]+' '\n        annos4+=[annos3]\n        \n    submit=pd.DataFrame(columns=sample_submission.columns)    \n    submit['predicted']=annos4\n    submit['id']=idi\n    submit2=pd.concat([submit2,submit],axis=0)\n    \n#submit2.to_csv('submission.csv', index=False)\nsubmit2","metadata":{"execution":{"iopub.status.busy":"2021-12-01T09:26:56.551027Z","iopub.execute_input":"2021-12-01T09:26:56.551464Z","iopub.status.idle":"2021-12-01T09:26:56.859377Z","shell.execute_reply.started":"2021-12-01T09:26:56.551426Z","shell.execute_reply":"2021-12-01T09:26:56.858619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(test_masks[0])\nplt.title('before fix_overlapping')\nplt.axis(\"off\")\nplt.show()\n\nplt.imshow(test_masks2[0])\nplt.title('after fix_overlapping')\nplt.axis(\"off\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-12-01T08:29:59.966577Z","iopub.status.idle":"2021-12-01T08:29:59.967195Z","shell.execute_reply.started":"2021-12-01T08:29:59.966956Z","shell.execute_reply":"2021-12-01T08:29:59.966982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"execution":{"iopub.status.busy":"2021-12-01T09:27:45.536132Z","iopub.execute_input":"2021-12-01T09:27:45.536686Z","iopub.status.idle":"2021-12-01T09:27:45.543353Z","shell.execute_reply.started":"2021-12-01T09:27:45.536648Z","shell.execute_reply":"2021-12-01T09:27:45.542125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}