那不是OCR,有些人可能会感觉那东西会和OCR一样,间接停行整个字的识别就止,然而其真不是.
OCR是2维像素矩阵的像素数据.而手写识别纷比方样,手写可以把用户写字的笔画光阳顺序,笼统成一个维度.那样识其它便是3维的数据了.识别起来简略不少.
最近须要作一个中文手写识别算法.搜寻了网上的一些前人做品,发现都是只讲了真践,不讲真际开发.于是筹算原人开发一个,并记录开发历程.
由于代码质比较多,那里不会全副贴上来解说,代码曾经放到了gitee,局部处所需斗劲代码停行不雅寓目,下面有URL.
思路网上对于中文手写识其它文章不暂不多,不过数字OCR方案确有不少.
尽管中文手写识别其真不就是OCR,但总归有点联系干系性.
我发现数字的OCR粗略是那么个淘路:
神经网络的输出层每一个节点对应一个数字的相似度.而中文不能那么作.因为中文有上万字.
不过那是手写识别,咱们有用户写字的时候每一笔的数据,可以先识别笔画.而后再依据笔画,去识别字.
首先咱们须要一个字典,用于供给所有中文汉字的笔画顺序,那玩意正在百度搜寻"字典 mdb"能获得不少(我会放到源码里)
通过查察字典的"笔顺"字段,咱们可以看到,字典中的字,笔顺分为了: 横,竖,撇,捺,其他 那5个类型
反正撇捺好弄,不过那个"其他"有点出格,通过查问.中文的笔画有30多种.
我依照长相,将笔画大约分红了那7种:
也便是说,我那里是分红7种来识其它,后续运用的时候,是再转换为5种笔画.
咱们将用户输入的笔画顺序识别出来后,颠终字符串相似度算法,识别出用户输入的笔画,取字典中每个字的笔画的相似度,而后停行牌序.
对于字符串相似度,那里给取的是 leZZZenshtein算法,相关代码可正在我的源码中找到.
首先我须要支罗一些笔画数据,而后交给神经网络,训练神经网络识别才华.
那里开发了一个支罗工具,用来支罗一些用于训练的数据:
Gitee查察源码>>
Github查察源码>>
运用办法如下:
保存后会获得一个json文件,里面是支罗到的笔画数据:
每个笔画支罗30次之后保存,正在保存后,请将那个文件更名,而后再从头翻开一次软件,支罗下一个笔画
把上面表格中的7个笔画每一个支罗30次摆布(次数不须要彻底一样)每个笔画径自支罗到一个文件
再格外支罗一个用于测试的数据:
那里选择BP网络的起因是因为网络上有间接复制便可用的C#代码,究竟我是用C#开发,基于C#的神经网络代码很少.大局部是基于C大概python的.
我对我找到的BP网络的局部代码停行了批改,训练完后可以把训练结果保存为单个json文件.也可以读与json文件接着训练,或着应用里面的训练结果停行识别.
把上面支罗的7个笔画样原放入神经网络训练:
如你所见,我此外开发了一个训练工具,读与前面轨范支罗到的笔画数据生成矩阵,给BP网络,停行训练.
矩阵的格局:
注:我用来训练的矩阵的大小是牢固的16*16,以下只是为了注明而作的一个缩小版:
留心:我正在矩阵中运用0~1之间的浮点数标识出了哪个像素是先画出来的,哪个像素是后画出来的.
不过神经网络输入的矩阵是1维的,所以正在代码中可以看到,我写了个GetDim1MatriV办法,将那里面的数据,全副连贯到了一起.
正在代码中,有一个MatriVData类,那个类用于寄存训练大概识别用的数据并停行矩阵的输出,可以正在那里面找到生成矩阵的算法.
训练完成后,运用训练结果,对测试数据停行了测试.并生成为了训练结果文件:
训练工具源码:
Gitee查察源码>>
Github查察源码>>
识别罪能和支罗工具作正在一起了,将神经网络训练出来的结果"GData.json"文件放进支罗工具工程里.运止工程便可.
正在真际运用中成效没有想象中的好,笔画相似度高的字比较多,得把字写得比较灵巧威力识别到,想要获与更好的结果,还须要对方案停行更多的劣化才止.
改制筹划目前我比较倾向于那两个方案:
正在测试中有个景象,笔画识别舛错率有点高,可能须要批改笔画识其它方式,检验测验用其它方式去识别笔画
我找到的字典有问题,字符尽管很全,但是笔画分类才5种,只分为"横,竖,撇,捺,其他",那个"其他"比较碍事,可以检验测验找笔画分类更细的字典来处置惩罚惩罚那个问题.
假如对那个名目感趣味大概有更好劣化的思路,可以给我留言