作者:微软亚洲研究院首席研究员 霍强

把手机摄像头对准菜单上的法语菜名,屏幕上实时显示出翻译好的中文菜名;将全世界图书馆的藏书转化为电子书;街景车游走于大街小巷,拍摄街景的同时也从街景图像中自动提取文字标识,让地图信息更丰富更准确……这些场景的背后有一个共同的关键技术——OCR
(Optical Character Recognition),光学字符识别。

OCR让电脑“读”懂世界

鼠标发明人Doug Engelbart曾经针对人工智能的简称AI提出了另一个理念——Augmented
Intelligence,增强智能。在他看来,人已经足够聪明,我们无需再去复制人类,而是可以从更加实用的角度,将人类的智能进一步延伸,让机器去增强人的智能。

智能眼镜就是这样的产品,去超市的时候带上一副,看到心仪商品上的文字,自动搜索出详细信息:生产商情况、在不同电商平台的价格等等。让智能眼镜读懂文字的正是OCR技术。OCR本质上是利用光学设备去捕获图像,今天可以是手机、照相机,未来可以是智能眼镜、可穿戴设备等,就像人的眼睛一样,只要有文字,就去认出来。

我们也可以设想一下OCR在未来工作中的应用场景:每次工作会议后,无需再把白板上的讨论内容捎写下来,然后群发邮件布置任务,只要将白板用手机等智能设备拍照留存,系统便能自动识别并分检出相关人员的后续工作,并将待办事项自动存放到各自的电子日历中。

事实上,我们已经向这个场景迈进了一步,微软前不久推出的Office
Lens应用
,已经可以通过视觉计算技术自动对图像进行清理并把它保存到OneNote,而OneNote中基于云端的OCR技术将对图片进行文字识别,随后你就可以拥有一个可编辑、可搜索的数字文件,为上述未来应用场景打下基础。微软几年前推出的手机应用Translator,除了支持文本和语音翻译外,还能用手机拍摄不同语言的菜单或指示牌,翻译结果立即浮现于原文之上。Office
Lens和Translator这两款产品的OCR核心组件就来自微软亚洲研究院的语音团队。

 

从平板扫描仪到前端手机后端云

回过头来看,OCR技术经历了怎样的发展历程呢?早在20世纪50年代,IBM就开始利用OCR技术实现各类文档的数字化,早期的OCR设备庞大而复杂,只能处理干净背景下的某种印刷字体。20世纪80年代,平板扫描仪的诞生让OCR进入商用阶段,设备更为轻便灵巧,可以处理的字体数量也增多,但对文字的背景要求仍然很高,需要很好的成像质量。

平板扫描仪对印刷体文本的识别率在20世纪90年代就已经达到99%以上,可谓OCR应用迎来的第一个高潮。当时最著名事件是谷歌数字图书馆,谷歌还申请了图书扫描专利,实现了批量化的高速扫描。在此期间,手写字体的识别也在并行发展,被广泛用于邮件分拣、支票分类、手写表格数字化等领域。

这样的成就一度让大家误以为OCR技术已经登峰造极,但从21世纪开始,准确地说是自从2004年300万像素的智能手机诞生之日起,这一情况发生了根本改变。越来越多的人随手拿起手机拍摄所看到的事物和场景,而此类自然场景中的文字识别难度远远高于平板扫描仪时期,即便是印刷字体,也只能达到60%-70%的识别率,更别说手写体了。学术界因此将自然场景中的文字识别作为全新的课题来对待。

与此同时,云计算、大数据以及通讯网络的快速发展,实现了智能手机的24小时在线,前端采用手机摄像头进行文字捕捉,后端可以对其进行实时分析和处理,二者的结合让OCR的未来应用模式充满想象。因此,对OCR的研究再度成为学术界的焦点,无论是前端识别技术还是后端的关联应用领域,都有着无限可能。微软亚洲研究院的研究员们,也非常有幸加入了这个大潮。

