{"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":"markdown","source":"","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-23T20:53:16.960716Z","iopub.execute_input":"2021-09-23T20:53:16.961158Z","iopub.status.idle":"2021-09-23T20:53:16.968047Z","shell.execute_reply.started":"2021-09-23T20:53:16.961123Z","shell.execute_reply":"2021-09-23T20:53:16.967120Z"},"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-23T20:53:16.969693Z","iopub.execute_input":"2021-09-23T20:53:16.969982Z","iopub.status.idle":"2021-09-23T20:53:16.976309Z","shell.execute_reply.started":"2021-09-23T20:53:16.969949Z","shell.execute_reply":"2021-09-23T20:53:16.975654Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"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-23T20:53:19.025770Z","iopub.execute_input":"2021-09-23T20:53:19.026012Z","iopub.status.idle":"2021-09-23T20:53:19.046154Z","shell.execute_reply.started":"2021-09-23T20:53:19.025985Z","shell.execute_reply":"2021-09-23T20:53:19.045408Z"},"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-23T20:53:19.808932Z","iopub.execute_input":"2021-09-23T20:53:19.809522Z","iopub.status.idle":"2021-09-23T20:54:00.085944Z","shell.execute_reply.started":"2021-09-23T20:53:19.809491Z","shell.execute_reply":"2021-09-23T20:54:00.085268Z"},"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-23T20:54:00.087712Z","iopub.execute_input":"2021-09-23T20:54:00.088158Z","iopub.status.idle":"2021-09-23T20:54:00.095084Z","shell.execute_reply.started":"2021-09-23T20:54:00.088123Z","shell.execute_reply":"2021-09-23T20:54:00.094333Z"},"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-23T20:54:00.096311Z","iopub.execute_input":"2021-09-23T20:54:00.096575Z","iopub.status.idle":"2021-09-23T20:54:00.105767Z","shell.execute_reply.started":"2021-09-23T20:54:00.096543Z","shell.execute_reply":"2021-09-23T20:54:00.105083Z"},"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-23T20:54:00.107488Z","iopub.execute_input":"2021-09-23T20:54:00.107841Z","iopub.status.idle":"2021-09-23T20:54:00.118757Z","shell.execute_reply.started":"2021-09-23T20:54:00.107810Z","shell.execute_reply":"2021-09-23T20:54:00.118089Z"},"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-23T20:54:00.119875Z","iopub.execute_input":"2021-09-23T20:54:00.120258Z","iopub.status.idle":"2021-09-23T20:54:00.643403Z","shell.execute_reply.started":"2021-09-23T20:54:00.120220Z","shell.execute_reply":"2021-09-23T20:54:00.642640Z"},"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 Input, Dropout,AvgPool2D,concatenate,UpSampling2D,MaxPool2D,MaxPooling2D, Dense, Activation, BatchNormalization, Flatten, Reshape,Conv2D,Conv2DTranspose\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras import optimizers, losses, metrics","metadata":{"execution":{"iopub.status.busy":"2021-09-23T20:54:14.326483Z","iopub.execute_input":"2021-09-23T20:54:14.326755Z","iopub.status.idle":"2021-09-23T20:54:18.422834Z","shell.execute_reply.started":"2021-09-23T20:54:14.326719Z","shell.execute_reply":"2021-09-23T20:54:18.422096Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"inputs = Input(shape=(224, 224, 3))\n\n#high\n#d1=BatchNormalization()(inputs)\nd11=AvgPool2D((3,3),strides=(1,1),padding='same')(inputs)\nd11=Conv2D(32,(1,1),activation='relu', padding='same')(d11)\nd12=Conv2D(32,(1,1),activation='relu', padding='same')(inputs)\nd12=Conv2D(32,(5,5),activation='relu', padding='same')(d12)\nd13=Conv2D(32,(1,1),activation='relu', padding='same')(inputs)\nd13=Conv2D(32,(3,3),activation='relu', padding='same')(d13)\nd14=Conv2D(32,(1,1),activation='relu', padding='same')(inputs)\ndf1=concatenate([d11,d12,d13,d14, inputs], axis=3)\ndf1=BatchNormalization()(df1)\n\n\n#mid\nd2=MaxPool2D(pool_size=(2,2))(df1)\n\nd21=AvgPool2D((3,3),strides=(1,1),padding='same')(d2)\nd21=Conv2D(48,(1,1),activation='relu', padding='same')(d21)\n\nd22=Conv2D(48,(1,1),activation='relu', padding='same')(d2)\nd22=Conv2D(32,(5,5),activation='relu', padding='same')(d22)\n\nd23=Conv2D(48,(1,1),activation='relu', padding='same')(d2)\nd23=Conv2D(32,(3,3),activation='relu', padding='same')(d23)\n\nd24=Conv2D(48,(1,1),activation='relu', padding='same')(d2)\ndf2=concatenate([d21,d22,d23,d24], axis=3)\n#df2=BatchNormalization()(df2)\nd3=MaxPool2D(pool_size=(2,2))(df2)\n\n#low\n\nd31=AvgPool2D((3,3),strides=(1,1),padding='same')(d3)\nd31=Conv2D(64,(1,1),activation='relu', padding='same')(d31)\n\nd32=Conv2D(64,(1,1),activation='relu', padding='same')(d3)\nd32=Conv2D(64,(5,5),activation='relu', padding='same')(d32)\n\nd33=Conv2D(64,(1,1),activation='relu', padding='same')(d3)\nd33=Conv2D(64,(3,3),activation='relu', padding='same')(d33)\n\nd34=Conv2D(64,(1,1),activation='relu', padding='same')(d3)\n\ndf3=concatenate([d31,d32,d33,d34], axis=3)\n#df3=BatchNormalization()(df3)\nd4=MaxPool2D(pool_size=(2,2))(df3)\nd4=Conv2D(128,(3,3),activation='relu', padding='same')(d4)\nd4=Conv2D(128,(3,3),activation='relu', padding='same')(d4)\nd4=Conv2D(128,(3,3),activation='relu', padding='same')(d4)\n#d4=BatchNormalization()(d4)\n#center\nc=MaxPooling2D(pool_size=(2,2))(d4)\nc=Dropout(0.50)(c)\nc=Conv2D(256,(3,3),activation='relu', padding='same')(c)\nc=Conv2D(256,(3,3),activation='relu', padding='same')(c)\nc=Conv2D(256,(3,3),activation='relu', padding='same')(c)\nc=BatchNormalization()(c)\n#low\n#p4=Conv2DTranspose(128,(3,3),activation='relu',padding='same')(c)\np4=UpSampling2D()(c)\np4=concatenate([d4, p4], axis=3)\np4=Conv2D(128,(3,3),activation='relu', padding='same')(p4)\np4=Conv2D(128,(3,3),activation='relu', padding='same')(p4)\n\n\n#p3=Conv2DTranspose(64,(3,3),activation='relu',padding='same')(p4)\np3=UpSampling2D()(p4)\np3=concatenate([df3, p3], axis=3)\np3=Conv2D(64,(3,3),activation='relu', padding='same')(p3)\np3=Conv2D(64,(3,3),activation='relu', padding='same')(p3)\n\n#mid\n\n#p2=Conv2DTranspose(32,(3,3),activation='relu',padding='same')(p3)\np2=UpSampling2D()(p3)\np2=concatenate([df2, p2], axis=3)\np2=Conv2D(32,(3,3),activation='relu', padding='same')(p2)\np2=Conv2D(32,(3,3),activation='relu', padding='same')(p2)\n\n#high\n\n#p1=Conv2DTranspose(32,(3,3),activation='relu',padding='same')(p2)\np1=UpSampling2D()(p2)\np1=concatenate([df1, p1], axis=3)\np1=Conv2D(32,(3,3),activation='relu', padding='same')(p1)\np1=Conv2D(32,(3,3),activation='relu', padding='same')(p1)\n\n\nclassify = Conv2D(1, (1, 1), activation='sigmoid')(p1)\nmodel = Model(inputs=inputs, outputs=classify)\noptimizer = optimizers.Adam(learning_rate=1e-3)\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-23T20:57:45.448093Z","iopub.execute_input":"2021-09-23T20:57:45.448553Z","iopub.status.idle":"2021-09-23T20:57:45.795416Z","shell.execute_reply.started":"2021-09-23T20:57:45.448516Z","shell.execute_reply":"2021-09-23T20:57:45.794681Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate(xdata['x'], ydata['x'])","metadata":{"execution":{"iopub.status.busy":"2021-09-23T20:57:46.217292Z","iopub.execute_input":"2021-09-23T20:57:46.217775Z","iopub.status.idle":"2021-09-23T20:58:10.709372Z","shell.execute_reply.started":"2021-09-23T20:57:46.217742Z","shell.execute_reply":"2021-09-23T20:58:10.708682Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2021-09-23T20:58:10.710929Z","iopub.execute_input":"2021-09-23T20:58:10.711263Z","iopub.status.idle":"2021-09-23T20:58:10.741002Z","shell.execute_reply.started":"2021-09-23T20:58:10.711229Z","shell.execute_reply":"2021-09-23T20:58:10.740380Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(xdata['x'], ydata['x'], epochs=25, batch_size=32)","metadata":{"execution":{"iopub.status.busy":"2021-09-23T20:58:10.741934Z","iopub.execute_input":"2021-09-23T20:58:10.742159Z"},"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-23T20:57:29.853339Z","iopub.status.idle":"2021-09-23T20:57:29.854132Z","shell.execute_reply.started":"2021-09-23T20:57:29.853885Z","shell.execute_reply":"2021-09-23T20:57:29.853908Z"},"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-23T20:57:28.177024Z","iopub.status.idle":"2021-09-23T20:57:28.178251Z","shell.execute_reply.started":"2021-09-23T20:57:28.177993Z","shell.execute_reply":"2021-09-23T20:57:28.178016Z"},"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-23T20:51:56.183995Z","iopub.status.idle":"2021-09-23T20:51:56.184483Z","shell.execute_reply.started":"2021-09-23T20:51:56.184253Z","shell.execute_reply":"2021-09-23T20:51:56.184280Z"},"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-23T20:51:56.185919Z","iopub.status.idle":"2021-09-23T20:51:56.186458Z","shell.execute_reply.started":"2021-09-23T20:51:56.186230Z","shell.execute_reply":"2021-09-23T20:51:56.186258Z"},"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-23T20:51:56.187526Z","iopub.status.idle":"2021-09-23T20:51:56.188328Z","shell.execute_reply.started":"2021-09-23T20:51:56.188079Z","shell.execute_reply":"2021-09-23T20:51:56.188102Z"},"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-23T20:51:56.189833Z","iopub.status.idle":"2021-09-23T20:51:56.190229Z","shell.execute_reply.started":"2021-09-23T20:51:56.190015Z","shell.execute_reply":"2021-09-23T20:51:56.190037Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.export('submission.csv')","metadata":{"execution":{"iopub.status.busy":"2021-09-23T20:23:22.028504Z","iopub.status.idle":"2021-09-23T20:23:22.028925Z","shell.execute_reply.started":"2021-09-23T20:23:22.028707Z","shell.execute_reply":"2021-09-23T20:23:22.028727Z"},"trusted":true},"execution_count":null,"outputs":[]}]}