{"cells":[{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.execute_input":"2020-11-06T02:32:08.988359Z","iopub.status.busy":"2020-11-06T02:32:08.987431Z","iopub.status.idle":"2020-11-06T02:32:16.323731Z","shell.execute_reply":"2020-11-06T02:32:16.32314Z"},"papermill":{"duration":7.37193,"end_time":"2020-11-06T02:32:16.323854","exception":false,"start_time":"2020-11-06T02:32:08.951924","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport keras\nimport keras.backend as K\nfrom keras.models import *\nfrom keras.layers import *\nfrom keras.optimizers import *\nimport tensorflow as tf\n\nfrom sklearn.model_selection import train_test_split\nimport os\nfrom keras.preprocessing.image import array_to_img, img_to_array, load_img, ImageDataGenerator\n%matplotlib inline\nimport cv2\nfrom PIL import Image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import zipfile\n#解压训练集图像\nwith zipfile.ZipFile('../input/carvana-image-masking-challenge/train_hq.zip','r') as zip_ref:\n    zip_ref.extractall('/kaggle/working')\n\nwith zipfile.ZipFile('../input/carvana-image-masking-challenge/train_masks.zip','r') as zip_ref:\n    zip_ref.extractall('/kaggle/working')\n\nwith zipfile.ZipFile('../input/carvana-image-masking-challenge/train.zip','r') as zip_ref:\n    zip_ref.extractall('/kaggle/working')\n\nwith zipfile.ZipFile('../input/carvana-image-masking-challenge/metadata.csv.zip','r') as zip_ref:\n    zip_ref.extractall('/kaggle/working')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_size = len(os.listdir('/kaggle/working/train_hq'))\nprint('训练集size:',data_size)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-11-06T02:32:32.51968Z","iopub.status.busy":"2020-11-06T02:32:32.5189Z","iopub.status.idle":"2020-11-06T02:32:32.542964Z","shell.execute_reply":"2020-11-06T02:32:32.542497Z"},"papermill":{"duration":0.048596,"end_time":"2020-11-06T02:32:32.543059","exception":false,"start_time":"2020-11-06T02:32:32.494463","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"import os\nfrom glob import glob\ntrain_files=glob(os.path.join('/kaggle/working/train','*.jpg'))\n#解释：遍历文件夹下所有jpg文件\ntrain_ids=[s[len('/kaggle/working/train')+1:-4] for s in train_files]\n#去除文件的前缀，后缀","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-11-06T02:32:32.99751Z","iopub.status.busy":"2020-11-06T02:32:32.996666Z","iopub.status.idle":"2020-11-06T02:32:33.00612Z","shell.execute_reply":"2020-11-06T02:32:33.006626Z"},"papermill":{"duration":0.034452,"end_time":"2020-11-06T02:32:33.006741","exception":false,"start_time":"2020-11-06T02:32:32.972289","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"all_images = os.listdir('/kaggle/working/train_hq')\ntrain_images, validation_images = train_test_split(all_images, train_size=0.8, test_size=0.2)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-11-06T02:32:33.10176Z","iopub.status.busy":"2020-11-06T02:32:33.100967Z","iopub.status.idle":"2020-11-06T02:32:33.115277Z","shell.execute_reply":"2020-11-06T02:32:33.114802Z"},"papermill":{"duration":0.039705,"end_time":"2020-11-06T02:32:33.115372","exception":false,"start_time":"2020-11-06T02:32:33.075667","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"car_ids=sorted(os.listdir('/kaggle/working/train_hq'))\nmask_ids=sorted(os.listdir('/kaggle/working/train_masks'))\nrnd_ids=list(np.random.choice(data_size,8))\nfor i in rnd_ids:\n    print('训练图片:{},对应标注图片:{}'.format(car_ids[i],mask_ids[i]))","execution_count":null,"outputs":[]},{"metadata":{"papermill":{"duration":0.020723,"end_time":"2020-11-06T02:32:33.157164","exception":false,"start_time":"2020-11-06T02:32:33.136441","status":"completed"},"tags":[]},"cell_type":"markdown","source":"# 可视化"},{"metadata":{"execution":{"iopub.execute_input":"2020-11-06T02:32:33.208062Z","iopub.status.busy":"2020-11-06T02:32:33.207324Z","iopub.status.idle":"2020-11-06T02:32:33.943851Z","shell.execute_reply":"2020-11-06T02:32:33.944324Z"},"papermill":{"duration":0.765856,"end_time":"2020-11-06T02:32:33.944501","exception":false,"start_time":"2020-11-06T02:32:33.178645","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"car_id = car_ids[0]\nmask_id = mask_ids[0]\ncar = load_img('/kaggle/working/train_hq/' + car_id)\nmask = load_img('/kaggle/working/train_masks/' + mask_id)\nprint(\"Image Size: \", car.size)\nprint(\"Mask Size: \", mask.size)\nfig, ax = plt.subplots(1, 2, figsize=(20,20))\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":{"execution":{"iopub.execute_input":"2020-11-06T02:32:34.010147Z","iopub.status.busy":"2020-11-06T02:32:34.009097Z","iopub.status.idle":"2020-11-06T02:32:34.012513Z","shell.execute_reply":"2020-11-06T02:32:34.010754Z"},"papermill":{"duration":0.042207,"end_time":"2020-11-06T02:32:34.012641","exception":false,"start_time":"2020-11-06T02:32:33.970434","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nX_train_ids, X_val_ids, y_train_ids, y_val_ids= train_test_split(car_ids, mask_ids,\n                                                                 test_size=.2, train_size=.8,\n                                                                 random_state=42)\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":{"papermill":{"duration":0.088363,"end_time":"2020-11-06T02:32:41.29907","exception":false,"start_time":"2020-11-06T02:32:41.210707","status":"completed"},"tags":[]},"cell_type":"markdown","source":"# Resize"},{"metadata":{"execution":{"iopub.execute_input":"2020-11-06T02:32:42.596729Z","iopub.status.busy":"2020-11-06T02:32:42.591221Z","iopub.status.idle":"2020-11-06T02:32:42.601616Z","shell.execute_reply":"2020-11-06T02:32:42.60302Z"},"papermill":{"duration":1.213458,"end_time":"2020-11-06T02:32:42.603208","exception":false,"start_time":"2020-11-06T02:32:41.38975","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"input_size = [128,128,3]\ndef data_generator(images_path, masks_path, image_ids, mask_ids, batch_size, img_size=input_size):\n    data_size = len(image_ids)\n    while True:\n        rnd_ind = np.random.choice(np.arange(data_size),batch_size)\n        imgs = []\n        masks = []\n        for i in rnd_ind:\n            img_id, mask_id = image_ids[i], mask_ids[i]\n            img = load_img(images_path + img_id, target_size=img_size) \n            mask = load_img(masks_path + mask_id, target_size=img_size[:-1], color_mode = 'grayscale')\n            imgs.append(img_to_array(img))\n            masks.append(img_to_array(mask).reshape(img_size[:-1] + [1]))\n        yield np.array(imgs, dtype=np.float16) / 255., np.array(masks, dtype=np.float16) / 255.","execution_count":null,"outputs":[]},{"metadata":{"papermill":{"duration":0.093004,"end_time":"2020-11-06T02:32:44.726964","exception":false,"start_time":"2020-11-06T02:32:44.63396","status":"completed"},"tags":[]},"cell_type":"markdown","source":"# U-net"},{"metadata":{"trusted":true},"cell_type":"code","source":"def dice_coef(y_true, y_pred):\n    smooth = 1e-5\n    \n    y_true = tf.round(tf.reshape(y_true, [-1]))\n    y_pred = tf.round(tf.reshape(y_pred, [-1]))\n    \n    isct = tf.reduce_sum(y_true * y_pred)\n    \n    return 2 * isct / (tf.reduce_sum(y_true) + tf.reduce_sum(y_pred))","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-11-06T02:32:44.95849Z","iopub.status.busy":"2020-11-06T02:32:44.949388Z","iopub.status.idle":"2020-11-06T02:32:48.897344Z","shell.execute_reply":"2020-11-06T02:32:48.896784Z"},"papermill":{"duration":4.077234,"end_time":"2020-11-06T02:32:48.897495","exception":false,"start_time":"2020-11-06T02:32:44.820261","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"\ndef Unet(input_shape=(128,128, 3)):\n    inputs = Input(shape=input_shape)\n\n    down1 = Conv2D(64, (3, 3), padding='same')(inputs)\n    down1 = BatchNormalization()(down1)\n    down1 = Activation('relu')(down1)\n    down1 = Conv2D(64, (3, 3), padding='same')(down1)\n    down1 = BatchNormalization()(down1)\n    down1 = Activation('relu')(down1)\n    down1_pool = MaxPooling2D((2, 2), strides=(2, 2))(down1)\n\n    down2 = Conv2D(128, (3, 3), padding='same')(down1_pool)\n    down2 = BatchNormalization()(down2)\n    down2 = Activation('relu')(down2)\n    down2 = Conv2D(128, (3, 3), padding='same')(down2)\n    down2 = BatchNormalization()(down2)\n    down2 = Activation('relu')(down2)\n    down2_pool = MaxPooling2D((2, 2), strides=(2, 2))(down2)\n\n    down3 = Conv2D(256, (3, 3), padding='same')(down2_pool)\n    down3 = BatchNormalization()(down3)\n    down3 = Activation('relu')(down3)\n    down3 = Conv2D(256, (3, 3), padding='same')(down3)\n    down3 = BatchNormalization()(down3)\n    down3 = Activation('relu')(down3)\n    down3_pool = MaxPooling2D((2, 2), strides=(2, 2))(down3)\n\n    down4 = Conv2D(512, (3, 3), padding='same')(down3_pool)\n    down4 = BatchNormalization()(down4)\n    down4 = Activation('relu')(down4)\n    down4 = Conv2D(512, (3, 3), padding='same')(down4)\n    down4 = BatchNormalization()(down4)\n    down4 = Activation('relu')(down4)\n    down4_pool = MaxPooling2D((2, 2), strides=(2, 2))(down4)\n\n    center = Conv2D(1024, (3, 3), padding='same')(down4_pool)\n    center = BatchNormalization()(center)\n    center = Activation('relu')(center)\n    center = Conv2D(1024, (3, 3), padding='same')(center)\n    center = BatchNormalization()(center)\n    center = Activation('relu')(center)\n\n    up4 = UpSampling2D((2, 2))(center)\n    up4 = concatenate([down4, up4], axis=3)\n    up4 = Conv2D(512, (3, 3), padding='same')(up4)\n    up4 = BatchNormalization()(up4)\n    up4 = Activation('relu')(up4)\n    up4 = Conv2D(512, (3, 3), padding='same')(up4)\n    up4 = BatchNormalization()(up4)\n    up4 = Activation('relu')(up4)\n    \n\n    up3 = UpSampling2D((2, 2))(up4)\n    up3 = concatenate([down3, up3], axis=3)\n    up3 = Conv2D(256, (3, 3), padding='same')(up3)\n    up3 = BatchNormalization()(up3)\n    up3 = Activation('relu')(up3)\n    up3 = Conv2D(256, (3, 3), padding='same')(up3)\n    up3 = BatchNormalization()(up3)\n    up3 = Activation('relu')(up3)\n\n    up2 = UpSampling2D((2, 2))(up3)\n    up2 = concatenate([down2, up2], axis=3)\n    up2 = Conv2D(128, (3, 3), padding='same')(up2)\n    up2 = BatchNormalization()(up2)\n    up2 = Activation('relu')(up2)\n    up2 = Conv2D(128, (3, 3), padding='same')(up2)\n    up2 = BatchNormalization()(up2)\n    up2 = Activation('relu')(up2)\n   \n\n    up1 = UpSampling2D((2, 2))(up2)\n    up1 = concatenate([down1, up1], axis=3)\n    up1 = Conv2D(64, (3, 3), padding='same')(up1)\n    up1 = BatchNormalization()(up1)\n    up1 = Activation('relu')(up1)\n    up1 = Conv2D(64, (3, 3), padding='same')(up1)\n    up1 = BatchNormalization()(up1)\n    up1 = Activation('relu')(up1)\n    \n\n    \n    out = Conv2D(1, (1, 1), activation='sigmoid')(up1)\n\n    model = Model(inputs=inputs, outputs=out)\n\n    model.compile(optimizer='adam', loss='mse', metrics=[dice_coef])\n\n    return model\n\nmodel = Unet()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-11-06T02:32:49.091499Z","iopub.status.busy":"2020-11-06T02:32:49.090465Z","iopub.status.idle":"2020-11-06T02:32:49.094893Z","shell.execute_reply":"2020-11-06T02:32:49.095328Z"},"papermill":{"duration":0.104297,"end_time":"2020-11-06T02:32:49.095472","exception":false,"start_time":"2020-11-06T02:32:48.991175","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"X_train_size\n#4000/40=100","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-11-06T02:32:49.291256Z","iopub.status.busy":"2020-11-06T02:32:49.290455Z","iopub.status.idle":"2020-11-06T02:32:49.293287Z","shell.execute_reply":"2020-11-06T02:32:49.292782Z"},"papermill":{"duration":0.102911,"end_time":"2020-11-06T02:32:49.293389","exception":false,"start_time":"2020-11-06T02:32:49.190478","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"batch_size = 40\ntrain_gen = data_generator('/kaggle/working/train_hq/', '/kaggle/working/train_masks/',\n                           X_train_ids, y_train_ids, batch_size=batch_size)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-11-06T02:32:49.503507Z","iopub.status.busy":"2020-11-06T02:32:49.502008Z","iopub.status.idle":"2020-11-06T02:32:49.508354Z","shell.execute_reply":"2020-11-06T02:32:49.507881Z"},"papermill":{"duration":0.121758,"end_time":"2020-11-06T02:32:49.508473","exception":false,"start_time":"2020-11-06T02:32:49.386715","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"from tensorflow.python.client import device_lib\nprint(device_lib.list_local_devices())","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-11-06T02:32:49.703108Z","iopub.status.busy":"2020-11-06T02:32:49.702446Z","iopub.status.idle":"2020-11-06T03:00:52.046974Z","shell.execute_reply":"2020-11-06T03:00:52.047931Z"},"papermill":{"duration":1682.445736,"end_time":"2020-11-06T03:00:52.048106","exception":false,"start_time":"2020-11-06T02:32:49.60237","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"model.fit_generator(train_gen, steps_per_epoch=100,epochs=5)\n#拥有越高性能的GPU，则可以设置越大的batch_size值。\n#根据现有硬件，我们设置了每批次输入50-100张图像。\n#参数steps_per_epoch是通过把训练图像的数量除以批次大小得出的。\n#有4070(4000)张图像且批次大小为40，则steps_per_epoch值为100。\n#参数epoch决定网络中所有图像的训练次数。\n#在Tesla K80 GPU上，大约需要11小时才能完成对1万张图像的21次训练。","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-11-06T03:00:53.134256Z","iopub.status.busy":"2020-11-06T03:00:53.133317Z","iopub.status.idle":"2020-11-06T03:00:54.506504Z","shell.execute_reply":"2020-11-06T03:00:54.505892Z"},"papermill":{"duration":2.023941,"end_time":"2020-11-06T03:00:54.506627","exception":false,"start_time":"2020-11-06T03:00:52.482686","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"gen = data_generator('/kaggle/working/train_hq/', '/kaggle/working/train_masks/',\n                    X_val_ids, y_val_ids, batch_size=32)\n\nimgs, masks = next(gen)\nprint('Images batch shape: ', imgs.shape)\nprint('Masks batch shape: ', masks.shape)\npred_masks = model.predict(imgs)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-11-06T03:00:55.388279Z","iopub.status.busy":"2020-11-06T03:00:55.387357Z","iopub.status.idle":"2020-11-06T03:01:01.210788Z","shell.execute_reply":"2020-11-06T03:01:01.211286Z"},"papermill":{"duration":6.269718,"end_time":"2020-11-06T03:01:01.211434","exception":false,"start_time":"2020-11-06T03:00:54.941716","status":"completed"},"tags":[],"trusted":true},"cell_type":"code","source":"fig, ax = plt.subplots(32, 3, figsize=(20,150))\nfor i in range(32):\n    ax[i, 0].imshow(imgs[i].astype(np.float32))\n    ax[i, 0].axis('off')\n    ax[i, 0].title.set_text('Car')\n    \n    ax[i, 1].imshow(masks[i,:,:,0].astype(np.float32), cmap='gray')\n    ax[i, 1].axis('off')\n    ax[i, 1].title.set_text('Real Mask')\n    \n    ax[i, 2].imshow(pred_masks[i,:,:,0], cmap='gray')\n    ax[i, 2].axis('off')\n    ax[i, 2].title.set_text('Predicted Mask')\nplt.show() ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#解压测试集图像\nwith zipfile.ZipFile('../input/carvana-image-masking-challenge/test_hq.zip','r') as zip_ref:\n    zip_ref.extractall('/kaggle/working')\n\nwith zipfile.ZipFile('../input/carvana-image-masking-challenge/test.zip','r') as zip_ref:\n    zip_ref.extractall('/kaggle/working')\n\ntest_ids=sorted(os.listdir('/kaggle/working/test_hq'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def pre_data_generator(images_path,image_ids,batch_size, img_size=input_size):\n    data_size = len(image_ids)\n    while True:\n        rnd_ind = np.random.choice(np.arange(data_size),batch_size)\n        imgs = []\n        for i in rnd_ind:\n            img = load_img(images_path + image_ids[i], target_size=img_size) \n            imgs.append(img_to_array(img))\n        yield np.array(imgs, dtype=np.float16) / 255.\n        \npre_gen=pre_data_generator('/kaggle/working/test_hq',test_ids,batch_size=)\ntest_imgs=next(pre_gen)\npred_masks = model.predict(test_imgs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n#with zipfile.ZipFile('/kaggle/working/submission.zip', 'w') as z:\n#   z.write(pred_masks)\n","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}