2021年1月, 微信发布了微信8.0, 这次更新支持图片文字提取的功能。用户在聊天界面和朋友圈中长按图片就可以提取图片中文字,然后一键转发、复制或收藏。图片文字提取功能基于微信自研OCR技术,本文将介绍微信OCR能力是如何落地文字提取业务的。
一、背景
微信8.0上线了图片提取文字的功能,用户在聊天界面和朋友圈中如果想提取图像中的文字,不用再辛苦打字了,只要简单几个步骤,就可以拿到图片中的文字内容,超级方便实用。
图1 微信客户端提取图片中的文字
图片提取文字功能以OCR技术为基础,识别出图片中的文字并进行排版展示给用户。
OCR技术, 即Optical Character Recognition(光学字符识别),用于识别图像中的文字,常见的有卡证识别、票据识别和通用识别等。OCR具有非常广泛的应用场景。如目前火热的教育场景中拍照搜题和智能作业批改、金融场景中票据识别、办公场景的文档电子化、交通场景中的停车管理等,都用到了OCR的识别能力。
微信OCR识别能力自2018年开始大力研发,目前支持多种卡证识别、车牌识别、通用识别等,经历了多次算法迭代,识别精度不断提升,取得了业界领先的识别水准。
图2 微信OCR框架
微信OCR能力目前接入了微信小程序服务市场,助力企业的公众号和小程序业务需求更好更高效地落地,同时也在微信客户端的长按图片提取文字、银行卡绑卡、表情搜索和推荐等业务中成功落地。
本文主要介绍微信OCR能力是怎么落地图片文字提取业务的。
二、难点与挑战
1. 如何判断图像中是否存在文字?
长按图片的种类复杂多类,存在商品、人物、风景、汽车等各种可能性,其中大部分图片可能没有文字,我们希望只处理有文字的图片,过滤无文字图片。
2. 如何判断文本图像的类别?
对于文本图像,同样存在复杂多样的问题,比如证件类图像、手写体图像、表格图像等等,OCR识别有大量的垂类场景,依靠单一的识别模型识别能力可能不足,准确率不够好。因此我们希望能判断文本图像的类型,根据不同类别选择不同的识别模型。
3. 如何优化通用识别算法,达到效果和效率的平衡?
通用OCR的识别能力是业务使用的主要能力,我们希望通用OCR识别的效果尽可能好,能涵盖大部分用户的拍摄场景需求,同时落地业务也需要考虑成本。
4. 如何进行版面分析?
文本识别出来的结果是孤立的文本行内容,展示给用户一行行的文字,不符合用户的阅读习惯,用户后续对比和使用时也会存在困难。我们希望能对识别出来的文本行进行合并排版,以用户易于阅读的方式展示。
三、文字提取整体解决方案
针对上面分析的难点和挑战,我们设计了下面的提取文字流程:
图3 图片提取文字的完整流程
快速文字判定模块用于快速判断图像中是否存在文字,如果存在文字,弹出提取文字入口。
文本图像分类模块用于判断文本图像的类别,是垂类文本场景还是通用文本场景等,根据类别选择不同的识别路线。垂类文本识别包括证件识别、表格识别等,可以调用相关的API进行识别,我们也会根据线上用户数据分析用户需求,不断扩展新的垂类文本识别能力。
通用文本识别包括文本检测和文本识别两个阶段,文本检测用于定位文字区域,文本识别用于识别文本行的内容。
版面分析模块将识别出来的文本按易于阅读的方式进行排版展示。
下面将对流程中的各个模块中的算法进行介绍。
1. 快速文字判定
业务场景的图像丰富多样,存在无文字图像和有文本图像,且文本图像中可能存在不同的语种。
图4 不同类型图像示例
我们的需求:
快速判断图像中是否存在中英文本;
兼容长按翻译,同时需要判断文本中的文本语种;
移动端部署,速度和模型大小要求高。
可以采用普通的图像分类来判断图像上是否有文字及文本语种类别,但存在下面的一些问题:
图片复杂,分类准确率低;
文本占比小,存在误判;
图片中可能存在多语种,语种之间有相似性;
无法确定各语种的文本在图像中区域和所占的比例。
我们提出了一个可以用于移动端部署的快速多语种文本分类检测网络,判断不同区域的文本所属的语种类别,可以计算得到图像中是否存在文字以及文字语种以及所占面积等。目前支持拉丁(英文)、中文、日文、韩文、泰文、俄文、越南语等语种的检测和分类。
该模块采用超轻量级的CNN网络,在移动端平均耗时约80ms,具有较高的检测召回和分类精度,能够快速过滤不必要的图像。
图5 多语种文本分类检测网络
2. 文本图像分类
文本图像分类标签体系融入到长按图片分类标签体系中。采用多标签分类来适应复杂图像场景。目前文本图像类别分为证件票据和文档两大类别,后续可能根据需求扩充。
图6 长按图片分类标签体系
3. 通用OCR识别
(1)文本检测
常用的基于深度学习的文本检测方法一般可以分为基于回归的、基于分割的两大类,当然还有一些将两者进行结合的方法。
图7 常用文本检测算法
基于回归的方法分为box回归和像素值回归。
采用box回归的方法主要有CTPN、Textbox系列和EAST,这类算法对规则形状文本检测效果较好,但无法准确检测不规则形状文本,对过长文本效果也不太好。
像素值回归的方法主要有CRAFT和SA-Text,这类算法能够检测弯曲文本且对小文本效果优秀但是实时性能不够。
基于分割的算法,如PSENet,这类算法不受文本形状的限制,对各种形状的文本都能取得较好的效果,但是后处理通常比较复杂,耗时较多。
我们采用了基于实例分割的DBNet算法,DBNet将二值化进行近似,使其可导,融入训练,从而获取更准确的边界,大大降低了后处理的耗时。此外,DB使用轻量级网络也有很好的表现,且长文本不易切断。
图8 DBNet模型结构
基于速度和性能的平衡的考虑,backbone我们选择了轻量级网络mobilenetv3,并对模型的header做了一些裁剪,使得模型大小减少、预测速度提升,但性能轻微下降。针对小文本、超长图像检测和一些特殊场景图像检测,我们也做了一些相应的优化。
此外为了适应多方向的文本图像,我们在检测模型上加入了方向判定分支,支持判断文本框的文本方向。
在模型训练上,我们采用了模型蒸馏的方法,先训练resnet50模型作为teacher模型,然后加入mobilenetv3模型作为student模型联合训练,最终的性能相对不蒸馏的模型能提升1个点。
在模型部署上,采用TensorRT部署,线上T4机型平均耗时小于30ms。
(2)文本识别
文本检测需要的训练数据相对较少,文本识别则需要大量的数据进行训练,特别是中文字符数较多,存在生僻字等,训练数据获取困难。
文本识别存在下面的一些困难:
通用场景复杂,文字多样,各种字体和风格的文字都可能存在,数据难以采集;
生僻字问题,字符不均衡;
相似字问题。
针对上面的问题,我们需要使用数据合成工具来合成大量训练数据。
数据合成工具
TextRender 合成文本行识别数据;
StyleText 合成文本行识别数据。
TextRender是利用图像处理的方法来合成数据,对已有语料或字符表字符随机组合,结合模糊、倾斜、透视变换和加背景等方法,生成接近真实场景中的文字图片,生成字符的数量、字体、大小和风格可控,速度快,是我们主要采用的合成方法。
图9 TextRender示例
StyleText是采用模型风格迁移的方法,针对实际场景真实数据严重不足,TextRender无法合成文字风格(字体、颜色、间距、背景)的问题的补充,利用少许目标场景图像就可以批量合成大量与目标场景风格相近的文本图像。我们主要利用其补充badcase的数据。
图10 StyleText示例
文本识别算法
目前主流的是基于深度学习的端到端的文字识别,将其转化为序列学习问题,两大主流技术是CRNN OCR 和Attention OCR。CRNN OCR借鉴了语音识别思想,引入LSTM + CTC 的建模方式解决不定长序列对齐问题。Attention OCR借鉴了机器翻译中的Encoder-Decoder模型,并加入了注意力(Attention)机制来帮助特征对齐。近年来还出现了一些新的方法,如ACE方法,采用统计时间维度上各字符的数量进行监督的方法来进行文本识别,也取得了不错的效果。
图11 文本识别算法对比
在模型设计上,我们采用了结合上面3种方法的多任务文本识别模型。在训练时,以CTC为主,Attention Decoder和ACE辅助训练。在预测时,考虑到速度和性能,只采用CTC进行解码预测。多任务可以提高模型的泛化性,同时如果对预测时间要求不高,多结果也可以提供更多的选择和对比。
图12 多任务文本识别模型
在模型训练上,我们采用了多种文本图像增强的方法来提升模型的泛化性和鲁棒性,特别是为了对弯曲扭曲变形文本有更好的识别效果,我们采用了在线文本distort变换,识别准确率提升1-2个点。
图13 在线文本图像增强
此外,针对生僻字和形似字问题,我们对CTC loss进行优化,加入了focal loss 和center loss辅助训练,在形似字测试集上能提升2-3个点。
4. 版面分析
版面分析主要用于分析哪些文本行属于同一段落,合并文本行,哪些区域是表格等目前有基于深度学习分割的方法和基于规则的方法。
基于深度学习的版面分割方法:
数据标注困难;
部署:模型大小 + 耗时;
泛化性不够:依赖训练数据;
解决badcase需重训模型,不够灵活。
基于几何规则的版面分析方法:
依赖写好的规则;
快速修复badcase;
耗时小,部署简单。
基于上面的分析比较,我们采用自研的基于几何规则的版面分析方法,通过DFS的文本框合并,取得了不错的排版效果。
5. 结果展示对比
与竞品对比优势如下所示:
(1)支持垂直文本识别
(2)支持证件图片精确提取
(3)排版更合理
(4)过滤无意义文本
四、总结与展望
提取文字作为一个服务用户的工具,我们希望能提供给用户尽可能准确和高效的结果。后续,我们将根据用户的提取需求,进一步扩展垂类场景,同时打磨更通用的自然场景文本识别算法。而OCR作为图像和文本之前的桥梁,我们也将继续深耕微信OCR,更好地为业务服务。最后也欢迎大家扫码体验OCR体验工具。