{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"collapsed":true},"cell_type":"code","source":"\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport random\nimport os\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport seaborn as sns\nimport cv2\nfrom PIL import Image\nimport random\nfrom sklearn.model_selection import train_test_split","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"4eb6d72bc969b2f5356c79bb91522054c8b6118a"},"cell_type":"code","source":"from keras.models import Model,load_model\nfrom keras.layers import Input,Dropout,Activation,UpSampling2D\nfrom keras.layers.core import Lambda,RepeatVector,Reshape,SpatialDropout2D\nfrom keras.layers.normalization import BatchNormalization\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,ReduceLROnPlateau,TensorBoard\nfrom keras import backend as K\nfrom keras.optimizers import Adam\nimport tensorflow as tf","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"2da3ae70475c75a6b9784c1940f135401c25bd6b"},"cell_type":"code","source":"shipdata=pd.read_csv('../input/train_ship_segmentations.csv')\nprint(shipdata.head())\nprint(len(shipdata))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"93a14f1be8b1c3262a49ca4acc3bf0bdbd429a7c","collapsed":true},"cell_type":"code","source":"train_dir='../input/train/'\ntest_dir='../input/test/'\nIMG_RAW_COL=IMG_RAW_ROW=768\nIMG_ROW=IMG_COL=128\nIMG_CHANNEL=3","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"184a4921c61849854e39a32bed550ed01c2ad98b"},"cell_type":"code","source":"train_imgpath,valid_imgpath,train_maskstr,valid_maskstr=train_test_split(shipdata['ImageId'],shipdata['EncodedPixels'],\n                                                                        test_size=0.08)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"33afe0d19a539421b971b994439d0c8c7d9fbf16"},"cell_type":"code","source":"def imgarr(imgpath):\n    img=cv2.imread(imgpath)\n    img=cv2.resize(img,(IMG_RAW_COL,IMG_RAW_ROW))\n    return img","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"1d8a7d6d4c4aa3f948caacba8077dd2d4e334988"},"cell_type":"code","source":"def mask_decode(maskstr):\n    img=np.zeros(IMG_RAW_COL*IMG_RAW_ROW,dtype=np.uint8)\n    if(type(maskstr)==np.float):\n        return img.reshape((IMG_RAW_COL,IMG_RAW_ROW)).T\n    s=maskstr.split(' ')\n    starts,lengths=[np.asarray(x,dtype=np.int32) for x in (s[0:][::2],s[1:][::2])]\n    starts-=1\n    ends=starts+lengths\n    for lo,hi in zip(starts,ends):\n        img[lo:hi]=1\n    return img.reshape((IMG_RAW_COL,IMG_RAW_ROW)).T","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"13ab791b01137636ee0f54489c34c68ac13a8913"},"cell_type":"code","source":"for i in range(25):\n    rnd_id=random.randint(0,len(shipdata)-1)\n    f,ax=plt.subplots(1,2,figsize=(15,2))\n    axes=ax.flatten()\n    j=0\n    for ax in axes:\n        imgpath=train_dir+shipdata['ImageId'][rnd_id]\n        imgarray=imgarr(imgpath)\n        maskarray=mask_decode(shipdata['EncodedPixels'][rnd_id])\n        if(j==0):\n            ax.imshow(imgarray)\n        else:\n            ax.imshow(maskarray)\n        j+=1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"8442ab621621944e10745bc530afa140889b2d02"},"cell_type":"code","source":"def transform_imgarr(imgpath):\n    img=cv2.imread(imgpath)\n    img=cv2.resize(img,(IMG_COL,IMG_ROW))\n    return img","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"f4d5b17acba225474356a6f5779cba4c21b52aa2"},"cell_type":"code","source":"def transform_num(num):\n    return int(int(num)*(IMG_COL**2)/(IMG_RAW_COL**2))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"654eb0625b7045d8227c534836d59f37b734b85d"},"cell_type":"code","source":"def transform_maskarr(maskstr):\n    mask=np.zeros(IMG_COL*IMG_ROW,dtype=np.bool)\n    if(len(maskstr)==0):\n        return mask.reshape((IMG_ROW,IMG_COL,1))\n    s=maskstr.split(' ')\n    for i in range(len(s)):\n        s[i]=transform_num(s[i])\n    starts,lengths=[np.asarray(x,dtype=np.int32) for x in (s[0:][::2],s[1:][::2])]\n    starts-=1\n    ends=starts+lengths\n    for lo,hi in zip(starts,ends):\n        mask[lo:hi]=1\n    mask=mask.reshape((IMG_COL,IMG_ROW,1))\n    return mask","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"75d5d2b3c54b74963bf9bd40047929f6d1bf0150"},"cell_type":"code","source":"def train_gen(batch_size=200):\n    imgarr=[]\n    maskarr=[]\n    while(True):\n        for i in range(batch_size):\n            rnd_id=random.randint(0,len(train_imgpath)-1)\n            img=transform_imgarr(train_dir+train_imgpath[train_imgpath.index[rnd_id]])\n            if(type(train_maskstr[train_imgpath.index[rnd_id]])==np.float):\n                mask=transform_maskarr('')\n            else:\n                mask=transform_maskarr(train_maskstr[train_maskstr.index[rnd_id]])\n            imgarr.append(img)\n            maskarr.append(mask)\n        yield (np.asarray(imgarr),np.asarray(maskarr))\n        imgarr=[]\n        maskarr=[]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"53c409c9dcfb9406837778d91dd4b96b1441003b"},"cell_type":"code","source":"def testdata():\n    imgarr=[]\n    maskarr=[]\n    for i in range(len(valid_imgpath)):\n        img=transform_imgarr(train_dir+train_imgpath[train_imgpath.index[i]])\n        if(type(train_maskstr[train_maskstr.index[i]])==np.float):\n            mask=transform_maskarr('')\n        else:\n            mask=transform_maskarr(train_maskstr[train_maskstr.index[i]])\n        imgarr.append(img)\n        maskarr.append(mask)\n    return (np.asarray(imgarr),np.asarray(maskarr))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"9bc9182da89cb9365135ed1a3922a2d6355e20dd"},"cell_type":"code","source":"(imgarr,maskarr)=testdata()\nprint(imgarr.shape)\nprint(maskarr.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c84178e66d9b5e8a91487031ea485b033e0ead7e","collapsed":true},"cell_type":"code","source":"def double_conv_layer(x,size,dropout=0.0,batch_norm=True):\n    conv=Conv2D(size,(3,3),padding='same')(x)\n    if(batch_norm):\n        conv=BatchNormalization(axis=3)(conv)\n    conv=Activation('sigmoid')(conv)\n    conv=Conv2D(size,(3,3),padding='same')(conv)\n    if(batch_norm):\n        conv=BatchNormalization(axis=3)(conv)\n    conv=Activation('relu')(conv)\n    if(dropout!=0.0):\n        conv=SpatialDropout2D(dropout)(conv)\n    return conv","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"e1dcd3e273d94cadbfca79c94d15984c304296e5"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"337787410229b31c9f956423032d8e9865272ffa"},"cell_type":"code","source":"def build_unet_model(filters):\n    inputs=Input((IMG_ROW,IMG_COL,IMG_CHANNEL))\n    conv1=double_conv_layer(inputs,filters)\n    p1=MaxPooling2D(pool_size=(2,2))(conv1)\n    \n    conv2=double_conv_layer(p1,2*filters)\n    p2=MaxPooling2D(pool_size=(2,2))(conv2)\n    \n    conv3=double_conv_layer(p2,4*filters)\n    p3=MaxPooling2D(pool_size=(2,2))(conv3)\n    \n    conv4=double_conv_layer(p3,8*filters)\n    p4=MaxPooling2D(pool_size=(2,2))(conv4)\n    \n    conv5=double_conv_layer(p4,16*filters)\n    p5=MaxPooling2D(pool_size=(2,2))(conv5)\n    \n    conv6=double_conv_layer(p5,32*filters)\n    \n    up7=concatenate([UpSampling2D(size=(2,2))(conv6),conv5],axis=3)\n    conv7=double_conv_layer(up7,16*filters)\n    \n    up8=concatenate([UpSampling2D(size=(2,2))(conv7),conv4],axis=3)\n    conv8=double_conv_layer(up8,8*filters)\n    \n    up9=concatenate([UpSampling2D(size=(2,2))(conv8),conv3],axis=3)\n    conv9=double_conv_layer(up9,4*filters)\n    \n    up10=concatenate([UpSampling2D(size=(2,2))(conv9),conv2],axis=3)\n    conv10=double_conv_layer(up10,2*filters)\n    \n    up11=concatenate([UpSampling2D(size=(2,2))(conv10),conv1],axis=3)\n    conv11=double_conv_layer(up11,filters,0)\n    \n    convfinal=Conv2D(1,(1,1))(conv11)\n    convfinal=Activation('sigmoid')(convfinal)\n    \n    model=Model(inputs,convfinal)\n    model.summary()\n    return model\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"58480a5b4dbdfac040ef23a045ad4f73fd65bc99"},"cell_type":"code","source":"model=build_unet_model(8)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"166837fef972c2fe20f91b68e95953ee4964ca4d"},"cell_type":"code","source":"def dice_coef(y_true,y_pred):\n    y_true_f=K.flatten(y_true)\n    y_pred_f=K.flatten(y_pred)\n    intersection=K.sum(y_true_f*y_pred_f)\n    return (2.0*intersection+1.0)/(K.sum(y_true_f)+K.sum(y_pred_f)+1.0)\ndef dice_coef_loss(y_true,y_pred):\n    return -dice_coef(y_true,y_pred)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"9e604673405db65d1182e8862d97125393e512c6"},"cell_type":"code","source":"def mean_iou(Y_true, Y_pred, score_thres=0.5):\n    prec = []\n    for t in np.arange(0.5, 1.0, 0.05):\n        Y_pred_bool = tf.to_int32(Y_pred > t) # boolean mask by threshold\n        score, update_op = tf.metrics.mean_iou(Y_true, Y_pred_bool, 2)\n        K.get_session().run(tf.local_variables_initializer())\n        with tf.control_dependencies([update_op]):\n            score = tf.identity(score)\n        prec.append(score) \n    return K.mean(K.stack(prec), axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"d5725ef8dfe8649806c5bb90643acb18eb6d4e33"},"cell_type":"code","source":"callbacks=[\n    ReduceLROnPlateau(patience=5,min_lr=1e-9,verbose=1,mode='min'),\n    ModelCheckpoint('air_model.h5',save_best_only=True,verbose=1)\n]\nmodel.compile(Adam(lr=0.001),metrics=[mean_iou],loss='binary_crossentropy')\nhistory=model.fit_generator(train_gen(),epochs=50,\n                           steps_per_epoch=100,\n                           validation_data=(imgarr,maskarr),\n                           callbacks=callbacks)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"abfab059a182ae795ac134107ffe64ace12f7bd0"},"cell_type":"code","source":"plt.plot(history.history['mean_iou'])\nplt.plot(history.history['val_mean_iou'])","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}