本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5809b...
Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是经过审核的移动开发工程师。每周都会举行嘉宾分享,话题讨论等活动。
本期,我们邀请了 腾讯 TEG 技术工程师“文亚飞”,为大家分享《深度学习在OCR中的应用》。
大家好,我是文亚飞,来自腾讯TEG,目前负责图像识别相关的工作。OCR(光学字符识别)旨在从图片中检测和识别文字信息,本次分享将介绍我们在OCR技术研发过程中的一些方法和经验总结。
一,OCR背景及基本框架介绍
OCR技术从上世纪60年代就开始得到重视和研究,开源OCR框架Tesseract[14]始于1985年,至今仍在不断迭代和优化。从早期的通用扫描文档识别(谷歌数字图书馆,ABBYY,汉王,文通等),到银行卡/身份证/金融票据等证件识别(百度,微信,支付宝)以及车牌识别,OCR在业界也积累了非常多的宝贵经验。针对不同的应用场景,OCR所用到的方法也会有所不同。
我们这里将主要分享在通用图片下的文字检测与识别。
我们把通用图片分为两类,字迹清晰背景单一的简单图文和字迹模糊背景多变的复杂图文。
上图分别对应简单图文和复杂图文
复杂图文的文字检测和识别压力很大,非常具有挑战性
这是一般的OCR框架流程图,基于一般的ceiling analysis,文字检测和文字识别是最具挑战也是能够最大程度提升整体框架表现的两个主要模块。
传统方法大都需要依靠手动提取特征来训练检测模型和识别模型,由于底层特征与高层语义之间特有的语义鸿沟,当应对多类字体变化以及复杂背景干扰的时候,单一的特征选择或分类器的调优就显得相形见绌了。卷积神经网络LeNet-5第一次在mnist手写数字识别上得到成功的应用,而近些年随着计算硬件成本的降低以及几项深度学习关键技术的突破,AlexNet、VGG、GoogleNet、ResNet等在imageNet、LFW上取得了令人傲娇的表现,开启了深度学习在大规模数据训练和学习的浪潮。
针对OCR传统手法在应对复杂图文场景的不足,我们对文字检测和文字识别这两个关键步骤结合深度学习进行研究与开发。
二、文字检测
下图是2000张人脸、行人、文字的average image
从上图可以看到,不同于人脸和行人,文字的均值图更像是一种噪声,其组成部位即无固定位置,数量也不固定。这表明文字检测并不能简单的借用人脸/行人检测等常用目标检测框架,一步到位的由图像得到文字区域标定的端到端方法很有压力。
通常,一般的文字检测方法可以分为两类:
基于滑动窗口全图扫描的自上而下的方式。对每个滑动窗口基于HOG、Gabor、LBP、Haar等纹理特征训练Adaboost,SVM,MLP等二类分类器得到文字区域的概率响应值,然后再利用camshift或连通域分析结合形态学等操作定位最终的文字框。该方法对分类器的要求很高,要求能应对各种字体和背景的形式,即便是基于CNN来训练检测模型,大量的扫描滑动窗口对性能耗损十分严重,不适合对性能要求较高的大数据应用场景。
基于底层规则先分割得到小区域再组合成文字区域的自底而上的方式。通常这类方法利用文字颜色、亮度、边缘信息进行聚类的方式来快速分离文字区域与非文字区域,而以MSER和SWT为代表的连通域分析方法在自然场景文字检测中表现优异,在获得高鲁棒性的同时性能也比滑动窗口的形式提高不少。
我们首先基于MSER(最大稳定极值区域)的方法来设计我们的检测方案,如下图。
由于MSER基于分水岭迭代的方式来寻找候选框,能有效提取候选文字区域的同时也容易产生非常多的非文字区域。MSER产生的干扰区域往往跟文字享有类似的纹理特征(如窗户,草地,头发等),我们需要强有力的分类器来滤除干扰。SVM/adaboost等传统手法往往基于人工设计特征训练分类器,很难适应复杂多变场景。
由于过检测模型是候选框数量很大,为了降低性能损耗需要把网络设计得尽可能简单,我们借鉴MNIST的LeNet-5网络来构建一个精简的CNN二分类检测模型。
上图是我们的检测结果示例
三、文字识别
早先的传统文字识别手法基本都采用基于模板匹配的方式,对特征描述要求非常苛刻,很难满足复杂场景下的识别任务。深度学习抛弃了传统人工设计特征的方式,利用海量标定样本数据以及大规模GPU集群的优势让机器自动学习特征和模型参数,能一定程度上弥补底层特征与高层语义之间的不足。近些年深度学习在人脸识别、目标检测与分类中达到了前所未有的高度,也开启了深度学习在文字分类的新浪潮。
Google在photoOCR中设计了一套基于HOG特征作为输入的5层CNN网络作为OCR识别模型,该套系统在Google多项产品中得到成功的应用。Goodfellow等人第一次提出用Maxout作为非线性激活单元来构建CNN模型学习通用特征,并随后在文字分类上取得了state-of-the-art的结果。
我们参考Maxout网络模型基于caffe来构建我们的OCR识别模型
在识别网络训练环节,卷积神经网络要识别这类复杂多变的文字,首先面临的挑战就是如何获取足够多的符合多样性的训练样本。只有让训练样本满足字体、颜色、背景等的多样性才能保证训练出符合业务需求的ocr识别网络。
以下我们的OCR方法识别结果示例
四,业界
ABBYY与汉王类似,更擅长于扫描文档转PFD作业。
而通用场景文字识别,OCR作为图像识别领域非常经典也非常有挑战的研究课题,百度、微软、Google都有强大的研究团队进行研发,也都取得了非常不错的进展。
今天的分享就到此结束了,谢谢大家,欢迎大家一起探讨交流。
互动问答
Q1:这些技术客户端上有应用吗,效果如何?
我们基础研究这边只负责技术员研发,目前主要用在部门内部需求,尚未对外输出。
Q2:想问一下OCR有没有针对中文繁体字异体字方面的识别技术?在古籍整理方面应该会有比较大的应用
我们目前是支持繁体的,如果要支持其他异体字,只要准备相应的训练集即可。
Q3:请问一下有没有比较轻量级的开源OCR库供app集成,主要使用场景是用于通过卡片图像识别卡号
我们目前的应用场景是大数据业务,对性能要求很高。识别卡号这种具体也许场景一般会做相应的调整,检测可以利用卡号的位置等信息,如果识别的字体比较单一,可以精简训练集,训练一个相对轻量级的识别网络。
Q4:就识别银行卡这个功能,要怎么去做?这知识点是哪方面的?
银行卡和身份证这种属于特定也许场景下的识别,相对本文介绍的通用图片识别压力要小很多。参考问题3的回答
Q5:亚飞老师好,通用场景中要面临不同的环境,比如在移动端应用的OCR技术,在处理不同噪声,模糊,光照不均等情形时,有什么处理经验可借鉴和分享么?
关键是要准备充足的字符训练集,可以根据字符前景和背景生成多个灰度值对,使得训练样本更加丰富
Q6:OCR识别二维码,需要怎么去做?
本次分享的这套OCR技术应该难以应对二维码的识别,可以旋转字体,加干扰,艺术字体,对抗性太强,识别和检测的压力都很大
Q7:识别网络的训练样本大概是多少量级?准确率如何?
训练样本在千万级别,业务场景的识别率在95%以上
Q8:看上面的那个图,对有地图,或者有背景水印的图片. OCR 还是很吃力。主要是文字检测阶段是不是?微信里面的街景扫描原理是怎样的?谢谢!
对,场景文字识别最难的还是文字检测,背景干扰,文字对比度弱等情况下很容易漏检。前面提过,只要训练样本足够,识别基本不会有什么问题的。微信的街景扫描没有体验过。自然场景的文字识别一直是业内挑战最高的一个课题,目前基于深度学习在这方面的研究很多,到工业界还没有非常成熟的算法,百度和google是业界最好的。
Q9:当面对不同背景和图像畸变时,你们一般会如何应对,更倾向于在预处理缓解规范化,还是在训练样本中加入多样化的样本?
后者。不过检测到整行文字倾斜是可以考虑先做方向矫正再送识别。
Q10:能用来识别车牌吗?考虑对车牌拍摄时的光照,角度等因素。
可以。不过车牌的检测算法很成熟了,可以先检测到车牌,做方向矫正后再送识别。车牌银行卡这种文字类别相对很少,不到100个,一般传统的模板匹配的方法也可以达到比较好的效果。而本文介绍的通用图片的文字识别需要应对6000多个汉字还有英文数字等,对网络的要求更高
Q11:问题:除了基于CNN的识别方法,有没有尝试过其他的深度学习算法。比如RNN,是否对于粘连字符和英文的识别效果会更好?
我们目前是做字符切割之后再送识别,切割对中英文混排压力很大。后续会考虑用基于RNN的LSTM来做整行识别,能避免切割,问题是将会对性能产生影响。
Q12:锤子发布的 big bang,他的检测很精确,尤其对文字语句,段句这块。现场展示将一段化学元素和语句成功段开,对于这个的原理,能解释下吗?这个您对它怎么看?谢谢!
锤子的big bang个人理解跟OCR不大相关。手机应该是可以直接从聊天记录获得文本,不需要从图像里去检测和识别文字,主要涉及到的是NIL方向的算法,比如分词。
更多精彩内容欢迎关注bugly的微信公众账号:
腾讯 Bugly是一款专为移动开发者打造的质量监控工具,帮助开发者快速,便捷的定位线上应用崩溃的情况以及解决方案。智能合并功能帮助开发同学把每天上报的数千条 Crash 根据根因合并分类,每日日报会列出影响用户数最多的崩溃,精准定位功能帮助开发同学定位到出问题的代码行,实时上报可以在发布后快速的了解应用的质量情况,适配最新的 iOS, Android 官方操作系统,鹅厂的工程师都在使用,快来加入我们吧!