{"cells":[{"metadata":{"trusted":true,"_uuid":"1ba037ebcdb32f5946a500ee8c26fa2c0d8605ee"},"cell_type":"code","source":"import os\nfrom skimage.data import imread\nfrom skimage.morphology import label\nimport pandas as pd\nimport numpy as np\nfrom keras.models import *\nfrom keras.layers import *\nfrom keras.optimizers import *\nimport random\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.model_selection import train_test_split\n\ninput_dir = '../input/'\ntrain_img_dir = '../input/train_v2/'\ntest_img_dir = '../input/test_v2/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e6f8b9c22413988b77f6e4e038420d2cbeffb970"},"cell_type":"code","source":"train_df = pd.read_csv(input_dir+'train_ship_segmentations_v2.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"072c3bed2b1b3d4b2d7bc37ab9fb62df5db5056e"},"cell_type":"code","source":"train_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"af99c55a3e9fcaa3dede8a01ec92075f03996cfa"},"cell_type":"code","source":"train_df.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f8d5cb9107de942ea1563e387ade6db540d8d4c7"},"cell_type":"code","source":"train_df = train_df[train_df['ImageId'] != '6384c3e78.jpg']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7f66a76ccb54b9d9c39ba56be5e220316427c201"},"cell_type":"code","source":"train_df.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4984e124dff7a85aa1f827bedad2175d0f712fab"},"cell_type":"code","source":"def area_isnull(x):\n    if x == x:\n        return 0\n    else:\n        return 1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3a0a9341cb8cd92d3e65f54503b0a73958c54ce8"},"cell_type":"code","source":"train_df['isnan'] = train_df['EncodedPixels'].apply(area_isnull)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"539ad37ca95a8ece676ad36a02a9da02a7ad5374"},"cell_type":"code","source":"train_df['isnan'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"10667d458c00eff2e8b2f2f80e7179a484b404f5"},"cell_type":"code","source":"train_df = train_df.sort_values('isnan', ascending=False)\ntrain_df = train_df.iloc[100000:]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f440affa830fa15318212889251fe97106182a5f"},"cell_type":"code","source":"train_df['isnan'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8c866b87cbeceadfb22ac4c1456436ee48b102dd"},"cell_type":"code","source":"def rle_to_mask(rle_list, SHAPE):\n    tmp_flat = np.zeros(SHAPE[0]*SHAPE[1])\n    if len(rle_list) == 1:\n        mask = np.reshape(tmp_flat, SHAPE).T\n    else:\n        strt = rle_list[::2]\n        length = rle_list[1::2]\n        for i,v in zip(strt,length):\n            tmp_flat[(int(i)-1):(int(i)-1)+int(v)] = 255\n        mask = np.reshape(tmp_flat, SHAPE).T\n    return mask","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1bd3841fad131a9e36154b8b3dd5667c15f758d4"},"cell_type":"code","source":"def calc_area_for_rle(rle_str):\n    rle_list = [int(x) if x.isdigit() else x for x in str(rle_str).split()]\n    if len(rle_list) == 1:\n        return 0\n    else:\n        area = np.sum(rle_list[1::2])\n        return area","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"51cbd5849021c8d03fd6a459d8aca929c1efe455"},"cell_type":"code","source":"train_df['area'] = train_df['EncodedPixels'].apply(calc_area_for_rle)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cc51ddeefa0dc6a64cacc396a30e8bd9d3f3e125"},"cell_type":"code","source":"train_df_isship = train_df[train_df['area'] > 0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3fd334deb163964a0a93bda3455c261a7d8a2020"},"cell_type":"code","source":"train_df_isship.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"855e32c2534b58a20ae6fc796c9829e9f2437f6e"},"cell_type":"code","source":"train_df_smallarea = train_df_isship['area'][train_df_isship['area'] < 10]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6a5b27ba1a006d2604fe11ba5785c64c51e31738"},"cell_type":"code","source":"train_df_smallarea.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a64c58b7bdd828175a5661a35ff3a7db7f326841"},"cell_type":"code","source":"train_df_smallarea.shape[0]/train_df_isship.shape[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"37a1d58abb586fd79af84e48fd913ea6e2c504b9"},"cell_type":"code","source":"train_gp = train_df.groupby('ImageId').sum()\ntrain_gp = train_gp.reset_index()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c283636abe3a5c88cefd25ce8b8b7cf022f59ccc"},"cell_type":"code","source":"train_gp.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3fbb4b1727d383195bcbbdf02fb0262212ce6d50"},"cell_type":"code","source":"def calc_class(area):\n    area = area / (768*768)\n    if area == 0:\n        return 0\n    elif area < 0.005:\n        return 1\n    elif area < 0.015:\n        return 2\n    elif area < 0.025:\n        return 3\n    elif area < 0.035:\n        return 4\n    elif area < 0.045:\n        return 5\n    else:\n        return 6","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"34e88eef3c5c666bec83320bae8fc84d1f28d510"},"cell_type":"code","source":"train_gp['class'] = train_gp['area'].apply(calc_class)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2a60b2c5cd87d915ca568fdc94e8224e173a087f"},"cell_type":"code","source":"train_gp['class'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f479ebfc9db3744799da4131df2a52a5e8ff0874"},"cell_type":"code","source":"train, val = train_test_split(train_gp, test_size=0.01, stratify=train_gp['class'].tolist())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"975738393635cc237a6c5063ab28dca2bd4f9a4b"},"cell_type":"code","source":"train_isship_list = train['ImageId'][train['isnan']==0].tolist()\ntrain_isship_list = random.sample(train_isship_list, len(train_isship_list))\ntrain_nanship_list = train['ImageId'][train['isnan']==1].tolist()\ntrain_nanship_list = random.sample(train_nanship_list, len(train_nanship_list))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8cfa76ff4f2f4a62380ca4f2a774c1ce77edee68"},"cell_type":"code","source":"len(train_isship_list),len(train_nanship_list)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"420f79bfe3bd661c51d9f5574205b9bb8738cde7"},"cell_type":"code","source":"def mygenerator(isship_list, nanship_list, batch_size, cap_num):\n    train_img_names_nanship = isship_list[:cap_num]\n    train_img_names_isship = nanship_list[:cap_num]\n    k = 0\n    while True:\n        if k+batch_size//2 >= cap_num:\n            k = 0\n        batch_img_names_nan = train_img_names_nanship[k:k+batch_size//2]\n        batch_img_names_is = train_img_names_isship[k:k+batch_size//2]\n        batch_img = []\n        batch_mask = []\n        for name in batch_img_names_nan:\n            tmp_img = imread(train_img_dir + name)\n            batch_img.append(tmp_img)\n            mask_list = train_df['EncodedPixels'][train_df['ImageId'] == name].tolist()\n            one_mask = np.zeros((768, 768, 1))\n            for item in mask_list:\n                rle_list = str(item).split()\n                tmp_mask = rle_to_mask(rle_list, (768, 768))\n                one_mask[:,:,0] += tmp_mask\n            batch_mask.append(one_mask)\n        for name in batch_img_names_is:\n            tmp_img = imread(train_img_dir + name)\n            batch_img.append(tmp_img)\n            mask_list = train_df['EncodedPixels'][train_df['ImageId'] == name].tolist()\n            one_mask = np.zeros((768, 768, 1))\n            for item in mask_list:\n                rle_list = str(item).split()\n                tmp_mask = rle_to_mask(rle_list, (768, 768))\n                one_mask[:,:,0] += tmp_mask\n            batch_mask.append(one_mask)\n        img = np.stack(batch_img, axis=0)\n        mask = np.stack(batch_mask, axis=0)\n        img = img / 255.0\n        mask = mask / 255.0\n        k += batch_size//2\n        yield img, mask","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"12a3b4619d2e67fbf0be9827d1650cdf9ea01755"},"cell_type":"code","source":"BATCH_SIZE = 2\nCAP_NUM = min(len(train_isship_list),len(train_nanship_list))\ndatagen = mygenerator(train_isship_list, train_nanship_list, batch_size=BATCH_SIZE, cap_num=CAP_NUM)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"67ed7e1169bc922f334e060a5af187e1b60569ee"},"cell_type":"code","source":"inputs = Input(shape=(768,768,3))\nconv0 = Conv2D(8, 3, activation='relu', padding='same', kernel_initializer='he_normal')(inputs)\nconv0 = BatchNormalization()(conv0)\nconv0 = Conv2D(8, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv0)\nconv0 = BatchNormalization()(conv0)\n\ncomp0 = AveragePooling2D((6,6))(conv0)\nconv1 = Conv2D(16, 3, activation='relu', padding='same', kernel_initializer='he_normal')(comp0)\nconv1 = BatchNormalization()(conv1)\nconv1 = Conv2D(16, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv1)\nconv1 = BatchNormalization()(conv1)\nconv1 = Dropout(0.0)(conv1)\n\npool1 = MaxPooling2D(pool_size=(2,2))(conv1)\nconv2 = Conv2D(32, 3, activation='relu', padding='same', kernel_initializer='he_normal')(pool1)\nconv2 = BatchNormalization()(conv2)\nconv2 = Conv2D(32, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv2)\nconv2 = BatchNormalization()(conv2)\nconv2 = Dropout(0.0)(conv2)\n\npool2 = MaxPooling2D(pool_size=(2,2))(conv2)\nconv3 = Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(pool2)\nconv3 = BatchNormalization()(conv3)\nconv3 = Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv3)\nconv3 = BatchNormalization()(conv3)\nconv3 = Dropout(0.0)(conv3)\n\npool3 = MaxPooling2D(pool_size=(2,2))(conv3)\nconv4 = Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(pool3)\nconv4 = BatchNormalization()(conv4)\nconv4 = Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv4)\nconv4 = BatchNormalization()(conv4)\nconv4 = Dropout(0.0)(conv4)\n\npool4 = MaxPooling2D(pool_size=(2,2))(conv4)\nconv5 = Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(pool4)\nconv5 = BatchNormalization()(conv5)\nconv5 = Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv5)\nconv5 = BatchNormalization()(conv5)\n\nupcv6 = UpSampling2D(size=(2,2))(conv5)\nupcv6 = Conv2D(128, 2, activation='relu', padding='same', kernel_initializer='he_normal')(upcv6)\nupcv6 = BatchNormalization()(upcv6)\nmrge6 = concatenate([conv4, upcv6], axis=3)\nconv6 = Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(mrge6)\nconv6 = BatchNormalization()(conv6)\nconv6 = Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv6)\nconv6 = BatchNormalization()(conv6)\n\nupcv7 = UpSampling2D(size=(2,2))(conv6)\nupcv7 = Conv2D(64, 2, activation='relu', padding='same', kernel_initializer='he_normal')(upcv7)\nupcv7 = BatchNormalization()(upcv7)\nmrge7 = concatenate([conv3, upcv7], axis=3)\nconv7 = Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(mrge7)\nconv7 = BatchNormalization()(conv7)\nconv7 = Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv7)\nconv7 = BatchNormalization()(conv7)\n\nupcv8 = UpSampling2D(size=(2,2))(conv7)\nupcv8 = Conv2D(32, 2, activation='relu', padding='same', kernel_initializer='he_normal')(upcv8)\nupcv8 = BatchNormalization()(upcv8)\nmrge8 = concatenate([conv2, upcv8], axis=3)\nconv8 = Conv2D(32, 3, activation='relu', padding='same', kernel_initializer='he_normal')(mrge8)\nconv8 = BatchNormalization()(conv8)\nconv8 = Conv2D(32, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv8)\nconv8 = BatchNormalization()(conv8)\n\nupcv9 = UpSampling2D(size=(2,2))(conv8)\nupcv9 = Conv2D(16, 2, activation='relu', padding='same', kernel_initializer='he_normal')(upcv9)\nupcv9 = BatchNormalization()(upcv9)\nmrge9 = concatenate([conv1, upcv9], axis=3)\nconv9 = Conv2D(16, 3, activation='relu', padding='same', kernel_initializer='he_normal')(mrge9)\nconv9 = BatchNormalization()(conv9)\nconv9 = Conv2D(16, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv9)\nconv9 = BatchNormalization()(conv9)\n\ndcmp10 = UpSampling2D((6,6), interpolation='bilinear')(conv9)\nmrge10 = concatenate([dcmp10, conv0], axis=3)\nconv10 = Conv2D(16, 3, activation='relu', padding='same', kernel_initializer='he_normal')(mrge10)\nconv10 = BatchNormalization()(conv10)\nconv10 = Conv2D(8, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv10)\nconv10 = BatchNormalization()(conv10)\nconv11 = Conv2D(1, 1, activation='sigmoid')(conv10)\n\nmodel = Model(inputs=inputs, outputs=conv11)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"55d7bb65672b2129a98655c0b21015cc38d26f1c"},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"be768e85f4ca3880511761dd01c666747fff4f3c"},"cell_type":"code","source":"model.compile(optimizer = 'adam', loss = 'binary_crossentropy')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"87505c438ef0063bf1ef16c3930c2c6bffad7a6f","scrolled":true},"cell_type":"code","source":"history = model.fit_generator(datagen, steps_per_epoch = 200, epochs = 100)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b3bcfb0caec38f8a221c37219ed8da60621e597d"},"cell_type":"code","source":"def calc_IoU(A, B):\n    AorB = np.logical_or(A,B).astype('int')\n    AandB = np.logical_and(A,B).astype('int')\n    IoU = AandB.sum() / AorB.sum()\n    return IoU\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0525765264adce8d1f135b09d124e4f606547490"},"cell_type":"code","source":"def calc_IoU_vector(A, B):\n    score_vector = []\n    IoU = calc_IoU(A, B)\n    for threshold in np.arange(0.5,1,0.05):\n        score = int(IoU > threshold)\n        score_vector.append(score)\n    return score_vector","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7ef92918545cea587989bb7c8059d02d31a2ef56"},"cell_type":"code","source":"def calc_IoU_tensor(masks_true, masks_pred):\n    true_mask_num = masks_true.shape[0]\n    pred_mask_num = masks_pred.shape[0]\n    score_tensor = np.zeros((true_mask_num, pred_mask_num, 10))\n    for true_i in range(true_mask_num):\n        for pred_i in range(pred_mask_num):\n            true_mask = masks_true[true_i]\n            pred_mask = masks_pred[pred_i]\n            score_vector = calc_IoU_vector(true_mask, pred_mask)\n            score_tensor[true_i,pred_i,:] = score_vector\n    return score_tensor\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c796d16aded3a857533f21a7256e8e397f5ff36e"},"cell_type":"code","source":"def calc_F2_per_one_threshold(score_matrix):\n    tp = np.sum( score_matrix.sum(axis=1) > 0  )\n    fp = np.sum( score_matrix.sum(axis=1) == 0 )\n    fn = np.sum( score_matrix.sum(axis=0) == 0 )\n    F2 = (5*tp) / ((5*tp) + fp + (4*fn))\n    return F2","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9eef2976f3136690bc7b6a4c5646e288b26830cc"},"cell_type":"code","source":"def calc_score_one_image(mask_true, mask_pred):\n    mask_true = mask_true.reshape(768,768)\n    mask_pred = mask_pred.reshape(768,768)\n    if mask_true.sum() == 0 and mask_pred.sum() == 0:\n        score = 1\n    elif mask_true.sum() == 0 and mask_pred.sum() != 0:\n        score = 0\n    elif mask_true.sum() != 0 and mask_pred.sum() == 0:\n        score = 0\n    else:\n        mask_label_true = label(mask_true)\n        mask_label_pred = label(mask_pred)\n        c_true = np.max(mask_label_true)\n        c_pred = np.max(mask_label_pred)\n        tmp = []\n        for k in range(c_true):\n            tmp.append(mask_label_true == k+1)\n        masks_true = np.stack(tmp, axis=0)\n        tmp = []\n        for k in range(c_pred):\n            tmp.append(mask_label_pred == k+1)\n        masks_pred = np.stack(tmp, axis=0)\n        score_tensor = calc_IoU_tensor(masks_true, masks_pred)\n        F2_t = []\n        for i in range(10):\n            F2 = calc_F2_per_one_threshold(score_tensor[:,:,i])\n            F2_t.append(F2)\n        score = np.mean(F2_t)\n    return score","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6dfaa35f65b18c0e1ac7f31250e4ffb103e43f70"},"cell_type":"code","source":"def calc_score_all_image(batch_mask_true, batch_mask_pred, threshold=0.5):\n    num = batch_mask_true.shape[0]\n    tmp = batch_mask_pred > threshold\n    batch_mask_pred = tmp.astype('int')\n    scores = list()\n    for i in range(num):\n        score = calc_score_one_image(batch_mask_true[i], batch_mask_pred[i])\n        scores.append(score)\n    return np.mean(scores)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d418e2579cb242da55025b0da58817c144ddde41"},"cell_type":"code","source":"val_list = val['ImageId'].tolist()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b73ef21e3f234450de7c6e6ddcf755a51d9b6c00"},"cell_type":"code","source":"def create_data(image_list):\n    batch_img = []\n    batch_mask = []\n    for name in image_list:\n        tmp_img = imread(train_img_dir + name)\n        batch_img.append(tmp_img)\n        mask_list = train_df['EncodedPixels'][train_df['ImageId'] == name].tolist()\n        one_mask = np.zeros((768, 768, 1))\n        for item in mask_list:\n            rle_list = str(item).split()\n            tmp_mask = rle_to_mask(rle_list, (768, 768))\n            one_mask[:,:,0] += tmp_mask\n        batch_mask.append(one_mask)\n    img = np.stack(batch_img, axis=0)\n    mask = np.stack(batch_mask, axis=0)\n    img = img / 255.0\n    mask = mask / 255.0\n    return img, mask","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5bce209de64e44bcbe729d01e4a8e06473ea43cb"},"cell_type":"code","source":"from tqdm import tqdm","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1b38c38fa2609d6c6612d4540a44e9eef1c2b468"},"cell_type":"code","source":"scores_list = dict()\nthreshold_list = [x/100 for x in range(20,80,10)]\nfor threshold in threshold_list:\n    scores = []\n    for i in tqdm(range(len(val_list)//2)):\n        temp_list = val_list[i*2:(i+1)*2]\n        val_img, val_mask = create_data(temp_list)\n        pred_mask = model.predict(val_img)\n        F2 = calc_score_all_image(val_mask, pred_mask, threshold=threshold)*2\n        scores.append(F2)\n    val_F2 = np.sum(scores)/(len(val_list)//2 *2)\n    scores_list[threshold] = val_F2","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"5384a4d66c6601d3b99835382377d456589df45e"},"cell_type":"code","source":"scores_list","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5b7c89fff49cd77276affe7b2b8d81b1f94981cd"},"cell_type":"code","source":"opt_threshold = max(scores_list, key=scores_list.get)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"fd8423aa38cc742d5669f00147b3e5a51ff300f8"},"cell_type":"code","source":"test_img_names = [x.split('.')[0] for x in os.listdir(test_img_dir)]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"279d00b683f1d74a57d5300866468ed5c0710241"},"cell_type":"code","source":"def multi_rle_encode(img, **kwargs):\n    '''\n    Encode connected regions as separated masks\n    '''\n    labels = label(img[0,:,:,:])\n    if img.ndim > 2:\n        return [rle_encode(np.sum(labels==k, axis=2), **kwargs) for k in np.unique(labels[labels>0])]\n    else:\n        return [rle_encode(labels==k, **kwargs) for k in np.unique(labels[labels>0])]\n\n# ref: https://www.kaggle.com/paulorzp/run-length-encode-and-decode\ndef rle_encode(img, min_max_threshold=1e-3, max_mean_threshold=None):\n    '''\n    img: numpy array, 1 - mask, 0 - background\n    Returns run length as string formated\n    '''\n    if np.max(img) < min_max_threshold:\n        return '' ## no need to encode if it's all zeros\n    if max_mean_threshold and np.mean(img) > max_mean_threshold:\n        return '' ## ignore overfilled mask\n    pixels = img.T.flatten()\n    pixels = np.concatenate([[0], pixels, [0]])\n    runs = np.where(pixels[1:] != pixels[:-1])[0] + 1\n    runs[1::2] -= runs[::2]\n    return ' '.join(str(x) for x in runs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5919f21d09926cc6984d8089899002cc22f8d1b0","scrolled":true},"cell_type":"code","source":"pred_rows = []\nfor name in tqdm(test_img_names):\n    test_img = imread(test_img_dir + name + '.jpg')\n    test_img_1 = test_img.reshape(1,768,768,3)/255.0\n    test_img_2 = test_img_1[:, :, ::-1, :]\n    test_img_3 = test_img_1[:, ::-1, :, :]\n    test_img_4 = test_img_1[:, ::-1, ::-1, :]\n    pred_prob_1 = model.predict(test_img_1)\n    pred_prob_2 = model.predict(test_img_2)\n    pred_prob_3 = model.predict(test_img_3)\n    pred_prob_4 = model.predict(test_img_4)\n    pred_prob = (pred_prob_1 + pred_prob_2[:, :, ::-1, :] + pred_prob_3[:, ::-1, :, :] + pred_prob_4[:, ::-1, ::-1, :])/4\n    pred_mask = pred_prob > opt_threshold\n    rles = multi_rle_encode(pred_mask)\n    if len(rles)>0:\n        for rle in rles:\n            pred_rows += [{'ImageId': name + '.jpg', 'EncodedPixels': rle}]\n    else:\n        pred_rows += [{'ImageId': name + '.jpg', 'EncodedPixels': None}]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e712f4407506cbb6916f641b9099905188e758a1"},"cell_type":"code","source":"submission_df = pd.DataFrame(pred_rows)[['ImageId', 'EncodedPixels']]\nsubmission_df.to_csv('abi_sub.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4769e9f5fea33436af2d11b80d9b9aad669dc9a5"},"cell_type":"code","source":"submission_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"bf33a335716e84707bcaf9a90d6e626e23a0dced"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}