搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > DotNet程序员 > 纯C#实现基于BP神经网络的中文手写识别算法

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

DotNet程序员 2019-04-09
举报

链接:http://www.cnblogs.com/DragonStart/p/10136246.html

效果展示

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


这不是OCR,有些人可能会觉得这东西会和OCR一样,直接进行整个字的识别就行,然而并不是。


OCR是2维像素矩阵的像素数据.而手写识别不一样,手写可以把用户写字的笔画时间顺序,抽象成一个维度.这样识别的就是3维的数据了.识别起来简单很多


最近需要做一个中文手写识别算法.搜索了网上的一些前人作品,发现都是只讲了理论,不讲实际开发.于是打算自己开发一个,并记录开发过程


由于代码量比较多,这里不会全部贴上来讲解,代码已经放到了gitee,部分地方需对照代码进行观看,下面有URL

思路

网上关于中文手写识别的文章不多,不过数字OCR方案确有很多


虽然中文手写识别并不等于OCR,但总归有点关联性


我发现数字的OCR大概是这么个套路:

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


神经网络的输出层每一个节点对应一个数字的相似度.而中文不能这么做.因为中文有上万字。


不过这是手写识别,我们有用户写字的时候每一笔的数据,可以先识别笔画.然后再根据笔画,去识别字。

资源获取与数据模型设定

首先我们需要一个字典,用于提供所有中文汉字的笔画顺序,这玩意在百度搜索"字典 mdb"能得到很多(我会放到源码里)


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


通过查看字典的"笔顺"字段,我们可以看到,字典中的字,笔顺分为了: 横,竖,撇,捺,其它 这5个类型


横竖撇捺好弄,不过这个"其它"有点特别,通过查询.中文的笔画有30多种。


我按照长相,将笔画大体分成了这7种:

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


也就是说,我这里是分成7种来识别的,后续使用的时候,是再转换为5种笔画。


我们将用户输入的笔画顺序识别出来后,经过字符串相似度算法,识别出用户输入的笔画,与字典中每个字的笔画的相似度,然后进行排序。


关于字符串相似度,这里采用的是 levenshtein算法,相关代码可在我的源码中找到。

开发采集工具&采集一些数据

首先我需要采集一些笔画数据,然后交给神经网络,训练神经网络识别能力。


这里开发了一个采集工具,用来采集一些用于训练的数据:


Gitee查看源码:

https://gitee.com/handwriting_research/collection_and_test.git

Github查看源码:https://github.com/ChineseHandWritingRecognized/collection_and_test.git


使用方法如下:

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


保存后会得到一个json文件,里面是采集到的笔画数据:


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


每个笔画采集30次之后保存,在保存后,请将这个文件改名,然后再重新打开一次软件,采集下一个笔画


把上面表格中的7个笔画每一个采集30次左右(次数不需要完全一样)每个笔画单独采集到一个文件


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


再额外采集一个用于测试的数据:

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

训练过程

这里选择BP网络的原因是因为网络上有直接复制即可用的C#代码,毕竟我是用C#开发,基于C#的神经网络代码很少.大部分是基于C或者python的。


我对我找到的BP网络的部分代码进行了修改,训练完后可以把训练结果保存为单个json文件.也可以读取json文件接着训练,或着运用里面的训练结果进行识别


把上面采集的7个笔画样本放入神经网络训练:

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


如你所见,我另外开发了一个训练工具,读取前面步骤采集到的笔画数据生成矩阵,给BP网络,进行训练。


矩阵的格式:


**注:我用来训练的矩阵的大小是固定的16*16,以下只是为了说明而做的一个缩小版:**


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


注意:我在矩阵中使用0~1之间的浮点数标识出了哪个像素是先画出来的,哪个像素是后画出来的。


不过神经网络输入的矩阵是1维的,所以在代码中可以看到,我写了个GetDim1Matrix方法,将这里面的数据,全部连接到了一起


在代码中,有一个MatrixData类,这个类用于存放训练或者识别用的数据并进行矩阵的输出,可以在这里面找到生成矩阵的算法


训练完成后,使用训练结果,对测试数据进行了测试.并生成了训练结果文件:

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


训练工具源码:


Gitee查看源码:

https://gitee.com/handwriting_research/bp_neural_network_training.git

Github查看源码:

https://github.com/ChineseHandWritingRecognized/bp_neural_network_training.git

实际使用

识别功能和采集工具做在一起了,将神经网络训练出来的结果"GData.json"文件放进采集工具工程里.运行工程即可。


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


在实际使用中效果没有想象中的好,笔画相似度高的字比较多,得把字写得比较工整才能识别到,想要获取更好的结果,还需要对方案进行更多的优化才行。

改进计划

目前我比较倾向于这两个方案:


1、在测试中有个现象,笔画识别错误率有点高,可能需要修改笔画识别的方式,尝试用别的方式去识别笔画。

2、我找到的字典有问题,字符虽然很全,但是笔画分类才5种,只分为"横,竖,撇,捺,其它",这个"其它"比较碍事,可以尝试找笔画分类更细的字典来解决这个问题。


如果对这个项目感兴趣或者有更好优化的思路,可以给我留言。



编号213,输入编号直达本文

●输入m获取文章目录

推荐↓↓↓

运维

更多推荐

涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等。

版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《纯C#实现基于BP神经网络的中文手写识别算法》的版权归原作者「DotNet程序员」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

举报