文章作者:激萌の小宅
促销:¥0
价格:¥0
0 天
有效期
0
总销量
1
累计评价
本章节视频讲解如下:
人工神经网络的演示(识别数字):
ANN卷积神经网络可视化原理:
本章节给大家讲讲如何利用OpenCv进行神经网络的训练,考虑到训练时间会很长,我这里训练样本不会弄太多,训练的内容为英文字符、数字、以及部分简易的汉字,该训练为后面做OpenCv的车牌识别做准备。
同样的,我这里会提供C#、C++、Python三个版本的训练方法,以及三种版本的训练时长对比、识别成功率对比的参考数据。方便大家对C#、C++、Python在神经网络的处理性能方面有个初步的认识。
我们的调试平台为:VS2019 windows10 64位,各个语言的OpenCv版本信息如下:
在开始训练之前,我们首先需要准备一些训练用的图片,图片如下,目前训练的图片中没有汉字,所以我们目前只做数字和英文的识别,后面进行车牌识别时,我会以汉字为例子,教大家如何制作训练图片。
训练库下载:车牌识别源码下载页
大家可以看到,在上图中,英文字符只有24个,少了“O”和“I”两个字母,因为这两个字母和数字“0”、“1”非常像,所以需要剔除,车牌里面好像也没有这两个字母。
考虑到训练的时间特别长,我这里每组图片只制作了50张训练样本,理论上,训练样本数越多,识别的成功率就越高。
不同电脑,训练时间可能会有些差异,估计也不会差太多,下面是我的电脑配置:
由于OpenCvSharp3-AnyCPU找不到关于ANN_MLP的应用接口,所有改成OpenCvSharp4了。
使用OpenCvSharp4需要安装两个库:OpenCvSharp4和OpenCvSharp4.runtime.win
C#版本的训练结果如下:
从测试数据上看,C#版本的训练耗时时间为:
开始训练时间:2021/12/28 20:38:29
训练完成时间:2021/12/28 20:41:41
总耗时大约3分钟,这速度,比C++的42分钟,真的不是只快了一点点,不知道是不是C#的OpenCvSharp4在算法上做了优化。
对训练结果进行识别测试,测试结果如下,有7张图片识别错误,成功率为:7/(34*50)*100%= 99.6%,和C++版本的基本一致。
从测试结果上看,有7张图片未识别成功,7张图片如下:
C#版本完整代码如下:
车牌识别源码下载页
C++版本的代码目前只测试过在OpenCv-3.4.0和OpenCv-4.5.5两个版本中运行过,识别成功率基本没太大差异。
在C++版本中,我们首先需要先调用ANN_Drill函数来训练出我们的xml文件,当然了,这个训练只需要训练一次就够了,后面做车牌识别时,只需要调用xml文件即可,识别速度还是相当的快的。
训练过程如下。
训练过程中中间会卡在“./Image/Z/9_0.9727...”位置,此时就是漫长的等待了....
训练耗时如下。
开始时间:2021-12-07 20:59:45
完成时间:2021-12-07 21:43:24
总耗时大概42分钟。
训练的EnglishAndNumber.xml文件张这个样子
最后调用TestXml函数的测试结果如下:
从结果中可以看到,还是有一些图片识别失败了,一共有7张,如下:
从失败的图片中可以看出,这个训练图片用的好像也不是特别好,正常训练图片用的好,基本上能达到100%的识别成功率。
完整代码如下:
Python版本相对前面C#和C++版本,数字+英文字母的识别成功率太低了,只有26%,如果只是单纯的识别数字,成功率能达到83%,但是如果采用C++的xml文件进行识别,成功率基本和C#的一致,这种情况,如果不是训练方法问题,那估计就是opencv的版本问题了,之前在调试时也出现过这种情况,某些版本的opencv神经网络识别成功率就非常低,如果是训练方法有问题,没理由数字识别能达到83%,加上英文字母后,就只剩下26%了。所以,我还是怀疑是opencv的版本问题,改天换个高版本的再试试。
Opencv3.4.2的训练过程如下:
Opencv4.5.5的训练过程如下:
从结果上看,Python的训练时间也挺快的,Opencv3.4.2版本大概也只用了17秒的时候,Opencv4.5.5版本用了159秒左右,两个版本都比C++和C#都快了好几倍了,但是识别的成功率是真的不行。识别错误的图片如下,总共也才34*50=1700张图片,就有Opencv3.4.2版本有1256张识别失败,而Opencv4.5.5版本有1219张识别失败,Opencv4也就比Opencv3好了那么一点点。。。坑!
Opencv3.4.2和Opencv4.5.5通用完整代码如下