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

阿里妹导读:随着深度学习,尤其是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等,如下图),模型的尺寸虽然不断减小,精度并未随之下降,在满足端上对模型的苛刻限制的同时取得了较好的检测效果。


Group Convolution + Channel Shuffle

文字行识别

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

LSTM Projection

xNN模型压缩

目前我们的OCR算法模型都是基于tensorflow开发的,xNN已经增加了对TFLite模型的支持,并且在性能上已经远超TFLite。xNN对于我们OCR算法的模型压缩比在10-20倍之间,不同的场景稍微有些区别,与此同时,压缩后模型的精度基本保持不变。由于OCR是一个较复杂的识别任务,算法模型通常都非常大,并且目前大部分的后台OCR算法都是在GPU上运行,要想在端上运行,除了需要在算法层次上做很多优化外,更需要xNN强大的模型压缩和加速能力。

移动端OCR应用

OCR技术是信息提取和场景理解极其重要的技术手段之一,应用领域非常广泛。目前移动端本地OCR应用从技术角度可以分为2大类,一类是印刷体文字识别,主要是针对字体变化不大、背景单一的场景,例如身份证识别、名片识别、车牌识别等等,另一类是场景类文字识别,主要是针对字体变化大且背景复杂的场景,例如银行卡识别、燃气表/水表识别、门头名识别、场景英文识别(AR翻译)等等,这两类场景中后者识别难度较大,面临的挑战性更多。我们将xNN-OCR用于这些场景并根据场景的特点做了各种优化,取得了一系列的成果,特别是在复杂环境下面识别依然可以保持高效和精准,具体的数据如下表。下面简介了几个比较重要和常见的应用场景。

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相关的业务带来更深远的影响和更高的价值。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

想要AI优先?数据优先才行

戳蓝字“CSDN云计算”关注我们哦&#xff01;来源 | forbes编译 | shawn责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09; 开展人工智能和机器学习项目的人很早就知道&#xff0c;机器学习项目不是应用程序开发项目。机器学习项目的大部分价值在…

Cloud Toolkit 部署应用到阿里云轻量应用服务器

在之前的文章《在 Intellij IDEA 中部署 Java 应用到 阿里云 ECS》中讲解了如何将一个本地应用部署到阿里云 ECS 上去&#xff0c;有些读者反馈目前正在使用阿里云轻量应用服务器&#xff0c;咨询是否可以通过 Cloud Toolkit 插件将应用部署到这些服务器上去&#xff1f;最新版…

springboot 排除 默认的loggback 和slf4j的依赖

文章目录异常现象&#xff1a;解决方案&#xff1a;总结异常现象&#xff1a; SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/D:/Program%20Files/JavaEclipse/repo/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.…

Node.js 应用故障排查手册 —— Node.js 性能平台使用指南

楔子 前一节中我们借助于 Chrome devtools 实现了对线上 Node.js 应用的 CPU/Memory 问题的排查定位&#xff0c;但是在实际生产实践中&#xff0c;大家会发现 Chrome devtools 更加偏向本地开发模式&#xff0c;因为显然 Chrome devtools 不会负责去生成分析问题所需要的 Dum…

懂编译真的可以为所欲为|不同前端框架下的代码转换

背景 整个前端领域在这几年迅速发展&#xff0c;前端框架也在不断变化&#xff0c;各团队选择的解决方案都不太一致&#xff0c;此外像小程序这种跨端场景和以往的研发方式也不太一样。在日常开发中往往会因为投放平台的不一样需要进行重新编码。前段时间我们需要在淘宝页面上…

面试稳了!网易资深工程师揭秘运维面经!

作者 | 阿文责编 | 伍杏玲出品 | 程序人生&#xff08;ID&#xff1a;coder_life&#xff09;受新型冠状病毒影响&#xff0c;很多企业都推迟了复工时间或集体开始远程办公&#xff0c;而一些企业本来计划春节过后开始春季招聘&#xff0c;但是受疫情影响已做出了调整&#xff…

java.lang.NumberFormatException: null

public static void main(String[] args) {String str null;try {int a Integer.parseInt(str);} catch (NumberFormatException e) {e.printStackTrace();}}

Pick!闲鱼亿级商品库中的秒级实时选品

一、业务背景 在电商运营工作中&#xff0c;营销活动是非常重要的部分&#xff0c;对用户增长和GMV都有很大帮助。对电商运营来说&#xff0c;如何从庞大的商品库中筛选出卖家优质商品并推送给有需要的买家购买是每时每刻都要思索的问题&#xff0c;而且这个过程需要尽可能快和…

一文看懂Microsoft Azure的十年变迁

来源 | forbes编译 | 火火酱责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;当微软前首席软件架构师雷奥兹&#xff08;Ray Ozzie&#xff09;在2008年的PDC大会上发布Windows Azure时&#xff0c;没人能预估这个软件平台将会为该公司和整个行业…

