有图又怎样?我有文来斗:表情包文字识别解析

导语

表情已经充斥在网络的各个角落。现在流行 “能发图就不打字”。在我们的表情项目当中需要从形形色色的网络表情中找出对应的文字,作为关键字搜索。这些表情中提取出的文字,亦可用于我们后续的文本分析,情感预测,语义理解等。因此,表情文字识别成为了重中之重。这篇文章是我们在文字识别上的一些积累和成果,分享给大家。

产品背景

相信大家都有使用过表情的经历,一张合适的底图配上逗比的文字往往比冰冷的文字更加能表达当时的一个心理状态。基于这个背景,我们团队想在表情上做一些创新的尝试,让用户能够搜索到他们想要的表情。因此,搜索成为了这个产品的关键,而一个搜索方式就是用户根据文字找到想要的表情。

为了打通图片和文字的桥梁,我们把重心放在了文字识别,也可以叫做OCR识别上。使用了公司的通用OCR后,发现针对复杂多变的表情文字,很难达到理想的效果。如何在表情文字识别这个垂直领域上做一些突破?我们针对这个问题进行了深入的研究并且取得了一定的成果。

识别算法介绍

目前主流的文字识别方法都差不多。主要分为两个模块,一个模块定位文字位置,另外一个模块针对定位后的文字进行识别。针对这两个模块,我们使用的是Faster RCNN + CTC的方案。

文字定位

Faster RCNN1是从RCNN2逐渐演变过来的。相对于它的前辈RCNN以及Fast RCNN3, Faster RCNN提出了RPN(Region Proposal Network)网络。通过RPN输出Anchor Box Proposals。再通过NMS和其他一些方法进行Proposals Reduction。该方法对比以往的方案,性能更优,减少了selective search里面繁琐的计算。当然目前目标检测还有其他state of art的定位方案,例如YOLOv24,Mask RCNN5等,其中Mask RCNN更多聚焦在image segmentation上。

图1: Faster RCNN的基本结构

图2: 文字定位后截取的图片

文字识别

文字识别使用的CTC(Connectionist Temporal Classification)6技术在语音识别里很常用,后来也被用于文字的识别。文字识别中使用的CTC也是基于端对端的。基本思路是将定位后的图片,用CNN网络提取特征,输出特征给RNN网络,再由RNN网络输出预测序列。输出的序列通过greedy decoder、最优路径等方法进行解码,并计算出损失。

图3: CTC模型输出

识别方案介绍

为了达到我们想要的效果,我们主要在数据扩增,网络结构,tricks以及参数调优上面做了大量的工作。下面我们会大致介绍部分使用到的调优方法。

数据扩增

通过人工去标注大量的文字定位信息和文字内容信息用于训练显然是不可行的。对比其他业务的标签数据,文字识别是比较容易通过机器去生成。我们研究了后台表情图片的文字大致分布,然后模拟生成接近真实图片的训练数据。

方法包括:

a. 我们找了各种颜色的背景图,以便于生成多样性,例如偏蓝色背景图,偏红色背景图,黑白背景图等等。

b. 结合语料使生成的图片更加接近真实数据集。

c. 控制各种类型图片生成比例。

最终,在定位中使用的训练数据集大约60万张,而在文字识别使用中生成的数据集大约200万张。我们训练两个网络使用不同的数据集,目的是避免overfitting.

图4: 生成图片采样

网络结构

a. 文字定位最开始用的是VGG网络,定位出来的坐标不够准确。定位后发现是由于VGG网络学习容易饱和导致。后采用深度残差网络替换,使得loss能够进一步降低。

b. CTC模型使用的是一个改进的VGG16网络,以及一个双向RNN网络。在改进版VGG16网络中,每一层都加上Batch Norm以及dropout。

tricks

a. 由于我们在CTC中使用的是双向RNN网络,因此在训练过程中,前几个time step不计算损失。目的是让网络在第一次计算loss的时候,能拿到前后的信息。

b. Spatial Transform。定位的图片输入后使用ST对输入进行空间变换,增加模型健壮性。

c. 权重初始化使用何恺明论文里提出的variance scaling initializer7。

d. 图片输入网络之前使用双线性插值。

参数调优

除去常规的参数调优,这里列举一些值得关注的参数调整

a. 针对文字定位部分,主要调整了anchor box的aspect ratio。由于文字一般是长方形,因此我们希望长方形的anchor box生成的更多,减少其他不必要的anchor box。

b. RNN输出的序列不宜过长,否则效果会下降。

评估对比