自然场景下的文字识别获突破性进展

自然场景图像中的文字识别大大难于扫描仪识别,因为它具有极大的多样性和明显的不确定性。如文字中包含多种语言,每种语言含有多种字母,每个字母又可以有不同的大小、字体、颜色、亮度、对比度等;文字通常以文本行的形式存在,但文本行可能有不同的排列和对齐方式,横向、竖向、弯曲都有可能;因拍摄图像的随意性,图像中的文字区域还可能会产生变形(透视、变换)、残缺、模糊断裂等现象。

自然场景图片中的文字多样性示例

与传统 OCR
技术中的扫描文档图像相比,自然场景图像的背景更为复杂。如文字可能不是写在平面上而是在曲面上;文字区域附近有非常复杂的纹理和噪声;图像中的非文字区域有着跟文字区域非常相似的纹理,比如窗户、树叶、栅栏、砖墙等。这些复杂背景一方面会进一步增大文字的多样性,另外一方面会极大增加误检率。

由于自然场景下的文字识别难度大,微软亚洲研究院团队对相关技术和算法进行了针对性的优化和创新,从三个方面对文本监测技术进行了改进,并取得突破。通常,OCR识别的步骤可以分为两步:首先是文本检测(Text
detection),将文字从图片中提取出来;然后,对文本进行识别(Recognition),此次的突破主要是在文本检测环节的三个子阶段。

阶段①:采用新算法,检测更高效

一个字母或文字通常可以分为若干个连通区域,如o就拥有一个连通区域,i则拥有两个连通区域,文本检测首先要从图像中切割出可能存在的文字,即候选连通区域,然后再对其进行文字/非文字分类。

在确定候选连通区域阶段,微软亚洲研究院团队在传统检测方法ER(Extremal
Region,极值区域)和MSER(Maximally Stable Extremal
Region,最大平稳极值区域)基础之上创新地采用了对比极值区域CER(Contrasting Extremal
Region),CER是跟周围的背景有一定对比度的极值区域,这个对比度至少要强到能够被人眼感知到,在低对比度的图像上比MSER效果更好,而且获得的候选连通区域数量远小于ER,候选范围大大缩小,提高了算法的效率。

阶段②:过滤噪音,检测更准确

为了提高所获得的候选连通区域的质量,微软亚洲研究院团队决定增加一个算法环节去增强CER。尤其在图像模糊、分辨率低或者噪声较多时,提取出来的CER有可能会含有冗余像素或者噪声,这些冗余像素或者噪声的存在会使得后面的文字/非文字分类问题变得更为复杂。

采用Munsell颜色空间颜色去增强CER可算是此次算法优化的另一个创新之举,利用颜色信息尽可能滤除CER中的冗余像素或者噪声,从而得到Color-enhanced
CER。该颜色空间具有视觉感知一致性,而且对光照敏感,更接近人眼对颜色的判断。

受噪声影响的CER示例

在实际操作中,并不是每个CER都需要通过颜色信息来增强,因为有很多CER本身颜色均匀,没有噪声,尤其是在图片质量很高的时候。因此,在对CER进行增强操作之前我们会先判断该CER是否需要增强操作,以减少不必要的计算复杂度。

CER的颜色增强效果示例

算法提取出来的候选连通区域结果示例

阶段③:创新分类,检测更高质

当获得了高质量的候选连通区域,就需要对其中的字符进行分辨,确定其是否为文字或非文字,微软亚洲研究院团队创新地提出了一套基于浅层神经网络的文字/非文字分类算法,比以往的算法更加有效。

该算法根据文字本身的特性采用分治策略将原始问题空间划分为5个子空间,每个子空间对应一类文字样本,分别命名为Long类,Thin类,Fill类,Square-large类和
Square-small类(如下图所示),于是每个候选连通区域被划分到这5类中的一种。

文字类问题空间划分示例

