注:此篇内容主要是综合整理了光学字符识别 和OCR技术系列之一】字符识别技术总览,详情见文末参考文献

什么是 OCR?

OCR(Optical Character Recognition,光学字符识别)。简单来说是利用光学技术和计算机技术把印在或写在纸上的文字读取出来,并转换成一种计算机能够接受、人又可以理解的格式。

具体操作过程大致为电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。

文字识别是计算机视觉研究领域的分支之一,而且这个课题已经是比较成熟了,并且在商业中已经有很多落地项目了。比如汉王OCR,百度OCR,阿里OCR等等,很多企业都有能力都是拿OCR技术开始挣钱了。其实我们自己也能感受到,OCR技术确实也在改变着我们的生活:比如一个手机APP就能帮忙扫描名片、身份证,并识别出里面的信息;汽车进入停车场、收费站都不需要人工登记了,都是用车牌识别技术;我们看书时看到不懂的题,拿个手机一扫,APP就能在网上帮你找到这题的答案。

如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。衡量一个OCR系统性能好坏的主要指标有:拒识率、误识率、识别速度、用户界面的友好性,产品的稳定性,易用性及可行性等。

OCR的分类

按字体来源可分为手写体识别和印刷体识别。印刷体大多都是规则的字体,这些字体都是计算机生成再通过打印技术印刷到纸上。在印刷体的识别上有其独特的干扰:在印刷过程中字体很有可能变得断裂或者墨水粘连,使得OCR识别异常困难。但这些可通过一些图像处理的技术尽可能还原,进而提高识别率。

不同的人所写出的手写体都各带风格,不尽相同,因此手写体识别要比印刷体识别困难得多。

如果按识别的内容来分类,也就是按照识别的语言的分类的话,那么要识别的内容将是人类的所有语言(汉语、英语、德语、法语等)。如果仅按照我们国人的需求,那识别的内容就包括:汉字、英文字母、阿拉伯数字、常用标点符号。根据要识别的内容不同,识别的难度也各不相同。简单而言,识别数字是最简单了,毕竟要识别的字符只有0~9,而英文字母识别要识别的字符有26个(如果算上大小写的话那就52个),而中文识别,要识别的字符高达数千个(二级汉字一共6763个)!因为汉字的字形各不相同,结构非常复杂(比如带偏旁的汉字)如果要将这些字符都比较准确地识别出来,是一件相当具有挑战性的事情。但是,并不是所有应用都需要识别如此庞大的汉字集,比如车牌识别,我们的识别目标仅仅是数十个中国各省和直辖市的简称,难度就大大减少了。当然,在一些文档自动识别的应用是需要识别整个汉字集的,所以要保证识别的整体的识别还是很困难的。

软件结构

由于扫描仪的普及与广泛应用,OCR软件只需提供与扫描仪的接口,利用扫描仪驱动软件即可。因此,OCR软件主要是由下面几个部分组成。
 

图像输入、预处理

图像输入:对于不同的图像格式,有着不同的存储格式,不同的压缩方式,目前有OpenCV,CxImage等开源项目 。预处理:主要包括二值化,噪声去除,倾斜较正等

二值化

摄像头拍摄的图片,大多数是彩色图像,彩色图像所含信息量巨大,对于图片的内容,我们可以简单的分为前景与背景,为了让计算机更快的,更好的识别文字,我们需要先对彩色图进行处理,使图片只前景信息与背景信息,可以简单的定义前景信息为黑色,背景信息为白色,这就是二值化图了。

噪声去除

对于不同的文档,我们对噪声的定义可以不同,根据噪声的特征进行去噪,就叫做噪声去除

倾斜较正

由于一般用户,在拍照文档时,都比较随意,因此拍照出来的图片不可避免的产生倾斜,这就需要文字识别软件进行较正

版面分析

将文档图片分段落,分行的过程就叫做版面分析,由于实际文档的多样性,复杂性,因此,目前还没有一个固定的,最优的切割模型

字符切割

由于拍照条件的限制,经常造成字符粘连,断笔,因此极大限制了识别系统的性能,这就需要文字识别软件有字符切割功能

字符识别

这一研究,已经是很早的事情了,比较早有模板匹配,后来以特征提取为主,由于文字的位移,笔画的粗细,断笔,粘连,旋转等因素的影响,极大影响特征的提取的难度

版面恢复

