这款神秘的移动端OCR引擎,如何做到“所见即所得”?

4次阅读

共计 3545 个字符,预计需要花费 9 分钟才能阅读完成。

阿里妹导读:随着深度学习,尤其是 CNN 和 RNN 等技术的飞速发展,文字识别技术 (OCR) 近几年得到了迅速的提升。与此同时,在智能化终端的大趋势下,本地化智能识别凭借更高效快捷的体验以及高度的隐私保护和零流量消耗等优势备受瞩目和亲睐,越来越多的应用算法开始倾向终端化完成,OCR 也不例外。接下来,蚂蚁金服的算法专家亦弦为我们剖析这个轻量而精准的移动端 OCR 引擎——xNN-OCR。

背景及概述
移动端 OCR 的优势
受算法效率和算法模型大小的限制和约束,目前大部分的 OCR 端上应用都是上传图片到服务端识别再将识别结果回传到客户端。虽然满足了部分业务需求,但一方面,对一些实效性要求较高的业务场景来说用户体验无疑是一个巨大的损失,尤其是弱网环境下。另一方面,在面临大促业务并发请求量过大的情况下,服务端不得不采用降级方案,而如果端上也具备识别能力的话,便可以极大地减少服务端的压力。此外,涉及到身份证、银行卡等重要私人证件采用 OCR 进行信息提取的时候,端上“识完即焚”这种方式,对这种敏感数据和隐私保护来说是天然的堡垒。因此,具备终端 OCR 识别能力有着极其重要的业务价值和意义。
移动端 OCR 的难点
OCR 采用深度学习技术使得识别精度在特定的场景下面有了一定的保障,但模型大小和速度问题在端上依然是一大难题。目前大部分的后台 OCR 模型通常几十 M 或者上百 M,可能比整个 App 安装包都要大,是不可能直接放到移动端的,而如果走实时下载的办法,模型过大也会造成下载失败率高、等待时间长、App 占用空间大、流量消耗大等问题。另外,现在很多 OCR 算法在云端 GPU 上运行尚且需要几十到上百毫秒,要在手机 CPU 上保持较高的运行效率是一个极大的挑战。
我们做了什么?——xNN-OCR
xNN-OCR 是专门针对移动端本地识别研发的的高精度、高效率、轻体量文字识别引擎,目前支持场景数字、场景英文、场景汉字以及特殊符号的识别。xNN-OCR 针对移动端开发和优化了一套基于深度学习的文字检测和文字行识别算法框架,结合 xNN 的网络压缩和加速能力,检测和识别模型可以压缩到数百 K 级别,在中端及以上手机 CPU 上达到实时(最高 15FPS),可结合“扫一扫”的模式在视频流中做到所见即所得。
移动端 OCR 识别技术
移动端 OCR 技术主要分为二个方面,一是 OCR 算法框架的研究和优化,主要目标是探索高精度且轻量级的检测和识别框架,确保在压缩之前模型的大小和速度在一个适当的范围以内,二是利用 xNN 对模型进行剪枝和量化压缩到实际应用需要的大小。下图是我们以银行卡检测和识别模型为例子展示整个压缩流程精度和模型的变化,其他 OCR 场景识别均是类似流程。

轻量级 OCR 算法框架的探索
目前大部分的移动端 OCR 技术都是以传统算法为主,在复杂自然场景下识别率相对较低,而基于深度学习的方案可以很好的解决这一类问题,识别率和稳定性远超传统算法。目前主流的深度学习 OCR 主要分为文字行检测和行识别两大块,下面我们分别介绍下:
文字行检测
在检测方面,我们将物体检测的 Region-CNN 框架与 FCN 的图像分割框架融合在一起,保留了 FCN 的简单框架以适应端上对模型尺寸和预测时间的要求,同时又在模型中加入了目标检测的位置回归模块,实现了对任意形状文本的检测能力。在基于 FCN 的整体框架中,为了在精简模型的同时不降低检测效果,我们采用了各种模型精简结构(例如 Separable Convolution、Group Convolution + Channel Shuffle 等,如下图),模型的尺寸虽然不断减小,精度并未随之下降, 在满足端上对模型的苛刻限制的同时取得了较好的检测效果。

文字行识别
在识别方面,我们在 CRNN(CNN+LSTM+CTC)框架基础上进行了优化改进,在 Densenet 的基础上结合 Multiscale Feature、Channel-wise Attention 等技术设计出了一套专门用于移动端文字行识别的轻量级 CNN 网络,同时对 LSTM 内部参数采用 Project 技术、全连接层采用 SVD、BTD 等降维技术进一步减少参数数量 (如下图),在 ICDAR2013 数据集(NOFINETUNE) 上,模型大小下降约 50% 的前提下识别率高出 CRNN 近 4 个点,这一改进优化点为上端打下了强有力的基础。

