当前位置:   article > 正文

PP_OCR_REC_v4学习笔记_nrtrloss

nrtrloss

github地址paddleocr
优化项:
SVTR_LCNetV3:精度更高的骨干网络
Lite-Neck:精简的Neck结构
GTC-NRTR:稳定的Attention指导分支
Multi-Scale:多尺度训练策略
DF: 数据挖掘方案
DKD :DKD蒸馏策略

SVTR_LCNetV3

SVTR
Scene Text Recognition with a Single Visual Model
SVTR主要思想是:提出local mix block 和 global mix block 把局部特征和全局特征进行融合(已是常见操作,只是模型结构存在少许差异),
基本网络结构如下:
SVTR网络结构
其中在embedding 中把VIT的patch embedding替换成了轻量化的paddle自身的LCNetV3,在head中使用了multi_head分别用的CTC_head和NRTRHead。
其中CTC_head中的输入是基于svtr的encoder。svtr_encoder 做了两层的CNN然后使用svtr global mixing blocks 再通过一层CNN还原。
NRTRHead是4层transfomer的decode

Lite-Neck

原文中所说的Lite-Neck就是采用的svtr_encoder,有意思的是在文中采用depth在代码中未起作用(也许是看漏了)

class EncoderWithSVTR(nn.Layer):
    def __init__(
            self,
            in_channels,
            dims=64,  # XS
            depth=2,
            hidden_dims=120,
            use_guide=False,
            num_heads=8,
            qkv_bias=True,
            mlp_ratio=2.0,
            drop_rate=0.1,
            attn_drop_rate=0.1,
            drop_path=0.,
            kernel_size=[3, 3],
            qk_scale=None):
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

GTC-NRTR

GTC-NRTR可以看作未基于NRTR的encoder和decoder与ctc-loss来辅助优化模型

NRTR: A No-Recurrence Sequence-to-Sequence Model For Scene Text Recognition
NRTR的作用本质上其实是通过使用transfomer中的关联矩阵的获得字符和图片文字的信息统一,采用的方式未multi-head attention
GTC-loss:
GTC: Guided Training of CTC Towards Efficient and Accurate Scene Text Recognition
GTC 在CTC loss之后作为辅佐模型训练的主要是解决ctcloss中 对文字特征匹配存在差异的情况。
在文中的GTC只是参考的论文的思路,在实现上与GCN无关,只是以端到端的方式进行优化模型。
GTC原文的实现流程
GTC: Guided Training of CTC Towards Efficient and Accurate Scene Text Recognition中训练流程图
PPOCR_REC_V4的实现流程
PP_OCR_REC_v4
这里attention_loss 有两种实现方式

class NRTRLoss(nn.Layer):
    def __init__(self, smoothing=True, ignore_index=0, **kwargs):
        super(NRTRLoss, self).__init__()
        if ignore_index >= 0 and not smoothing:
            self.loss_func = nn.CrossEntropyLoss(
                reduction='mean', ignore_index=ignore_index)
        self.smoothing = smoothing

    def forward(self, pred, batch):
        max_len = batch[2].max()
        tgt = batch[1][:, 1:2 + max_len]
        pred = pred.reshape([-1, pred.shape[2]])
        tgt = tgt.reshape([-1])
        if self.smoothing:
            eps = 0.1
            n_class = pred.shape[1]
            one_hot = F.one_hot(tgt, pred.shape[1])
            one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1)
            log_prb = F.log_softmax(pred, axis=1)
            non_pad_mask = paddle.not_equal(
                tgt, paddle.zeros(
                    tgt.shape, dtype=tgt.dtype))
            loss = -(one_hot * log_prb).sum(axis=1)
            loss = loss.masked_select(non_pad_mask).mean()
        else:
            loss = self.loss_func(pred, tgt)
        return {'loss': loss}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

一种是直接采用CrossEntropyLoss进行计算 attnetion之后的fc和target的之间的差异
还有一种是通过平滑处理的方式进行计算。

Multi-Scale:多尺度训练策略

多尺度训练是训练模型常用的套路之一,采用不同的尺度训练模型从而增加模型的鲁棒性

DF: 数据挖掘方案

文中DF的思路就是通过模型进行数据率选,从而保证训练数据的质量,其实更合理一点应该采用Online Hard Example Mining之类的思路。不过作为数据筛选来说,可以有效降低数据量集。

DKD :DKD蒸馏策略**

没用上,没研究,后续用上再补充吧。

可优化项

考虑到发布的时间和进度,其实还有一些可以工作可以进行:

  1. mining的机制,在海量数据训练的时候 OHEM是一个还不错的方式。
  2. decode端,在PPV4中证明transfomer的结构在decode中会起到很好的效果,但是应该还有提升的空间。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/1006424
推荐阅读
相关标签
  

闽ICP备14008679号