赞
踩
论文地址:https://arxiv.org/pdf/1507.05717v1.pdf
网络结构:
CNN + RNN + CTC
网络编码:
当输入一张尺寸归一化的图片 [32, 280, 3] ,其中32代表文本图片高度,280代表文本图片宽度,3代表文本图片通道数;经过CNN特征编码之后,高度5次2倍下采样变成1,宽度3次2倍下采样变成35,通道经过卷积变成512,最终CNN输出特征 [1, 35, 512];以此特征输入RNN网络,以35作为序列步长,通道数最终输出字符分类总数,假设字典字符总数为80,最终编码输出特征尺寸为 [1, 35, 80]。
网络解码:
训练过程使用CTCloss对[1, 35, 80]特征自动对齐真实标签。推理过程可以使用贪婪解码和束解码,贪婪解码是将每一步特征进行softmax输出概率最大字符作为识别结果;束解码是将每一步输出概率排名前k的字符都作为输出备选,最终以整个步长路径概率最大对应的字符串作为输出结果。
第一部分简单介绍网络范式CNN+RNN+CTC,工程代码链接提供了VGG+BiLSTM+CTC的具体实践方式,在工程应用中,更多会使用残差结构网络ResNet或者DenseNet作为CNN部分的特征提取,虽然使用这些结构会提升网络效果,但同时带来了网络结构更复杂。RepVGG提供了一种更适合工程化的方法,在训练的时候使用类似ResNet的残差结构增加网络特征提取能力,推理的时候通过卷积核等效变化,“融合”了残差结构,简化了推理网络结构,因此CNN部分可以更换成RepVGG。
RepVGG:https://github.com/DingXiaoH/RepVGGhttps://github.com/DingXiaoH/RepVGG
注意:使用RepVGG做为识别backbone,官方代码在推理融合的时候只提供了CNN网络的处理,识别网络我们还要处理BiLSTM部分权重,可以按照下面方式处理即可:
之前偶然看到一篇比较有意思的文章 SWA Object Detection。这篇文章全文无公式、无算法流程图,不改模型结构,不增加模型复杂度、推断时间,也不对数据进行增广。将其简单应用于主流的目标检测算法,可普遍在COCO数据集上获得 ~1 个AP的精度提升。好奇之下,将其迁移到了文本识别工程之中,目前实验来看,在部分识别任务确实有效果。
论文地址:https://arxiv.org/pdf/2012.12645.pdf
在文本识别中,可以如下使用生成reco_swa.pth:
在实际工程中,我们会将模型转换成onnx格式,使用onnxruntime来提高推理速度,一般在识别任务中,cpu环境下,比较pytorch会提高5-10倍速度。其中pytorch提供转化onnx格式模型接口,具体示例可以参考如下:
使用onnxruntime框架推理demo如下:
在实际工程中,我们经常会遇到识别文本出现弯曲畸变或者结构识别(比如数学公式识别),此时CRNN+CTC范式并不能再满足我们的任务需求,比较传统的方式是借鉴语言翻译任务范式Seq2Seq+Attention,通过结构微调成CRNN+LSTM+Attention模式实现结构化以及位置感知识别,但是这个方式局限于LSTM无法并行计算,大大降低了计算效率。比较成熟的方案是基于CNN+Transformer范式解决此类问题,通常使用CNN学习图像低级特征,使用self-attention学习全局特征解码,既解决了数据饥渴的问题,又解决了解码无法并行的计算效率问题。
CNN+Transformer(encoder):
以上介绍的都是传统文本识别的一些典型方法,工程领域已经非常成熟。目前近一年Vision Transformer的大火,同时带来了许多文本识别新范式。由于文本识别本就属于图像与语言交叉形式的任务,基于多模态、自监督预训练等多种范式在多个识别领域SOTA,例如微软新提出的Trocr等方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。