前天把模型导入进行识别,硬是没一个对的。去检查发现,是pandas打乱了label到character的索引,要不是查看别人写的代码,还有自己去翻一翻变量控制器,还真找不出来。
另外,为了提高识别精度,我还打算将输入的图片进行归一化,即0~255缩小到 0 ~ 1, 和训练的时候预处理数据相同。
错误索引:
code_to_character = ['零', '一', '二', '三', '四', '五', '六', '七',
'八', '九', '十', '百', '千', '万', '亿']
正确索引:
code_to_character = ['一', '七', '万', '三', '九', '二', '五', '亿',
'八', '六', '十', '千', '四', '百', '零']
今天还把图像处理更加具体细化,即输入的图片限制尺寸大小;截取的图片必须在外围padding,让整个字处在中间,提高识别率。
# =============================================================================
# 用于裁剪下来的文字缩小,提高识别率
# =============================================================================
def imgNarrow(image):
COLOR=[255,255,255]
image = cv2.copyMakeBorder(image,20,20,20,20,cv2.BORDER_CONSTANT,value=COLOR)
t, image = cv2.threshold(image,120,255,cv2.THRESH_BINARY_INV)
image = skimage.transform.resize(image, (64, 64, 1), mode="reflect") #归一化的图片
return image
# =============================================================================
# 防止图片过大,使得噪声裁切都受到影响,将其限制尺寸
# =============================================================================
def imgNormalization(image):
height = image[0]
width = image[1]
if height > 768 or width > 768:
height = height/2
width = width/2
image = cv2.rezize(image, height, width,3)
imgNormalization(image)
else:
return image
最后对于图像处理还有一个问题要处理,也就是文字图像要reshape成(1,64,64,1)才能送入到预测器,并且不需要反色,因为二值化已经变成黑底白字了。
image2 = constant.reshape(1,64,64,1)