xNN 模型压缩
目前我们的 OCR 算法模型都是基于 tensorflow 开发的,xNN 已经增加了对 TFLite 模型的支持,并且在性能上已经远超 TFLite。xNN 对于我们 OCR 算法的模型压缩比在 10-20 倍之间,不同的场景稍微有些区别,与此同时,压缩后模型的精度基本保持不变。由于 OCR 是一个较复杂的识别任务,算法模型通常都非常大,并且目前大部分的后台 OCR 算法都是在 GPU 上运行,要想在端上运行,除了需要在算法层次上做很多优化外,更需要 xNN 强大的模型压缩和加速能力。
移动端 OCR 应用
OCR 技术是信息提取和场景理解极其重要的技术手段之一,应用领域非常广泛。目前移动端本地 OCR 应用从技术角度可以分为 2 大类,一类是印刷体文字识别,主要是针对字体变化不大、背景单一的场景,例如身份证识别、名片识别、车牌识别等等,另一类是场景类文字识别,主要是针对字体变化大且背景复杂的场景,例如银行卡识别、燃气表 / 水表识别、门头名识别、场景英文识别(AR 翻译)等等,这两类场景中后者识别难度较大,面临的挑战性更多。我们将 xNN-OCR 用于这些场景并根据场景的特点做了各种优化,取得了一系列的成果,特别是在复杂环境下面识别依然可以保持高效和精准,具体的数据如下表。下面简介了几个比较重要和常见的应用场景。

银行卡识别:银行卡识别是金融类行业非常重要的一项技术,是场景数字类识别的一个典型代表。目前大部分银行卡识别均是采用端上识别的方案,因为端上识别不仅能带来更好更快的体验,同时由于不需要数据上传也能一定程度保护用户的隐私数据。基于 xNN-OCR 开发的银行卡识别在中端手机上耗时 <300ms,大部分银行卡都是秒识别。此外,在面对复杂背景以及复杂环境干扰的时候,xNN-OCR 在识别速度和精度上均展现了非常明显的优势。
燃气表识别:通过 OCR 识别燃气表读数是目前燃气自助抄表中的一项关键性技术,相比于传统上门抄表,一方面可以节省很大的人力物力,避免上门抄表带来的麻烦,另外一方面也可以减少漏抄、误抄等问题。目前已经有很多燃气公司已经开始应用这一项技术,但实际应用过程中,由于燃气表的位置有时候比较隐蔽,拍摄角度和光照难以控制,通常一般的用户拍照上传到后台识别的图片质量都比较差,识别率偏低。xNN-OCR 在端上完成整套识别流程,通过识别反馈引导用户拍摄,可较大程度的提升识别率,在与一家燃气公司的合作中,我们测试识别率可以达到 93%+,模型尺寸可保持在 500k 以内,识别成功耗时 <1s。
车牌 /VIN 码识别:车牌 /VIN 码识别是传统印刷体类文字应用的一个经典场景,在移动警务、车辆维修定损等日常场景中起着非常重要的作用。由于车牌 /VIN 码识别在实际应用中可能同时需要,为了避免交互流程上的繁琐以及端上 2 套算法模型过大,xNN-OCR 将车牌和 VIN 码这 2 个场景识别合二为一,模型尺寸依然 <500k,在中端手机上识别成功耗时 <1s,并且对光照、模糊、拍摄角度等干扰因素不敏感,同时由于端上可以反复识别寻求置信度最高的结果作为最终结果,所以相对于后台识别“一锤子买卖”而言,在识别精度上会更胜一筹。
身份证识别:身份证识别也是金融类行业非常重要的一项技术,在实名认证、安全审核等场景起着非常重要的作用,但由于中文汉字字库较大,导致模型较大,目前大部分的身份证识别均采用的是服务端识别,但由于端侧质量难以控制,往往会导致体验和精度上面难以均衡。xNN-OCR 在大字库中文识别方面也作出了一些突破,整体模型小于 1M,在端侧用单字识别信度控制识别精度,避免了对图片质量判断的依赖,通过多帧融合提升识别效率,单次识别中端手机上 <600ms,识别成功 <2s。

展望
xNN-OCR 目前在端上已经能较好的识别场景数字、英文以及部分汉字,无论是模型大小、速度、准确度均已达到工业应用的水平,并且全面超过基于传统算法识别的 OCR 端上应用,在多个实际应用项目中对比得以验证。另外,我们在端上全量 7000 多类汉字识别上也做出了一些成果,在不久的将来会分享出来,欢迎有兴趣的同学来一起研究和探讨。
我们坚信,随着深度学习的移动端化逐步增强和移动硬件设备的逐步升级,终端智能化的应用与业务将会越来越多,未来 xNN-OCR 必将会给 OCR 相关的业务带来更深远的影响和更高的价值。

本文作者:亦弦阅读原文
本文来自云栖社区合作伙伴“阿里技术”,如需转载请联系原作者。

正文完
 0