公司在文字识别中做了不少的工作。我们主要对比的就是他们的通用OCR。对比的数据集是我们人工随机抽取的980张图片,并且标注了ground truth文字内容。对比数据如下:

String Accuracy

Char Accuracy

Tencent General OCR

0.249

0.418

Ours

0.65

0.801

针对我们业务最关心的整句准确率,可以看出一定的提升。

总结

以上就是我们在表情识别方面的一些经验和积累。对于不同的特定业务,需要收集该业务中尽可能多的标签数据,并针对这些标签数据做好数据扩增。使用适合的tricks和参数提高上限。

目前我们已经把我们的模型接入到了运营环境中。如下图所示:

图5: 运营环境实际使用

未来工作

深度残差网络能够有效对抗梯度问题,但是由于网络太深,参数太多,会引起训练以及预测时候效率的下降。今年的CVPR中提到了Dense CNN8,一种新的网络结构,能够有效降低参数数量,加快训练速度。也许可以用于替换我们现有的CNN。

感谢

在这里特别感谢 MIG D2数据计算平台对我们项目提供的各种计算支持

Reference

1 Shaoqing Ren, Kaiming He, Ross Girshick, Jian Sun(2016 v3), Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

2 Girshick, Ross and Donahue, Jeff and Darrell, Trevor and Malik, Jitendra(2014), Rich feature hierarchies for accurate object detection and semantic segmentation

3 Ross Girshick(2015), Fast R-CNN

4 Joseph Redmon, Ali Farhadi(2016), YOLO9000: Better, Faster, Stronger

5 Kaiming He, Georgia Gkioxari, Piotr Dollár, Ross Girshick(2017), Mask R-CNN

6 Alex Graves, Santiago Fern´andez, Faustino Gomez, Jurgen Schmidhuber(2006), Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks

7 Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun(2015), Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification

8 Gao Huang, Zhuang Liu, Kilian Q. Weinberger, Laurens van der Maaten(2016), Densely Connected Convolutional Networks

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

周力的专栏

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏生信宝典

贝叶斯学习记录

这篇文章用于记录学习贝叶斯定理及其应用过程中的记录,希望由浅及深的提供一份自我学习教程。 引子 概率的定义:概率是一个0-1之间的数,代表了我们对某个事实或预测...

1686
来自专栏大数据文摘

欲取代CNN的Capsule Network究竟是什么来头?它能为AI界带来革命性转折么?

1535
来自专栏AI研习社

Facebook 的数据预测工具 Prophet 有何优势?用贝叶斯推理一探究竟

编者按:2月23日,Facebook开源了一款基于 Python 和 R 语言的数据预测工具——“Prophet”(详细报道请看 AI 研习社此前文章 :支持P...

3646
来自专栏AI研习社

自拍抠图抠到手软?详解如何用深度学习消除背景

在机器学习方兴未艾的过去几年里,我一直想要亲自开发具有实用价值且基于机器学习的产品。然后几个月前,在我学习了由 Fast.AI 所提供的深度学习课程之后,我意识...

3044
来自专栏人工智能头条

中文NLP用什么?中文自然语言处理的完整机器处理流程

人工智能头条早先发布的文章《用 Python 构建 NLP Pipeline,从思路到具体代码,这篇文章一次性都讲到了》,是基于英文来举例的。

1073
来自专栏机器之心

业界 | 谷歌最新语义图像分割模型DeepLab-v3+今日开源

选自Google Research Blog 作者:Liang-Chieh Chen、Yukun Zhu 机器之心编译 参与:刘晓坤、路雪 刚刚,谷歌开源了语义...

2726
来自专栏阮一峰的网络日志

蒙特卡罗方法入门

本文通过五个例子,介绍蒙特卡罗方法(Monte Carlo Method)。 ? 一、概述 蒙特卡罗方法是一种计算方法。原理是通过大量随机样本,去了解一个系统,...

3516
来自专栏人工智能头条

云从科技资深算法研究员:详解跨镜追踪(ReID)技术实现及难点 | 公开课笔记

1253
来自专栏PPV课数据科学社区

深度学习带你抠像表演

前情 回顾这些年机器学习的进展,我也一直想弄点真正的机器学习产品。 几个月前,我参加了超棒的Fast.ai深度学习课程之后,我好像就开窍了,我也有了机会:得益于...

2986
来自专栏量子位

密集人体姿态估计:2D图像帧可实时生成UV贴图(附论文)

Root 编译整理 量子位 出品 | 公众号 QbitAI Facebook人工智能研究院和法国国立计算机及自动化研究院最近提出了一种密集人体姿态估计新方法:D...

2897

扫码关注云+社区