表情已经充斥在网络的各个角落。现在流行 “能发图就不打字”。在我们的表情项目当中需要从形形色色的网络表情中找出对应的文字,作为关键字搜索。这些表情中提取出的文字,亦可用于我们后续的文本分析,情感预测,语义理解等。因此,表情文字识别成为了重中之重。这篇文章是我们在文字识别上的一些积累和成果,分享给大家。
相信大家都有使用过表情的经历,一张合适的底图配上逗比的文字往往比冰冷的文字更加能表达当时的一个心理状态。基于这个背景,我们团队想在表情上做一些创新的尝试,让用户能够搜索到他们想要的表情。因此,搜索成为了这个产品的关键,而一个搜索方式就是用户根据文字找到想要的表情。
为了打通图片和文字的桥梁,我们把重心放在了文字识别,也可以叫做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数据计算平台对我们项目提供的各种计算支持
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
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。