{"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":"# Import Modules","metadata":{}},{"cell_type":"code","source":"import sys\n\nsys.path.insert(0, '../input/computer-vision-training-fcis-21/')\n\nimport utils\n\nworking_dir = '../input/computer-vision-training-fcis-21/224/content/flowers/224/'\n\ntrain_dir = f'{working_dir}/train/train/'\ntest_dir = f'{working_dir}/test/test/'","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:11:50.929545Z","iopub.execute_input":"2021-09-23T16:11:50.929823Z","iopub.status.idle":"2021-09-23T16:11:50.934309Z","shell.execute_reply.started":"2021-09-23T16:11:50.929794Z","shell.execute_reply":"2021-09-23T16:11:50.933538Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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\n\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\n\nimport matplotlib.pyplot as plt\n\nfrom tqdm import tqdm\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","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:11:50.943247Z","iopub.execute_input":"2021-09-23T16:11:50.943855Z","iopub.status.idle":"2021-09-23T16:11:50.952778Z","shell.execute_reply.started":"2021-09-23T16:11:50.943819Z","shell.execute_reply":"2021-09-23T16:11:50.952072Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Read N-Batches","metadata":{}},{"cell_type":"code","source":"train_nbatch = utils.num_of_batches(train_dir + '/origin')\n\nprint('No. Batches: %i'%train_nbatch)","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:11:50.954291Z","iopub.execute_input":"2021-09-23T16:11:50.954479Z","iopub.status.idle":"2021-09-23T16:11:50.972429Z","shell.execute_reply.started":"2021-09-23T16:11:50.954451Z","shell.execute_reply":"2021-09-23T16:11:50.971751Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"start = 0\nend = 107\n\nxdata = utils.read_nbatch(train_dir + '/origin', start, end)\nydata = utils.read_nbatch(train_dir + '/masks', start, end)\n\nprint(xdata['x'].shape, ydata['x'].shape)","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:11:50.973486Z","iopub.execute_input":"2021-09-23T16:11:50.973706Z","iopub.status.idle":"2021-09-23T16:12:20.839064Z","shell.execute_reply.started":"2021-09-23T16:11:50.973676Z","shell.execute_reply":"2021-09-23T16:12:20.838365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Explore","metadata":{}},{"cell_type":"code","source":"def plot(images: np.ndarray, nrows: int = 1, ncols: int = 4, figsize: tuple = (10, 6)):\n\n    fig, axs = plt.subplots(nrows=nrows, ncols=ncols, figsize=figsize)\n    \n    axs = axs.flatten()\n\n    for i in range(len(axs)):\n\n        axs[i].imshow(images[i].squeeze())\n\n        axs[i].grid(None)\n        axs[i].axis('off')\n    \n    \n    fig.tight_layout()\n    \n    return fig, axs","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:12:20.841323Z","iopub.execute_input":"2021-09-23T16:12:20.841600Z","iopub.status.idle":"2021-09-23T16:12:20.849618Z","shell.execute_reply.started":"2021-09-23T16:12:20.841565Z","shell.execute_reply":"2021-09-23T16:12:20.848697Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def sample(images, sample_size=4, random_state=42):\n    \n    random = np.random.RandomState(random_state)\n\n    indices = np.arange(0, 320)\n\n    random.shuffle(indices)\n    \n    indices = indices[:sample_size]    \n    \n    return images[indices]","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:12:20.850983Z","iopub.execute_input":"2021-09-23T16:12:20.851301Z","iopub.status.idle":"2021-09-23T16:12:20.862438Z","shell.execute_reply.started":"2021-09-23T16:12:20.851267Z","shell.execute_reply":"2021-09-23T16:12:20.861413Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_sample = sample(xdata['x'])\ny_sample = sample(ydata['x'])\n\nprint(x_sample.shape, y_sample.shape)","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:12:20.864005Z","iopub.execute_input":"2021-09-23T16:12:20.864370Z","iopub.status.idle":"2021-09-23T16:12:20.875079Z","shell.execute_reply.started":"2021-09-23T16:12:20.864330Z","shell.execute_reply":"2021-09-23T16:12:20.874286Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.style.use('grayscale')\n\nfig, ax = plot(x_sample)\nfig, ax = plot(y_sample)","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:12:20.876723Z","iopub.execute_input":"2021-09-23T16:12:20.877075Z","iopub.status.idle":"2021-09-23T16:12:21.391183Z","shell.execute_reply.started":"2021-09-23T16:12:20.877041Z","shell.execute_reply":"2021-09-23T16:12:21.390343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\n\nfrom tensorflow.keras.layers import *\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras import optimizers, losses, metrics","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:12:21.392594Z","iopub.execute_input":"2021-09-23T16:12:21.392869Z","iopub.status.idle":"2021-09-23T16:12:21.397440Z","shell.execute_reply.started":"2021-09-23T16:12:21.392833Z","shell.execute_reply":"2021-09-23T16:12:21.396568Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" inputs = Input(shape=(224, 224, 3))\n\n\nconv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(inputs)\nconv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv1)\nconv1 = BatchNormalization()(conv1)\npool1 = MaxPooling2D((2, 2))(conv1)\n\nconv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(pool1)\nconv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv2)\nconv2 = BatchNormalization()(conv2)\npool2 = MaxPooling2D((2, 2))(conv2)\n\n\nconv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool2)\nconv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv3)\nconv3 = BatchNormalization()(conv3)\npool3 = MaxPooling2D((2, 2))(conv3)\n\nconv00 = Conv2D(256, (3, 3), activation='relu', padding='same')(pool3)\nconv00 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv00)\nconv00 = BatchNormalization()(conv00)\n\n\n\ndeconv0= Conv2DTranspose(128, (3, 3), strides=(2, 2), padding=\"same\")(conv00)\nup0 = concatenate([deconv0, conv3])\nconv0 = Conv2D(128, (3, 3), activation='relu', padding='same')(up0)\nconv0 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv0)\nconv0 = BatchNormalization()(conv0)\n\ndeconv1 = Conv2DTranspose(64, (3, 3), strides=(2, 2), padding=\"same\")(conv0)\nup1 = concatenate([deconv1, conv2])\nconv4 = Conv2D(64, (3, 3), activation='relu', padding='same')(up1)\nconv4 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv4)\nconv4 = BatchNormalization()(conv4)\n\ndeconv2 = Conv2DTranspose(32, (3, 3), strides=(2, 2), padding=\"same\")(conv4)\nup2 = concatenate([deconv2, conv1])\nconv5 = Conv2D(32, (3, 3), activation='relu', padding='same')(up2)\nconv5 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv5)\n\nconv5 = Conv2D(2, (3, 3), activation='relu', padding='same')(conv5)\nconv5 = Conv2D(1, (1, 1), activation='sigmoid', padding='same')(conv5)\n\n\n\noutputs = Reshape(target_shape=(224, 224))(conv5)\nmodel = Model(inputs, outputs)\n\noptimizer = optimizers.Adam(learning_rate=1e-3)\nloss = losses.BinaryCrossentropy('loss')\nmetric = metrics.MeanIoU(2, name='iou')\n\nmodel.compile(optimizer=optimizer, loss=loss, metrics=metric)","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:12:21.400629Z","iopub.execute_input":"2021-09-23T16:12:21.401096Z","iopub.status.idle":"2021-09-23T16:12:21.643109Z","shell.execute_reply.started":"2021-09-23T16:12:21.401061Z","shell.execute_reply":"2021-09-23T16:12:21.642377Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:12:21.644424Z","iopub.execute_input":"2021-09-23T16:12:21.644707Z","iopub.status.idle":"2021-09-23T16:12:21.670348Z","shell.execute_reply.started":"2021-09-23T16:12:21.644673Z","shell.execute_reply":"2021-09-23T16:12:21.669670Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(xdata['x'], ydata['x'], epochs=10, batch_size=64)","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:12:21.671702Z","iopub.execute_input":"2021-09-23T16:12:21.672612Z","iopub.status.idle":"2021-09-23T16:15:48.900885Z","shell.execute_reply.started":"2021-09-23T16:12:21.672577Z","shell.execute_reply":"2021-09-23T16:15:48.898025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict","metadata":{}},{"cell_type":"code","source":"test_nbatches = utils.num_of_batches(test_dir + '/origin')\n\nprint('No. Batches: %i'%test_nbatches)","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:15:48.903756Z","iopub.status.idle":"2021-09-23T16:15:48.905289Z","shell.execute_reply.started":"2021-09-23T16:15:48.905019Z","shell.execute_reply":"2021-09-23T16:15:48.905046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data = utils.read_nbatch(test_dir + 'origin/', 108, 108 + test_nbatches)\n\ntest_size = len(test_data['id'])\n\nprint(test_size)","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:15:48.908029Z","iopub.status.idle":"2021-09-23T16:15:48.912270Z","shell.execute_reply.started":"2021-09-23T16:15:48.911996Z","shell.execute_reply":"2021-09-23T16:15:48.912022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_ids = test_data['id']\n\ntest_masks = model.predict(test_data['x']) > 0.5","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:15:48.913691Z","iopub.status.idle":"2021-09-23T16:15:48.914134Z","shell.execute_reply.started":"2021-09-23T16:15:48.913890Z","shell.execute_reply":"2021-09-23T16:15:48.913911Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_sample = sample(test_data['x'])\ny_sample = sample(test_masks)","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:15:48.916722Z","iopub.status.idle":"2021-09-23T16:15:48.917417Z","shell.execute_reply.started":"2021-09-23T16:15:48.916916Z","shell.execute_reply":"2021-09-23T16:15:48.917074Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.style.use('grayscale')\n\nfig, ax = plot(x_sample)\nfig, ax = plot(y_sample)","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:15:48.919688Z","iopub.status.idle":"2021-09-23T16:15:48.920884Z","shell.execute_reply.started":"2021-09-23T16:15:48.920054Z","shell.execute_reply":"2021-09-23T16:15:48.920359Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"submission = utils.Submission(shape=(224, 224))\n\nsubmission.init()\n\nfor i in tqdm(range(test_size)):\n    \n    submission.update(test_ids[i], test_masks[i])","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:15:48.921998Z","iopub.status.idle":"2021-09-23T16:15:48.922349Z","shell.execute_reply.started":"2021-09-23T16:15:48.922157Z","shell.execute_reply":"2021-09-23T16:15:48.922175Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.export('submission.csv')","metadata":{"execution":{"iopub.status.busy":"2021-09-23T16:15:48.923412Z","iopub.status.idle":"2021-09-23T16:15:48.923776Z","shell.execute_reply.started":"2021-09-23T16:15:48.923572Z","shell.execute_reply":"2021-09-23T16:15:48.923591Z"},"trusted":true},"execution_count":null,"outputs":[]}]}