Skip to content

Commit c2e00eb

Browse files
authored
Add files via upload
1 parent 97e455f commit c2e00eb

File tree

5 files changed

+446
-0
lines changed

5 files changed

+446
-0
lines changed

cnn.ipynb

Lines changed: 303 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,303 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": null,
6+
"metadata": {},
7+
"outputs": [],
8+
"source": [
9+
"from keras import Sequential\n",
10+
"from keras.layers.convolutional import MaxPooling2D\n",
11+
"from keras.layers.convolutional import Conv2D\n",
12+
"from keras.layers import Dense, Dropout,Flatten,Activation\n",
13+
"from keras.losses import categorical_crossentropy ##as there is 10 catagories to choose from"
14+
]
15+
},
16+
{
17+
"cell_type": "code",
18+
"execution_count": null,
19+
"metadata": {},
20+
"outputs": [],
21+
"source": [
22+
"model = Sequential()\n",
23+
"\n",
24+
"model.add(Conv2D(16,input_shape=(55,45,1),kernel_size=(3,3))) ##standard input size h=55,w=45,channels=1\n",
25+
"\n",
26+
"model.add(MaxPooling2D(pool_size=(4,4), strides=(4,4), padding='valid'))\n",
27+
"\n",
28+
"model.add(Flatten())\n",
29+
"\n",
30+
"model.add(Dense(260))\n",
31+
"model.add(Activation('sigmoid')) ##sigmoid 'cuz it worked\n",
32+
"model.add(Dropout(rate=0.4)) ##standard\n",
33+
"\n",
34+
"model.add(Dense(10)) ##last layer i.e. output layer: 10 catagory (0,1,2,3,4,5,6,7,8,9)\n",
35+
"model.add(Activation('softmax'))\n",
36+
"\n",
37+
"model.compile(loss=categorical_crossentropy, optimizer='sgd', metrics=[\"accuracy\"])"
38+
]
39+
},
40+
{
41+
"cell_type": "code",
42+
"execution_count": null,
43+
"metadata": {},
44+
"outputs": [
45+
{
46+
"name": "stdout",
47+
"output_type": "stream",
48+
"text": [
49+
"_________________________________________________________________\n",
50+
"Layer (type) Output Shape Param # \n",
51+
"=================================================================\n",
52+
"conv2d_9 (Conv2D) (None, 53, 43, 16) 160 \n",
53+
"_________________________________________________________________\n",
54+
"max_pooling2d_9 (MaxPooling2 (None, 13, 10, 16) 0 \n",
55+
"_________________________________________________________________\n",
56+
"flatten_9 (Flatten) (None, 2080) 0 \n",
57+
"_________________________________________________________________\n",
58+
"dense_23 (Dense) (None, 260) 541060 \n",
59+
"_________________________________________________________________\n",
60+
"activation_19 (Activation) (None, 260) 0 \n",
61+
"_________________________________________________________________\n",
62+
"dropout_6 (Dropout) (None, 260) 0 \n",
63+
"_________________________________________________________________\n",
64+
"dense_24 (Dense) (None, 10) 2610 \n",
65+
"_________________________________________________________________\n",
66+
"activation_20 (Activation) (None, 10) 0 \n",
67+
"=================================================================\n",
68+
"Total params: 543,830\n",
69+
"Trainable params: 543,830\n",
70+
"Non-trainable params: 0\n",
71+
"_________________________________________________________________\n"
72+
]
73+
}
74+
],
75+
"source": [
76+
"model.summary()"
77+
]
78+
},
79+
{
80+
"cell_type": "code",
81+
"execution_count": null,
82+
"metadata": {},
83+
"outputs": [],
84+
"source": [
85+
"from keras.preprocessing.image import ImageDataGenerator"
86+
]
87+
},
88+
{
89+
"cell_type": "code",
90+
"execution_count": null,
91+
"metadata": {},
92+
"outputs": [],
93+
"source": [
94+
"train_datagen = ImageDataGenerator()"
95+
]
96+
},
97+
{
98+
"cell_type": "code",
99+
"execution_count": null,
100+
"metadata": {},
101+
"outputs": [
102+
{
103+
"name": "stdout",
104+
"output_type": "stream",
105+
"text": [
106+
"Found 6606 images belonging to 10 classes.\n"
107+
]
108+
}
109+
],
110+
"source": [
111+
"training_set = train_datagen.flow_from_directory('samples_no', ##input dir\n",
112+
" target_size = (55, 45), ##standard we selected\n",
113+
" batch_size = 32, ##trade off between batch_size and step_per_epoch (given below)\n",
114+
" class_mode = 'categorical', ##10 catagories duh!\n",
115+
" color_mode = 'grayscale') ##all images are grayscale"
116+
]
117+
},
118+
{
119+
"cell_type": "code",
120+
"execution_count": null,
121+
"metadata": {},
122+
"outputs": [
123+
{
124+
"name": "stdout",
125+
"output_type": "stream",
126+
"text": [
127+
"Epoch 1/64\n",
128+
"200/200 [==============================] - 4s 19ms/step - loss: 2.1620 - acc: 0.2361\n",
129+
"Epoch 2/64\n",
130+
"200/200 [==============================] - 3s 17ms/step - loss: 1.7117 - acc: 0.4019\n",
131+
"Epoch 3/64\n",
132+
"200/200 [==============================] - 3s 17ms/step - loss: 1.3640 - acc: 0.5656\n",
133+
"Epoch 4/64\n",
134+
"200/200 [==============================] - 3s 17ms/step - loss: 0.9595 - acc: 0.7357\n",
135+
"Epoch 5/64\n",
136+
"200/200 [==============================] - 3s 17ms/step - loss: 0.6687 - acc: 0.8279\n",
137+
"Epoch 6/64\n",
138+
"200/200 [==============================] - 4s 18ms/step - loss: 0.5055 - acc: 0.8726: 1s -\n",
139+
"Epoch 7/64\n",
140+
"200/200 [==============================] - 4s 21ms/step - loss: 0.4238 - acc: 0.8917\n",
141+
"Epoch 8/64\n",
142+
"200/200 [==============================] - 4s 21ms/step - loss: 0.3426 - acc: 0.9131\n",
143+
"Epoch 9/64\n",
144+
"200/200 [==============================] - 5s 23ms/step - loss: 0.3304 - acc: 0.9150\n",
145+
"Epoch 10/64\n",
146+
"200/200 [==============================] - 4s 22ms/step - loss: 0.2917 - acc: 0.9267\n",
147+
"Epoch 11/64\n",
148+
"200/200 [==============================] - 4s 22ms/step - loss: 0.2423 - acc: 0.9434: 1s - loss:\n",
149+
"Epoch 12/64\n",
150+
"200/200 [==============================] - 4s 20ms/step - loss: 0.2422 - acc: 0.9380\n",
151+
"Epoch 13/64\n",
152+
"200/200 [==============================] - 4s 20ms/step - loss: 0.2193 - acc: 0.9412\n",
153+
"Epoch 14/64\n",
154+
"200/200 [==============================] - 4s 21ms/step - loss: 0.2139 - acc: 0.9446: 0s - loss: 0.2142 - acc\n",
155+
"Epoch 15/64\n",
156+
"200/200 [==============================] - 4s 22ms/step - loss: 0.1940 - acc: 0.9503\n",
157+
"Epoch 16/64\n",
158+
"200/200 [==============================] - 4s 19ms/step - loss: 0.1798 - acc: 0.9530\n",
159+
"Epoch 17/64\n",
160+
"200/200 [==============================] - 4s 19ms/step - loss: 0.1714 - acc: 0.9548\n",
161+
"Epoch 18/64\n",
162+
"200/200 [==============================] - 4s 19ms/step - loss: 0.1597 - acc: 0.9623\n",
163+
"Epoch 19/64\n",
164+
"200/200 [==============================] - 4s 19ms/step - loss: 0.1466 - acc: 0.9631\n",
165+
"Epoch 20/64\n",
166+
"200/200 [==============================] - 4s 21ms/step - loss: 0.1561 - acc: 0.9586\n",
167+
"Epoch 21/64\n",
168+
"200/200 [==============================] - 4s 22ms/step - loss: 0.1393 - acc: 0.9626\n",
169+
"Epoch 22/64\n",
170+
"200/200 [==============================] - 4s 21ms/step - loss: 0.1382 - acc: 0.9626: 0s - loss: 0.1373 - ac\n",
171+
"Epoch 23/64\n",
172+
"200/200 [==============================] - 4s 20ms/step - loss: 0.1290 - acc: 0.9666\n",
173+
"Epoch 24/64\n",
174+
"200/200 [==============================] - 4s 20ms/step - loss: 0.1199 - acc: 0.9688\n",
175+
"Epoch 25/64\n",
176+
"200/200 [==============================] - 4s 21ms/step - loss: 0.1106 - acc: 0.9725\n",
177+
"Epoch 26/64\n",
178+
"200/200 [==============================] - 4s 20ms/step - loss: 0.1068 - acc: 0.9728\n",
179+
"Epoch 27/64\n",
180+
"200/200 [==============================] - 4s 19ms/step - loss: 0.0923 - acc: 0.9775\n",
181+
"Epoch 28/64\n",
182+
"200/200 [==============================] - 4s 19ms/step - loss: 0.0988 - acc: 0.9745\n",
183+
"Epoch 29/64\n",
184+
"200/200 [==============================] - 4s 20ms/step - loss: 0.0932 - acc: 0.9766\n",
185+
"Epoch 30/64\n",
186+
"200/200 [==============================] - 4s 21ms/step - loss: 0.0825 - acc: 0.9798\n",
187+
"Epoch 31/64\n",
188+
"200/200 [==============================] - 4s 21ms/step - loss: 0.0827 - acc: 0.9809\n",
189+
"Epoch 32/64\n",
190+
"200/200 [==============================] - 4s 21ms/step - loss: 0.0712 - acc: 0.9828\n",
191+
"Epoch 33/64\n",
192+
"200/200 [==============================] - 4s 20ms/step - loss: 0.0724 - acc: 0.9837\n",
193+
"Epoch 34/64\n",
194+
"200/200 [==============================] - 4s 20ms/step - loss: 0.0731 - acc: 0.9834\n",
195+
"Epoch 35/64\n",
196+
"200/200 [==============================] - 4s 20ms/step - loss: 0.0648 - acc: 0.9852\n",
197+
"Epoch 36/64\n",
198+
"200/200 [==============================] - 5s 24ms/step - loss: 0.0620 - acc: 0.9859\n",
199+
"Epoch 37/64\n",
200+
"200/200 [==============================] - 4s 21ms/step - loss: 0.0667 - acc: 0.9861\n",
201+
"Epoch 38/64\n",
202+
"200/200 [==============================] - 4s 22ms/step - loss: 0.0606 - acc: 0.9856\n",
203+
"Epoch 39/64\n",
204+
"200/200 [==============================] - 4s 21ms/step - loss: 0.0555 - acc: 0.9875\n",
205+
"Epoch 40/64\n",
206+
"200/200 [==============================] - 4s 22ms/step - loss: 0.0542 - acc: 0.9866\n",
207+
"Epoch 41/64\n",
208+
"200/200 [==============================] - 5s 23ms/step - loss: 0.0538 - acc: 0.9879\n",
209+
"Epoch 42/64\n",
210+
"200/200 [==============================] - 4s 22ms/step - loss: 0.0571 - acc: 0.9872\n",
211+
"Epoch 43/64\n",
212+
"200/200 [==============================] - 4s 22ms/step - loss: 0.0478 - acc: 0.9905\n",
213+
"Epoch 44/64\n",
214+
"200/200 [==============================] - 4s 21ms/step - loss: 0.0489 - acc: 0.9878: 1s - lo\n",
215+
"Epoch 45/64\n",
216+
"200/200 [==============================] - 4s 21ms/step - loss: 0.0465 - acc: 0.9903\n",
217+
"Epoch 46/64\n",
218+
"200/200 [==============================] - 4s 22ms/step - loss: 0.0444 - acc: 0.9914\n",
219+
"Epoch 47/64\n",
220+
"200/200 [==============================] - 4s 21ms/step - loss: 0.0433 - acc: 0.9900\n",
221+
"Epoch 48/64\n",
222+
"200/200 [==============================] - 4s 21ms/step - loss: 0.0437 - acc: 0.9911\n",
223+
"Epoch 49/64\n",
224+
"200/200 [==============================] - 4s 21ms/step - loss: 0.0466 - acc: 0.9900\n",
225+
"Epoch 50/64\n",
226+
"200/200 [==============================] - 4s 22ms/step - loss: 0.0385 - acc: 0.9922\n",
227+
"Epoch 51/64\n",
228+
"200/200 [==============================] - 4s 19ms/step - loss: 0.0393 - acc: 0.9917\n",
229+
"Epoch 52/64\n",
230+
"200/200 [==============================] - 4s 19ms/step - loss: 0.0396 - acc: 0.9909\n",
231+
"Epoch 53/64\n",
232+
"200/200 [==============================] - 4s 19ms/step - loss: 0.0445 - acc: 0.9908\n",
233+
"Epoch 54/64\n",
234+
"200/200 [==============================] - 4s 19ms/step - loss: 0.0355 - acc: 0.9942\n",
235+
"Epoch 55/64\n",
236+
"200/200 [==============================] - 4s 20ms/step - loss: 0.0361 - acc: 0.9928\n",
237+
"Epoch 56/64\n",
238+
"200/200 [==============================] - 4s 20ms/step - loss: 0.0374 - acc: 0.9916\n",
239+
"Epoch 57/64\n",
240+
"200/200 [==============================] - 4s 20ms/step - loss: 0.0363 - acc: 0.9922\n",
241+
"Epoch 58/64\n",
242+
"200/200 [==============================] - 4s 20ms/step - loss: 0.0378 - acc: 0.9936\n",
243+
"Epoch 59/64\n",
244+
"200/200 [==============================] - 4s 20ms/step - loss: 0.0329 - acc: 0.9934\n",
245+
"Epoch 60/64\n",
246+
"200/200 [==============================] - 4s 20ms/step - loss: 0.0346 - acc: 0.9928\n",
247+
"Epoch 61/64\n",
248+
"200/200 [==============================] - 4s 20ms/step - loss: 0.0351 - acc: 0.9914\n",
249+
"Epoch 62/64\n",
250+
"200/200 [==============================] - 4s 21ms/step - loss: 0.0329 - acc: 0.9928\n",
251+
"Epoch 63/64\n",
252+
"200/200 [==============================] - 4s 21ms/step - loss: 0.0330 - acc: 0.9933\n",
253+
"Epoch 64/64\n",
254+
"200/200 [==============================] - 4s 20ms/step - loss: 0.0290 - acc: 0.9942\n"
255+
]
256+
},
257+
{
258+
"data": {
259+
"text/plain": [
260+
"<keras.callbacks.History at 0x21f8b0f2fd0>"
261+
]
262+
},
263+
"execution_count": null,
264+
"metadata": {},
265+
"output_type": "execute_result"
266+
}
267+
],
268+
"source": [
269+
"model.fit_generator(training_set,steps_per_epoch = 200,epochs = 64) "
270+
]
271+
},
272+
{
273+
"cell_type": "code",
274+
"execution_count": null,
275+
"metadata": {},
276+
"outputs": [],
277+
"source": [
278+
"model.save('cnn/model.h5')"
279+
]
280+
}
281+
],
282+
"metadata": {
283+
"kernelspec": {
284+
"display_name": "Python 3",
285+
"language": "python",
286+
"name": "python3"
287+
},
288+
"language_info": {
289+
"codemirror_mode": {
290+
"name": "ipython",
291+
"version": 3
292+
},
293+
"file_extension": ".py",
294+
"mimetype": "text/x-python",
295+
"name": "python",
296+
"nbconvert_exporter": "python",
297+
"pygments_lexer": "ipython3",
298+
"version": "3.7.3"
299+
}
300+
},
301+
"nbformat": 4,
302+
"nbformat_minor": 2
303+
}

