-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_main.py
169 lines (128 loc) · 5.62 KB
/
test_main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import numpy as np
import matplotlib.pyplot as plt
import cv2
from keras.models import load_model
import numpy as np
import imutils
from imutils.contours import sort_contours
img_rows, img_cols =64, 64
model = load_model('transCripterModel.h5')
labels=["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+","/","(","*",")","-"]
MODEL_INPUT_SIZE= img_rows, img_cols
#give image to function to decipher formula
def digitize_math_expression(image_path, model):
global MODEL_INPUT_SIZE
#preprocessing input
img = cv2.imread(image_path)
#no need to color image to process
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#padding grayed image to make rectangle input
img_w,img_h= img.shape[1],img.shape[0]
if img_w>img_h:
diff=(img_w-img_h)//2#top and bottom padsize(+10 fır roi_w)
img_gray = cv2.copyMakeBorder(img_gray,diff,diff,0,0,cv2.BORDER_CONSTANT,None,value=255)
img = cv2.copyMakeBorder(img,diff,diff,0,0,cv2.BORDER_CONSTANT,None,value=255)
elif img_h>img_w:
diff=(img_h-img_w)//2#left and right padsize(+10 for roi_h)
img_gray = cv2.copyMakeBorder(img_gray,0,0,diff,diff,cv2.BORDER_CONSTANT,None,value=255)
img = cv2.copyMakeBorder(img,0,0,diff,diff,cv2.BORDER_CONSTANT,None,value=255)
else:
pass
#resize after padding to preserve shapes in image(avoid strecthing problem)
img = cv2.resize(img, (MODEL_INPUT_SIZE[0]*13, MODEL_INPUT_SIZE[1]*13))
img_gray = cv2.resize(img_gray, (MODEL_INPUT_SIZE[0]*13, MODEL_INPUT_SIZE[1]*13))
# blurred = cv2.GaussianBlur(img_gray, (3, 3), 0)
#find edges in image to find contours(to determine boundaries of symbol)
edged = cv2.Canny(img_gray, 30, 150)
contours = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = imutils.grab_contours(contours)
# order detected symbols left-to-right to write mathematical expression properly
contours = sort_contours(contours, method="left-to-right")[0]
text=''#deciphered math expression
for c in contours:
#founded symbols area
(x, y, w, h) = cv2.boundingRect(c)
#detected shape of possible symbol sholuld be
#in given range, throw remaining areas
if 28<=w and 10<=h and h<=200 and w<=200:
#image sub-area of founded symbol
roi = img_gray[y:y+h, x:x+w]#detected area of symbol by contouring
#binarize image
T, roi =cv2.threshold(roi,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)
"""
cv2.imshow(f"{T}",roi)
cv2.waitKey(0)
"""
#pad cause wrong prediciton
#determine padsize to conservate shape
#or else for example constant padding stretches 1
#and cause model to predict as 7 or anything
roi_w,roi_h= roi.shape[1],roi.shape[0]
padd=10
if roi_w>roi_h:
diff=(padd//2 +roi_w-roi_h)//2#top and bottom padsize(+10 fır roi_w)
roi=cv2.copyMakeBorder(roi,diff,diff,padd,padd,cv2.BORDER_CONSTANT,None,value=255)
elif roi_h>roi_w:
diff=(padd//2 +roi_h-roi_w)//2#left and right padsize(+10 for roi_h)
roi=cv2.copyMakeBorder(roi,padd,padd,diff,diff,cv2.BORDER_CONSTANT,None,value=255)
else:
pass
#process image to input to model.Model expects (1,32,32,1) as input
#by blurring, we obtain diffusion of values to conservate
#inputs when resizig image
#BLUR DİSTORTS REAL İMAGE!! DO NOT APPLY or apply little kernel
#works on digital images
#roi=cv2.GaussianBlur(roi,(7,7),0)
#normalize to give to model
roi=cv2.resize(roi,MODEL_INPUT_SIZE)/255.
#roi=cv2.GaussianBlur(roi,(3,3),0)
"""
cv2.imshow("founded roi of symbol",roi)
cv2.waitKey(1)
input("d")
"""
shape4D=(-1, MODEL_INPUT_SIZE[0], MODEL_INPUT_SIZE[1], 1)
roi=np.reshape(roi, shape4D)
#predict symbol
val=model.predict(roi,verbose=0).argmax()
"""
print("prediction:", labels[val.argmax()])
input("devam: ")
"""
text=text+labels[val]
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)#to show area over main image
cv2.putText(img, labels[val] , (x-5, y), cv2.FONT_HERSHEY_SIMPLEX, 2.0, (0, 0, 255),2)
print("predicted :",text,end="=")
try:
print(eval(text))
except Exception:
print(" Could not solved. possibly bad prediciton")
return img
"""
cv2.imshow("all contours over image",img)
cv2.waitKey(0)
"""
from matplotlib import pyplot as plt
import os
def test_model(read_path="dataset/test/expression"):
for root_dir, sub_dir, files in os.walk(read_path):
print(f"{len(files)} test files found on :",root_dir)
for f in files:
test_img= os.path.join(root_dir,f)
print("expected:",f)
img=digitize_math_expression(test_img, model)
print("-"*40)
plt.imshow(img)
plt.show()
#run test---------------------------
#test_model("dataset/test/symbols")
"""
img=digitize_math_expression("man2-enhanced.jpg", model)
plt.imshow(img)
plt.show()
exit(0)
"""
print("test data will be predicted\n----------------")
test_model("dataset/test/expression")
exit(0)
#run test---------------------------