赞
踩
github地址paddleocr
优化项:
SVTR_LCNetV3:精度更高的骨干网络
Lite-Neck:精简的Neck结构
GTC-NRTR:稳定的Attention指导分支
Multi-Scale:多尺度训练策略
DF: 数据挖掘方案
DKD :DKD蒸馏策略
SVTR
Scene Text Recognition with a Single Visual Model
SVTR主要思想是:提出local mix block 和 global mix block 把局部特征和全局特征进行融合(已是常见操作,只是模型结构存在少许差异),
基本网络结构如下:
其中在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就是采用的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):
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原文的实现流程
PPOCR_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}
一种是直接采用CrossEntropyLoss进行计算 attnetion之后的fc和target的之间的差异
还有一种是通过平滑处理的方式进行计算。
多尺度训练是训练模型常用的套路之一,采用不同的尺度训练模型从而增加模型的鲁棒性
文中DF的思路就是通过模型进行数据率选,从而保证训练数据的质量,其实更合理一点应该采用Online Hard Example Mining之类的思路。不过作为数据筛选来说,可以有效降低数据量集。
没用上,没研究,后续用上再补充吧。
考虑到发布的时间和进度,其实还有一些可以工作可以进行:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。