├── requirements.txt ├── Image └── Detect_image.png ├── LICENSE ├── README.md ├── object_detection_using_vgg16_with_tensorflow.py └── Object_Detection_Using_VGG16_With_Tensorflow.ipynb /requirements.txt: -------------------------------------------------------------------------------- 1 | tensorflow 2 | numpy 3 | matplotlib 4 | scikit-learn -------------------------------------------------------------------------------- /Image/Detect_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zubairsamo/Object-Detection-With-Tensorflow-Using-VGG16/HEAD/Image/Detect_image.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 zubair samo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Object-Detection-With-Tensorflow-Using-VGG16

2 | 3 |

4 | 5 |

6 | 7 | 8 | [![Build Status](https://img.shields.io/badge/Build-Passing-brightgreen.svg?style=for-the-badge&logo=appveyor)](#) 9 | [![Open Source Love svg1](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)](#) 10 | [![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat&label=Contributions&colorA=red&colorB=black )](#) 11 | [![GitHub Forks](https://img.shields.io/github/forks/zubairsamo/Object-Detection-With-Tensorflow-Using-VGG16.svg?style=social&label=Fork&maxAge=2592000)](https://github.com/zubairsamo/Object-Detection-With-Tensorflow-Using-VGG16/fork) 12 | [![GitHub Issues](https://img.shields.io/github/issues/zubairsamo/Object-Detection-With-Tensorflow-Using-VGG16.svg?style=flat&label=Issues&maxAge=2592000)](https://github.com/zubairsamo/Object-Detection-With-Tensorflow-Using-VGG16/issues) 13 | # VGG16 Architecture 14 | The input to the Convolutional Network is a fixed-size 224 X 224 X 3 image. The preprocessing step subtracts the mean RGB value from each pixel. The image is passed 15 | through a stack of convolutional layers with 3 X 3 receptive fields (smallest size that 16 | accommodates a pixel shift). In one of the layers, a 1 X 1 convolutional filter linearly 17 | transforms the input channels. The stride is fixed to 1 pixel and padding is such that the 18 | spatial resolution is preserved after convolution. 5 max-pooling layers are performed over 19 | a 2 X 2 pixel window, with stride 2. I have used the pre-trained weights for VGG16 trained 20 | model on ImageNet dataset to extract features. The feature for each image is a tensor of 7 21 | X 7 X 512 dimension. Fig 1 represents the architecture of the convolutional layers in 22 | VGG16. 23 | # Description 24 | Object detection in one of the fundamental problems in the field of artificial intelligence 25 | with applications in robotics, automation, and human-computer interaction. The aim is to 26 | track an arbitrary object in consecutive frames of a video segment by localizing it inside 27 | bounding boxes. The most common representation of these bounding boxes is in terms of 28 | the top-left and bottom-right coordinates in the frame with respect to the origin of each 29 | imaginary image grid. 30 | The VGG16 model secured the first position in ILSRVC for object localization and its accuracy 31 | for predicting the location of these boxes is unquestionably high Nevertheless, tradeoffs between accuracy 32 | and computation-intensity is obvious and raises the need for faster 33 | approaches. In this project, the VGG16 model has been trained on pre-trained weights on 34 | ImageNet for feature extraction. This transfer learning model is advantageous as it escapes 35 | the necessity to train the model on a large-scale dataset like ImageNet 36 | # Run it now 37 | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/15tA57gXnWprZjc5J_V7591AUdSQWrTF6?usp=sharing) 38 | 39 | # Dataset 40 | https://drive.google.com/drive/folders/1NxnVWN-aJuHdTibSOPstzZcFiIHEgx6Y?usp=sharing 41 | 42 | # Requirements 43 | 44 | Type below command in cmd to get up and running with the dependencies of the file. 45 | ``` 46 | pip install -r requirement.txt 47 | ``` 48 | git clone https://github.com/zubairsamo/Object-Detection-With-Tensorflow-Using-VGG16 49 | .git 50 | 51 | # Usage 52 | Object-Detection-With-Tensorflow-Using-VGG16 53 | .ipynb 54 | 55 | ## Author 56 | You can get in touch with me on my LinkedIn Profile: 57 | 58 | #### Zubair Samo 59 | [![LinkedIn Link](https://img.shields.io/badge/Connect-ZubairSamo-blue.svg?logo=linkedin&longCache=true&style=social&label=Connect 60 | )](https://linkedin.com/in/zubair-samo-3a2764197) 61 | 62 | You can also follow my GitHub Profile to stay updated about my latest projects: [![GitHub Follow](https://img.shields.io/badge/Connect-zubairsamo-blue.svg?logo=Github&longCache=true&style=social&label=Follow)](https://github.com/zubairsamo) 63 | 64 | If you liked the repo then kindly support it by giving it a star ⭐! 65 | 66 | ## Contributions Welcome 67 | [![forthebadge](https://forthebadge.com/images/badges/built-with-love.svg)](#) 68 | 69 | If you find any bug in the code or have any improvements in mind then feel free to generate a pull request. 70 | 71 | ## License 72 | [![MIT](https://img.shields.io/cocoapods/l/AFNetworking.svg?style=style&label=License&maxAge=2592000)](../master/LICENSE) 73 | 74 | Copyright (c) 2020 Zubair Samo 75 | -------------------------------------------------------------------------------- /object_detection_using_vgg16_with_tensorflow.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """Object Detection Using VGG16 With Tensorflow.ipynb 3 | 4 | Automatically generated by Colaboratory. 5 | 6 | Original file is located at 7 | https://colab.research.google.com/drive/15tA57gXnWprZjc5J_V7591AUdSQWrTF6 8 | """ 9 | 10 | import os 11 | base_path="/content/drive/MyDrive/Applied_Ai_Course/Datasets" 12 | images=os.path.sep.join([base_path,'images']) 13 | annotations=os.path.sep.join([base_path,'airplanes.csv']) 14 | 15 | # Lets Load Dataset 16 | # airplanes annotation is a Csv file thats why we can see through with rows 17 | 18 | rows= open(annotations).read().strip().split("\n") 19 | 20 | # lets make three list where we save our exact bounding boxes 21 | data=[] 22 | targets=[] 23 | filenames=[] 24 | 25 | # After load we have to split dataset according to images 26 | # import some usefull libraries 27 | import cv2 28 | from tensorflow.keras.preprocessing.image import load_img 29 | # we also save images into array format so import img_array library too 30 | from tensorflow.keras.preprocessing.image import img_to_array 31 | for row in rows: 32 | row=row.split(",") 33 | # we always create rectangle with h+w so we have to know where exactly we should start from 34 | (filename,startX,startY,endX,endY)=row 35 | 36 | imagepaths=os.path.sep.join([images,filename]) 37 | image=cv2.imread(imagepaths) 38 | (h,w)=image.shape[:2] 39 | 40 | # initializing starting point 41 | # Why we take in float because when we convert into array so then will trouble happen 42 | startX = float(startX) / w 43 | startY = float(startY) / h 44 | # Also initialize ending point 45 | endX = float(endX) / w 46 | endY = float(endY) / h 47 | #load image and give them default size 48 | image=load_img(imagepaths,target_size=(224,224)) 49 | # see here if we cant take it into float then we face trouble 50 | image=img_to_array(image) 51 | 52 | # Lets append into data , targets ,filenames 53 | targets.append((startX,startY,endX,endY)) 54 | filenames.append(filename) 55 | data.append(image) 56 | 57 | # Normalizing Data here also we face would face issues if we take input as integer 58 | import numpy as np 59 | data=np.array(data,dtype='float32') / 255.0 60 | targets=np.array(targets,dtype='float32') 61 | 62 | # we should seperate data into train and split so import sklearn library 63 | from sklearn.model_selection import train_test_split 64 | 65 | # split into testing and training 66 | split=train_test_split(data,targets,filenames,test_size=0.10,random_state=42) 67 | 68 | # lets split into steps 69 | (train_images,test_images) = split[:2] 70 | (train_targets,test_targets) = split[2:4] 71 | (train_filenames,test_filenames) = split[4:] 72 | 73 | # lets import pre trained VGG16 Which is already Builtin for computer vision 74 | from tensorflow.keras.applications import VGG16 75 | from tensorflow.keras.layers import Input 76 | 77 | # Imagenet is a competition every year held and VGG16 is winner of between 2013-14 78 | # so here we just want limited layers so thats why we false included_top 79 | vgg=VGG16(weights='imagenet',include_top=False,input_tensor=Input(shape=(224,224,3))) 80 | 81 | vgg.summary() 82 | 83 | from tensorflow.keras.layers import Input,Flatten,Dense 84 | 85 | # we use VGG16 as per our requirement not use whole 86 | vgg.trainable = False 87 | 88 | flatten = vgg.output 89 | 90 | flatten = Flatten()(flatten) 91 | 92 | # Lets make bboxhead 93 | bboxhead = Dense(128,activation="relu")(flatten) 94 | bboxhead = Dense(64,activation="relu")(bboxhead) 95 | bboxhead = Dense(32,activation="relu")(bboxhead) 96 | bboxhead = Dense(4,activation="relu")(bboxhead) 97 | 98 | # lets import Model 99 | from tensorflow.keras.models import Model 100 | model = Model(inputs = vgg.input,outputs = bboxhead) 101 | 102 | model.summary() 103 | 104 | # Lets fit our model 105 | # Optimization 106 | from tensorflow.keras.optimizers import Adam 107 | 108 | opt = Adam(1e-4) 109 | 110 | model.compile(loss='mse',optimizer=opt) 111 | 112 | history = model.fit(train_images,train_targets,validation_data=(test_images,test_targets),batch_size=32,epochs=50,verbose=1) 113 | 114 | # lets save model 115 | model.save('detect_Planes.h5') 116 | 117 | from tensorflow.keras.models import load_model 118 | 119 | model=load_model('/content/detect_Planes.h5') 120 | 121 | imagepath='/content/drive/MyDrive/Applied_Ai_Course/Datasets/images/image_0111.jpg' 122 | 123 | image = load_img(imagepath, 124 | target_size=(224,224)) 125 | image = img_to_array(image) / 255.0 126 | image = np.expand_dims(image,axis=0) 127 | 128 | preds=model.predict(image)[0] 129 | (startX,startY,endX,endY)=preds 130 | 131 | import imutils 132 | 133 | image=cv2.imread(imagepaths) 134 | image=imutils.resize(image,width=600) 135 | 136 | (h,w)=image.shape[:2] 137 | 138 | startX=int(startX * w) 139 | startY=int(startY * h) 140 | 141 | endX=int(endX * w) 142 | endY=int(endY * h) 143 | 144 | cv2.rectangle(image,(startX,startY),(endX,endY),(0,255,0),3) 145 | 146 | from google.colab.patches import cv2_imshow 147 | 148 | import matplotlib.pyplot as plt 149 | plt.imshow(image) 150 | cv2.waitKey(0) 151 | 152 | -------------------------------------------------------------------------------- /Object_Detection_Using_VGG16_With_Tensorflow.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Object Detection Using VGG16 With Tensorflow.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [] 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "accelerator": "GPU" 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "markdown", 19 | "metadata": { 20 | "id": "iVKGF4unVslV" 21 | }, 22 | "source": [ 23 | "" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "metadata": { 29 | "id": "Vl_dLDnV_Lys" 30 | }, 31 | "source": [ 32 | "import os\n", 33 | "base_path=\"/content/drive/MyDrive/Applied_Ai_Course/Datasets\"\n", 34 | "images=os.path.sep.join([base_path,'images'])\n", 35 | "annotations=os.path.sep.join([base_path,'airplanes.csv'])" 36 | ], 37 | "execution_count": 175, 38 | "outputs": [] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "metadata": { 43 | "id": "ztWsfMIXFFlK" 44 | }, 45 | "source": [ 46 | "# Lets Load Dataset\n", 47 | "# airplanes annotation is a Csv file thats why we can see through with rows\n", 48 | "\n", 49 | "rows= open(annotations).read().strip().split(\"\\n\")\n", 50 | "\n", 51 | "# lets make three list where we save our exact bounding boxes\n", 52 | "data=[]\n", 53 | "targets=[]\n", 54 | "filenames=[]" 55 | ], 56 | "execution_count": 176, 57 | "outputs": [] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "metadata": { 62 | "id": "-C1Ynxw7FveF" 63 | }, 64 | "source": [ 65 | "# After load we have to split dataset according to images\n", 66 | "# import some usefull libraries\n", 67 | "import cv2\n", 68 | "from tensorflow.keras.preprocessing.image import load_img\n", 69 | "# we also save images into array format so import img_array library too\n", 70 | "from tensorflow.keras.preprocessing.image import img_to_array\n", 71 | "for row in rows:\n", 72 | " row=row.split(\",\")\n", 73 | " # we always create rectangle with h+w so we have to know where exactly we should start from\n", 74 | " (filename,startX,startY,endX,endY)=row\n", 75 | "\n", 76 | " imagepaths=os.path.sep.join([images,filename])\n", 77 | " image=cv2.imread(imagepaths)\n", 78 | " (h,w)=image.shape[:2]\n", 79 | "\n", 80 | " # initializing starting point\n", 81 | " # Why we take in float because when we convert into array so then will trouble happen\n", 82 | " startX = float(startX) / w\n", 83 | " startY = float(startY) / h\n", 84 | " # Also initialize ending point \n", 85 | " endX = float(endX) / w\n", 86 | " endY = float(endY) / h\n", 87 | " #load image and give them default size\n", 88 | " image=load_img(imagepaths,target_size=(224,224))\n", 89 | " # see here if we cant take it into float then we face trouble \n", 90 | " image=img_to_array(image)\n", 91 | "\n", 92 | " # Lets append into data , targets ,filenames\n", 93 | " targets.append((startX,startY,endX,endY))\n", 94 | " filenames.append(filename)\n", 95 | " data.append(image)\n" 96 | ], 97 | "execution_count": 177, 98 | "outputs": [] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "metadata": { 103 | "id": "0J6zfNkZJKi_" 104 | }, 105 | "source": [ 106 | "# Normalizing Data here also we face would face issues if we take input as integer\n", 107 | "import numpy as np\n", 108 | "data=np.array(data,dtype='float32') / 255.0\n", 109 | "targets=np.array(targets,dtype='float32')" 110 | ], 111 | "execution_count": 178, 112 | "outputs": [] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "metadata": { 117 | "id": "cI3z3eOUJdCI" 118 | }, 119 | "source": [ 120 | "# we should seperate data into train and split so import sklearn library \n", 121 | "from sklearn.model_selection import train_test_split" 122 | ], 123 | "execution_count": 179, 124 | "outputs": [] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "metadata": { 129 | "id": "2WwSEjEJK1MI" 130 | }, 131 | "source": [ 132 | "# split into testing and training\n", 133 | "split=train_test_split(data,targets,filenames,test_size=0.10,random_state=42)" 134 | ], 135 | "execution_count": 180, 136 | "outputs": [] 137 | }, 138 | { 139 | "cell_type": "code", 140 | "metadata": { 141 | "id": "sxxnaBHhLIyR" 142 | }, 143 | "source": [ 144 | "# lets split into steps\n", 145 | "(train_images,test_images) = split[:2]\n", 146 | "(train_targets,test_targets) = split[2:4]\n", 147 | "(train_filenames,test_filenames) = split[4:]\n" 148 | ], 149 | "execution_count": 181, 150 | "outputs": [] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "metadata": { 155 | "id": "MZBKv2k_L62z" 156 | }, 157 | "source": [ 158 | "# lets import pre trained VGG16 Which is already Builtin for computer vision\n", 159 | "from tensorflow.keras.applications import VGG16\n", 160 | "from tensorflow.keras.layers import Input" 161 | ], 162 | "execution_count": 182, 163 | "outputs": [] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "metadata": { 168 | "id": "YpIvvM48MUOs" 169 | }, 170 | "source": [ 171 | "# Imagenet is a competition every year held and VGG16 is winner of between 2013-14\n", 172 | "# so here we just want limited layers so thats why we false included_top \n", 173 | "vgg=VGG16(weights='imagenet',include_top=False,input_tensor=Input(shape=(224,224,3)))" 174 | ], 175 | "execution_count": 183, 176 | "outputs": [] 177 | }, 178 | { 179 | "cell_type": "code", 180 | "metadata": { 181 | "colab": { 182 | "base_uri": "https://localhost:8080/" 183 | }, 184 | "id": "gPaFO3AZNZOE", 185 | "outputId": "98af118e-9bc5-4ad4-aac0-6c1c965740a9" 186 | }, 187 | "source": [ 188 | "vgg.summary()" 189 | ], 190 | "execution_count": 184, 191 | "outputs": [ 192 | { 193 | "output_type": "stream", 194 | "text": [ 195 | "Model: \"vgg16\"\n", 196 | "_________________________________________________________________\n", 197 | "Layer (type) Output Shape Param # \n", 198 | "=================================================================\n", 199 | "input_4 (InputLayer) [(None, 224, 224, 3)] 0 \n", 200 | "_________________________________________________________________\n", 201 | "block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", 202 | "_________________________________________________________________\n", 203 | "block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", 204 | "_________________________________________________________________\n", 205 | "block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", 206 | "_________________________________________________________________\n", 207 | "block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", 208 | "_________________________________________________________________\n", 209 | "block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", 210 | "_________________________________________________________________\n", 211 | "block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", 212 | "_________________________________________________________________\n", 213 | "block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", 214 | "_________________________________________________________________\n", 215 | "block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", 216 | "_________________________________________________________________\n", 217 | "block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", 218 | "_________________________________________________________________\n", 219 | "block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", 220 | "_________________________________________________________________\n", 221 | "block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", 222 | "_________________________________________________________________\n", 223 | "block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", 224 | "_________________________________________________________________\n", 225 | "block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", 226 | "_________________________________________________________________\n", 227 | "block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", 228 | "_________________________________________________________________\n", 229 | "block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", 230 | "_________________________________________________________________\n", 231 | "block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", 232 | "_________________________________________________________________\n", 233 | "block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", 234 | "_________________________________________________________________\n", 235 | "block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", 236 | "=================================================================\n", 237 | "Total params: 14,714,688\n", 238 | "Trainable params: 14,714,688\n", 239 | "Non-trainable params: 0\n", 240 | "_________________________________________________________________\n" 241 | ], 242 | "name": "stdout" 243 | } 244 | ] 245 | }, 246 | { 247 | "cell_type": "code", 248 | "metadata": { 249 | "id": "0YPGZE1oNdvP" 250 | }, 251 | "source": [ 252 | "from tensorflow.keras.layers import Input,Flatten,Dense" 253 | ], 254 | "execution_count": 185, 255 | "outputs": [] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "metadata": { 260 | "id": "Qg2i026tNnOM" 261 | }, 262 | "source": [ 263 | "# we use VGG16 as per our requirement not use whole \n", 264 | "vgg.trainable = False\n", 265 | "\n", 266 | "flatten = vgg.output\n", 267 | "\n", 268 | "flatten = Flatten()(flatten)" 269 | ], 270 | "execution_count": 186, 271 | "outputs": [] 272 | }, 273 | { 274 | "cell_type": "code", 275 | "metadata": { 276 | "id": "zBCbiwSMODz-" 277 | }, 278 | "source": [ 279 | "# Lets make bboxhead\n", 280 | "bboxhead = Dense(128,activation=\"relu\")(flatten)\n", 281 | "bboxhead = Dense(64,activation=\"relu\")(bboxhead)\n", 282 | "bboxhead = Dense(32,activation=\"relu\")(bboxhead)\n", 283 | "bboxhead = Dense(4,activation=\"relu\")(bboxhead)" 284 | ], 285 | "execution_count": 187, 286 | "outputs": [] 287 | }, 288 | { 289 | "cell_type": "code", 290 | "metadata": { 291 | "id": "6whx45l1OdFW" 292 | }, 293 | "source": [ 294 | "# lets import Model\n", 295 | "from tensorflow.keras.models import Model\n", 296 | "model = Model(inputs = vgg.input,outputs = bboxhead)" 297 | ], 298 | "execution_count": 188, 299 | "outputs": [] 300 | }, 301 | { 302 | "cell_type": "code", 303 | "metadata": { 304 | "colab": { 305 | "base_uri": "https://localhost:8080/" 306 | }, 307 | "id": "nhp9ptwpO7_7", 308 | "outputId": "95426c6f-3ea8-49df-c5b5-fcf5b098b9ff" 309 | }, 310 | "source": [ 311 | "model.summary()" 312 | ], 313 | "execution_count": 189, 314 | "outputs": [ 315 | { 316 | "output_type": "stream", 317 | "text": [ 318 | "Model: \"functional_7\"\n", 319 | "_________________________________________________________________\n", 320 | "Layer (type) Output Shape Param # \n", 321 | "=================================================================\n", 322 | "input_4 (InputLayer) [(None, 224, 224, 3)] 0 \n", 323 | "_________________________________________________________________\n", 324 | "block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", 325 | "_________________________________________________________________\n", 326 | "block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", 327 | "_________________________________________________________________\n", 328 | "block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", 329 | "_________________________________________________________________\n", 330 | "block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", 331 | "_________________________________________________________________\n", 332 | "block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", 333 | "_________________________________________________________________\n", 334 | "block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", 335 | "_________________________________________________________________\n", 336 | "block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", 337 | "_________________________________________________________________\n", 338 | "block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", 339 | "_________________________________________________________________\n", 340 | "block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", 341 | "_________________________________________________________________\n", 342 | "block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", 343 | "_________________________________________________________________\n", 344 | "block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", 345 | "_________________________________________________________________\n", 346 | "block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", 347 | "_________________________________________________________________\n", 348 | "block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", 349 | "_________________________________________________________________\n", 350 | "block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", 351 | "_________________________________________________________________\n", 352 | "block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", 353 | "_________________________________________________________________\n", 354 | "block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", 355 | "_________________________________________________________________\n", 356 | "block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", 357 | "_________________________________________________________________\n", 358 | "block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", 359 | "_________________________________________________________________\n", 360 | "flatten_3 (Flatten) (None, 25088) 0 \n", 361 | "_________________________________________________________________\n", 362 | "dense_12 (Dense) (None, 128) 3211392 \n", 363 | "_________________________________________________________________\n", 364 | "dense_13 (Dense) (None, 64) 8256 \n", 365 | "_________________________________________________________________\n", 366 | "dense_14 (Dense) (None, 32) 2080 \n", 367 | "_________________________________________________________________\n", 368 | "dense_15 (Dense) (None, 4) 132 \n", 369 | "=================================================================\n", 370 | "Total params: 17,936,548\n", 371 | "Trainable params: 3,221,860\n", 372 | "Non-trainable params: 14,714,688\n", 373 | "_________________________________________________________________\n" 374 | ], 375 | "name": "stdout" 376 | } 377 | ] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "metadata": { 382 | "id": "Fye3qz96O9y2" 383 | }, 384 | "source": [ 385 | "# Lets fit our model \n", 386 | "# Optimization \n", 387 | "from tensorflow.keras.optimizers import Adam\n", 388 | "\n", 389 | "opt = Adam(1e-4)" 390 | ], 391 | "execution_count": 190, 392 | "outputs": [] 393 | }, 394 | { 395 | "cell_type": "code", 396 | "metadata": { 397 | "id": "o1G-qSwgPX6u" 398 | }, 399 | "source": [ 400 | "model.compile(loss='mse',optimizer=opt)" 401 | ], 402 | "execution_count": 191, 403 | "outputs": [] 404 | }, 405 | { 406 | "cell_type": "code", 407 | "metadata": { 408 | "colab": { 409 | "base_uri": "https://localhost:8080/" 410 | }, 411 | "id": "rOfPJd6RPek5", 412 | "outputId": "fade4076-7c0d-44e4-abb0-c0e9deb9edc6" 413 | }, 414 | "source": [ 415 | "history = model.fit(train_images,train_targets,validation_data=(test_images,test_targets),batch_size=32,epochs=50,verbose=1)" 416 | ], 417 | "execution_count": 192, 418 | "outputs": [ 419 | { 420 | "output_type": "stream", 421 | "text": [ 422 | "Epoch 1/50\n", 423 | "23/23 [==============================] - 4s 155ms/step - loss: 0.0342 - val_loss: 0.0186\n", 424 | "Epoch 2/50\n", 425 | "23/23 [==============================] - 3s 152ms/step - loss: 0.0124 - val_loss: 0.0080\n", 426 | "Epoch 3/50\n", 427 | "23/23 [==============================] - 4s 153ms/step - loss: 0.0072 - val_loss: 0.0069\n", 428 | "Epoch 4/50\n", 429 | "23/23 [==============================] - 4s 155ms/step - loss: 0.0061 - val_loss: 0.0066\n", 430 | "Epoch 5/50\n", 431 | "23/23 [==============================] - 4s 155ms/step - loss: 0.0057 - val_loss: 0.0064\n", 432 | "Epoch 6/50\n", 433 | "23/23 [==============================] - 3s 151ms/step - loss: 0.0042 - val_loss: 0.0026\n", 434 | "Epoch 7/50\n", 435 | "23/23 [==============================] - 3s 148ms/step - loss: 0.0017 - val_loss: 0.0022\n", 436 | "Epoch 8/50\n", 437 | "23/23 [==============================] - 3s 147ms/step - loss: 0.0011 - val_loss: 0.0019\n", 438 | "Epoch 9/50\n", 439 | "23/23 [==============================] - 3s 146ms/step - loss: 7.5519e-04 - val_loss: 0.0020\n", 440 | "Epoch 10/50\n", 441 | "23/23 [==============================] - 3s 142ms/step - loss: 6.2409e-04 - val_loss: 0.0018\n", 442 | "Epoch 11/50\n", 443 | "23/23 [==============================] - 3s 141ms/step - loss: 5.1805e-04 - val_loss: 0.0017\n", 444 | "Epoch 12/50\n", 445 | "23/23 [==============================] - 3s 140ms/step - loss: 4.3773e-04 - val_loss: 0.0018\n", 446 | "Epoch 13/50\n", 447 | "23/23 [==============================] - 3s 139ms/step - loss: 3.7624e-04 - val_loss: 0.0017\n", 448 | "Epoch 14/50\n", 449 | "23/23 [==============================] - 3s 138ms/step - loss: 3.0916e-04 - val_loss: 0.0016\n", 450 | "Epoch 15/50\n", 451 | "23/23 [==============================] - 3s 138ms/step - loss: 2.7746e-04 - val_loss: 0.0017\n", 452 | "Epoch 16/50\n", 453 | "23/23 [==============================] - 3s 139ms/step - loss: 2.4081e-04 - val_loss: 0.0017\n", 454 | "Epoch 17/50\n", 455 | "23/23 [==============================] - 3s 139ms/step - loss: 2.0326e-04 - val_loss: 0.0016\n", 456 | "Epoch 18/50\n", 457 | "23/23 [==============================] - 3s 139ms/step - loss: 1.8227e-04 - val_loss: 0.0017\n", 458 | "Epoch 19/50\n", 459 | "23/23 [==============================] - 3s 139ms/step - loss: 1.6671e-04 - val_loss: 0.0016\n", 460 | "Epoch 20/50\n", 461 | "23/23 [==============================] - 3s 139ms/step - loss: 1.4739e-04 - val_loss: 0.0016\n", 462 | "Epoch 21/50\n", 463 | "23/23 [==============================] - 3s 140ms/step - loss: 1.2999e-04 - val_loss: 0.0016\n", 464 | "Epoch 22/50\n", 465 | "23/23 [==============================] - 3s 142ms/step - loss: 1.1637e-04 - val_loss: 0.0016\n", 466 | "Epoch 23/50\n", 467 | "23/23 [==============================] - 3s 144ms/step - loss: 1.0369e-04 - val_loss: 0.0016\n", 468 | "Epoch 24/50\n", 469 | "23/23 [==============================] - 3s 145ms/step - loss: 9.5637e-05 - val_loss: 0.0016\n", 470 | "Epoch 25/50\n", 471 | "23/23 [==============================] - 3s 148ms/step - loss: 8.6480e-05 - val_loss: 0.0016\n", 472 | "Epoch 26/50\n", 473 | "23/23 [==============================] - 3s 148ms/step - loss: 8.1371e-05 - val_loss: 0.0016\n", 474 | "Epoch 27/50\n", 475 | "23/23 [==============================] - 3s 148ms/step - loss: 7.6879e-05 - val_loss: 0.0016\n", 476 | "Epoch 28/50\n", 477 | "23/23 [==============================] - 3s 147ms/step - loss: 7.5892e-05 - val_loss: 0.0016\n", 478 | "Epoch 29/50\n", 479 | "23/23 [==============================] - 3s 147ms/step - loss: 6.9565e-05 - val_loss: 0.0016\n", 480 | "Epoch 30/50\n", 481 | "23/23 [==============================] - 3s 145ms/step - loss: 6.9834e-05 - val_loss: 0.0016\n", 482 | "Epoch 31/50\n", 483 | "23/23 [==============================] - 3s 145ms/step - loss: 7.2559e-05 - val_loss: 0.0016\n", 484 | "Epoch 32/50\n", 485 | "23/23 [==============================] - 3s 145ms/step - loss: 7.9856e-05 - val_loss: 0.0016\n", 486 | "Epoch 33/50\n", 487 | "23/23 [==============================] - 3s 143ms/step - loss: 8.3668e-05 - val_loss: 0.0016\n", 488 | "Epoch 34/50\n", 489 | "23/23 [==============================] - 3s 143ms/step - loss: 9.3816e-05 - val_loss: 0.0016\n", 490 | "Epoch 35/50\n", 491 | "23/23 [==============================] - 3s 142ms/step - loss: 9.1081e-05 - val_loss: 0.0017\n", 492 | "Epoch 36/50\n", 493 | "23/23 [==============================] - 3s 142ms/step - loss: 7.7571e-05 - val_loss: 0.0015\n", 494 | "Epoch 37/50\n", 495 | "23/23 [==============================] - 3s 142ms/step - loss: 6.3817e-05 - val_loss: 0.0016\n", 496 | "Epoch 38/50\n", 497 | "23/23 [==============================] - 3s 142ms/step - loss: 5.2386e-05 - val_loss: 0.0017\n", 498 | "Epoch 39/50\n", 499 | "23/23 [==============================] - 3s 142ms/step - loss: 5.4663e-05 - val_loss: 0.0015\n", 500 | "Epoch 40/50\n", 501 | "23/23 [==============================] - 3s 142ms/step - loss: 5.1314e-05 - val_loss: 0.0016\n", 502 | "Epoch 41/50\n", 503 | "23/23 [==============================] - 3s 142ms/step - loss: 5.9441e-05 - val_loss: 0.0015\n", 504 | "Epoch 42/50\n", 505 | "23/23 [==============================] - 3s 142ms/step - loss: 5.2642e-05 - val_loss: 0.0016\n", 506 | "Epoch 43/50\n", 507 | "23/23 [==============================] - 3s 143ms/step - loss: 5.3741e-05 - val_loss: 0.0015\n", 508 | "Epoch 44/50\n", 509 | "23/23 [==============================] - 3s 143ms/step - loss: 4.8830e-05 - val_loss: 0.0016\n", 510 | "Epoch 45/50\n", 511 | "23/23 [==============================] - 3s 143ms/step - loss: 5.1866e-05 - val_loss: 0.0015\n", 512 | "Epoch 46/50\n", 513 | "23/23 [==============================] - 3s 144ms/step - loss: 4.8851e-05 - val_loss: 0.0016\n", 514 | "Epoch 47/50\n", 515 | "23/23 [==============================] - 3s 144ms/step - loss: 5.3998e-05 - val_loss: 0.0016\n", 516 | "Epoch 48/50\n", 517 | "23/23 [==============================] - 3s 145ms/step - loss: 7.1642e-05 - val_loss: 0.0015\n", 518 | "Epoch 49/50\n", 519 | "23/23 [==============================] - 3s 144ms/step - loss: 7.0317e-05 - val_loss: 0.0016\n", 520 | "Epoch 50/50\n", 521 | "23/23 [==============================] - 3s 145ms/step - loss: 7.0439e-05 - val_loss: 0.0017\n" 522 | ], 523 | "name": "stdout" 524 | } 525 | ] 526 | }, 527 | { 528 | "cell_type": "code", 529 | "metadata": { 530 | "id": "lxlowj7qPyyv" 531 | }, 532 | "source": [ 533 | "# lets save model \n", 534 | "model.save('detect_Planes.h5')" 535 | ], 536 | "execution_count": 228, 537 | "outputs": [] 538 | }, 539 | { 540 | "cell_type": "code", 541 | "metadata": { 542 | "id": "42ly_eqHQh6v" 543 | }, 544 | "source": [ 545 | "from tensorflow.keras.models import load_model" 546 | ], 547 | "execution_count": 229, 548 | "outputs": [] 549 | }, 550 | { 551 | "cell_type": "code", 552 | "metadata": { 553 | "id": "THgB3xU0QqGI" 554 | }, 555 | "source": [ 556 | "model=load_model('/content/detect_Planes.h5')" 557 | ], 558 | "execution_count": 230, 559 | "outputs": [] 560 | }, 561 | { 562 | "cell_type": "code", 563 | "metadata": { 564 | "id": "w-tWP_UtQuwk" 565 | }, 566 | "source": [ 567 | "imagepath='/content/drive/MyDrive/Applied_Ai_Course/Datasets/images/image_0111.jpg'" 568 | ], 569 | "execution_count": 231, 570 | "outputs": [] 571 | }, 572 | { 573 | "cell_type": "code", 574 | "metadata": { 575 | "id": "IV_2eMaxQ6pa" 576 | }, 577 | "source": [ 578 | "image = load_img(imagepath,\n", 579 | " target_size=(224,224))\n", 580 | "image = img_to_array(image) / 255.0\n", 581 | "image = np.expand_dims(image,axis=0)" 582 | ], 583 | "execution_count": 232, 584 | "outputs": [] 585 | }, 586 | { 587 | "cell_type": "code", 588 | "metadata": { 589 | "id": "XVLc6q9_RO8m", 590 | "colab": { 591 | "base_uri": "https://localhost:8080/" 592 | }, 593 | "outputId": "101aa2c3-0af5-4be8-ef7e-13a7c8680530" 594 | }, 595 | "source": [ 596 | "preds=model.predict(image)[0]\n", 597 | "(startX,startY,endX,endY)=preds" 598 | ], 599 | "execution_count": 233, 600 | "outputs": [ 601 | { 602 | "output_type": "stream", 603 | "text": [ 604 | "WARNING:tensorflow:5 out of the last 11 calls to .predict_function at 0x7fb51c1a81e0> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n" 605 | ], 606 | "name": "stdout" 607 | } 608 | ] 609 | }, 610 | { 611 | "cell_type": "code", 612 | "metadata": { 613 | "id": "B0tlESgNRkcW" 614 | }, 615 | "source": [ 616 | "import imutils" 617 | ], 618 | "execution_count": 234, 619 | "outputs": [] 620 | }, 621 | { 622 | "cell_type": "code", 623 | "metadata": { 624 | "id": "UjPHbP2sRnUH" 625 | }, 626 | "source": [ 627 | "image=cv2.imread(imagepaths)\n", 628 | "image=imutils.resize(image,width=600)" 629 | ], 630 | "execution_count": 235, 631 | "outputs": [] 632 | }, 633 | { 634 | "cell_type": "code", 635 | "metadata": { 636 | "id": "mMj9dh6IRuAm" 637 | }, 638 | "source": [ 639 | "(h,w)=image.shape[:2]" 640 | ], 641 | "execution_count": 236, 642 | "outputs": [] 643 | }, 644 | { 645 | "cell_type": "code", 646 | "metadata": { 647 | "id": "oHiDSiASSKXE" 648 | }, 649 | "source": [ 650 | "startX=int(startX * w)\n", 651 | "startY=int(startY * h)\n", 652 | "\n", 653 | "endX=int(endX * w)\n", 654 | "endY=int(endY * h)" 655 | ], 656 | "execution_count": 237, 657 | "outputs": [] 658 | }, 659 | { 660 | "cell_type": "code", 661 | "metadata": { 662 | "colab": { 663 | "base_uri": "https://localhost:8080/" 664 | }, 665 | "id": "Wo2Ps1aEScXZ", 666 | "outputId": "8266c719-e5a5-49fe-be0d-ba5098824f32" 667 | }, 668 | "source": [ 669 | "cv2.rectangle(image,(startX,startY),(endX,endY),(0,255,0),3)" 670 | ], 671 | "execution_count": 238, 672 | "outputs": [ 673 | { 674 | "output_type": "execute_result", 675 | "data": { 676 | "text/plain": [ 677 | "array([[[255, 255, 255],\n", 678 | " [255, 255, 255],\n", 679 | " [255, 255, 255],\n", 680 | " ...,\n", 681 | " [255, 255, 255],\n", 682 | " [255, 255, 255],\n", 683 | " [255, 255, 255]],\n", 684 | "\n", 685 | " [[255, 255, 255],\n", 686 | " [255, 255, 255],\n", 687 | " [255, 255, 255],\n", 688 | " ...,\n", 689 | " [255, 255, 255],\n", 690 | " [255, 255, 255],\n", 691 | " [255, 255, 255]],\n", 692 | "\n", 693 | " [[255, 255, 255],\n", 694 | " [255, 255, 255],\n", 695 | " [255, 255, 255],\n", 696 | " ...,\n", 697 | " [255, 255, 255],\n", 698 | " [255, 255, 255],\n", 699 | " [255, 255, 255]],\n", 700 | "\n", 701 | " ...,\n", 702 | "\n", 703 | " [[255, 255, 255],\n", 704 | " [255, 255, 255],\n", 705 | " [255, 255, 255],\n", 706 | " ...,\n", 707 | " [255, 255, 255],\n", 708 | " [255, 255, 255],\n", 709 | " [255, 255, 255]],\n", 710 | "\n", 711 | " [[255, 255, 255],\n", 712 | " [255, 255, 255],\n", 713 | " [255, 255, 255],\n", 714 | " ...,\n", 715 | " [255, 255, 255],\n", 716 | " [255, 255, 255],\n", 717 | " [255, 255, 255]],\n", 718 | "\n", 719 | " [[255, 255, 255],\n", 720 | " [255, 255, 255],\n", 721 | " [255, 255, 255],\n", 722 | " ...,\n", 723 | " [255, 255, 255],\n", 724 | " [255, 255, 255],\n", 725 | " [255, 255, 255]]], dtype=uint8)" 726 | ] 727 | }, 728 | "metadata": { 729 | "tags": [] 730 | }, 731 | "execution_count": 238 732 | } 733 | ] 734 | }, 735 | { 736 | "cell_type": "code", 737 | "metadata": { 738 | "id": "uklFcl2AStTe" 739 | }, 740 | "source": [ 741 | "\n", 742 | "from google.colab.patches import cv2_imshow\n" 743 | ], 744 | "execution_count": 239, 745 | "outputs": [] 746 | }, 747 | { 748 | "cell_type": "code", 749 | "metadata": { 750 | "colab": { 751 | "base_uri": "https://localhost:8080/", 752 | "height": 181 753 | }, 754 | "id": "jUNMby9FS3OJ", 755 | "outputId": "7a89dff4-d565-4be3-cae3-5cc030a95719" 756 | }, 757 | "source": [ 758 | "import matplotlib.pyplot as plt\n", 759 | "plt.imshow(image)\n", 760 | "cv2.waitKey(0)" 761 | ], 762 | "execution_count": 240, 763 | "outputs": [ 764 | { 765 | "output_type": "execute_result", 766 | "data": { 767 | "text/plain": [ 768 | "-1" 769 | ] 770 | }, 771 | "metadata": { 772 | "tags": [] 773 | }, 774 | "execution_count": 240 775 | }, 776 | { 777 | "output_type": "display_data", 778 | "data": { 779 | "image/png": "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\n", 780 | "text/plain": [ 781 | "
" 782 | ] 783 | }, 784 | "metadata": { 785 | "tags": [], 786 | "needs_background": "light" 787 | } 788 | } 789 | ] 790 | }, 791 | { 792 | "cell_type": "code", 793 | "metadata": { 794 | "id": "sknQm7nFTmVZ" 795 | }, 796 | "source": [ 797 | "" 798 | ], 799 | "execution_count": 240, 800 | "outputs": [] 801 | } 802 | ] 803 | } --------------------------------------------------------------------------------