{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os, keras\nimport numpy as np \nimport pandas as pd \nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nimport tensorflow.keras.backend as K\n\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Input, Conv2DTranspose, concatenate, Activation, MaxPooling2D, Conv2D, BatchNormalization\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.metrics import MeanIoU\n\nfrom tqdm import tqdm\nfrom tensorflow.keras.preprocessing.image import load_img, ImageDataGenerator, img_to_array, array_to_img","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.utils import plot_model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from PIL import Image\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Set some directories\ntrainHQ_zip_path = '/kaggle/input/carvana-image-masking-challenge/train_hq.zip'\nmasks_zip_path = '/kaggle/input/carvana-image-masking-challenge/train_masks.zip'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import zipfile\n#extract from ZIP training Image .\nwith zipfile.ZipFile(trainHQ_zip_path,'r') as zip_ref:\n    zip_ref.extractall('/kaggle/working/image')\n#extract from ZIP train masks/labels.\nwith zipfile.ZipFile(masks_zip_path,'r') as zip_ref:\n    zip_ref.extractall('/kaggle/working/mask')\n    \nimage_label_numb = len(os.listdir('/kaggle/working/image/train_hq'))\nprint('train images: ', len(os.listdir('/kaggle/working/image/train_hq')))\nprint('train masks: ', len(os.listdir('/kaggle/working/mask/train_masks')))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image_size = (512,512,3)\nimage_size","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i,j in zip(car_inds,mask_inds):\n    print(i,j)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"car_inds = sorted(os.listdir('/kaggle/working/image/train_hq'))\nmask_inds = sorted(os.listdir('/kaggle/working/mask/train_masks'))\nfor mask_name,car_name in zip(mask_inds,car_inds):\n    pil_im=Image.open('/kaggle/working/mask/train_masks/'+mask_name).convert(\"L\")\n    #print(pil_im.format, pil_im.size, pil_im.mode)\n    check = True\n    k = 0\n    while check:\n        x=np.random.randint(pil_im.size[0]-image_size[1]-5)\n        y=np.random.randint(pil_im.size[1]-image_size[0]-5)\n        pil_im_  = pil_im.crop((x,y,x+image_size[1],y+image_size[0]))\n        if (np.mean(pil_im_)>50) & (np.mean(pil_im_)<200):\n            check= False\n            pil_im_.save('/kaggle/working/mask/train_masks/'+mask_name[:-4]+\".png\")\n            pil_im=Image.open('/kaggle/working/image/train_hq/'+car_name)\n            pil_im_  = pil_im.crop((x,y,x+image_size[1],y+image_size[0]))\n            pil_im_.save('/kaggle/working/image/train_hq/'+car_name)\n        if k <100:\n            k +=1\n        if k >100:\n            check = False\n            x = pil_im.size[0] // 2 - image_size[1] // 2 \n            y = pil_im.size[1] // 2 - image_size[0] // 2\n            pil_im_.save('/kaggle/working/mask/train_masks/'+mask_name[:-4]+\".png\")\n            pil_im=Image.open('/kaggle/working/image/train_hq/'+car_name)\n            pil_im_  = pil_im.crop((x,y,x+image_size[1],y+image_size[0]))\n            pil_im_.save('/kaggle/working/image/train_hq/'+car_name)\n            \n\n       ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"list_mask_png = []\nlist_mask_gif = []\nfor i in os.listdir('/kaggle/working/mask/train_masks'):\n    if i.endswith('.gif'):\n        list_mask_gif.append(i)\n    if i.endswith('.png'):\n        list_mask_png.append(i)    \n        \nlen(list_mask_png)   , len(list_mask_gif) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i in os.listdir('/kaggle/working/mask/train_masks/'):\n    #print(i)\n    if i.endswith('.gif'):\n        if os.path.exists('/kaggle/working/mask/train_masks/'+i):\n            #print('/kaggle/working/mask/train_masks/'+i)\n            os.remove('/kaggle/working/mask/train_masks/'+i)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#X - input / y - output.\nX_train_ids, X_val_ids, y_train_ids, y_val_ids= train_test_split(car_inds, mask_inds,\n                                                                 test_size=.2, train_size=.8,\n                                                                 random_state=0)\nX_train_size = len(X_train_ids)\nX_val_size = len(X_val_ids)\nprint('Training images size: ', X_train_size)\nprint('Validation images size: ', X_val_size)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#images and masks filename show.\ncar_inds = sorted(os.listdir('/kaggle/working/image/train_hq'))\nmask_inds = sorted(list_mask_png)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dir_hq ='/train_hq'\ndir_mask ='/train_masks'\n\nwork_dir_img = '/image'\nwork_dir_mask = '/mask'\n\nwork_dir_val_img = '/imageval'\nwork_dir_val_mask = '/maskval' \npath='/kaggle/working'\n   \nif os.path.exists(path+work_dir_val_img+dir_hq) == False:\n    os.makedirs(path+work_dir_val_img+dir_hq)\nif os.path.exists(path+work_dir_val_mask+dir_mask) == False:\n    os.makedirs(path+work_dir_val_mask+dir_mask)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.path.exists(path+work_dir_val_img+dir_hq)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.path.exists(path+work_dir_val_mask+dir_mask)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_val_ids[0],y_val_ids[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for x_name in X_val_ids:\n    if os.path.exists(path+work_dir_img+dir_hq+'/'+x_name):\n        os.replace(path+work_dir_img+dir_hq+'/'+x_name, path+work_dir_val_img+dir_hq+'/'+x_name)\nfor y_name in y_val_ids:\n    if os.path.exists(path+work_dir_mask+dir_mask+'/'+y_name):\n        os.replace(path+work_dir_mask+dir_mask+'/'+y_name, path+work_dir_val_mask+dir_mask+'/'+y_name)     ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"list_car = sorted(os.listdir(path+work_dir_img+dir_hq))\nlist_mask = sorted(os.listdir(path+work_dir_mask+dir_mask))\nfor i,j,in zip(list_car ,list_mask):\n    print(i,':',j)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"list_car_val = sorted(os.listdir(path+work_dir_val_img+dir_hq))\nlist_mask_val = sorted(os.listdir(path+work_dir_val_mask+dir_mask))\nfor i,j,in zip(list_car_val ,list_mask_val):\n    print(i,':',j)\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"\n#get samples.\nrnd_ind = list(np.random.choice(range(len(list_car)) ,4))\nfor i in rnd_ind:\n    print(\"Car index: '{}' : Mask index '{}'\".format(list_car[i], list_mask[i]))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#current number of Car\nn = 10\ncar_ind = list_car[n]\nmask_ind = list_mask[n]\n#Load car&mask images using thier ids.\ncar = load_img('/kaggle/working/image/train_hq/' + car_ind)\nmask = load_img('/kaggle/working/mask/train_masks/' + mask_ind)\nprint(\"Image Size: \", car.size)\nprint(\"Mask Size: \", mask.size)\n#Plot them.\nfig, ax = plt.subplots(1, 2, figsize=(16,16))\nfig.subplots_adjust(hspace=.1, wspace=.01)\nax[0].imshow(car)\nax[0].axis('off')\nax[0].title.set_text('Car Image')\nax[1].imshow(mask)\nax[1].axis('off')\nax[1].title.set_text('Car Mask')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# metric Tensorflow\nfrom tensorflow.keras import backend as K\n\ndef dice_coef(y_true, y_pred):\n    return (2. * K.sum(y_true * y_pred) + 1.) / (K.sum(y_true) + K.sum(y_pred) + 1.)\n\n\ndef dice_loss(y_true, y_pred):\n    '''\n    Loss function\n    '''\n    loss = 1 - dice_coef(y_true, y_pred)\n    return loss\n\n\ndef bce_dice_loss(y_true, y_pred):\n    '''\n    Mixed crossentropy and dice loss.\n    '''\n    loss = tf.keras.losses.binary_crossentropy(y_true, y_pred) + dice_loss(y_true, y_pred)\n    return loss","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def conv_block(x=None,numb_kernel = 32,  kernel_size=3, k = 0):\n    x1 = Conv2D(numb_kernel, (kernel_size,kernel_size),padding='same', name='block'+str(k)+'_conv1' )(x)\n    x1 = BatchNormalization()(x1)\n    x1 = Activation('relu', name='block'+str(k)+'_activ_conv1' )(x1)\n    \n    x1 = Conv2D(numb_kernel, (kernel_size,kernel_size),padding='same', name='block'+str(k)+'_conv2' )(x1)\n    x1 = BatchNormalization()(x1)\n    x1 = Activation('relu', name='block'+str(k)+'_activ_conv2' )(x1)\n    \n    x_block = MaxPooling2D(name='block'+str(k)+'_pool')(x1)\n    return x_block\n    \ndef de_conv_block(xc=[None,None],numb_kernel = 32,  kernel_size=3, k = 0):\n    \n    x = Conv2DTranspose(numb_kernel, (2, 2), strides=(2, 2), padding='same',name='deblock'+str(k)+'_deconv')(xc[0])\n    x = BatchNormalization()(x)\n    x = Activation('relu')(x)\n    print(':',x)\n    print(':',xc[1])\n    x_concat = concatenate([x, xc[1]])\n    print(':',x_concat)\n    x1 = Conv2D(numb_kernel, (kernel_size,kernel_size),padding='same', name='deblock'+str(k)+'_conv1' )(x_concat)\n    x1 = BatchNormalization()(x1)\n    x1 = Activation('relu', name='deblock'+str(k)+'_activ_conv1' )(x1)\n    \n    x1 = Conv2D(numb_kernel, (kernel_size,kernel_size),padding='same', name='deblock'+str(k)+'_conv2' )(x1)\n    x1 = BatchNormalization()(x1)\n    x_block = Activation('relu', name='deblock'+str(k)+'_activ_conv2' )(x1)\n    \n    return x_block\n    \n    \ndef res_block(x=None,numb_kernel = [32,64],  kernel_size=[1,3], k = 0):\n    \n    x1 = Conv2D(numb_kernel, (kernel_size[0],kernel_size[0]),padding='same', name='block'+str(k)+'_res_conv11' )(x)\n    x1 = BatchNormalization()(x1)\n    x1 = Activation('relu', name='block'+str(k)+'_res_activ_conv11' )(x1)\n    \n    x1 = Conv2D(numb_kernel, (kernel_size[1],kernel_size[1]),padding='same', name='block'+str(k)+'_res_conv12' )(x1)\n    x1 = BatchNormalization()(x1)\n    x1 = Activation('relu', name='block'+str(k)+'_res_activ_conv12' )(x1)\n    \n    x2 = Conv2D(numb_kernel, (kernel_size[1],kernel_size[1]),padding='same', name='block'+str(k)+'_res_conv21' )(x)\n    x2 = BatchNormalization()(x2)\n    x2 = Activation('relu', name='block'+str(k)+'_res_activ_conv21' )(x2)\n    \n    x2 = Conv2D(numb_kernel, (kernel_size[0],kernel_size[0]),padding='same', name='block'+str(k)+'_res_conv22' )(x2)\n    x2 = BatchNormalization()(x2)\n    x2 = Activation('relu', name='block'+str(k)+'_res_activ_conv22' )(x2)\n    \n    x3 = Conv2D(numb_kernel, (kernel_size[0],kernel_size[0]),padding='same', name='block'+str(k)+'_res_conv31' )(x)\n    x3 = BatchNormalization()(x3)\n    x3 = Activation('relu', name='block'+str(k)+'_res_activ_conv31' )(x3)\n\n    x4 = Conv2D(numb_kernel, (kernel_size[1],kernel_size[1]),padding='same', name='block'+str(k)+'_res_conv4' )(x)\n    x4 = BatchNormalization()(x4)\n    x4 = Activation('relu', name='block'+str(k)+'_res_activ_conv41' )(x4)\n    \n    x_concat = concatenate([x, x1,x2,x3,x4],axis=3)\n    \n    x_block = MaxPooling(name='block'+str(k)+'_pool')(x_concat)\n    \n    return x_bloc    \n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"    left_model = tf.keras.applications.VGG16(\n    include_top=False, weights='imagenet', input_tensor=None,\n    input_shape=(512, 512, 3))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"left_model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"left_model.layers[5].output","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def net_conv(num_classes = 1, input_shape= (256, 256, 3),numb_level=2):\n    img_input = Input(input_shape)\n    x_block=[img_input]\n    for i in range(numb_level):\n        x_block.append(conv_block(x=x_block[i],numb_kernel = 32*(i+1),  kernel_size=3, k = i))\n    x = x_block[-1]  \n    print(x_block)\n    \n    x = Conv2D(32*(i+1), (3,3),padding='same', name='block'+'_conv01' )(x)\n    x = BatchNormalization()(x)\n    x = Activation('relu', name='block_activ_conv01' )(x)\n    \n    x = Conv2D(32*(i+1), (3,3),padding='same', name='block'+'_conv02' )(x)\n    x = BatchNormalization()(x)\n    x = Activation('relu', name='block_activ_conv02' )(x)\n    \n    print(x)\n    for i in range((numb_level-1),-1,-1):\n        print('deconv:',x_block[i])\n        x = de_conv_block(xc=[x,x_block[i]],numb_kernel = 32*(i+1),  kernel_size=3, k = i)\n    # слой классификатор\n    x = Conv2D(num_classes, (3, 3), activation='sigmoid', padding='same')(x)#softmax\n\n    model = Model(img_input, x)\n    model.compile(optimizer=Adam(),\n                  loss= 'categorical_crossentropy',\n                  metrics=[tf.keras.metrics.MeanIoU(num_classes=3)])\n   \n    return model    \n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n\ndef net_res_conv(num_classes = 1, input_shape= (256, 256, 3),numb_level=4):\n    left_model = tf.keras.applications.VGG16(\n    include_top=False, weights='imagenet', input_tensor=None,\n    input_shape=input_shape)\n    img_input = left_model.input\n    left_model.trainable = False\n    x_block=[img_input]\n    for i in range(numb_level):\n        x_block.append(left_model.layers[2+((i)*3)].output)\n    x = x_block[-1]  \n    print(x_block)\n    \n    x = Conv2D(32*(i+1), (3,3),padding='same', name='block'+'_conv01' )(x)\n    x = BatchNormalization()(x)\n    x = Activation('relu', name='block_activ_conv01' )(x)\n    \n    x = Conv2D(32*(i+1), (3,3),padding='same', name='block'+'_conv02' )(x)\n    x = BatchNormalization()(x)\n    x = Activation('relu', name='block_activ_conv02' )(x)\n    \n    print(x)\n    for i in range((numb_level),1,-1):\n        print('deconv:',x_block[i])\n        x = de_conv_block(xc=[x,x_block[i-1]],numb_kernel = 32*(i+1),  kernel_size=3, k = i)\n    # слой классификатор\n    x = Conv2D(num_classes, (3, 3), activation='sigmoid', padding='same')(x)#softmax\n\n    model = Model(img_input, x)\n    model.compile(optimizer=Adam(),\n                  loss= 'categorical_crossentropy',\n                  metrics=[tf.keras.metrics.MeanIoU(num_classes=3)])\n   \n    return model  ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_unet = net_res_conv(num_classes = 3, input_shape= (512,512,3))\nmodel_unet.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_model(model_unet,'1.png')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"path+work_dir_mask + '/train_masks/'+mask_ind","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"'''\n'''\n\n#current number of Car\nn = 100\ncar_ind = list_car[n]\nmask_ind = list_mask[n]\n#Load car&mask images using thier ids.\ncar = load_img(path+work_dir_img + '/train_hq/'+car_ind,target_size=(image_size[0],image_size[1]))\ncar =  tf.keras.preprocessing.image.img_to_array(car).reshape((1,image_size[0],image_size[1],3))\nmask = load_img(path+work_dir_mask + '/train_masks/'+mask_ind,target_size=(image_size[0],image_size[1]))\nmask = tf.keras.preprocessing.image.img_to_array(mask).reshape((1,image_size[0],image_size[1],3))\n\nplt.figure(figsize=(16,16))\nplt.subplot(1,2,1)\nplt.imshow(car[0,:,:,:].astype(int))\nplt.subplot(1,2,2)\nplt.imshow(mask[0,:,:,0])\nplt.show()\n\nData_img = ImageDataGenerator(rescale = 1./255)\nData_mask = ImageDataGenerator(rescale = 1./255 )\n\nseed=1\nData_img.fit(car, augment=False, seed=seed)\nData_mask.fit(mask, augment=False, seed=seed)\n\n\nData_img_dir = Data_img.flow_from_directory(\n    path+work_dir_img,\n    target_size=(image_size[0], image_size[1]),\n    shuffle=False,\n     class_mode=None,\n    color_mode=\"rgb\",\n    batch_size=5,\n    seed=seed)\n\nData_mask_dir = Data_mask.flow_from_directory(\n    path+work_dir_mask,\n    target_size=(image_size[0], image_size[1]),\n    color_mode=\"rgb\",\n     class_mode='binary',\n    shuffle=False,\n    batch_size=5,seed=seed\n   )\n\ntrain_generator = zip(Data_img_dir, Data_mask_dir)\n\n#path+work_dir_val_mask\nData_img_val = ImageDataGenerator(rescale = 1./255)\nData_mask_val = ImageDataGenerator(rescale = 1./255)\nseed=1\nData_img_val.fit(car, augment=False, seed=seed)\nData_mask_val.fit(mask, augment=False, seed=seed)\n\n\nData_img_dir_val = Data_img_val.flow_from_directory(\n    path+work_dir_val_img,\n    target_size=(image_size[0], image_size[1]),\n    shuffle=False,\n     class_mode=None,\n    color_mode=\"rgb\",\n    batch_size=5,\n    seed=seed)\n\nData_mask_dir_val = Data_mask_val.flow_from_directory(\n    path+work_dir_val_mask,\n    target_size=(image_size[0], image_size[1]),\n    color_mode=\"rgb\",\n     class_mode='binary',\n    shuffle=False,\n    batch_size=5,seed=seed\n   )\n\nval_generator = zip(Data_img_dir_val, Data_mask_dir_val)\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#for i,j in train_generator:\n    #print(np.array(i).shape)\n#    plt.imshow(j[0][:,:,0])\n#    plt.show()\n    \n#    print(np.sum(j[0])/(image_size[0]* image_size[1]))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_unet.fit(train_generator,\n        steps_per_epoch=200,\n        epochs=2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for img_,mask_ in train_generator:\n    \n    y_pred = model_unet.predict(img_)\n    plt.figure(figsize=(16,8))\n    plt.subplot(1,3,1)\n    plt.imshow(img_[0])\n    plt.subplot(1,3,2)\n    plt.imshow(mask_[0][0,:,:])\n    plt.subplot(1,3,3)\n    plt.imshow((y_pred[0,:,:,0]>y_pred[0,:,:,0].mean()).astype(float))\n    plt.show()\n    if True:\n        break","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_pred[0,:,:,:].mean()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}