OCR(Optical Character Recognition ) 光学字符识别技术主要分为手写体识别和印刷体识别两类 , 印刷体识别比手写体识别要简单, 因为印刷体更规范, 字体来自于计算机字库, 尽管印刷过程中可能会发生不清晰\粘连, 这些都可以通过一些"腐蚀"/"膨胀"图像处理技术还原, 但是手写体由于个体差异的存在, 还是非常难的.
从内容角度, 可以分为: 汉字, 英文, 数字和图画. 数字最简单, 英文次之, 汉字比较难.
谷歌OCR识别引擎: tesseract
百度OCR API:https://cloud.baidu.com/doc/OCR/OCR-API.html
腾讯 OCR:https://ai.qq.com/product/ocr.shtml#identify
阿里OCR: https://data.aliyun.com/product/ocr
早期字符模板匹配算法, 用实现定义的文字/数字模板滑动匹配图片上的字符, 直接给出识别结果. 这种方法简单,暴力, 直接.但是对于复杂场景的泛化能力很弱.
特征设计方法, 利用字符的图像特征进行特征提取, 例如结构特征, 笔画特征, 等等, 进行人工设计后, 提取文字特征, 送入SVM中做分类给出识别结果, 这种方法需要大量的人工特征设计, 而且当字体变化\模糊等复杂条件下泛化能力同样不行.
深度学习, 特别是卷积神经网络给OCR识别提供了新的思路.
目前非常优秀的模型有哪些?
这里说的pipeline流程不区分手写或者印刷体. 对于输入系统的文本, 例如一段文字的图片, 或者
预处理 --> 版面分析/行列切割 --> 字符识别 --> 后处理识别矫正
预处理: 文档图像可能是倾斜或者有污渍的, 需要进行角度矫正, 去噪
openCV轮廓检测+透视变换+ 二值化
轮廓提取: 适用于车牌, 身份证, 人民币, 书本, 发票一类的矩形且边界明显的物体矫正
直线探测矫正: 适用于文本类的矫正.
透视变换: cnn model(spatial transformer network, STN), 可以有效矫正文字的扭曲/翻转问题, 配准算法.STN可以有效地学习从一组点到对应点的变化关系, 可以作为一个组件和其他模型搭配使用.
版面分析: 判断页面上文本的朝向, 做行和列的切割, 把文字按照行切割出来, 然后(按照列)切割出每一个文字
字符识别和后处理识别矫正: 文字识别算法模型进行识别, 通常是利用经典的CNN模型(例如vgg, lenet)作为backbone, 配合循环神经网络或者结合识别结果, 进行微调/上下图片关系分析, 连接, 重新送入模型识别, 提高识别正确率.
行列切割:
行列的切割可以用横向投影和纵向投影获得. 横向投影, 是将像素点的纵坐标(y)做histogram, 得到:
很显然, 从横向水平投影histgram可以很容易地区分出每一行文本. 纵向竖直投影histogram如下:
纵向投影没有横向那么分割"清晰". 这种情况主要发生在汉字中, 因为英语字母都是连通体, 不像中文的这种框架结构, 特别是左右结构的汉字, 很容易被模型识别为两个字.
可以说文字的分割对正确的识别非常重要, 甚至是至关重要. 基于深度神经网络的算法有: yolo/ssd/frcnn算法等.
识别模型: 以CNN为基础, 嵌入其他网络, 例如循环网络等.
Faster RCNN做目标检测的关键步骤有哪些:
2016年的detceting text in natural lmage with connectionist text proposal network一文提出了CTPN网络, 采用了一个以小的窄矩形检测框代替大检测框, 同时针对文字之间间隔的问题, 采用RNN对连续的小检测框的结果进行判断, 在CTPN中, 小检测框在文本上的移动就如同一个序列, CTPN的双向LSTM(BiLSTM)模型可以对当前检测框及其左右两边的小检测框建立联系, 可以有效地提高对于文本检测的精度.
VPR2017的一篇spotlight论文《Detecting Oriented Text in Natural Images by Linking Segments》介绍以一种可以检测任意角度文本的检测算法,我们一般称这个算法为SegLink,这篇论文既融入CTPN小尺度候选框的思路又加入了SSD算法的思路,达到了当时自然场景下文本检测state-of-art的效果。
seglink这种先做分割再合并的思路,增大了文本检测精度的损失和时间的消耗,CVPR2017有一篇文章提出了一个能优雅且简洁地完成多角度文本检测,这个算法叫做EAST,论文为《EAST: An Efficient and Accurate Scene Text Detector》。
EAST网络分为特征提取层+特征融合层+输出层三大部分。
基于语义分割的思路做文本检测的、基于角点检测做文本检测、各种方法混合的文本检测.
主流模型分为两种: attention OCR(= cnn+ rnn+ attention) 或者CRNN(= cnn+rnn+CTC ) . 这两大方法的主要区别在于最后的输出层,attention OCR采用的是attention机制, CRNN对齐采用的是CTC算法.
利用语法检测器, 检测字符的组合逻辑是否合理.
#参考与更多阅读:
CTPN - 自然场景文本检测 https://blog.csdn.net/zchang81/article/details/78873347
一文读懂FRCNN: https://zhuanlan.zhihu.com/p/31426458
文字识别seglink : https://zhuanlan.zhihu.com/p/37781277