总结下最近作的一个项目,只提供一些技术方案,不涉及具体业务和具体实现。网络
自动识别图片中电话号码,也能够推广到识别字符串,英文等。性能
---识别--->学习
“18811610168”字体
固然,背景会有干扰(天然环境),字体也更多变。spa
要求:全对识别,人工修正的成本太高,若是有一位识别错误,人工修正还不如从新输入方便(人工输入能够支持语音识别的)。保证85%以上的数据是能够全对识别的,最好返回全对识别的几率。固然对于电话号码业务,根据识别的文本结果再加上电话的一些规则,后判断程序也能够有效地判断哪些是高几率识别错误的。设计
目标检测、ocr识别已是被学术界玩透的技术了。神经网路是目前的大热,并且效果极佳。识别方案有如下三种:3d
检测图片中的数字位置,而后对数字region过度类器识别。传统方法:Sliding Windows、Selective Search等寻找候选区域;Boosting分类器、SVM等均可以用于识别。深度学习的方案效果更好,好比:Faster RCNN、YOLO等。blog
它们的实质都是:检测字符的位置,识别字符的类别(内容)。图片
识别结果主要受检测准确度和识别精度的影响。在检测彻底正确的状况下,自左向右识别各个字符,而后串联识别结果。若是检测彻底正确,识别分类器的loss=0.01,每一个字符的正确识别的几率p=0.99。11位电话全对的几率约为0.895,loss值=-ln(0.895)=0.111。
可是,检测可能出错。另外,图片中的电话多是倾斜的,后期串联结果也会比较繁琐,好比。
方案一没有考虑电话号码的序列特性,若是将图片分割为时序信号,送入RNN/LSTM/BLSTM等网络,识别性能会大幅提高。
问题是图片的分割不许确怎么办?其实这里的分割并非严格的,解决方案是,将图片按行分割成n个,好比电话号码分割成21个小图片,而后20个图片送入RNN网络获得20个序列化的输出。因为一个字符可能在相邻两个小图上出现(各一半),最终的识别结果极可能是“1_88_8_1_1_66_10_16_8”。最后再通过一个CTC网络融合获得“18811610168”。
方案二是把图片原图分割后送入RNN网络,RNN作特征提取和分类识别。级联RNN的训练是不容易收敛的,并且特征的提取工做是CNN的强项。从新设计网络,可使用cnn提取图片的特征,而后将feature Map分割成n个,送入RNN作识别,最终经过CTC获得识别结果。
这样的好处是,输入数据不用作预处理,切割能够经过网络中矩阵的转置实现;网络实现了End-to-End;输出是完整字符串,识别准确率高,loss值约为0.02,全对正确率约为0.98。
1. Long-term Recurrent Convolutional Networks for Visual Recognition and Description 2.Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks