{"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-10-16T22:01:38.368099Z","iopub.execute_input":"2021-10-16T22:01:38.368706Z","iopub.status.idle":"2021-10-16T22:01:43.936349Z","shell.execute_reply.started":"2021-10-16T22:01:38.368610Z","shell.execute_reply":"2021-10-16T22:01:43.935506Z"},"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-10-16T22:01:43.938105Z","iopub.execute_input":"2021-10-16T22:01:43.938370Z","iopub.status.idle":"2021-10-16T22:01:44.426703Z","shell.execute_reply.started":"2021-10-16T22:01:43.938336Z","shell.execute_reply":"2021-10-16T22:01:44.425973Z"},"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-10-16T22:01:44.427855Z","iopub.execute_input":"2021-10-16T22:01:44.428125Z","iopub.status.idle":"2021-10-16T22:01:44.450292Z","shell.execute_reply.started":"2021-10-16T22:01:44.428091Z","shell.execute_reply":"2021-10-16T22:01:44.449485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(sample_submission.shape)\nsample_submission.head()","metadata":{"execution":{"iopub.status.busy":"2021-10-16T22:01:44.452243Z","iopub.execute_input":"2021-10-16T22:01:44.452556Z","iopub.status.idle":"2021-10-16T22:01:44.462056Z","shell.execute_reply.started":"2021-10-16T22:01:44.452520Z","shell.execute_reply":"2021-10-16T22:01:44.461128Z"},"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-10-16T22:01:44.463433Z","iopub.execute_input":"2021-10-16T22:01:44.464094Z","iopub.status.idle":"2021-10-16T22:01:44.499390Z","shell.execute_reply.started":"2021-10-16T22:01:44.464041Z","shell.execute_reply":"2021-10-16T22:01:44.498583Z"},"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-10-16T22:01:44.500744Z","iopub.execute_input":"2021-10-16T22:01:44.501000Z","iopub.status.idle":"2021-10-16T22:01:44.836283Z","shell.execute_reply.started":"2021-10-16T22:01:44.500968Z","shell.execute_reply":"2021-10-16T22:01:44.835378Z"},"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-10-16T22:01:44.837569Z","iopub.execute_input":"2021-10-16T22:01:44.838016Z","iopub.status.idle":"2021-10-16T22:01:44.999605Z","shell.execute_reply.started":"2021-10-16T22:01:44.837977Z","shell.execute_reply":"2021-10-16T22:01:44.998844Z"},"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-10-16T22:01:45.002766Z","iopub.execute_input":"2021-10-16T22:01:45.003019Z","iopub.status.idle":"2021-10-16T22:01:46.421240Z","shell.execute_reply.started":"2021-10-16T22:01:45.002989Z","shell.execute_reply":"2021-10-16T22:01:46.407434Z"},"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-10-16T22:01:46.422171Z","iopub.execute_input":"2021-10-16T22:01:46.422384Z","iopub.status.idle":"2021-10-16T22:01:46.670288Z","shell.execute_reply.started":"2021-10-16T22:01:46.422356Z","shell.execute_reply":"2021-10-16T22:01:46.669646Z"},"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-10-16T22:01:46.672696Z","iopub.execute_input":"2021-10-16T22:01:46.673114Z","iopub.status.idle":"2021-10-16T22:01:49.789580Z","shell.execute_reply.started":"2021-10-16T22:01:46.673074Z","shell.execute_reply":"2021-10-16T22:01:49.787734Z"},"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 = 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)\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-10-16T22:01:49.791107Z","iopub.execute_input":"2021-10-16T22:01:49.791372Z","iopub.status.idle":"2021-10-16T22:03:17.423709Z","shell.execute_reply.started":"2021-10-16T22:01:49.791336Z","shell.execute_reply":"2021-10-16T22:03:17.422998Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_id_num = 20\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-10-16T22:04:10.825250Z","iopub.execute_input":"2021-10-16T22:04:10.825806Z","iopub.status.idle":"2021-10-16T22:04:11.195811Z","shell.execute_reply.started":"2021-10-16T22:04:10.825768Z","shell.execute_reply":"2021-10-16T22:04:11.194761Z"},"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-10-16T22:04:13.842155Z","iopub.execute_input":"2021-10-16T22:04:13.842688Z","iopub.status.idle":"2021-10-16T22:04:13.849021Z","shell.execute_reply.started":"2021-10-16T22:04:13.842650Z","shell.execute_reply":"2021-10-16T22:04:13.848004Z"},"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-10-16T22:04:15.335893Z","iopub.execute_input":"2021-10-16T22:04:15.336758Z","iopub.status.idle":"2021-10-16T22:04:15.342255Z","shell.execute_reply.started":"2021-10-16T22:04:15.336710Z","shell.execute_reply":"2021-10-16T22:04:15.341201Z"},"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])\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=[dice_coefficient])\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-10-16T22:04:17.421833Z","iopub.execute_input":"2021-10-16T22:04:17.422265Z","iopub.status.idle":"2021-10-16T22:04:20.095657Z","shell.execute_reply.started":"2021-10-16T22:04:17.422219Z","shell.execute_reply":"2021-10-16T22:04:20.094798Z"},"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-10-16T22:15:16.278859Z","iopub.execute_input":"2021-10-16T22:15:16.279619Z","iopub.status.idle":"2021-10-16T22:19:06.206301Z","shell.execute_reply.started":"2021-10-16T22:15:16.279580Z","shell.execute_reply":"2021-10-16T22:19:06.205578Z"},"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()","metadata":{"execution":{"iopub.status.busy":"2021-10-16T22:19:15.833616Z","iopub.execute_input":"2021-10-16T22:19:15.834513Z","iopub.status.idle":"2021-10-16T22:19:39.379447Z","shell.execute_reply.started":"2021-10-16T22:19:15.834473Z","shell.execute_reply":"2021-10-16T22:19:39.378724Z"},"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('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":{"execution":{"iopub.status.busy":"2021-10-16T22:19:39.384118Z","iopub.execute_input":"2021-10-16T22:19:39.386203Z","iopub.status.idle":"2021-10-16T22:19:41.585841Z","shell.execute_reply.started":"2021-10-16T22:19:39.386162Z","shell.execute_reply":"2021-10-16T22:19:41.584795Z"},"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-10-16T22:40:57.591743Z","iopub.execute_input":"2021-10-16T22:40:57.592417Z","iopub.status.idle":"2021-10-16T22:40:58.294118Z","shell.execute_reply.started":"2021-10-16T22:40:57.592374Z","shell.execute_reply":"2021-10-16T22:40:58.293462Z"},"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-10-16T22:19:42.308092Z","iopub.execute_input":"2021-10-16T22:19:42.308350Z","iopub.status.idle":"2021-10-16T22:19:43.024675Z","shell.execute_reply.started":"2021-10-16T22:19:42.308312Z","shell.execute_reply":"2021-10-16T22:19:43.023981Z"},"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-10-16T22:22:31.777380Z","iopub.execute_input":"2021-10-16T22:22:31.777654Z","iopub.status.idle":"2021-10-16T22:22:32.290087Z","shell.execute_reply.started":"2021-10-16T22:22:31.777625Z","shell.execute_reply":"2021-10-16T22:22:32.289428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Run-length encoding stolen from https://www.kaggle.com/rakhlin/fast-run-length-encoding-python\ndef rle_encoding(x):\n    dots = np.where(x.T.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 run_lengths\n\ndef prob_to_rles(x, cutoff=0.5):\n    lab_img = label(x > cutoff)\n    for i in range(1, lab_img.max() + 1):\n        yield rle_encoding(lab_img == i)","metadata":{"execution":{"iopub.status.busy":"2021-10-16T22:27:54.203453Z","iopub.execute_input":"2021-10-16T22:27:54.204256Z","iopub.status.idle":"2021-10-16T22:27:54.209832Z","shell.execute_reply.started":"2021-10-16T22:27:54.204208Z","shell.execute_reply":"2021-10-16T22:27:54.209057Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"output_df = pd.DataFrame(data = None, columns = sample_submission.columns)\ncount = 0\n\nfor n, id_ in enumerate(test_ids):\n    rle = list(prob_to_rles(preds_test_upsampled[n]))\n    for i in range(0, len(rle)):\n        cell_annotations = ' '.join([str(x) for x in rle[i]])\n        output_df.loc[count] = id_,cell_annotations\n        count +=1\n        \noutput_df.to_csv('submission.csv', index = False)","metadata":{"execution":{"iopub.status.busy":"2021-10-16T22:37:21.961944Z","iopub.execute_input":"2021-10-16T22:37:21.962601Z","iopub.status.idle":"2021-10-16T22:37:22.208869Z","shell.execute_reply.started":"2021-10-16T22:37:21.962561Z","shell.execute_reply":"2021-10-16T22:37:22.208171Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"output_df","metadata":{"execution":{"iopub.status.busy":"2021-10-16T22:43:41.267803Z","iopub.execute_input":"2021-10-16T22:43:41.268360Z","iopub.status.idle":"2021-10-16T22:43:41.279563Z","shell.execute_reply.started":"2021-10-16T22:43:41.268318Z","shell.execute_reply":"2021-10-16T22:43:41.278507Z"},"trusted":true},"execution_count":null,"outputs":[]}]}