CRNN+WAP模型

目前OCR技术,比较主流的是CRNN模型即CNN+RNN+CTC Loss;还有个就是WAP模型即CNN+Attention+RNN

CRNN

  1. CRNN论文https://arxiv.org/abs/1507.05717;对应的pytroch github地址https://github.com/meijieru/crnn.pytorch
  2. 整个模型流程是输入图片,通过CNN提取图片特征,然后经过RNN进行时序增强,最终通过CTC Loss进行优化,具体可以参考https://zhuanlan.zhihu.com/p/43534801
  3. 这里以以上github中的模型为例,输入固定高度为32的图像,宽度可以不定,假设输入 b ∗ 3 ∗ 32 ∗ 100 b*3*32*100 b332100;经过CNN(这里是以VGG网络为原型,6个block,最终在高度上进行32倍下采样,宽度上面4倍下采样,其中有4层maxpool外加最后一层卷积进行下采样),得到输出 b ∗ 512 ∗ 1 ∗ 26 b*512*1*26 b512126;之后转换成 26 ∗ b ∗ 512 26*b*512 26b512作为RNN(一般是双向LSTM或者双向GRU)的输入,得到输出 26 ∗ b ∗ 512 26*b*512 26b512,然后放入CTC Loss中进行优化
  4. 关于CTC Loss,可以参考https://zhuanlan.zhihu.com/p/42719047;CTC Loss主要是解决输入和输出不对齐的问题(如图片中有空白等,导致输出字符长度为26,而实际字符只有5个这种不对齐的情况),这里处理是先加入空白字符进行对齐,然后通过给定输入序列 X ,我们希望最大化输出Y的后验概率 P ( Y ∣ X ) P(Y|X) P(YX),进行损失函数计算,进而进行优化;当然CTC Loss缺点是假设输出的字符之间是独立的,还有就是当输出Y序列长度大于输入X序列长度时,无法计算
  5. CRNN模型主要是识别单行文本,对于高度方向重叠的多行文本无法很好识别;关于CRNN模型的优化,在CNN特征提取上面可以替换backbone,增加channel数等;在RNN中采用LSTM,GRU, TCN以及多加几层RNN结构;CTC Loss目前看来是CRNN中最重要起作用的地方
  6. 个人经验:RNN层可以不加,直接对CNN提取的特征进入CTC Loss进行计算,效果损失很小;替换CNN的backbone等,效果提升不明显;因为对RNN层学习率太大,很可能不收敛,这里可以对CNN层和RNN层设置不同学习率,略有效果;关于CTC Loss的替换,在语音上面有一些,可以参考https://www.bilibili.com/video/BV1RE411g7rQ?p=5,目前还未做尝试

WAP

  1. WAP论文http://home.ustc.edu.cn/~xysszjs/paper/PR2017.pdf 和优化版http://staff.ustc.edu.cn/~jundu/Publications/publications/2.pdf,对应的pytroch github https://github.com/KienHuynh/Img2Latex
  2. WAP模型是CNN+Seq2Seq+Attention类型,输入图片进入CNN得到图片特征,然后图片特征进行Attention在加上隐藏层(hidden state)和token特征(训练的时候是gt,前向是前一个时序得到的token),放入GRU(关于RNN,LSTM,RNN参考https://zhuanlan.zhihu.com/p/34203833)中,得到最终的时序序列,然后通过交叉熵Loss去优化
  3. 整个模型流程,输入图片 b ∗ c ∗ 128 ∗ 768 b*c*128*768 bc128768,进过CNN(整个CNN有4个block,每个block中4层卷积+bn+leaky_relu,最后在加shortcut,接maxpool进行下采样)得到图片特征fcn_out( b ∗ 256 ∗ 8 ∗ 48 b*256*8*48 b256848),之后对特征做Attention;这里先初始化两个个tensor,分别是beta_mat( b ∗ 8 ∗ 48 b*8*48 b848,初始化值为0),gru_hidden( b ∗ 256 b*256 b256,初始化值为0),对于gru_hidden,先通过全连接得到特征 b ∗ 512 b*512 b512,然后在重复成from_h( b ∗ 512 ∗ 8 ∗ 48 b*512*8*48 b512848);对于fcn_out,先进行转换然后通过全连接得到特征,最终得到from_a( b ∗ 512 ∗ 8 ∗ 48 b*512*8*48 b512848);对于beta_mat,先经过一个卷积变成特征 b ∗ 256 ∗ 8 ∗ 48 b*256*8*48 b256848,然后在转换加全连接得到from_b( b ∗ 512 ∗ 8 ∗ 48 b*512*8*48 b512848),最终得到from_a = from_a + from_b + from_h,在对from_a 进行tanh激活,加全连接得到特征 b ∗ 8 ∗ 48 b*8*48 b848,然后review成 b ∗ 384 b*384 b384,对维度1进行softmax计算全图特征的权重,在review成 b ∗ 8 ∗ 48 b*8*48 b848,得到最终的Attention权重alpha_mat( b ∗ 8 ∗ 48 b*8*48 b848)
  4. 对于Attention权重alpha_mat的更新,from_a的计算方式不变(在一次训练循环gru过程中,from_a值不变);from_b计算方式不变,但是输入的beta_mat = beta_mat + alpha_mat;from_h计算方式不变,但是输入的gru_hidden变成通过gru新生成的gru_hidden,所有计算方式都不变,得到新的alpha_mat
  5. 循环GRU过程,输入有3部分,第一个是gru_hidden;第二部分是输入的token,对于训练阶段,将GT作为输入token(这里会对GT进行扩展,加起始和结束字符,然后固定GT长度为70,这里长度可以自定义,不够的补无效字符,假设所有标签550),对于测试每次生成的token作为下一个的输入,在循环过程中,每个时序对应的token进行onehot编码得到特征 b ∗ 550 b*550 b550,然后通过全连接得到token特征 b ∗ 256 b*256 b256;第三部分是输入的图片特征fcn_out( b ∗ 256 ∗ 8 ∗ 48 b*256*8*48 b256848)乘以Attention权重alpha_mat( b ∗ 8 ∗ 48 b*8*48 b848),得到特征 b ∗ 256 ∗ 8 ∗ 48 b*256*8*48 b256848,然后对特征在宽度和高度方向求和,最终得到输入的图片特征multiplied_mat( b ∗ 256 b*256 b256),以这三个特征输入到GRU模块中,具体计算参考下图计算在这里插入图片描述在这里插入图片描述
    得到最终的输出gru_hidden以及对应的输出token;
  6. 在所有GRU循环结束,得到最终的输出token和gt做交叉熵Loss计算
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值