人们希望识别后的文字,仍然像原文档图片那样排列着,段落不变,位置不变,顺序不变,的输出到word文档,pdf文档等,这一过程就叫做版面恢复

后处理、校对

根据特定的语言上下文的关系,对识别结果进行较正,就是后处理

例如,对于钞票来说,做OCR之前首先要知道钞票的面值面向,以及一些例如版本号之类的信息。钞票面向可自行定义,分为横竖,各有4个面向。根据先验知识得知冠字号所在得面向,并结合当前钞票的面向去得到冠字号该面的图像。那应如何得到冠字号所在的该面图像?钞票在进入机器时采集图像会有上下两极传感器,则会有正反两面的图像,其中之一肯定为OCR所在的面向。因此根据第一极传感器判断当前面向,如果不等于先验中所在的面向,取第二极采集的图像即可。

则冠字号所在面向的白光图像就是我们OCR步骤中的输入图像。其中在此之前整张钞票还进行了很多操作,例如对钞票进行鉴伪、检边,找到四条边,根据每两条边的交叉点判断四个角点,得到长宽,进行倾斜校正等等预处理,接着才能进行冠字号的识别。

对于后处理步骤,例如在对文档进行识别时,可以设计语法检测器,检测字符的组合逻辑是否合理。比如,考虑单词Because,我们设计的识别模型把它识别为8ecause,那么我们就可以用语法检测器去纠正这种拼写错误,并用B代替8并完成识别矫正。

