想要快速入门一个领域,那就抓紧时间多几篇综述,自己总结一下
OCR
1 简介
OCR英文全称是Optical Character Recognition,中文叫做光学字符识别。它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来,并转换成一种计算机能够接受、人又可以理解的格式。
OCR技术确实也在改变着我们的生活:比如一个手机APP就能帮忙扫描名片、身份证,并识别出里面的信息;汽车进入停车场、收费站都不需要人工登记了,都是用车牌识别技术;我们看书时看到不懂的题,拿个手机一扫,APP就能在网上帮你找到这题的答案。
1.1 分类
文字识别从类型角度来说,主要分为两个方面,
一个是印刷汉字识别;
另一个则是手写字体识别
按场景分类分为3类:
自然场景中的文字识别(比如识别车牌号,图像中的饭店);
文本场景(pdf文件和考试试卷等)。
按处理方法:
普通方法
深度学习方法
1.2 现状
印刷体识别较手写体识别要简单得多,我们也能从直观上理解,印刷体大多都是规则的字体,因为这些字体都是计算机自己生成再通过打印技术印刷到纸上。在印刷体的识别上有其独特的干扰:在印刷过程中字体很可能变得断裂或者墨水粘连,使得OCR识别异常困难。当然这些都可以通过一些图像处理的技术帮他尽可能的还原,进而提高识别率。总的来说,单纯的印刷体识别在业界已经能做到很不错了,但说100%识别是肯定不可能的,但是说识别得不错那是没毛病。
1.3 OCR识别5大步骤
假如输入系统的图像是一页文本,那么识别时的第一件事情是判断页面上的文本朝向,因为我们得到的这页文档往往都不是很完美的,很可能带有倾斜或者污渍,那么我们要做的第一件事就是进行图像预处理,做角度矫正和去噪。然后我们要对文档版面进行分析,进每一行进行行分割,把每一行的文字切割下来,最后再对每一行文本进行列分割,切割出每个字符,将该字符送入训练好的OCR识别模型进行字符识别,得到结果。但是模型识别结果往往是不太准确的,我们需要对其进行识别结果的矫正和优化,比如我们可以设计一个语法检测器,去检测字符的组合逻辑是否合理。比如,考虑单词Because,我们设计的识别模型把它识别为8ecause,那么我们就可以用语法检测器去纠正这种拼写错误,并用B代替8并完成识别矫正。这样子,整个OCR流程就走完了。从大的模块总结而言,一套OCR流程可以分为:
从上面的流程图可以看出,要做字符识别并不是单纯一个OCR模块就能实现的(如果单纯的OCR模块,识别率相当低),都要各个模块的组合来保证较高的识别率。上面的流程分的比较粗,每个模块下还是有很多更细节的操作,每个操作都关系着最终识别结果的准确性。做过OCR的童鞋都知道,送入OCR模块的图像越清晰(即预处理做的越好),识别效果往往就越好。那现在对这流程中最为重要的字符识别技术做一个总结。
(1)版面分析
(2)预处理
预处理过程包括:彩色图像灰度化、二值化处理、噪声去除、图像变化角度检测、文字几何矫正。
(3)行列切割
(4)字符识别
(5)识别结果后处理矫正
1.4 进行字符识别的5种方法
- 使用谷歌开源OCR引擎Tesseract(汉字识别待优化)
- 使用大公司的OCR开放平台(比如百度),使用他们的字符识别API(要钱)
- 暴力的字符模板匹配法
暴力的字符模板匹配法看起来很蠢,但是在一些应用上可能却很凑效。比如在对电表数字进行识别时,我们首先定义出数字模板(0~9),然后用该模板滑动匹配电表上的字符,这种策略虽然简单但是相当有效。我们不需要左思右想去建模,训练模型,只需要识别前做好模板库就可以了。
模板匹配法只限于一些很简单的场景,但对于稍微复杂的场景,那就不太实用了。 - 传统方法做字符的特征提取,输入分类器,得出OCR模型
采取OCR的一般方法,即特征设计、特征提取、分类得出结果的计算机视觉通用的技巧。
这种方式最大的缺点就是,人们需要花费大量时间做特征的设计,这是一件相当费工夫的事情。通过人工设计的特征(例如HOG)来训练字符识别模型,此类单一的特征在字体变化,模糊或背景干扰时泛化能力迅速下降。而且过度依赖字符切分的结果,在字符扭曲、粘连、噪声干扰的情况下,切分的错误传播尤其突出。针对传统OCR解决方案的不足,学界业界纷纷拥抱基于深度学习的OCR。 - 大杀器:基于深度学习下的CNN字符识别
现在OCR基本都用卷积神经网络来做了,而且识别率也是惊人的好,人们也不再需要花大量时间去设计字符特征了。在OCR系统中,人工神经网络主要充当特征提取器和分类器的功能,输入是字符图像,输出是识别结果,一气呵成。
1.5 字符识别的评价标准
基本比较常用的3个
精确率P
召回率Recall
综合F1
1.6 发展历程
1966年,BIM公司的Casey和Nagy发表第一篇关于汉字识别的论文。
在一些简单环境下OCR的准确度已经比较高了(比如电子文档),但是在一些复杂环境下的字符识别,在当今还没有人敢说自己能做的很好。OCR传统方法在应对复杂图文场景的文字识别显得力不从心,越来越多人把精力都放在研究如何把文字在复杂场景读出来,并且读得准确作为研究课题,用学界术语来说,就是场景文本识别(文字检测+文字识别)。
1.7 难点
(1)数据集很少
(2)多种语言混合识别
(3)文本序列长度不固定
(4)文本倾斜旋转,曲形文本
(5)文本遮挡
(6)文本尺寸不统一,有大有小
(7)实时检测
(8)复杂场景下的检测
2 深度学习进行文字识别
目前基于深度学习的文字识别主要有两种方案,
- 文字检测加汉字识别的方法,分两步依次进行。
- 而另一种则是直接训练一个端到端的模型同时完成文字检测和文字识别。
文本检测与目标检测不同,文本是序列,目标检测是一个目标。在目标检测中,每个目标都有定义好的边界框,检测到的边界框与目标的实际边界框的重叠率大于某个值则说明检测结果正确。文本行是由一些独立的字符组成,检测时需要更准确的定位。
2.1 文本检测
CPTN
2.2 文本识别
CRNN
3 实战
参考文献
[1] OCR算法全集https://zhuanlan.zhihu.com/p/356842725
[2] 这个很好https://www.cnblogs.com/skyfsm/p/7923015.html
[3] https://blog.csdn.net/u011622208/article/details/90713806