{"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":"# Sartorius - Cell Instance Segmentation\n![](https://storage.googleapis.com/kaggle-competitions/kaggle/30201/logos/header.png?t=2021-09-03-15-27-46)","metadata":{}},{"cell_type":"markdown","source":"# Import packages","metadata":{}},{"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":{"execution":{"iopub.status.busy":"2021-11-08T08:36:48.183524Z","iopub.execute_input":"2021-11-08T08:36:48.183973Z","iopub.status.idle":"2021-11-08T08:36:54.347019Z","shell.execute_reply.started":"2021-11-08T08:36:48.183797Z","shell.execute_reply":"2021-11-08T08:36:54.346272Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load input files","metadata":{}},{"cell_type":"code","source":"train_data = pd.read_csv('../input/sartorius-cell-instance-segmentation/train.csv')\nsample_submission = pd.read_csv('../input/sartorius-cell-instance-segmentation/sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2021-11-08T08:36:54.348644Z","iopub.execute_input":"2021-11-08T08:36:54.348921Z","iopub.status.idle":"2021-11-08T08:36:54.867001Z","shell.execute_reply.started":"2021-11-08T08:36:54.348881Z","shell.execute_reply":"2021-11-08T08:36:54.866260Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# EDA","metadata":{}},{"cell_type":"code","source":"print(train_data.shape)\ntrain_data.head()","metadata":{"execution":{"iopub.status.busy":"2021-11-08T08:36:54.870157Z","iopub.execute_input":"2021-11-08T08:36:54.870372Z","iopub.status.idle":"2021-11-08T08:36:54.891989Z","shell.execute_reply.started":"2021-11-08T08:36:54.870340Z","shell.execute_reply":"2021-11-08T08:36:54.891290Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('# IDs in train data:', train_data['id'].nunique())\ntrain_data.groupby(['id']).size().reset_index().rename(columns = {0:'# Cells'}).sort_values(by = '# Cells', ascending = False)","metadata":{"execution":{"iopub.status.busy":"2021-11-08T08:36:54.893962Z","iopub.execute_input":"2021-11-08T08:36:54.894358Z","iopub.status.idle":"2021-11-08T08:36:54.927911Z","shell.execute_reply.started":"2021-11-08T08:36:54.894323Z","shell.execute_reply":"2021-11-08T08:36:54.927131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"temp_summary = train_data.groupby(['cell_type']).size().reset_index().rename(columns = {0:'# Cells'}).sort_values(by = '# Cells', ascending = False).reset_index(drop = True)\nplt.bar(data = temp_summary,x = 'cell_type', height = '# Cells')\nplt.title('# Cells')\nplt.show()\n\ntemp_summary = train_data.groupby(['cell_type']).agg({'id':'nunique'}).reset_index().rename(columns = {'id':'# images'}).sort_values(by = '# images', ascending = False).reset_index(drop = True)\nplt.bar(data = temp_summary,x = 'cell_type', height = '# images')\nplt.title('# Images')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-11-08T08:36:54.929316Z","iopub.execute_input":"2021-11-08T08:36:54.929573Z","iopub.status.idle":"2021-11-08T08:36:55.280971Z","shell.execute_reply.started":"2021-11-08T08:36:54.929541Z","shell.execute_reply":"2021-11-08T08:36:55.280192Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Reference: https://www.kaggle.com/ihelon/cell-segmentation-run-length-decoding\n\ndef rle_decode(mask_rle, shape, color=1):\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    '''\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\ndef 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=(16, 32))\n    plt.subplot(3, 1, 1)\n    plt.imshow(image)\n    plt.title('Input image')\n    plt.axis(\"off\")\n    plt.subplot(3, 1, 2)\n    plt.imshow(image)\n    plt.imshow(mask, alpha=0.5)\n    plt.title('Input image with mask')\n    plt.axis(\"off\")\n    plt.subplot(3, 1, 3)\n    plt.imshow(mask)\n    plt.title('Only mask')\n    plt.axis(\"off\")\n    \n    plt.show();","metadata":{"execution":{"iopub.status.busy":"2021-11-08T08:36:55.282543Z","iopub.execute_input":"2021-11-08T08:36:55.283063Z","iopub.status.idle":"2021-11-08T08:36:55.298478Z","shell.execute_reply.started":"2021-11-08T08:36:55.283022Z","shell.execute_reply":"2021-11-08T08:36:55.297584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_id = 'd164e96bb7a9'\nfile_path = '../input/sartorius-cell-instance-segmentation/train/' + sample_id + '.png'\n\nimage_df = imageio.imread(file_path)\nprint('ID:', sample_id, '\\nshape:',image_df.shape)\n\nplot_masks(sample_id, colors=False)\n\nprint('\\nTrain data:\\n')\ndisplay(train_data[train_data['id']==sample_id])","metadata":{"execution":{"iopub.status.busy":"2021-11-08T08:36:55.300167Z","iopub.execute_input":"2021-11-08T08:36:55.300582Z","iopub.status.idle":"2021-11-08T08:36:56.581518Z","shell.execute_reply.started":"2021-11-08T08:36:55.300545Z","shell.execute_reply":"2021-11-08T08:36:56.580894Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_semi_supervised\nfile_path = '../input/sartorius-cell-instance-segmentation/train_semi_supervised/astro[hippo]_D1-1_Vessel-361_2020-09-14_13h00m00s_Ph_1.png'\nimage_df = imageio.imread(file_path)\nprint('ID:', sample_id, '\\nshape:',image_df.shape)\nplt.imshow(image_df, cmap = 'gray')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-11-08T08:36:56.582466Z","iopub.execute_input":"2021-11-08T08:36:56.582877Z","iopub.status.idle":"2021-11-08T08:36:56.840906Z","shell.execute_reply.started":"2021-11-08T08:36:56.582826Z","shell.execute_reply":"2021-11-08T08:36:56.840239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# LIVECell_dataset_2021\nimport json\njson_file_path = '../input/sartorius-cell-instance-segmentation/LIVECell_dataset_2021/annotations/LIVECell_single_cells/shsy5y/livecell_shsy5y_test.json'\n\nwith open(json_file_path, 'r') as j:\n     temp_contents = json.loads(j.read())\n        \nprint(temp_contents.keys())","metadata":{"execution":{"iopub.status.busy":"2021-11-08T08:36:56.842134Z","iopub.execute_input":"2021-11-08T08:36:56.842459Z","iopub.status.idle":"2021-11-08T08:36:59.722677Z","shell.execute_reply.started":"2021-11-08T08:36:56.842421Z","shell.execute_reply":"2021-11-08T08:36:59.721908Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Modelling","metadata":{}},{"cell_type":"code","source":"# Reference: https://www.kaggle.com/keegil/keras-u-net-starter-lb-0-277\n\nIMG_HEIGHT = 512\nIMG_WIDTH = 512\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)\nprint('Getting and resizing train images and masks ... ')\n\nfor 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\n\n# Get and resize test images\nX_test = np.zeros((sample_submission['id'].nunique(), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)\nprint('Getting and resizing test images ... ')\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\n\nprint('Done!')","metadata":{"execution":{"iopub.status.busy":"2021-11-08T08:36:59.725224Z","iopub.execute_input":"2021-11-08T08:36:59.725648Z","iopub.status.idle":"2021-11-08T08:38:37.114985Z","shell.execute_reply.started":"2021-11-08T08:36:59.725611Z","shell.execute_reply":"2021-11-08T08:38:37.109069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_flip = np.flip(X_train , axis = 2)\ny_flip = np.flip(Y_train, axis = 2)\n\nX_train = np.append(X_train, x_flip, axis = 0)\nY_train = np.append(Y_train, y_flip, axis = 0)\n\nprint(\"X Shape: \", X_train.shape, \"Y Shape: \", Y_train.shape)","metadata":{"execution":{"iopub.status.busy":"2021-11-08T08:38:37.116286Z","iopub.execute_input":"2021-11-08T08:38:37.116728Z","iopub.status.idle":"2021-11-08T08:38:37.469205Z","shell.execute_reply.started":"2021-11-08T08:38:37.116687Z","shell.execute_reply":"2021-11-08T08:38:37.467647Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_flip = np.flip(X_train[:606] , axis = 1)\ny_flip = np.flip(Y_train[:606], axis = 1)\n\nX_train = np.append(X_train, x_flip, axis = 0)\nY_train = np.append(Y_train, y_flip, axis = 0)\n\nprint(\"X Shape: \", X_train.shape, \"Y Shape: \", Y_train.shape)","metadata":{"execution":{"iopub.status.busy":"2021-11-08T08:38:37.470719Z","iopub.execute_input":"2021-11-08T08:38:37.471007Z","iopub.status.idle":"2021-11-08T08:38:37.880183Z","shell.execute_reply.started":"2021-11-08T08:38:37.470970Z","shell.execute_reply":"2021-11-08T08:38:37.875897Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_id_num = 0\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":{"execution":{"iopub.status.busy":"2021-11-08T08:38:37.884600Z","iopub.execute_input":"2021-11-08T08:38:37.886965Z","iopub.status.idle":"2021-11-08T08:38:38.385142Z","shell.execute_reply.started":"2021-11-08T08:38:37.886924Z","shell.execute_reply":"2021-11-08T08:38:38.384400Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.to_int32=lambda x: tf.cast(x, tf.int32)\n\n# Define IoU metric\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":{"execution":{"iopub.status.busy":"2021-11-08T08:38:55.814101Z","iopub.execute_input":"2021-11-08T08:38:55.814682Z","iopub.status.idle":"2021-11-08T08:38:55.821218Z","shell.execute_reply.started":"2021-11-08T08:38:55.814640Z","shell.execute_reply":"2021-11-08T08:38:55.820291Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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":{"execution":{"iopub.status.busy":"2021-11-08T08:38:56.435340Z","iopub.execute_input":"2021-11-08T08:38:56.436079Z","iopub.status.idle":"2021-11-08T08:38:56.442603Z","shell.execute_reply.started":"2021-11-08T08:38:56.436042Z","shell.execute_reply":"2021-11-08T08:38:56.441899Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Unet model paper: https://arxiv.org/pdf/1505.04597.pdf","metadata":{}},{"cell_type":"markdown","source":"![](https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/u-net-architecture.png)","metadata":{}},{"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])\n#model.compile(optimizer='adam', loss='binary_crossentropy', metrics=[dice_coefficient])\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-11-08T09:25:26.598918Z","iopub.execute_input":"2021-11-08T09:25:26.599452Z","iopub.status.idle":"2021-11-08T09:25:26.848605Z","shell.execute_reply.started":"2021-11-08T09:25:26.599410Z","shell.execute_reply":"2021-11-08T09:25:26.847924Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3), loss='binary_crossentropy', metrics=['accuracy'])\n","metadata":{"execution":{"iopub.status.busy":"2021-11-08T09:26:03.797331Z","iopub.execute_input":"2021-11-08T09:26:03.797870Z","iopub.status.idle":"2021-11-08T09:26:03.809086Z","shell.execute_reply.started":"2021-11-08T09:26:03.797815Z","shell.execute_reply":"2021-11-08T09:26:03.808223Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"# Fit model\nearlystopper = EarlyStopping(patience=10, 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=100, \n                    callbacks=[earlystopper, checkpointer])\"\"\"","metadata":{"execution":{"iopub.status.busy":"2021-11-08T09:26:04.226167Z","iopub.execute_input":"2021-11-08T09:26:04.226917Z","iopub.status.idle":"2021-11-08T10:02:10.201370Z","shell.execute_reply.started":"2021-11-08T09:26:04.226869Z","shell.execute_reply":"2021-11-08T10:02:10.200527Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"plt.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()\n\n\"\"\"","metadata":{"execution":{"iopub.status.busy":"2021-11-08T10:13:43.657605Z","iopub.execute_input":"2021-11-08T10:13:43.657910Z","iopub.status.idle":"2021-11-08T10:13:43.875352Z","shell.execute_reply.started":"2021-11-08T10:13:43.657877Z","shell.execute_reply":"2021-11-08T10:13:43.874652Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predictions","metadata":{}},{"cell_type":"code","source":"# Predict on train, val and test\nmodel = load_model('../input/unet-new-model/model_011.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","metadata":{"execution":{"iopub.status.busy":"2021-11-08T10:14:34.173298Z","iopub.execute_input":"2021-11-08T10:14:34.175514Z","iopub.status.idle":"2021-11-08T10:14:59.301262Z","shell.execute_reply.started":"2021-11-08T10:14:34.175477Z","shell.execute_reply":"2021-11-08T10:14:59.300449Z"},"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":{"execution":{"iopub.status.busy":"2021-11-08T10:15:08.957301Z","iopub.execute_input":"2021-11-08T10:15:08.957594Z","iopub.status.idle":"2021-11-08T10:15:09.722725Z","shell.execute_reply.started":"2021-11-08T10:15:08.957552Z","shell.execute_reply":"2021-11-08T10:15:09.722041Z"},"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":{"execution":{"iopub.status.busy":"2021-11-08T10:15:30.996759Z","iopub.execute_input":"2021-11-08T10:15:30.997551Z","iopub.status.idle":"2021-11-08T10:15:32.087117Z","shell.execute_reply.started":"2021-11-08T10:15:30.997505Z","shell.execute_reply":"2021-11-08T10:15:32.086411Z"},"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":{"execution":{"iopub.status.busy":"2021-11-08T10:15:32.335500Z","iopub.execute_input":"2021-11-08T10:15:32.336058Z","iopub.status.idle":"2021-11-08T10:15:32.876644Z","shell.execute_reply.started":"2021-11-08T10:15:32.336017Z","shell.execute_reply":"2021-11-08T10:15:32.875947Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_masks = [cv2.resize(pred, (704,520)) for pred in preds_test_t]","metadata":{"execution":{"iopub.status.busy":"2021-11-08T10:16:09.247742Z","iopub.execute_input":"2021-11-08T10:16:09.248597Z","iopub.status.idle":"2021-11-08T10:16:09.266427Z","shell.execute_reply.started":"2021-11-08T10:16:09.248547Z","shell.execute_reply":"2021-11-08T10:16:09.265409Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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-11-08T10:57:56.754978Z","iopub.execute_input":"2021-11-08T10:57:56.755530Z","iopub.status.idle":"2021-11-08T10:57:56.760912Z","shell.execute_reply.started":"2021-11-08T10:57:56.755490Z","shell.execute_reply":"2021-11-08T10:57:56.759887Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predicted = [rle_encoding(test_mask) for test_mask in test_masks]","metadata":{"execution":{"iopub.status.busy":"2021-11-08T10:57:57.294174Z","iopub.execute_input":"2021-11-08T10:57:57.294450Z","iopub.status.idle":"2021-11-08T10:57:57.526378Z","shell.execute_reply.started":"2021-11-08T10:57:57.294419Z","shell.execute_reply":"2021-11-08T10:57:57.525668Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ss = pd.read_csv('../input/sartorius-cell-instance-segmentation/sample_submission.csv')\n         \n        \n","metadata":{"execution":{"iopub.status.busy":"2021-11-08T10:39:39.846825Z","iopub.execute_input":"2021-11-08T10:39:39.847334Z","iopub.status.idle":"2021-11-08T10:39:39.859809Z","shell.execute_reply.started":"2021-11-08T10:39:39.847296Z","shell.execute_reply":"2021-11-08T10:39:39.859047Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ss['predicted'] = predicted","metadata":{"execution":{"iopub.status.busy":"2021-11-08T10:39:40.343976Z","iopub.execute_input":"2021-11-08T10:39:40.344570Z","iopub.status.idle":"2021-11-08T10:39:40.349274Z","shell.execute_reply.started":"2021-11-08T10:39:40.344528Z","shell.execute_reply":"2021-11-08T10:39:40.348461Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ss.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2021-11-08T10:39:41.465977Z","iopub.execute_input":"2021-11-08T10:39:41.466507Z","iopub.status.idle":"2021-11-08T10:39:41.479901Z","shell.execute_reply.started":"2021-11-08T10:39:41.466466Z","shell.execute_reply":"2021-11-08T10:39:41.479172Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ss.head()","metadata":{"execution":{"iopub.status.busy":"2021-11-08T10:39:45.015103Z","iopub.execute_input":"2021-11-08T10:39:45.015365Z","iopub.status.idle":"2021-11-08T10:39:45.025753Z","shell.execute_reply.started":"2021-11-08T10:39:45.015336Z","shell.execute_reply":"2021-11-08T10:39:45.024828Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}