识别方法(引用自【OCR技术系列之一】字符识别技术总览

现在我们只想单纯地想对字符进行识别,那方法会有哪些呢?我列了一下可以采取的策略:

  • 使用谷歌开源OCR引擎Tesseract
  • 使用大公司的OCR开放平台(比如百度),使用他们的字符识别API
  • 传统方法做字符的特征提取,输入分类器,得出OCR模型
  • 暴力的字符模板匹配法
  • 大杀器:基于深度学习下的CNN字符识别

上面提到的OCR方法都有其有点和缺点,也正如此,他们也有各自特别适合的应用场景。

开源OCR引擎Tesseract是谷歌维护的一个OCR引擎,它已经有一段相当悠久的历史了。Tesseract现在的版本已经支持识别很多种语言了,当然也包括汉字的识别。毕竟Tesseract是外国人搞得一个东西,所以在汉字识别的精度上还是不能摆上台面,不过还是自己去改善。但是Tesseract在阿拉伯数字和英文字母上的识别还是可以的,如果你要做的应用是要识别英文或者数字,不妨考虑一下使用Tesseract,毕竟拿来就能得到不错的结果。当然啦,要做到你想要的识别率,后期微调或者优化肯定要多下功夫的。

接下来说一下借用OCR开放平台做文字识别。现在很多大公司都开放了OCR的API供开发者调用,小量调用是不收费的,但是大量调用就要收费了。最近我也在百度开放平台上调用OCR的API做一些识别的工作,说实话,在汉字的识别上,我们中国公司的技术还是顶尖的,在汉字识别的准确率上已经让人很满意了。比如我要识别一些文本,自己写个python脚本,调用开放平台的服务,返回的就是识别结果了。这种模式有啥不好的地方吗?首先是需要钱(当然每天小批量识别一下是不用钱的),第二是自己的控制程度不足,我们想要提升识别精度,我们不可以从OCR识别上做改进(毕竟别人的东西,我们改不了),能做只是预处理和后期矫正,能做的还是比较有限的。但是,如果自己不想花大量时间做OCR模型并且手上有钱的话,这种识别方法还是OK的。

上面提到的都是用的是别人的东西,那我们想从头自己做,咋办?

那就自己做吧!先谈一谈字符模板匹配法。暴力的字符模板匹配法看起来很蠢,但是在一些应用上可能却很凑效。比如在对电表数字进行识别时,考虑到电表上的字体较少(可能就只有阿拉伯数字),而且字体很统一,清晰度也很高,所以识别难度不高。针对这种简单的识别场景,我们首先考虑的识别策略当然是最为简单和暴力的模板匹配法。我们首先定义出数字模板(0~9),然后用该模板滑动匹配电表上的字符,这种策略虽然简单但是相当有效。我们不需要左思右想去建模,训练模型,只需要识别前做好模板库就可以了。

模板匹配法只限于一些很简单的场景,但对于稍微复杂的场景,那就不太实用了。那此时我们可以采取OCR的一般方法,即特征设计、特征提取、分类得出结果的计算机视觉通用的技巧。在深度学习大放异彩之前,OCR的方法基本都是这种方法,其效果嘛,并不算特别好。在这里简单说一下这里常见的方法。第一步是特征设计和提取,特征设计是一件很烦人的事情,做过模式识别相关项目的童鞋也深有体会,我们现在识别的目标是字符,所以我们要为字符设计它独有的的特征,来为后面的特征分类做好准备。字符有啥特征呢?有结构特征,即字符的端点、交叉点、圈的个数、横线竖线条数等等,都是可以利用的字符特征。比如“品”字,它的特征就是它有3个圈,6条横线,6条竖线。除了结构特征,还有大量人工专门设计的字符特征,据说都能得到不错的效果。最后再将这些特征送入分类器(SVM)做分类,得出识别结果。这种方式最大的缺点就是,人们需要花费大量时间做特征的设计,这是一件相当费工夫的事情。通过人工设计的特征(例如HOG)来训练字符识别模型,此类单一的特征在字体变化,模糊或背景干扰时泛化能力迅速下降。而且过度依赖字符切分的结果,在字符扭曲、粘连、噪声干扰的情况下,切分的错误传播尤其突出。针对传统OCR解决方案的不足,学界业界纷纷拥抱基于深度学习的OCR。

这些年深度学习的出现,让OCR技术焕发第二春。现在OCR基本都用卷积神经网络来做了,而且识别率也是惊人的好,人们也不再需要花大量时间去设计字符特征了。在OCR系统中,人工神经网络主要充当特征提取器和分类器的功能,输入是字符图像,输出是识别结果,一气呵成。当然用深度学习做OCR并不是在每个方面都很优秀,因为神经网络的训练需要大量的训练数据,那么如果我们没有办法得到大量训练数据时,这种方法很可能就不奏效了。其次,神经网络的训练需要花费大量的时间,并且需要用到的硬件资源一般都比较多,这几个都是需要考虑的问题。

OCR的发展

在一些简单环境下OCR的准确度已经比较高了(比如电子文档),但是在一些复杂环境下的字符识别,在当今还没有人敢说自己能做的很好。现在大家都很少会把目光还放在如何对电子文档的文字识别该怎么进一步提高准确率了,因为他们把目光放在更有挑战性的领域。OCR传统方法在应对复杂图文场景的文字识别显得力不从心,越来越多人把精力都放在研究如何把文字在复杂场景读出来,并且读得准确作为研究课题,用学界术语来说,就是场景文本识别(文字检测+文字识别)。

从上图可以看出,自然场景下的文字识别比简单场景的文字识别实在困难太多了,现在虽然出了很多成果,但是离理想结果还是差很远。

当然啦,除上面的场景文字识别外,历史悠久的手写体的识别到现在还是一件具有挑战的课题,在深度学习的浪潮下,手写体的识别已经前进了一大步,但是尚且没达到印刷体识别那种可以商用的地步,所以啊,OCR的研究还得不断地进行下去。

参考:

[1] 光学字符识别,百度百科

[2] 【OCR技术系列之一】字符识别技术总览

 

 

【OCR技术系列一】光学字符识别技术介绍的更多相关文章

  1. 【OCR技术系列之一】字符识别技术总览

    最近入坑研究OCR,看了比较多关于OCR的资料,对OCR的前世今生也有了一个比较清晰的了解.所以想写一篇关于OCR技术的综述,对OCR相关的知识点都好好总结一遍,以加深个人理解. 什么是OCR? OC ...

  2. [Xcode 实际操作]七、文件与数据-(22)使用OCR光学字符识别技术识别银行卡号码

    目录:[Swift]Xcode实际操作 本文将演示如何使用光学字符识别技术,识别信用卡上的卡号. OCR技术是光学字符识别的缩写(Optical Character Recognition), 是通过 ...

  3. 【OCR系列之一】字符识别技术总览

    最近入坑研究OCR,看了比较多关于OCR的资料,对OCR的前世今生也有了一个比较清晰的了解.所以想写一篇关于OCR技术的综述,对OCR相关的知识点都好好总结一遍,以加深个人理解. 什么是OCR? OC ...

  4. OCR (光学字符识别技术)安装

    一.安装homebrew 1)打开终端直接输入安装命令:     /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.c ...

  5. 🏆【Alibaba中间件技术系列】「Sentinel技术专题」分布式系统的流量防卫兵的基本介绍(入门源码介绍)

    推荐资料 官方文档 官方demo Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护 ...

  6. 🏆【Alibaba中间件技术系列】「RocketMQ技术专题」Broker配置介绍及发送流程、异常(XX Busy)问题分析

    参考资料 Rocketmq官网:http://rocketmq.apache.org/ Rocketmq的其它项目:https://github.com/apache/rocketmq-externa ...

  7. 🏆【Alibaba工具型技术系列】「EasyExcel技术专题」摒除OOM!让你的Excel操作变得更加优雅和安全

    前提概要 针对于后端开发者而言的,作为报表的导入和导出是一个很基础且有很棘手的问题!之前常用的工具和方案大概有这么几种: JXL(Java Excel API 工具服务),此种只支持xls的文件格式, ...

  8. 🏆【Alibaba中间件技术系列】「RocketMQ技术专题」系统服务底层原理以及高性能存储设计分析

    设计背景 消息中间件的本身定义来考虑,应该尽量减少对于外部第三方中间件的依赖.一般来说依赖的外部系统越多,也会使得本身的设计越复杂,采用文件系统作为消息存储的方式. RocketMQ存储机制 消息中间 ...

  9. 🏆【Alibaba中间件技术系列】「Nacos技术专题」配置中心加载原理和配置实时更新原理分析(上)

    官方资源 https://nacos.io/zh-cn/docs/quick-start.html Nacos之配置中心 动态配置管理是 Nacos的三大功能之一,通过动态配置服务,可以在所有环境中以 ...