74HC595

脚位图及说明 管脚说明&#xff1a; 14脚&#xff1a;DS&#xff08;SER&#xff09;&#xff0c;串行数据输入引脚 13脚&#xff1a;OE&#xff0c;输出使能控制脚&#xff0c;它是低电才使能输出&#xff0c;所以接GND 12脚&#xff1a;RCK&#xff08;STCP&#xff09;&…

UI2Code智能生成Flutter代码——机器生成代码

背景 在《UI2CODE--整体设计》篇中&#xff0c;我们提到UI2Code工程的整体流程。前步图片分析之后&#xff0c;我们可以得到对应的DSL布局描述。利用DSL的资讯&#xff0c;结合IntelliJ Plugin介面工具&#xff0c;面向使用者提供生成对应Flutter代码。 本篇主要介绍我们如何…

初始化java工具失败,“初始化 Java 工具”期间发生了内部错误, java.lang.NullPointerException...

今天刚打开eclipse就报了这个错误&#xff0c;我怀疑是昨晚想关电脑的时候&#xff0c;关闭eclipse太快&#xff0c;没有等待工作空间保存就关了电脑的缘故错误如图&#xff1a;(图片来自下方链接博客&#xff0c;因为忘记截图了) 我百度后按照提示&#xff0c;删除了eclipse工…

Node.js 应用故障排查手册 —— 正确打开 Chrome devtools

楔子 前面的预备章节中我们大致了解了如何在服务器上的 Node.js 应用出现问题时&#xff0c;从常规的错误日志、系统/进程指标以及兜底的核心转储这些角度来排查问题。这样就引出了下一个问题&#xff1a;我们知道进程的 CPU/Memory 高&#xff0c;或者拿到了进程 Crash 后的核…

钉钉流量暴增百倍,阿里云抗住了!

2月12日&#xff0c;钉钉已连续在苹果应用商店霸榜7天。记者采访获悉&#xff0c;春节以来&#xff0c;在家办公及在家上课的强需求&#xff0c;使得钉钉后台系统峰值流量暴增百倍。钉钉通过阿里云连续扩容10万台云服务器&#xff0c;成功抗住这一巨大的流量冲击&#xff01; 2…

PB 级数据处理挑战,Kubernetes如何助力基因分析?

引言 James Watson 和 Francis Crick 于 1953 年发现了 DNA 的双螺旋结构&#xff0c;从此揭开了物种进化和遗传的神秘面纱&#xff0c;开启了人类对数字化遗传的认知&#xff0c;但是人类基因奥秘却是一点点被读懂的。 1956 年&#xff0c;一则癌症和染色体相关性的发现令整…

Nginx 外的另一选择,轻量级开源 Web 服务器 Tengine 发布新版本

新版发布 近日&#xff0c;轻量级开源 Web 服务器 Tengine 发布了2.3.0版本&#xff0c;新增如下特性&#xff1a; ngx_http_proxy_connect_module [1] &#xff0c;该模块让 Tengine 可以用于正向代理场景&#xff0c;支持对 CONNECT 方法请求的处理&#xff1b;HTTP2 Serve…

腾讯云数据库Redis助力百万企业远程办公

受疫情影响&#xff0c;多数企业员工目前无法回到写字楼办公&#xff0c;学生推迟开学&#xff0c;稳定高效的远程办公和直播授课成为2020年的开年刚需。腾讯从1月24日开始向全国免费开放可支持300人同时在线会议的“腾讯会议”&#xff0c;直至疫情结束。央视新闻联播对此也给…

打通前后端逻辑,客户端Flutter代码一天上线

一、前沿 ​ 随着闲鱼的业务快速增长&#xff0c;运营类的需求也越来越多&#xff0c;其中不乏有很多界面修改或运营坑位的需求。闲鱼的版本现在是每2周一个版本&#xff0c;如何快速迭代产品&#xff0c;跳过窗口期来满足这些需求&#xff1f;另外&#xff0c;闲鱼客户端的包…

迈向电商认知智能时代的基石:阿里电商认知图谱揭秘

阿里妹导读&#xff1a;电商平台最大的挑战是从日益增长的海量商品&#xff08;数十亿&#xff09;中挑选出的一个小的子集&#xff08;几十或上百&#xff09;展示给用户&#xff0c;以满足用户的个性化的购物需求。为了解决仍存在的重复推荐、缺少新意等问题&#xff0c;我们…

我是如何用6个月,从0编程经验变成数据科学家的?

来源 | medium编译 | 武明利责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;我叫Kate&#xff0c;刚从长达 8 年的学习和艰苦的工作中走出来&#xff0c;没有任何预兆。你可能想问&#xff0c;为什么有人会这么做&#xff1f;不得不说&#xff…