〇、前言
What Is Wrong With Scene Text Recognition Model Comparisons? Dataset and Model Analysis
这篇文章很不错,对场景文字识别(STR,scene text recognition)做了一些工作,代码已经开源 https://github.com/clovaai/deep-text-recognition-benchmark
很好训,结果也非常SOTA
我先把文章看一下,后面对这个网络做一些到边缘设备上部署的尝试(另:这个文章没排版,将就着看)
一、正文
作者从几个方面分析了一下场景文字识别的固有问题,
- 第一个主要强调了以往工作通常建立在“训练集验证集的选择不一致”(inconsistent choices of training and evaluation datasets),我个人理解是强调两个数据集的分布差异太大:
- 第二个是提出了一个四阶段(four stage)的范式(我觉得就是以往工作的范式的总结,本文把他们整理在一起):
(我这里摘一些文中的句子无脑翻译一下)场景文字识别(STR)本身是一个比较特化的任务,它和传统的计算及视觉任务如目标检测本身有一些共性,所以STR方向的发展本身得益于那些特征检测的CNN网络、RNN网络的发展。CRNN这个网络第一次结合了CNN和RNN用于做STR任务,这个很有名了,网络简洁清晰明了,也非常好训。CRNN用CNN部分提特征,然后用RNN部分重组(reconfigure)这些特征用于输出序列的预测(sequence prediction)。
- 这个范式的四个阶段分别是:
1. Transformation: 用Spatial Transformer Network(STN)来对数据做Normalization来减轻后面阶段的难度。
2. Feature Extraction: 这个阶段的目的是通过深度网络提到和字符本身有关的特征,同时筛掉一些无用特征,比如字体、颜色、尺寸、背景信息等等;作者列了三类CNN:VGG、RCNN、Resnet,因其各自特有的结构,对提特征有不同的侧重优势。(这里不翻译了,贴个原文的图片)
3. Sequence Modeling: 这个阶段是捕获字符的上下文信息,以加强预测下一个字符的鲁棒性;代码里推荐用了双向LSTM。
4. Prediction:预测阶段;原文提供了两个方法,一个是CTC(Connectionist temporal classification),一个是Attn(attention-based sequence prediction)
a. CTC预测输出的序列长度可能是非固定的,这个non-fixed的性质来源于它处理预测序列的方法本身:通过删除重复字符和空白字符来产生非固定长度的序列;
b. Attn通过捕获信息流(information flow)预测序列。这个方法能让前面的STR模型主体学到字符级别的信息。
我感觉就是在CRNN的范式前面加多了一个用来Transformation的Spatial Transformer Network。这个操作的根据是基于前面论述过的:不同数据集差异性太大的问题。
- 再后面文章中列举了一些消融实验的结果,这里不贴了,我个人关注的是方法贡献和工程应用意义……
- 最后面列举了一些错误预测的样本,并分析了6种大致错误的类型:
前面五种没得说的,当然第一个复杂字体(花体圆体等等)的影响是一个问题,这个在工程应用方面其实规避不了;第二~第五种(纵向、特殊符号、遮挡、低分辨率)这几种在我看来属于bad samples,目前对我来说并不考虑这些阴间数据给整体准确性带来的影响;
对于最后一种,label noise,可以理解为是一些非字符、但是又很像字符的“label”(标志一类的)影响了模型的预测精度。作者重新审了一遍数据集,发现有label noise的样本其实还有标注标错的因素(=_=),除去这个因素作者并没有提出改进思路。
看了一下提供的错误预测样本示例,目前我个人对这个label noise也没有太多思路,主要考虑还是从训练过程中的数据增强入手吧:
- 【数据增强】不同字体图片的横向拼接(参考Mosaic);
- 【数据增强】图片四周pad一圈,用来扩增字符在图片中比例的多样性;
- 【数据分析】统计一下字符的频率,用来分析特殊字符识别不佳;
二、训练时候的心得
- 因为刚好拿着同样的任务和数据集训过一波CRNN,然后再训的本文的框架;
- CRNN没有前面Transformation的部分,同时后面的loss用的CTC;
- 而本文的TRBA(TPS-Resnet-BiLSTM-Attn)加了前面的Transformation后,能够对数据做一个低维的统一;
- 同时CTC loss 我觉得对于字符真正长度的控制并不是很好,TRBA相比CRNN精度提升很多(在我的数据集上从70%提到88%)我认为主要在于将CTC改为用Attn loss。
三、 部署到边缘设备的尝试
这个项目挺好的,同时对MNN和NCNN这两个框架有点经验,所以考虑为社区做一下贡献。
目前没写完(在努力抽时间)……
目前Pytorch的部分没什么问题,在人家源码上稍微修改了一点点,因为我的数据集里需要训几个特殊符号,在README中都有写。
先贴上repo地址: https://github.com/unanan/deep-text-recognition-benchmark-mnn-ncnn