• 文字识别网络学习—seq2seq+attention


      目前常用的文字识别网络主要有两种,一种是通过CRNN+CTC的方法(参见CRNN),一种是seq2seq+attention的方法。有说CTC方法优于seq2seq+attention的,但随着attention机制的发展(self-attention, transformer),也许seq2seq+attention更有潜力,这里不做评价, 只是学习下seq2seq用于文字识别的思想。

    1. seq2seq+attention模型介绍

      seq2seq+attention来源于NLP领域,简要介绍下,详细信息参考下面链接:

       https://zhuanlan.zhihu.com/p/36440334

      https://zhuanlan.zhihu.com/p/28054589

      https://zhuanlan.zhihu.com/p/150294471

      seq2seq模型主要用于机器翻译中,主要包括Encoder和Decoder两部分,两者都由循环神经网络RNN, LSTM或者GRU构成,如下图所示:序列[x1, x2, x3, x4]通过Encoder编码成特征向量C, C再经过Decoder解码成序列[y1, y2, y3], 这样就完成了序列[x1, x2, x3, x4到序列[y1, y2, y3]的映射

      seq2seq的Attention机制如下, 对于Encoder输出的特征向量C,经过attention模块,得到C1, C2, C3, 然后分别送入Decoder模块,其中Attention模块为一个权重矩阵,目的是使C1, C2, C3关注原始序列中的不同特征,如C1更加关注[x1, x2], C2更加关注[x2, x3], C3更加关注[x3, x4]。(Attention权重矩阵的实现有很多方式,不详细展开)

     2. seq2seq+attention用于文字识别

      下面两篇华科的论文阐述了seq2seq用于文字识别的流程和方法,2018年ASTER是2016年RARE的改进版本,github上有两个pytorch实现代码可以参考学习下。

        ASTER:An Attentional Scene Text Recognizer with Flexible Rectification(2018, ASTER) (参考实现代码:https://github.com/bgshih/aster,https://github.com/ayumiymk/aster.pytorch)

        Robust Scene Text Recognition with Automatic Rectification(2016, RARE) (参考实现代码:https://github.com/bai-shang/crnn_seq2seq_ocr_pytorch)

      这里主要介绍下ASTER文章中的网络结构,网络主要包括两部分:TPS文本矫正网络,seq2seq+attention文本识别网络。一张图片先通过TPS对文本形变进行矫正,然后将矫正后的图片送入seq2seq+attention进行文字识别,如下入所示:

     2.1 TPS文本矫正

      由于自然界中的文本并不一定是水平排列的,存在各种各样的形变,如弯曲,旋转,透视等变化,如下图所示,所以需要一种变换来将其转换为接近水平的文本,方便后续的识别。2015年的论文Spatial Transformer Network(STN)提出了一种空间变换网络,可以通过模型学习到这种变换。这种变换中可以分为三大类:Aff仿射变换(affine transformation), Proj投影变换(project transformation), TPS薄板样条变换(thin plate spline transormation), 这里论文中采用了TPS变换

       关于STN网络参考:

        https://www.bilibili.com/video/BV1Ct411T7Ur?from=search&seid=9657204082977415895 (这个视频讲的很清楚)

        https://zhuanlan.zhihu.com/p/37110107

        https://www.cnblogs.com/liaohuiqiang/p/9226335.html 

              Spatial Transformer Networks Tutorial (https://pytorch.org/tutorials/intermediate/spatial_transformer_tutorial.html)

      

      回到这篇论文里面,下图是其整体的STN结构示意图,包括Localisation net, Grid generator和Sampler三块。

      Localisation net

        下面是论文中localisation net的卷积结构,可以发现其对输入图片先进行resize,然后进行卷积,最后得到20*2的矩阵,这20个坐标就是我们希望网络能学习到的20个定位点(control points)。

      

       Grid generator

        如下图左边是输入STN网络的图片,图片上绿色十字点就表示我们希望localisation net网络能学习到的20个定位点,得到这个20个定位点后,就该Grid generator发挥作用了。如图右边所示,Grid generator新建一个32*100的空白图片,然后设置20个坐标点,和localisation net学出来的20个坐标点相对应,假设Input Image上学到的20个坐标点矩阵为A(20*2), Rectified Image上设置的20个坐标点为矩阵B(20*2),Rectified Image上所有点的坐标点为矩阵C(3200*2),由B和A之间的映射关系可以计算一种由B到A的变换函数F,通过变换函数F,可以计算出矩阵C中所有坐标点在Input Image上对应的坐标点,假设变换后的矩阵为D(3200*2),将其resize成32*100*2, 其中每一个值,表示该点对应的Input Image中的坐标点

      Sampler

      通过Grid generator可以得到一个32*100*2的矩阵坐标,如下图所示,假设Recified Image为32*100*2的矩阵,a22的值为(1.6, 2.4),表示Recified Image上(2, 2)像素点对应着Input Image上(1.6, 2.4),由于是小数,因此在Input Image上取(1.6,2.4)最近的四个像素点(1,2), (1,3),(2,2),(2,3),采用双线性插值法计算出(1.6, 2.4)的像素值,将Recified Image上(2, 2)处填充该像素值,依次处理整个Rectified Image,得到最终的图片(32*100*3)

      2.2 seq2seq + attention文字识别网络

      seq2seq+attention的网络包括:encoder编码网络和decoder解码网络,其整体结构如下图所示(左边是流程示意图,右边是具体的网络结构)。通过左边流程图,可以看到encoder网络通过cnn提取图片特征,BLSTM得到横向序列, decoder利用LSTM和attention机制对序列进行解码。右边网络结构可以看到encoder包括resnet+两层BiLSTM,类似于CRNN的特征提取模块,其中resnet模块包括5个block(对Resnet50进行了修改)。

      seq2seq+attention的网络的整体细节如下图所示。在训练阶段,输入图片吗3*32*100经过encoder得到编码后的特征序列x (25*512),序列进入decoder会进行循环解码。每一次循环中,序列x和上一次的隐藏层输出state_prev进入attention模块得到注意力权重alpha,alpha和序列x相乘得到context,context和上一次的output_prev进行concatenate后送入GRU得到新的state和output。在测试阶段循环解码是会有些不同,一般会用到beam search。

    关于seq2seq的beam search,参考:

      https://zhuanlan.zhihu.com/p/82829880

      https://zhuanlan.zhihu.com/p/36029811?group_id=972420376412762112

    参考文章:

      https://www.cnblogs.com/Allen-rg/p/10072162.html (ASTER)

      https://zhuanlan.zhihu.com/p/183182208 (公式识别)

      https://zhuanlan.zhihu.com/p/65707543 

  • 相关阅读:
    类的高内聚低耦合
    面向对象是三个特征:封装、继承、多态
    抽象类和接口
    remoting和webservice
    装箱和拆箱
    数据库
    遍历TextBox控件
    索引类型
    .NET和C#有什么区别
    三层架构
  • 原文地址:https://www.cnblogs.com/silence-cho/p/14129221.html
Copyright © 2020-2023  润新知