Python 机器学习中复合分数与减法符号的区分
我在一个名为“手写数学评估”的项目中工作 基本上,这里有11类(0-9)和(+,-)每类包含50个干净的手写数字。然后我训练了一个CNN模型,80%的数据用于训练,20%用于模型测试,准确率为98.83%。以下是CNN模型架构的代码:-Python 机器学习中复合分数与减法符号的区分,python,tensorflow,opencv,machine-learning,computer-vision,Python,Tensorflow,Opencv,Machine Learning,Computer Vision,我在一个名为“手写数学评估”的项目中工作 基本上,这里有11类(0-9)和(+,-)每类包含50个干净的手写数字。然后我训练了一个CNN模型,80%的数据用于训练,20%用于模型测试,准确率为98.83%。以下是CNN模型架构的代码:- import pandas as pd import numpy as np import pickle np.random.seed(1212) import keras from keras.models import Model from ke
import pandas as pd
import numpy as np
import pickle
np.random.seed(1212)
import keras
from keras.models import Model
from keras.layers import *
from keras import optimizers
from keras.layers import Input, Dense
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.utils import np_utils
from keras import backend as K
from keras.utils.np_utils import to_categorical
from keras.models import model_from_json
import matplotlib.pyplot as plt
model = Sequential()
model.add(Conv2D(30, (5, 5), input_shape =(28,28,1), activation ='relu'))
model.add(MaxPooling2D(pool_size =(2, 2)))
model.add(Conv2D(15, (3, 3), activation ='relu'))
model.add(MaxPooling2D(pool_size =(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation ='relu'))
model.add(Dense(50, activation ='relu'))
model.add(Dense(12, activation ='softmax'))
# Compile model
model.compile(loss ='categorical_crossentropy',
optimizer ='adam', metrics =['accuracy'])
model.fit(X_train, y_train, epochs=1000)
现在,数据集中的每个图像都按如下方式进行预处理:-
import cv2
im = cv2.imread(path)
im_gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret, im_th = cv2.threshold(im_gray, 90, 255, cv2.THRESH_BINARY_INV)
ctrs, hier = cv2.findContours(im_th.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
rects = [cv2.boundingRect(ctr) for ctr in ctrs]
rect = rects[0]
im_crop =im_th[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]
im_resize = cv2.resize(im_crop,(28,28))
im_resize = np.array(im_resize)
im_resize=im_resize.reshape(28,28)
我制作了一个求值函数,它可以解决简单的表达式,如7+8:-
def evaluate(im):
s = ''
data = []
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, im_th = cv2.threshold(im_gray, 90, 255, cv2.THRESH_BINARY_INV)
ctrs, hier = cv2.findContours(im_th.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])
boundingBoxes = [cv2.boundingRect(c) for c in ctrs]
look_up = ['0','1','2','3','4','5','6','7','8','9','+','-']
i=0
for c in ctrs:
rect = boundingBoxes[i]
im_crop = im_th[rect[1]:rect[1]+rect[3], rect[0]:rect[0]+rect[2]]
im_resize = cv2.resize(im_crop,(28,28))
im_resize = np.array(im_resize)
im_resize = im_resize.reshape(28,28,1)
data.append(im_resize)
i+=1
data = np.array(data)
predictions = model.predict(data)
i=0
while i<len(boundingBoxes):
rect = boundingBoxes[i]
print(rect[2],rect[3])
print(predictions[i])
s += look_up[predictions[i].argmax()]
i+=1
return s
def评估(im):
s=“”
数据=[]
im_gray=cv2.CVT颜色(im,cv2.COLOR_BGR2GRAY)
ret,im_th=cv2.阈值(im_gray,90255,cv2.阈值二进制\u INV)
ctrs,hier=cv2.findContours(im_th.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
排序的\u ctrs=sorted(ctrs,key=lambda ctr:cv2.boundingRect(ctr)[0])
BoundingBox=[cv2.boundingRect(c)表示ctrs中的c]
查找=['0'、'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'、'+'、'-']
i=0
对于CTR中的c:
rect=边界框[i]
im_crop=im_th[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]
im_resize=cv2.resize(im_裁剪,(28,28))
im_resize=np.数组(im_resize)
im_resize=im_resize.重塑(28,28,1)
data.append(im_resize)
i+=1
data=np.array(数据)
预测=模型。预测(数据)
i=0
当iperhaps附加两张图像来演示问题时。如果由于调整大小而丢失信息,那么显然在调整大小之前,您需要在预处理步骤中采取一些措施来帮助保留功能。神经网络在这方面不起任何作用。或者我误解了?实际上并没有一种方法是测量轮廓的纵横比并设置一个不等式条件,但它不是非常精确