{"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\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-20T16:17:58.656762Z","iopub.execute_input":"2021-09-20T16:17:58.657534Z","iopub.status.idle":"2021-09-20T16:17:58.662228Z","shell.execute_reply.started":"2021-09-20T16:17:58.657491Z","shell.execute_reply":"2021-09-20T16:17:58.661416Z"},"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-20T16:18:00.236811Z","iopub.execute_input":"2021-09-20T16:18:00.237104Z","iopub.status.idle":"2021-09-20T16:18:00.242709Z","shell.execute_reply.started":"2021-09-20T16:18:00.237077Z","shell.execute_reply":"2021-09-20T16:18:00.241728Z"},"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-20T16:12:23.469692Z","iopub.execute_input":"2021-09-20T16:12:23.470162Z","iopub.status.idle":"2021-09-20T16:12:23.486151Z","shell.execute_reply.started":"2021-09-20T16:12:23.470094Z","shell.execute_reply":"2021-09-20T16:12:23.485116Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"start = 0\nend = 108\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":{"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":{"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":{"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":{"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":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.layers import Input, Dense, Activation, BatchNormalization, Flatten, Reshape\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras import optimizers, losses, metrics","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"inputs = Input(shape=(224, 224, 3))\ndef bn_act(x, act=True):\n    x = keras.layers.BatchNormalization()(x)\n    if act == True:\n        x = keras.layers.Activation(\"relu\")(x)\n    return x\n\ndef conv_block(x, filters, kernel_size=(3, 3), padding=\"same\", strides=1):\n    conv = bn_act(x)\n    conv = keras.layers.Conv2D(filters, kernel_size, padding=padding, strides=strides)(conv)\n    return conv\n\ndef stem(x, filters, kernel_size=(3, 3), padding=\"same\", strides=1):\n    conv = keras.layers.Conv2D(filters, kernel_size, padding=padding, strides=strides)(x)\n    conv = conv_block(conv, filters, kernel_size=kernel_size, padding=padding, strides=strides)\n    \n    shortcut = keras.layers.Conv2D(filters, kernel_size=(1, 1), padding=padding, strides=strides)(x)\n    shortcut = bn_act(shortcut, act=False)\n    \n    output = keras.layers.Add()([conv, shortcut])\n    return output\n\ndef residual_block(x, filters, kernel_size=(3, 3), padding=\"same\", strides=1):\n    res = conv_block(x, filters, kernel_size=kernel_size, padding=padding, strides=strides)\n    res = conv_block(res, filters, kernel_size=kernel_size, padding=padding, strides=1)\n    \n    shortcut = keras.layers.Conv2D(filters, kernel_size=(1, 1), padding=padding, strides=strides)(x)\n    shortcut = bn_act(shortcut, act=False)\n    \n    output = keras.layers.Add()([shortcut, res])\n    return output\n\ndef upsample_concat_block(x, xskip):\n    u = keras.layers.UpSampling2D((2, 2))(x)\n    c = keras.layers.Concatenate()([u, xskip])\n    return c\nf = [16, 32, 64, 128, 256]\ne0 = inputs\ne1 = stem(e0, f[0])\ne2 = residual_block(e1, f[1], strides=2)\ne3 = residual_block(e2, f[2], strides=2)\ne4 = residual_block(e3, f[3], strides=2)\ne5 = residual_block(e4, f[4], strides=2)\nb0 = conv_block(e5, f[4], strides=1)\nb1 = conv_block(b0, f[4], strides=1)\nu1 = upsample_concat_block(b1, e4)\nd1 = residual_block(u1, f[4])\nu2 = upsample_concat_block(d1, e3)\nd2 = residual_block(u2, f[3])\nu3 = upsample_concat_block(d2, e2)\nd3 = residual_block(u3, f[2])\nu4 = upsample_concat_block(d3, e1)\nd4 = residual_block(u4, f[1])\nd4=tf.keras.layers.Conv2D(1, (3,3), activation='relu',padding='same')(d4)  \n    \n    \n    \n\n#outputs = Reshape(target_shape=(224, 224))(u11)\noutputs= Activation(\"sigmoid\")(d4)\nmodel = Model(inputs, outputs)\noptimizer = optimizers.Adam(learning_rate=0.01)\nloss = losses.BinaryCrossentropy('loss')\nmetric = metrics.MeanIoU(2, name='iou')\nmodel.compile(optimizer=optimizer, loss=loss, metrics=metric)","metadata":{"execution":{"iopub.status.busy":"2021-09-18T18:19:01.234106Z","iopub.execute_input":"2021-09-18T18:19:01.234363Z","iopub.status.idle":"2021-09-18T18:19:03.450505Z","shell.execute_reply.started":"2021-09-18T18:19:01.234332Z","shell.execute_reply":"2021-09-18T18:19:03.449784Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2021-09-18T18:19:03.451573Z","iopub.execute_input":"2021-09-18T18:19:03.451956Z","iopub.status.idle":"2021-09-18T18:19:03.470012Z","shell.execute_reply.started":"2021-09-18T18:19:03.451923Z","shell.execute_reply":"2021-09-18T18:19:03.469323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(xdata['x'], ydata['x'], epochs=100, batch_size=64)","metadata":{"execution":{"iopub.status.busy":"2021-09-18T13:38:41.096711Z","iopub.execute_input":"2021-09-18T13:38:41.096949Z","iopub.status.idle":"2021-09-18T13:41:03.026513Z","shell.execute_reply.started":"2021-09-18T13:38:41.09692Z","shell.execute_reply":"2021-09-18T13:41:03.025728Z"},"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-18T13:41:06.957633Z","iopub.execute_input":"2021-09-18T13:41:06.958385Z","iopub.status.idle":"2021-09-18T13:41:06.984973Z","shell.execute_reply.started":"2021-09-18T13:41:06.958345Z","shell.execute_reply":"2021-09-18T13:41:06.984089Z"},"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-18T13:41:08.115169Z","iopub.execute_input":"2021-09-18T13:41:08.115722Z","iopub.status.idle":"2021-09-18T13:41:12.324999Z","shell.execute_reply.started":"2021-09-18T13:41:08.115684Z","shell.execute_reply":"2021-09-18T13:41:12.322053Z"},"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-18T13:41:12.326812Z","iopub.execute_input":"2021-09-18T13:41:12.327207Z","iopub.status.idle":"2021-09-18T13:41:18.196697Z","shell.execute_reply.started":"2021-09-18T13:41:12.32717Z","shell.execute_reply":"2021-09-18T13:41:18.195907Z"},"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-18T13:41:18.197941Z","iopub.execute_input":"2021-09-18T13:41:18.198456Z","iopub.status.idle":"2021-09-18T13:41:18.206755Z","shell.execute_reply.started":"2021-09-18T13:41:18.19842Z","shell.execute_reply":"2021-09-18T13:41:18.206092Z"},"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-18T13:41:18.210814Z","iopub.execute_input":"2021-09-18T13:41:18.211999Z","iopub.status.idle":"2021-09-18T13:41:18.934151Z","shell.execute_reply.started":"2021-09-18T13:41:18.211968Z","shell.execute_reply":"2021-09-18T13:41:18.933533Z"},"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-13T16:22:50.342022Z","iopub.execute_input":"2021-09-13T16:22:50.342317Z","iopub.status.idle":"2021-09-13T16:22:57.653546Z","shell.execute_reply.started":"2021-09-13T16:22:50.342286Z","shell.execute_reply":"2021-09-13T16:22:57.652534Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.export('submission.csv')","metadata":{"execution":{"iopub.status.busy":"2021-09-13T16:22:57.654689Z","iopub.execute_input":"2021-09-13T16:22:57.654938Z","iopub.status.idle":"2021-09-13T16:22:58.045734Z","shell.execute_reply.started":"2021-09-13T16:22:57.654909Z","shell.execute_reply":"2021-09-13T16:22:58.044847Z"},"trusted":true},"execution_count":null,"outputs":[]}]}