OCR字符识别技术总览

OCR的定义与应⽤场景
OCR英⽂全称是Optical Character Recognition,中⽂叫做光学字符识别。它是利⽤光学技术和计算机技术把印在或写在纸上的⽂字读取出来,并转换成⼀种计算机能够接受、⼈⼜可以理解的格式。 ⽂字识别是计算机视觉研究领域的分⽀之⼀,⽽且这个课题已经是⽐较成熟了,并且在商业中已经有很多落地项⽬了。⽐如:

  • 汉王OCR
  • 百度OCR
  • 阿⾥OCR
  • google translate的拍照识别与⾃动翻译
    其实我们⾃⼰也能感受到,OCR技术确实也在改变着我们的⽣活:
    ⽐如⼀个⼿机APP就能帮忙扫描名⽚、身份证,并识别出⾥⾯的信息汽⻋进⼊停⻋场、收费站都不需要⼈⼯登记了,都是⽤⻋牌识别技术我们看书时看到不懂的题,拿个⼿机⼀扫,APP就能在⽹上帮你找到这题的答案OCR的应⽤在当今时代确实是百花⻬放啊。
    OCR的分类
    如果要给OCR进⾏分类,⼤体可以分为两类:⼿写体识别和印刷体识别。
    这两个可以认为是OCR领域两个⼤主题了,当然印刷体识别较⼿写体识别要简单得多,我们也能从直观上理解,印刷体⼤多都是规则的字体,因为这些字体都是计算机⾃⼰⽣成再通过打印技术印刷到纸上。
    在印刷体的识别上有其独特的⼲扰:在印刷过程中字体很可能变得断裂或者墨⽔粘连,使得OCR识别异常困难。当然这些都可以通过⼀些图像处理的技术帮他尽可能的还原,进⽽提⾼识别率。总的来说,单纯的印刷体识别在业界已经能做到很不错了,但说100%识别是肯定不可能的,但是说识别得不错那是没⽑病。
    印刷体已经识别得不错了,那么⼿写体呢?⼿写体识别⼀直是OCR界⼀直想攻克的难关,但是时⾄今天,感觉这个难关还没攻破,还有很多学者和公司在研究。
    为什么⼿写体识别这么难识别?因为⼈类⼿写的字往往带有个⼈特⾊,每个⼈写字的⻛格基本不⼀样,虽然⼈类可以读懂你写的⽂字,但是机器缺很难。
    那为什么机器能读懂印刷体?因为印刷体是机器造出来的啊,那机器当然能读懂⾃⼰造的字体啦哈哈~其实上⾯也提到了,印刷体⼀般都⽐较规则,字体都基本就那⼏⼗种,机器学习这⼏⼗种字体并不是⼀件难事,但是⼿写体,每个⼈都有⼀种字体的话,那机器该学习多少字体啊?这就是难度所在。
    OCR字符识别技术总览_第1张图片
    如果按识别的内容来分类,也就是按照识别的语⾔的分类的话,那么要识别的内容将是⼈类的所有语⾔(汉语、英语、德语、法语等)。
    如果仅按照我们国⼈的需求,那识别的内容就包括:汉字、英⽂字⺟、阿拉伯数字、常⽤标点符号。根据要识别的内容不同,识别的难度也各不相同。
    简单⽽⾔,识别数字是最简单了,毕竟要识别的字符只有0~9,⽽英⽂字⺟识别要识别的字符有26个(如果算上⼤⼩写的话那就52个),⽽中⽂识别,要识别的字符⾼达数千个(⼆级汉字⼀共6763个)!因为汉字的字形各不相同,结构⾮常复杂(⽐如带偏旁的汉字)如果要将这些字符都⽐较准确地识别出来,是⼀件相当具有挑战性的事情。
    但是,并不是所有应⽤都需要识别如此庞⼤的汉字集,⽐如⻋牌识别,我们的识别⽬标仅仅是数⼗个中国各省和直辖市的简称,难度就⼤⼤减少了。当然,在⼀些⽂档⾃动识别的应⽤是需要识别整个汉字集的,所以要保证识别的整体的识别还是很困难的。
    OCR的流程
    现在就来整理⼀下常⻅的OCR流程,为了⽅便描述,那就举⽂档中的字符识别为例⼦来展开说明吧。
    OCR字符识别技术总览_第2张图片
    假如输⼊系统的图像是⼀⻚⽂本,那么识别时的第⼀件事情是判断⻚⾯上的⽂本朝向,因为我们得到的这⻚⽂档往往都不是很完美的,很可能带有倾斜或者污渍,那么我们要做的第⼀件事就是进⾏图像预处理,做⻆度矫正和去噪。然后我们要对⽂档版⾯进⾏分析,进每⼀⾏进⾏⾏分割,把每⼀⾏的⽂字切割下来,最后再对每⼀⾏⽂本进⾏列分割,切割出每个字符,将该字符送⼊训练好的OCR识别模型进⾏字符识别,得到结果
    但是模型识别结果往往是不太准确的,我们需要对其进⾏识别结果的矫正和优化,⽐如我们可以设计⼀个语法检测器,去检测字符的组合逻辑是否合理。⽐如,考虑单词Because,我们设计的识别模型把它识别为8ecause,那么我们就可以⽤语法检测器去纠正这种拼写错误,并⽤B代替8并完成识别矫正。这样⼦,整个OCR流程就⾛完了。从⼤的模块总结⽽⾔,⼀套OCR流程可以分为:
    版⾯分析 -> 预处理-> ⾏列切割 -> 字符识别 -> 后处理识别矫正
    从上⾯的流程图可以看出,要做字符识别并不是单纯⼀个OCR模块就能实现的(如果单纯的OCR模块,识别率相当低),都要各个模块的组合来保证较⾼的识别率。上⾯的流程分的⽐较粗,每个模块下还是有很多更细节的操作,每个操作都关系着最终识别结果的准确性。做过OCR的童鞋都知道,送⼊OCR模块的图像越清晰(即预处理做的越好),识别效果往往就越好。那现在对这流程中最为重要的字符识别技术做⼀个总结。
    OCR识别⽅法概述
    现在我们只想单纯地想对字符进⾏识别,那⽅法会有哪些呢?我列了⼀下可以采取的策略:
  • 使⽤⾕歌开源OCR引擎Tesseract
  • 使⽤⼤公司的OCR开放平台(⽐如百度),使⽤他们的字符识别API
  • 传统⽅法做字符的特征提取,输⼊分类器,得出OCR模型
  • 暴⼒的字符模板匹配法
  • ⼤杀器:基于深度学习下的CNN字符识别
    上⾯提到的OCR⽅法都有其有点和缺点,也正如此,他们也有各⾃特别适合的应⽤场景。
    ⾸先说开源OCR引擎Tesseract。搞字符识别的童鞋应该都听说过Tesseract这个东⻄,这是⾕歌维护的⼀个OCR引擎,它已经有⼀段相当悠久的历史了。Tesseract现在的版本已经⽀持识别很多种语⾔了,当然也包括汉字的识别。毕竟Tesseract是外国⼈搞得⼀个东⻄,所以在汉字识别的精度上还是不能摆上台⾯,不过还是⾃⼰去改善。但是Tesseract在阿拉伯数字和英⽂字⺟上的识别还是可以的,如果你要做的应⽤是要识别英⽂或者数字,不妨考虑⼀下使⽤Tesseract,毕竟拿来就能得到不错的结果。当然啦,要
    做到你想要的识别率,后期微调或者优化肯定要多下功夫的。
    接下来说⼀下借⽤OCR开放平台做⽂字识别。现在很多⼤公司都开放了OCR的API供开发者调⽤,当然啦,⼩量调⽤是不收费的,但是⼤量调⽤就要收费了。最近我也在百度开放平台上调⽤OCR的API做⼀些识别的⼯作,说实话,在汉字的识别上,我们中国公司的技术还是顶尖的,在汉字识别的准确率上已经让⼈很满意了。⽐如我要识别⼀些⽂本,⾃⼰写个python脚本,调⽤开放平台的服务,返回的就是识别结果了。这种模式有啥不好的地⽅吗?⾸先是需要钱(当然每天⼩批量识别⼀下是不⽤钱的),第⼆是⾃⼰的控制程度不⾜,我们想要提升识别精度,我们不可以从OCR识别上做改进(毕竟别⼈的东⻄,我们改不了),能做只是预处理和后期矫正,能做的还是⽐较有限的。但是,如果⾃⼰不想花⼤量时间做OCR模型并且⼿上有钱的话,这种识别⽅法还是OK的。
    上⾯提到的都是⽤的是别⼈的东⻄,那我们想从头⾃⼰做,咋办?
    那就⾃⼰做吧!先谈⼀谈字符模板那匹配法。暴⼒的字符模板匹配法看起来很蠢,但是在⼀些应⽤上可能却很凑效。⽐如在对电表数字进⾏识别时,考虑到电表上的字体较少(可能就只有阿拉伯数字),⽽且字体很统⼀,清晰度也很⾼,所以识别难度不⾼。针对这种简单的识别场景,我们⾸先考虑的识别策略当然是最为简单和暴⼒的模板匹配法。我们⾸先定义出数字模板(0~9),然后⽤该模板滑动匹配电表上的字符,这种策略虽然简单但是相当有效。我们不需要左思右想去建模,训练模型,只需要识别前做好模板库就可以了。
    OCR字符识别技术总览_第3张图片
    模板匹配法只限于⼀些很简单的场景,但对于稍微复杂的场景,那就不太实⽤了。
    那此时我们可以采取OCR的⼀般⽅法,即特征设计、特征提取、分类得出结果的计算机视觉通⽤的技巧。在深度学习⼤放异彩之前,OCR的⽅法基本都是这种⽅法,其效果嘛,并不算特别好。
    在这⾥简单说⼀下这⾥常⻅的⽅法。
  • 第⼀步是特征设计和提取,特征设计是⼀件很烦⼈的事情,做过模式识别相关项⽬的童鞋也深有体会,我们现在识别的⽬标是字符,所以我们要为字符设计它独有的的特征,来为后⾯的特征分类做好准备。字符有啥特征呢?有结构特征,即字符的端点、交叉点、圈的个数、横线竖线条数等等,都是可以利⽤的字符特征。⽐如“品”字,它的特征就是它有3个圈,6条横线,6条竖线。除了结构特征,还有⼤量⼈⼯专⻔设计的字符特征,据说都能得到不错的效果。
  • 再将这些特征送⼊分类器(SVM)做分类,得出识别结果。
    这种⽅式最⼤的缺点就是,⼈们需要花费⼤量时间做特征的设计,这是⼀件相当费⼯夫的事情。通过⼈⼯设计的特征(例如HOG)来训练字符识别模型,此类单⼀的特征在字体变化,模糊或背景⼲扰时泛化能⼒迅速下降。⽽且过度依赖字符切分的结果,在字符扭曲、粘连、噪声⼲扰的情况下,切分的错误传播尤其突出。针对传统OCR解决⽅案的不⾜,学界业界纷纷拥抱基于深度学习的OCR。
    这些年深度学习的出现,让OCR技术焕发第⼆春。现在OCR基本都⽤卷积神经⽹络来做了,⽽且识别率也是惊⼈的好,⼈们也不再需要花⼤量时间去设计字符特征了。在OCR系统中,⼈⼯神经⽹络主要充当特征提取器和分类器的功能,输⼊是字符图像,输出是识别结果,⼀⽓呵成。当然⽤深度学习做OCR并不是在每个⽅⾯都很优秀,因为神经⽹络的训练需要⼤量的训练数据,那么如果我们没有办法得到⼤量训练数据时,这种⽅法很可能就不奏效了。其次,神经⽹络的训练需要花费⼤量的时间,并且需要⽤到的硬件资源⼀般都⽐较多,这⼏个都是需要考虑的问题。
    OCR的发展
    在⼀些简单环境下OCR的准确度已经⽐较⾼了(⽐如电⼦⽂档),但是在⼀些复杂环境下的字符识别,在当今还没有⼈敢说⾃⼰能做的很好。现在⼤家都很少会把⽬光还放在如何对电⼦⽂档的⽂字识别该怎么进⼀步提⾼准确率了,因为他们把⽬光放在更有挑战性的领域。
    OCR传统⽅法在应对复杂图⽂场景的⽂字识别显得⼒不从⼼,越来越多⼈把精⼒都放在研究如何把⽂字在复杂场景读出来,并且读得准确作为研究课题,⽤学界术语来说,就是场景⽂本识别(⽂字检测+⽂字识别)。
    OCR字符识别技术总览_第4张图片
    从上图可以看出,⾃然场景下的⽂字识别⽐简单场景的⽂字识别实在困难太多了,现在虽然出了很多成果,但是离理想结果还是差很远。
    当然啦,除上⾯的场景⽂字识别外,历史悠久的⼿写体的识别到现在还是⼀件具有挑战的课题,在深度学习的浪潮下,⼿写体的识别已经前进了⼀⼤步,但是尚且没达到印刷体识别那种可以⾼精准度完全商⽤的地步。

你可能感兴趣的:(OCR,人工智能,算法,计算机视觉)