随机推荐

  1. 【OPPO主题制作系列 - 01】-- 写个小工具自动打包Theme文件

    参考OPPO主题设计师站: http://dev.theme.oppomobile.com/user/user_start 想要打包成Theme文件,必须把需要打包的文件夹拖到oppo-themepa ...

  2. Activiti-5.3工作流引擎-源码解析(流程文档解析)

    前面我们通过BPMN20.xsd和Activiti自定义的XML Schema文件初步了解了业务流程模型的定义,那么现在我们来了解一下流程文档的解析过程,这个过程主要是通过代码解析来完成. 代码解析过 ...

  3. Java SpringMVC实现PC端网页微信扫码支付完整版

    一:前期微信支付扫盲知识 前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现.其实在你申请成功支付功能之后,微 ...

  4. 【Nginx】负载均衡

    本文介绍的负载均衡是针对的客户端请求在多个Nginx进程之间的均衡.注意与客户端请求在多个后端服务器之间的均衡相区别. 负载均衡问题的产生 在nginx中,建立连接的时候,会设计负载均衡问题.在多个子 ...

  5. Ansible 详细用法说明(一)

    一.概述 运维工具按需不需要有代理程序来划分的话分两类: agent(需要有代理工具):基于专用的agent程序完成管理功能,puppet, func, zabbix agentless(无须代理工具 ...

  6. hdu 5087 Revenge of LIS II ( LIS ,第二长子序列)

    链接:hdu 5087 题意:求第二大的最长升序子序列 分析:这里的第二大指的是,全部的递增子序列的长度(包含相等的), 从大到小排序后.排在第二的长度 cid=546" style=&qu ...

  7. protobuf 之 MessageLite 接口摘录

    class LIBPROTOBUF_EXPORT MessageLite { public: inline MessageLite() {} virtual ~MessageLite(); // Ba ...

  8. iOS用户体验之-modal上下文

    iOS用户体验之-modal上下文 何为模态视图,它的作用时聚焦当前.获得用户的注意,用户仅仅有完毕模态的任务才 退出模态视图.否则你将不能运行app的任务,比如,alert view,model v ...

  9. 打造极致性能数据库中间件丨LVS+Keepalive+华为云DDM之理论篇

    背景说明 华为云分布式数据库中间件(Distributed Database Middleware,简称DDM),专注于解决数据库分布式扩展问题,突破了传统数据库的容量和性能瓶颈,实现海量数据高并发访 ...

  10. android真机调试 INSTALL_FAILED_MEDIA_UNAVAILABLE 问题解决方案

    前提是手机用数据线连到电脑,安装好手机对应的驱动. 1:打开cmd 2:cd切换到sdk安装目录的platform-tools目录,比如我安装到了D盘根目录,则输入: cd d:\android-sd ...