在每个子空间中,该算法会分别训练一个相应的浅层神经网络,作为该子空间的文字/非文字分类器,我们可以将该神经网络看作是一个黑盒子,在经过大量学习之后,它便能较为准确的将文字与非文字分类。

每次分类动作包括两个阶段——预剪枝(Pre-pruning)阶段和验证(Verification)阶段。在预剪枝阶段,分类器的任务是尽可能滤除非文字候选连通区域;在验证阶段,则通过引入更多信息来消除孤立连通区域的歧义性,从而进一步滤除有歧义的非文字候选连通区域。

2014年8月在瑞典首都斯德哥尔摩举办的国际模式识别大会(ICPR)上,微软亚洲研究院团队将自然场景下的文字识别精度提升到92.12%,召回率提升至92.32%。此前业界的识别精度是80%,而召回率只有67%,多年来这些数字每年增长只有1%-2%,微软的技术突破让OCR的发展缩短了近十年。

人类需求牵引科技发展走到今天,智慧的无限延伸决定了世界的无限潜能。10年前的简单通讯工具手机如今已成为智慧生活的伴侣,曾经只被扫描仪应用的OCR技术业已焕发新机。随着研究工作的不断突破和智能设备的推陈出新,OCR的应用也将充满无限机会、无限可能性。

推荐阅读

Privacy.Tag:轻轻一贴,愉快拍照

别恐慌,大众关于的人工智能问题学界都在努力求解

Translator是他们自己的事——Skype Translator项目研发团队的故事" style="TexT-ALiGn: center; DispLAY: block" name="image_operate_58701429521156905" alt="对这些工程师来说,Skype Translator是他们自己的事——Skype Translator项目研发团队的故事" src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" real_src="http://s5.sinaimg.cn/mw690/001p48JAgy6Rzh8VbcU24&690" width="685" height="13" action-type="show-slide" action-data="http://s5.sinaimg.cn/mw690/001p48JAgy6Rzh8VbcU24&690">


欢迎关注

微软亚洲研究院官方网站:http://www.msra.cn

微软亚洲研究院人人网主页:http://page.renren.com/600674137

微软亚洲研究院微博:http://t.sina.com.cn/msra

微软亚洲研究院微信:搜索“微软研究院“或扫描下方二维码​:​

OCR:慧眼读世界的更多相关文章

  1. 如果简单的记录,就可以为这个世界创造更多的财富,那么还有什么理由不去写博客呢? — 读<<黑客与画家>> 有感

    上一次博文发文时间是2016.1.15,7个月已经过去了.最近读了一本<>的书,对我触动挺大的!里面有关于技术趋势的探讨,也有关于人生和财富的思考! 开始更新iOS122的文章的初衷是,聚 ...

  2. 旷视6号员工范浩强:高二开始实习,“兼职”读姚班,25岁在CVPR斩获第四个世界第一...

    初来乍到,这个人说话容易让人觉得"狂". "我们将比赛结果提交上去,果不其然,是第一名的成绩."当他说出这句话的时候,表情没有一丝波澜,仿佛一切顺理成章. 他说 ...

  3. [一起读源码]走进C#并发队列ConcurrentQueue的内部世界

    决定从这篇文章开始,开一个读源码系列,不限制平台语言或工具,任何自己感兴趣的都会写.前几天碰到一个小问题又读了一遍ConcurrentQueue的源码,那就拿C#中比较常用的并发队列Concurren ...

  4. [一起读源码]走进C#并发队列ConcurrentQueue的内部世界 — .NET Core篇

    在上一篇<走进C#并发队列ConcurrentQueue的内部世界>中解析了Framework下的ConcurrentQueue实现原理,经过抛砖引玉,得到了一众大佬的指点,找到了.NET ...

  5. 读<css世界>笔记之img标签

    Web开发时,为了节约带宽以及提高加载性能,首屏以下的图片就会通过滚屏加载的方式异步加载,然后这个即将被异步加载的图片为了布局稳健,体验良好,往往会使用一张透明的图片占位,如: <img src ...

  6. 如何精准实现OCR文字识别?

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云计算基础发表于云+社区专栏 前言 2018年3月27日腾讯云云+社区联合腾讯云智能图像团队共同在客户群举办了腾讯云OCR文字识别-- ...

  7. 腾讯 AI Lab 计算机视觉中心人脸 & OCR团队近期成果介绍(3)

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:周景超 在上一期中介绍了我们团队部分已公开的国际领先的研究成果,近期我们有些新的成果和大家进一步分享. 1 人脸进展 人脸是最重要的视觉 ...

  8. Java菜鸟浅谈OCR

    什么是OCR? 粗暴点说就是图片文本识别!正规点的说法就是:(Optical Character Recognition,光学电子识别) 最近公司开展新项目,考虑到实名认证这方面,然后还要上传身份证正 ...

  9. 我的2018:OCR、实习和秋招

    真的是光阴似箭,好像昨天还沉浸在考研成功的喜悦,今天却要即将步入2019年,即将硕士毕业.老规矩,还是在每一年的最后一天总结今年以及展望明年.回首2018,经历的东西特别多,视野也开阔了不少,可以说, ...

随机推荐

  1. Ubuntu---不能打开 exfat 文件系统格式的 U盘解决方法

    出现问题:今天把 U 盘插入 Ubuntu 系统的电脑中,打开 U 盘发现弹出 系统格式不支持 的提醒,无法进入 U 盘进行操作. 环境: Ubuntu18.04 TSL; 格式化为 exfat 文件 ...

  2. PAT Basic 1070 结绳(25) [排序,贪⼼]

    题目 给定⼀段⼀段的绳⼦,你需要把它们串成⼀条绳.每次串连的时候,是把两段绳⼦对折,再如下图所示套接在⼀起.这样得到的绳⼦⼜被当成是另⼀段绳⼦,可以再次对折去跟另⼀段绳⼦串连.每次串 连后,原来两段绳 ...

  3. \_\_doc\_\_

    __doc__ 注释信息 一.doc 返回类的注释信息 class Foo: '我是描述信息' pass print(Foo.__doc__) 我是描述信息 该属性无法被继承 class Foo: ' ...

  4. ifconfig筛选出IP

    ifconfig     |grep inet    |awk -F: 'NR==1{print}'     |awk  '{print $2}'

  5. Less(7)

    1.先判断注入类型 (1)首先看到要求,要求传一个ID参数,并且要求是数字型的:?id=1 (2)再输入:?id=1 and 1=1 (3)输入:?id=1 and 1=2 因为(2)(3)没有变化, ...

  6. RL78 RAM GUARD Funtion

    1.段设置 在Section段增加 My_ProtectRAM_n段, 段地址为RAM起始地址+256字节 2.变量定义 #pragma section bss My_ProtectRAM/*My_P ...

  7. rpm包管理工具

    介绍: RPM [1]  是Red-Hat Package Manager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLi ...

  8. C# 类的解构

    C#对类的解构,必须在该类内实现Deconstruct方法,并且返回类型为void ,并用out参数返回各个部分. using System; using System.Text; namespace ...

  9. cmake target_link_libraries() 中<PUBLIC|PRIVATE|INTERFACE> 的区别

    如果目标的头文件中包含了依赖的头文件(源文件间接包含),那么这里就是PUBLIC 如果目标仅源文件中包含了依赖的头文件,那么这里就是PRIVATE 如果目标的头文件包含依赖,但源文件未包含,那么这里就 ...

  10. Monkey通过安装包获取包名

    在monkey命令中,包名常作为一个参数.但我们经常知道apk文件,却不知道包名. 如何获取包名呢? 方法一:AAPT 在SDK的build-tools目录下,aapt工具可以查看,创建,更新zip格 ...