手写数字识别(一)(KNN+CNN+tensorflow)

       手写数字识别作为模式识别领域的一个重要问题,也有着重要的理论价值,在大数据时代的背景下,其应用领域非常之广。很多学者对手写数字识别提出了不同的算法,取得了不错的测试效果,但如今OCR领域大部分还在算法理论的研究阶段,并没有完善的应用体系出现。部分科技企业开发出的手写数字应用系统由于局限于书写的环境和书写风格的要求,只能适用于特点的应用场景,也并没有得到很好的推广。

       基于此,综合实时性和识别率这两大要求,设计出应用于不同场景的解决方案。

       场景一要求识别的交互性和实时性,例如仓库的货物数据单统计,试卷扫描自动累分系统等;场景二要求识别的高精准度和处理的大数据量,例如大规模的数据统计(行业年检,人口普查)以及财务、税务、金融等领域。

一:KNN

       本场景中,通过摄像头实时读取待处理的图像,经过灰度变换,转化为灰度图,经过图像的形态学膨胀和腐蚀做初步处理,并运用Sobels算子去除噪点。寻找轮廓后设定阈值分类图像,整合数字的特征,用训练好的KNN分类模型识别数字。提供自训练的API,按下执行命令后会识别到该场景下的识别图像,需要手动输入图像的标签,经测试,不同条件下的训练数据为6~8组即可较为精准的识别。

 
图1:场景一流程图 
(一):图像预处理(形态学膨胀腐蚀):
对图像做形态学腐蚀膨胀常用来做图像的预处理。其主要功能有:
消除噪声
分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
寻找图像中的明显的极大值区域或极小值区域
求出图像的梯度
在方案的设计中,首先做图像的腐蚀膨胀,以便于后面的边缘检测。效果如图:
  
图2:预处理——腐蚀膨胀
(二):基于Sobel算子的边缘检测:
Sobel算法是像素图像边缘检测中最重要的算子之一,在机器学习、数字媒体、计算机视觉等信息科技领域起着举足轻重的作用。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量。Sobel 算子是一个离散的一阶微分算子,用来计算图像灰度函数的近似梯度。算子使用两个3*3的矩阵和原始图片做卷积,分别得到横向和纵向的梯度值。如果梯度值大于设定的阈值,则认为检测到边缘点。
 
图3:Sobel算子使用的矩阵
对手写数字的图片用Sobel算子做边缘检测,综合其横向纵向的检测结果,如图:
 
图4:边缘检测
(三):数字提取分割与KNN识别:
将识别到的数字串分割成各个数字并框出,转换为特征矩阵作为KNN分类器的输入,由以训练好的KNN模型识别出数字标签,并标注在手写数字旁。如图:
   
图5:数字提取和识别结果
(四):手动训练API:
对于某些原因造成的识别错误,程序中,设定按u键手动更新训练,如图:
 
图6:待手动训练样本
界面将显示识别到的数字图片,标签手动输入,按enter后更新,更新2组后即可稳定识别:
 
图7:强化训练后的识别结果

       

视频演示截图:

猜你喜欢

转载自blog.csdn.net/wlx19970505/article/details/80267284