数字识别

希望学弟们在看本文之前已经尝试过使用模板匹配,SVM(支持向量机)等算法识别数字.

1.ANN简介

推荐一个神经网络入门必玩tensorflow playground简单了解一下啥是神经网络
相关名词定义可以参考这一篇博客https://blog.csdn.net/jinyuan7708/article/details/82466653

2.我的网络结构

我使用tensorflow编写神经网络,通过B站学会了tensorflow的基本用法bilibili
我一共写了两个版本的神经网络,一个全连接版,一个卷积版,准确率感觉差不多(没测,有兴趣的老弟帮我测一波).全连接版运行较快,卷积版运行较慢.具体结构如下:

名称

fc_n

激活函数

image

1728(36*48)

fc1

864

tanh

fc2

432

tanh

fc3

108

tanh

fc4

54

tanh

fc5

15

softmax

两个版本都在2020赛季规则出之前就写好,所以有大小装甲共15类,当然还有很大的改进空间,比如可以尝试减少网络层,把识别速率在提一提

loading picture

卷积版可以尝试根据上图自己编写
重点讲一下调用,全连接版的调用相比于卷积版的调用简单(柿子要挑软的捏).
①保存为PB文件.

loading picture

②调用.

loading picture

卷积版调用步骤同上,但你会遇到OpenCV报错说:没有reshape这个函数(卷积层到全连接层必定会用到的函数)
解决方法有两种:
①自定义reshape函数, 接下来我以laeky_relu为例介绍一下;

loading picture

调用前加上 CV_DNN_REGISTER_LAYER_CLASS(LeakyRelu, LeakyReluLayer)即可
如果这个没看懂可以参考OpenCV官网

②使用optimize_for_inference "修剪"模型(具体代码,看我github)

loading picture

3.图像预处理

在保证神经网络输入要求的前提下,尽量减少同类之间的变换,增加不同类之间的区别
如:在输入前使用逆透视变换进行校正,可以让两个1号看起来更相似,也可以让有一定角度的7和1区别开. 当然还有亮度旋转角度,等可以调节

4.代码

https://github.com/shilei31415/AutoShot