专业建站系统 - 打造最好的网站内容系统!

http://aihigh.cn

当前位置: 智能高-文具 > 智能文具 > 文章页 [纯C#实现]基于BP神经网络的中文手写识别算法

[纯C#实现]基于BP神经网络的中文手写识别算法

时间:2024-12-25来源: 作者:admin点击:
效果展示 这不是OCR ,有些人可能会觉得这东西会和OCR一样,直接进行整个字的识别就行,然而并不是. OCR是2维像素矩阵的像素数据.而手写识别不一样,手写可以把用户写字的笔画时间顺序,抽象成一个维度.这样识别的就是3维的数据了.识别起来简单很多. 最近需要做一个中文手写识别算法.搜索了网上的一些

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

------分隔线----------------------------
相关内容
推荐内容