From f5da173dc9ec3799ddcd937b624615678d119ccb Mon Sep 17 00:00:00 2001 From: Maciej Sobkowiak Date: Thu, 17 Feb 2022 01:19:25 +0100 Subject: [PATCH] main --- main.ipynb | 230 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) diff --git a/main.ipynb b/main.ipynb index e69de29..babec2f 100644 --- a/main.ipynb +++ b/main.ipynb @@ -0,0 +1,230 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "from src.Unet import Unet\n", + "from src.loss import jaccard_loss\n", + "from src.metrics import IOU\n", + "from src.consts import EPOCHS, STEPS, SEED, RGB_DIR, JPG_IMAGES, MASK_DIR\n", + "from src.helpers import create_folder\n", + "from tensorflow.keras.callbacks import ModelCheckpoint\n", + "import tensorflow as tf " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "model = Unet(num_classes=1).build_model()\n", + "\n", + "compile_params ={\n", + " 'loss':jaccard_loss(smooth=90), \n", + " 'optimizer':'rmsprop',\n", + " 'metrics':[IOU]\n", + " }\n", + " \n", + "model.compile(**compile_params)\n", + "\n", + "model_name = \"models/unet.h5\"\n", + "modelcheckpoint = ModelCheckpoint(model_name,\n", + " monitor='val_loss',\n", + " mode='auto',\n", + " verbose=1,\n", + " save_best_only=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 9399 images belonging to 1 classes.\n", + "Found 9399 images belonging to 1 classes.\n", + "Found 2349 images belonging to 1 classes.\n", + "Found 2349 images belonging to 1 classes.\n" + ] + } + ], + "source": [ + "train_gen = create_generators('training', SEED)\n", + "val_gen = create_generators('validation', SEED)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\masob\\AppData\\Local\\Temp\\ipykernel_15244\\933514074.py:1: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.\n", + " history = model.fit_generator(train_gen,\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/5\n", + "10/10 [==============================] - 1080s 109s/step - loss: 1.0869 - IOU: 0.6101 - val_loss: 1.1605 - val_IOU: 0.6003\n", + "Epoch 2/5\n", + "10/10 [==============================] - 1066s 109s/step - loss: 1.1465 - IOU: 0.6051 - val_loss: 1.1744 - val_IOU: 0.5955\n", + "Epoch 3/5\n", + "10/10 [==============================] - 1082s 109s/step - loss: 1.1440 - IOU: 0.6060 - val_loss: 1.0622 - val_IOU: 0.6341\n", + "Epoch 4/5\n", + "10/10 [==============================] - 1060s 108s/step - loss: 1.1511 - IOU: 0.6035 - val_loss: 1.3288 - val_IOU: 0.5423\n", + "Epoch 5/5\n", + "10/10 [==============================] - 1062s 108s/step - loss: 1.1654 - IOU: 0.5986 - val_loss: 1.1816 - val_IOU: 0.5930\n" + ] + } + ], + "source": [ + "history = model.fit_generator(train_gen,\n", + " validation_data=val_gen,\n", + " epochs=EPOCHS,\n", + " steps_per_epoch=STEPS,\n", + " validation_steps = STEPS,\n", + " shuffle=True,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "create_folder('models', '.')\n", + "model.save(filepath=model_name)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dict_keys(['loss', 'IOU', 'val_loss', 'val_IOU'])\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# summarize history for accuracy\n", + "import matplotlib.pyplot as plt\n", + "print(history.history.keys())\n", + "plt.plot(history.history['IOU'])\n", + "plt.plot(history.history['val_IOU'])\n", + "plt.title('model IOU')\n", + "plt.ylabel('IOU')\n", + "plt.xlabel('epoch')\n", + "plt.legend(['train', 'test'], loc='upper left')\n", + "plt.show()\n", + "# summarize history for loss\n", + "plt.plot(history.history['loss'])\n", + "plt.plot(history.history['val_loss'])\n", + "plt.title('model loss')\n", + "plt.ylabel('loss')\n", + "plt.xlabel('epoch')\n", + "plt.legend(['train', 'test'], loc='upper left')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random, os\n", + "import cv2\n", + "dp = create_folder(RGB_DIR, JPG_IMAGES)\n", + "img_names = [random.choice(os.listdir(dp)) for _ in range(3)]\n", + "\n", + "r_img = cv2.imread(os.path.join(JPG_IMAGES, RGB_DIR, img_names[0]))\n", + "m_img = cv2.imread(os.path.join(JPG_IMAGES, MASK_DIR, img))\n", + "pred = model.predict(r_img)\n", + "\n", + "fig,ax=plt.subplots(1,3,figsize=(16,8))\n", + "\n", + "ax[0].set_title('RGB Image')\n", + "ax[0].imshow(img[0][0,:,:,::-1])\n", + "ax[0].axis('off')\n", + "\n", + "ax[1].set_title('Original Mask')\n", + "ax[1].imshow(msk)\n", + "ax[1].axis('off')\n", + "\n", + "ax[2].set_title('Predicted Mask')\n", + "ax[2].axis('off')\n", + "ax[2].imshow(tf.keras.preprocessing.image.array_to_img(pred[0]>0.5),cmap='gray')\n", + "\n", + "plt.show()\n" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "a0ec3e03c477d553d7e02db72be164410aea09f54984d03651765aaff9c92bc7" + }, + "kernelspec": { + "display_name": "Python 3.9.0 ('venv': venv)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +}