参加 2018 AI开发者大会,请点击 ↑↑↑

作者 | Leonard Fink

译者 | 刘旭坤

整理 | Jane

出品 |  AI科技大本营

【导读】提到 Dropbox,大家可能都知道这是一个文件同步、备份、共享的云存储软件。其实 Dropbox 可以实现的功能远不止这些。今天就为大家介绍 Dropbox 一个非常强大又实用的功能——自动识别并提取图片中的文本内容,包含 PDF 文档中的图片。比如,当用户搜索其中某个文件中出现的一段文本时(英文文本),在搜索结果中就会显示出这个文件。下面我们就为大家介绍这样的功能是如何实现的。

前言

自动识别图片中的文字功能有很多好处,最显著的提升是能够让 Dropbox 用户搜索从前无法搜索的内容。Dropbox 用户上传的图片和 PDF 文档总数已经超过了两百亿,这其中有超过百分之十的文件真正的内容都是文本,但格式是图片,比如说手机拍摄的小票或者白板的照片。这些就是我们要进行文字识别的对象了。PDF 文件中有 25% 左右是文档的扫描件,这些也属于我们想实现自动文字识别的对象。

对用户来说,文档和文档的扫描件好像差不太多,但对计算机来说区别可就大了。文档可以进行索引并搜索,而图片说白了只是一些像素点罢了。像 TXT、DOCX 和 html 格式的文件一般来说都可以进行索引,而像 JPEG、PNG 和 GIF 这些图片格式一般来说是不能直接进行索引的。对 PDF 文件来说要分情况,比如 PDF 里的图片也是不能够索引的。图像文本自动识别功能可以智能地区分所有的文档和文档中包含哪类数据。

分析

讲如何实现之前我们先要对这个问题进行一些初步的分析,具体来说就是回答下面三个问题:

  • 什么文件需要进行文字识别

  • 如何判断文件是否包含有文字

  • 对于 PDF 文件是否所有页都需要全部识别?识别多少是有用的?

需要进行识别的主要是当前没有可用索引文本内容的文件,包括图片格式和还有一部分 PDF 文档,但其实这部分文件只占所有文件的很小一部分,所以解决这个问题很重要的一个步骤就是建立一个机器学习模型来判断文件是否包含可识别的文字。比如说某文档的照片我们就需要进行识别,但如果只是自拍拍到了衣服上的字,这时候识别恐怕就没有什么意义了。这里我们使用了一个卷积神经网络来进行二元分类。

我们经过统计发现 JPEG 这一最常见的图片格式中有大约 9% 可能包含文字。PDF 文件的每一页则可能属于下面三种情形之一:

  1. 非图片,只有可索引的文字

  2. 含有文字的图片

  3. 完全没有文字内容的图片

这三类中我们感兴趣的其实只有第二类。我们发现第二类情况在三种情况之中约占 28%。PDF文件的数量虽然只有 JPEG 图片数量的一半,但每个 PDF 文件平均有 8.8 页。所以综合看来要处理的 PDF 文件个数超过 JPEG 图片量十多倍。不过用下面这个很简单的办法就能大大降低需要处理的 PDF 文件数目。

文件总页数

有些 PDF 文件页数很多,可能好几千页的都有。如果我们没头没脑的通通识别会很占时间和资源。我们统计了一下 PDF 文件的页数,发现超过一半的文件都只有一页,超过十页的文件大约只占 PDF 文件总数的 10%。所以我们设定了一个标准,不管文件有多长只识别前面十页。

这样算下来 90% 的 PDF 文档我们都能实现完全索引。较长的文档我们虽然没有完全实现识别和索引,但能搜十页也比完全搜索不到好的多了。

自动文字识别系统

图片的渲染

对于 PDF 文件中图片的渲染由两种可行的方式:一个是将页面中的图片一张张提取出来,另一个是将一页文件当一整张图片来处理。这两种方法我们都测试了,不过 Dropbox 的文件预览功能已经有了完善的 PDF 渲染能力,所以最终我们选择了第二个方法。这样处理的话,像 PowerPoint 或者 Post Script 这样的文件格式,只要能支持预览,我们就能进行识别,而且词与词、段与段之间的顺序不会被打乱。

我们的渲染功能是基于谷歌的 PDFium 开发的。这其实也是 Chrome 浏览器所使用的 PDF 渲染引擎。渲染的过程中我们使用了并行处理来降低延迟。

文件图像分类

模型方面我们先用了 GoogLeNet 来进行特征提取,然后用了一个线性分类器来实现有无文字的分类。训练所用的图片有些是网上公开的,有些是用户和 Dropbox 员工提供的,一共有几千张。

我们发现一开始训练模型的时候准确率略低,模型把天际线、光溜溜的墙和开放水域这类图片都判断为有文字了。其实我们人眼都不太容易看出这些图片有什么共同点,不过模型认为只要是背景比较均一,有横线的就是有文字。最后是通过人工标记和给训练集中加入这类图片才克服了这个问题,从而把准确率提上来了。

识别图片的四个角

用户上传的图片因为拍照角度的原因,一般来说都不是我们想要的矩形和直角,所以必须进行矫正。要矫正的话,就要取得图片中文件四个角的坐标,这个功能我们也是用卷积神经网络来实现的。具体地说,就是把 Densenet-121 的输出换成了四个角的坐标。

训练这个模型用了几百张图。标记数据集的过程,需要一张一张地把文件的四个边找出来。这项工作我们是在亚马逊上众包完成的。有的图某个角可能压根没拍着,那这个角的坐标就跑到图片外面去了,这时候就只能靠人工脑补了。

为了加快速度,训练模型的时候用的图片分辨率比实际的图片分辨率低,所以输出的坐标也是低分辨率图片上的坐标。为了提高精度,我们在四个角附近,用高分辨率的图片把模型重跑了一遍。这样既提升了训练的速度,又能得到高精度图片上四个角的坐标。

单词提取

这一部分以矫正过的图片作为输入,输出的则是单词的内容和定界框。单词就按照识别出的顺序一一加入索引。如果文件超过一页,则继续建立索引一直达到 10 页的限制就停。

上面讲的的这几个部分组合起来看是这样的:

图中标出的步骤我们来分别介绍一下:

  1. 通过检查文件格式判断是否含有图片;判断用户权限

  2. 判断图片或 PDF 文件是否含有可识别的文字

  3. 判断图片的四个角以便进行矫正

  4. 提取单词

  5. 加入索引

图中有一个我们之前没有介绍过的 Auto-OCR lambda 模块,这其实是一个 Cape 微服务。Cape 是 Dropbox 在 16 年底推出的一个异步事件流处理框架,Dropbox 很多功能都用到了Cape。有了这个 Cape 微服务,当用户对文件进行增改的时候文字识别功能就能自动触发了,也就是图中列出来的步骤 1 到 5。

得益于 Dropbox 预览功能所提供的基础设施,这一系列从读取文件,判断类型,矫正到最后识别操作的效率很高,而且这套系统对文件的操作(比如渲染)是进行了缓存的,所以当用户上传同一个文件不会造成系统资源的二次开销。增加支持的文件类型和操作也是非常容易,只要为新的文件类型开发一个预览插件就行了。现在对 PDF 文件的识别也是通过插件来实现的。

为了提供系统的稳定性,我们在插件的调用过程中使用了指数补偿算法并加入了随机值。拿第一步调用的插件来说,重试之后失败率降低了 88%。

性能优化

刚开始测试的时候我们发现所使用的机器学习模型所占的资源和带来的延迟完全在我们能接受的范围之外,所以必须进行优化。我们决定先从配置参数着手,因为我们发现如果模型的性能遭遇瓶颈,很多时候简单地改变配置参数就能收到很好的效果。下面我们就来举几个例子说明一下。

我们的第一个改动是关闭了 TensorFlow 的多核支持。Dropbox 系统并行是在 CPU 层面实现的。每个核只运行一个单线程的程序,这样可以避免对数据的损坏也能降低恶意软件入侵的风险。然而,TensorFlow 默认是开启多核支持的。这样相当于每一个核又在跑多线程了,由此引起的上下文切换使得系统吞吐量损失了约 2/3。

关闭多核支持后性能还是不够好。所以我们又换成了支持 AVX2 指令集的 TensorFlow 并将模型和环境用 TensorFlow XLA 提前编译成一个 C++ 库。此外我们还调整了一些隐藏层的节点数量。

图像四个角坐标和文本方向的判断我们所采用的模型架构是 Densenet-121。相比之前用过的 Inception-Resnet-v2 来说速度大概快了一倍,坐标识别的准确率只是稍逊,而且是可以忽略不计的程度。

其实我们所作的这些工作都是为了加深对文件结构和内容的理解,让用户使用 Dropbox 时可以有更好的体验。

原文链接:

https://blogs.dropbox.com/tech/2018/10/using-machine-learning-to-index-text-from-billions-of-images/

--【完】--

2018 AI开发者大会

AI技术年度盛会即将开启!11月8-9日,来自Google、Amazon、微软、Facebook、LinkedIn、阿里巴巴、百度、腾讯、美团、京东、小米、字节跳动、滴滴、商汤、旷视、思必驰、第四范式、云知声等企业的技术大咖将带来工业界AI应用的最新思维。

如果你是某个AI技术领域的专业人才,或想寻求将AI技术整合至传统企业业务当中,扫码填写大会注册信息表,我们将从中挑选出20名相关性最高的幸运读者,送出单场分论坛入场券。大会嘉宾阵容和议题,请查看文末海报。

此外,如果你想与所有参会大牛充分交流沟通,点击阅读原文购票,使用优惠码:AI2018-DBY 购买两日通票,立减999元;此外大会还推出了1024定制票,主会+分会自由组合,精彩随心。

推荐阅读

吴恩达说“将引领下一波机器学习技术”的迁移学习到底好在哪?

Google最强模型BERT出炉,NLP还有哪些值得期待的发展?

北京房租大涨?6个维度,数万条数据帮你揭穿(附详情代码)

那些一毕业就选择华为的人,后来都怎么样了

宇宙第一 IDE Visual Studio 支持 Java 了!

为什么比特币是对政府最友好的加密货币?三大原因揭晓!

只因会区块链,就被300个女孩疯追?

点击阅读原文,查看大会更多详情。2018 AI开发者大会——摆脱焦虑,拥抱技术前沿。

Dropbox如何使用机器学习从数十亿图片中自动提取文字相关推荐

  1. Facebook开源图嵌入“神器”:无需GPU,高效处理数十亿级实体图形 | 极客头条...

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 编译 | Major.一一 出品 | AI科技大本营(ID: rgznai100) 有效处理大规模图对于 ...

  2. 《预训练周刊》第25期:HyperCLOVA:数十亿级韩语生成式预训练变换器、GPT-3在生物医学领域不是好的小样本学习器...

    No.25 智源社区 预训练组 预 训 练 研究 观点 资源 活动 关于周刊 超大规模预训练模型是当前人工智能领域研究的热点,为了帮助研究与工程人员了解这一领域的进展和资讯,智源社区整理了第25期&l ...

  3. 数十亿个 Wi-Fi 设备存在缺陷,通信易被窃听!

    作者 | DAN GOODIN 译者 | 弯月,责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 以下为译文: 在最近的RSA安全会议上,研究人员表示,数十亿设备(其中许多已打补丁)受到W ...

  4. OpenAI数十亿代码训出Codex:能将英语翻译成代码,给四句话就能写个神经网络...

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源:大数据文摘本文约2088字,建议阅读4分钟 本文介绍了Open ...

  5. ElasticSearch 在数十亿级别数据下,如何提高查询效率?

    来源:https://zhuanlan.zhihu.com/p/60458049 面试题 es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 面试官心理分析 这个问题是肯定要问的,说白了,就 ...

  6. 腾讯数十亿广告的基础是精准实时推荐

     专访腾讯数据平台部总经理蒋杰:腾讯数十亿广告的基础是精准实时推荐 虎嗅注:本文是福布斯中文网"数据大玩家"专栏中的一篇文章.接受提问的蒋杰先生,是腾讯数据平台部总经理,在加入 ...

  7. currenttimemillis 毫秒还是秒_Elasticsearch如何做到数十亿数据查询毫秒级响应?

    如果面试的时候碰到这样一个面试题:ES 在数据量很大的情况下(数十亿级别)如何提高查询效率? 这个问题说白了,就是看你有没有实际用过 ES,因为啥?其实 ES 性能并没有你想象中那么好的. 很多时候数 ...

  8. Facebook如何将QUIC应用于数十亿流量传输

    随着IETF很快完成QUIC标准定稿,越来越多的企业和开发者投入到QUIC开发实现与部署中.阿里巴巴实现了XQUIC:B站.快手在2019年就公开了QUIC的应用实践:Akamai等CDN服务商则很早 ...

  9. Elasticsearch如何做到数十亿数据查询毫秒级响应?

    如果面试的时候碰到这样一个面试题:ES 在数据量很大的情况下(数十亿级别)如何提高查询效率? 这个问题说白了,就是看你有没有实际用过 ES,因为啥?其实 ES 性能并没有你想象中那么好的. 很多时候数 ...

最新文章

  1. Java 树形结构数据生成--不需要顶级节点
  2. 在开发的过程如何使用源码
  3. android 在使用ViewAnimationUtils.createCircularReveal()无法兼容低版本的情况下,另行实现圆形scale动画...
  4. 从零开始学习mitmproxy源码阅读
  5. 查看oracle中各个表空间的已使用空间和最大分配空间
  6. textaligncenter仍然不居中_5个word你不知道的功能
  7. python基础逻辑判断语句(九)
  8. linux设置mysql字符集_linux修改mysql字符集编码
  9. vestacp升级php,升级VestaCP面板PHP版本至PHP7.x
  10. web移动端开发总结
  11. 小白都能看懂的numpy与pandas中axis解释
  12. Modelsim软件的使用教程
  13. ffmpeg h264 h265 视频格式操作
  14. 电路自学2-储能元件(电容+电感+储能元件的串并联)
  15. 有源淹没分析arcgis_基于DEM的有源洪水淹没分析算法
  16. matlab中omega是什么意思_小鸡宝宝考考你南柯一梦中的南柯是什么意思?
  17. RS485总线灵魂问答,看你知道几个?
  18. java基础之TreeMap
  19. 分布式微服务下的跨库查询解决思路
  20. 《程序员的算法趣题》-(日)增井敏克 Python解题 -- (Q13)

热门文章

  1. 更加安全的存取账户密码
  2. Oracle Grid Control 10.2.0.5 for Linux 安装和配置指南
  3. 上帝和面向对象的七天
  4. Python常用函数--文档字符串DocStrings
  5. HDU 1257 - 最少拦截系统 ( LIS / 贪心 )
  6. Sublime Text 3 (含:配置 C# 编译环境)
  7. 自定义View步骤学习笔记
  8. 查看Linux系统中某目录的大小
  9. 240个jquery插件
  10. UVA 10269 Adventure of Super Mario