├── 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 | [](#)
9 | [](#)
10 | [](#)
11 | [](https://github.com/zubairsamo/Object-Detection-With-Tensorflow-Using-VGG16/fork)
12 | [](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 | [](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 | [](https://linkedin.com/in/zubair-samo-3a2764197)
61 |
62 | You can also follow my GitHub Profile to stay updated about my latest projects: [](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 | [](#)
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 | [](../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 | }
--------------------------------------------------------------------------------