create_samples.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import os
2+
import cv2
3+
import numpy
4+
5+
try:
6+
os.mkdir('samples')
7+
except:
8+
print('dir already exist')
9+
10+
i = 0
11+
j = 0
12+
13+
num_imgs = []
14+
for num in os.listdir('num_imgs'):
15+
num_imgs.append(cv2.imread('num_imgs/'+num))
16+
17+
for j in range(0,3):
18+
for number in num_imgs:
19+
for images in os.listdir('gen_images'):
20+
img_hash = cv2.imread("gen_images/"+images)
21+
22+
##not all images have same shape of number
23+
scaling_factor = numpy.random.randint(8,11)
24+
25+
h,w,_ = number.shape
26+
w_0 = int(numpy.round((scaling_factor*w/10),0))
27+
h_0 = int(numpy.round((scaling_factor*h/10),0))
28+
29+
img_0_resize = cv2.resize(number,(w_0,h_0))
30+
31+
## resize again (you can use neg images also)
32+
hash_h,hash_w,_ = img_hash.shape
33+
hash_h = int(numpy.round((hash_h*160/hash_w),0)) ##rounding off to integer(no decimal place)
34+
hash_w =160
35+
img_hash = cv2.resize(img_hash,(hash_w,hash_h))
36+
37+
##choosing where to foreground number with a margin of 5
38+
rand_h = numpy.random.randint(5,hash_h-h_0-4)
39+
rand_w = numpy.random.randint(5,hash_w-w_0-4)
40+
41+
## background + foreground
42+
img_0_gray = cv2.cvtColor(img_0_resize,cv2.COLOR_BGR2GRAY)
43+
ret, mask = cv2.threshold(img_0_gray, 180, 255, cv2.THRESH_BINARY_INV)
44+
roi = img_hash[rand_h:rand_h+h_0,rand_w:rand_w+w_0]
45+
img2_fg = cv2.bitwise_and(img_0_resize,img_0_resize,mask = mask)
46+
img1_bg = cv2.bitwise_and(roi,roi,mask = ~mask)
47+
img_hash[rand_h:rand_h+h_0,rand_w:rand_w+w_0] = cv2.add(img1_bg,img2_fg)
48+
line = 'samples/0_'+str(i)+".jpg"
49+
img_hash = cv2.cvtColor(img_hash,cv2.COLOR_BGR2GRAY)
50+
51+
## creating samples
52+
cv2.imwrite(line,img_hash)
53+
54+
## adding to info.txt
55+
line = 'samples/0_'+str(i)+".jpg 1 "+str(rand_w)+" "+str(rand_h)+" "+str(w_0)+" "+str(h_0)+"\n"
56+
with open('info.txt','a') as f:
57+
f.write(line)
58+
i=i+1

create_samples_no.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import numpy as np
2+
import cv2
3+
import os
4+
5+
try:
6+
os.mkdir('samples_no')
7+
except:
8+
print('dir already exists')
9+
10+
## load_cascade
11+
num_cascade = cv2.CascadeClassifier('haar_cascade/cascade.xml')
12+
13+
for image in os.listdir('samples'):
14+
img = cv2.imread('samples/'+image,cv2.IMREAD_GRAYSCALE)
15+
numbers = num_cascade.detectMultiScale(img)
16+
flag = False
17+
18+
for (x,y,w,h) in numbers:
19+
## iff object found then
20+
flag = True
21+
22+
if flag:
23+
## roi: region of image(here, with the number part)
24+
roi = img[y:y+h,x:x+w] ##above x,y,w,h found at first glance
25+
## saving to satandard size
26+
roi = cv2.resize(roi,(45,55))
27+
cv2.imwrite('samples_no/'+image,roi)

0 commit comments

Comments
 (0)