先抱怨一句,识别真的比检测难很多呀,文字识别可根据待识别的文字特点采用不同的识别方法,一般分为定长文字、不定长文字两大类别。
定长文字:
定长字符识别中比较广泛的几个例子就是:MNIST识别,验证码识别,车牌识别。
MNIST:
MNIST这个感觉实在是没啥说的,拿出一本深度学习入门书籍,可能实战篇就有这个项目,无论什么深度学习框架上网搜,都能搜出一大堆程序。
验证码识别:
验证码这一块,现成的代码也比较多了,文章这一块我参考了https://my.oschina.net/u/876354/blog/3048523,代码这一块我参考了https://github.com/nickliqian/cnn_captcha。
车牌识别:
无,虽然现在车牌识别的产品已经很多了,但是网上基本没有开源的项目。我试过搜索一些论文和博客,感觉很多都是让你测效果,如何做出来的,网络结构这一块,没有找到,打开就是我做的车牌多准多准这样。
不定长文字识别:
不定长文字识别是目前OCR识别研究方向的主流,一些论文啥的也比较多,我做的不是这个方向,所以只是简单浏览了一下,看看有没有什么能用的,并没有深入调研,如果研究这个方向的可以参考这篇总结:https://github.com/hwalsuklee/awesome-deep-text-detection-recognition,虽然有一阵没更新了,但是整体还可以。
车辆VIN码:
试验1:验证码方法
由于我要做的东西除了长一些之外,其他的方面都与验证码识别相同。因此,我首先试了一下使用验证码识别的方法,用的方法非常简单,就是类似MNIST识别,只是one-shot那个位置长了一些而已,有多长呢,就是10个数字+26个英文字符=36,如果有15位就是15*36=540。就是最后全连接到长度540,然后分割,每36个做一个softmax,得出一个字符的分类,做15位,得出预测字符串,从做出来的结果来看,基本是用不了呀。
问题:
1.15个softmax怎么可能都预测对了,肯定有预测不对的呀,1、2个不对基本就用不了,比如说每一个都有90%的准确率,90%*90%......乘一乘就用不了了。
2.个人感觉全连接540,每15位与相邻每15位还是有一定关联的,经常出现前面一个错了,后面跟着错好几个的情况。
试验2:VIN码识别个人实现:
将原本pytorch实现的验证码识别网络结构中加入LSTM(个人觉得GRU应该也可以,也是第一次接触RNN这一块,并不是很熟悉,下一步可能会进行一下尝试),与网络结构对应的,将损失从原本的交叉熵损失改为CTCloss(吐槽一下pytorch的CTCloss,低版本的pytorch大家都是使用别人封装的baidu-ctcloss和wrap-ctcloss的,但是pytorch到了1.2版之后自带了CTCLoss,有网友说pytorch自带的没有人家封装的好用),主要就改了这两个地方,其他就没啥了,剩下的就是深度学习大力出奇迹了。
训练说明:
由于网上没有VIN码的开源数据集,个人使用图像的方法,自己造了10000张数据用于训练,由于数据是假的,所以没有做消融实验,也没有训练太长时间,只是想确认网络结构可以使用。检测方法使用AdavanceEAST,字符串矫正使用仿射变换。矫正这一块初步先这么做,后期可能会尝试其他方法,我看不定长字符识别中有一些论文就涉及到字符串矫正。
效果:
上方绿色为模型结果,下方为待测试VIN码。
遇到问题:
1.未理解:
通过调研发现,当前大多数的CRNN这一块都是keras实现,不知道是不是都是抄袭某位大牛,甚至连里面一些小细节都一样真是没弄明白这个位置是啥,batch为50,但是每次使用的时候都会抛弃前两张图像,调研其他程序的时候,keras版本的基本都是这么写的,有的作者直接写出他也不知道为啥这样。
2.Loss:inf:
造成这个情况的原因就是LSTM中,inputs_length已经要比target_length,长很多,如果inputs_length不够长就会出现这个错误
参考:https://blog.csdn.net/qq_39226755/article/details/100834206
个人疑惑:
1. 如上问题1,为啥舍弃前两张图像呀,看不懂,是因为LSTM有时间序列,开始进入的图像学习效果不好所以舍弃了吗?
2. LSTM中,输入长度和目标长度的相互关系是多少最合适??网上有说输入的长度需要保证目标字符与字符之间都可以插入一个空格,以VIN码为例,17个字符长,算上首尾插入18个空格,那么目标长度17,输入长度35,这样对吗?
3. 我使用pytorch自带的CTCLoss,后期损失值为负数了,但是确是一直在下降,这个正常吗?
这篇博客下的方法个人都试了一下:https://blog.csdn.net/github_38052581/article/details/87978546
但是都没有效果。
4. Softmax这一块,为什么会选择logsoftmax,而不是常用的softmax,与LSTM这一块有关吗?
借鉴:
1.CNN+GRU+CTC进行人民币编码识别:https://blog.csdn.net/qq_39226755/article/details/100803689
2.长数字识别:https://github.com/yl305237731/number_detection_recognition,
说明:
代码这一块,我使用pytorch,当前的进度是使用伪造的数据将网络结构初步定了下来,下一步可能会等到有真实数据后,再继续往下进行,欢迎大家评论和沟通交流。
来源:CSDN
作者:学渣在路上
链接:https://blog.csdn.net/XDH19910113/article/details/103477469