topduke
topduke
没有做过不使用绝对位置编码的实验,但是位置编码SVTR中不是关键部分,可以尝试直接将绝对位置编码去掉。 支持变长的position embedding可以参考SWin、CSwin、Uniformer等论文。
> @Topdu 感谢分享,实测可扩展为变长推理 还想请教下,Local mixer提供的mask在模型训练过程中会通过学习的方式更新嘛?另外,(1)Local mixer + Global mixer 和(2)Conv mixer + Global mixer 两种组合方式的效果有比较过嘛? 1、Local mixer 的mask在训练期间不会更新,其本质是,计算attention时将局部领域内patch保留,领域外的patch被mask掉。 2、(1)在论文的数据集和训练配置下表现更优秀,同时参数量少了一点,但是实际场景中(1)(2)两种方式都可以尝试。 > DropPath在SVTR实际训练过程中有使用嘛?影响收敛速度和收敛效果嘛? 另外pos_embed为什么采用trunc_normal_初始化? 另外激活函数选用了nn.GELU,这个对模型收敛速度和精度提升有收益嘛? DropPath默认使用,可以在代码中看到。 DropPath、pos_embed、nn.GELU均是参考当前Vision Transformer的通用配置,并没有进行消融实验。
patch的size是固定的4*4,如果patch的数量改变,也就是输入大小改变了,一般来说,输入大小越大性能越高。 Local mixer可以看做卷积特殊形式,卷积的kernal size是和输入大小无关的,也就是理论上讲Local mixer和输入大小无关,但是现在Local mixer的实现方式是不灵活的,一个类似Local mixer机制的实现方式可以参考 [Neighborhood-Attention-Transformer](https://github.com/SHI-Labs/Neighborhood-Attention-Transformer) ,这种实现方式更灵活,可以实现与输入大小无关,完全当作卷积使用,但是对于文本识别这种输入size相对较小的任务,这种实现方式速度会慢一些,后续SVTR也会考虑使用这种方式实现一版。 如果把local mixer当成卷积,训练和推理都可以使用变长的输入。
> 嗯嗯。后面尝试下。 看模型里use_lenhead,这个有啥用啊,是打算做一些类似文本字符计数的辅助监督嘛? 是的,加一个长度分类器和长度的监督celoss即可,这部分并未在SVTR论文中使用,代码没有放出来
> 长度分类器?区分长文本和短文本行?不是直接回归文本行字符数量嘛? 嗯嗯,你理解的对,可以理解为字符数量分类器,英文单词一般最长25个,所以将len_x分为25类,做celoss的监督,字符数量的标签也很容易获得。
> @Topdu hi,请问你在中文训练集上训练SVTR-Tiny收敛快嘛?训练过程的ctcloss曲线可以看下嘛? 这里不太方便提供loss曲线,loss下降趋势可参考反函数1/x的趋势。 > @Topdu 老哥,请问在现有模型权重基础上finetuning,初始学习率设置多少比较合适?试了下感觉多轮次finetuning对初始学习率比较敏感 finetune时,学习率可以调小一点,但是还是对于不同的数据集需要实验验证,这里没有很好建议。
> 您好,您这里说的字符数量的标签是通过什么获得的呢? 通过已有文本标注的识别数据集获得:len(label)
请问使用的是[PP-OCRv3](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/doc/doc_ch/PP-OCRv3_introduction.md) 还是 [SVTR](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/doc/doc_ch/algorithm_rec_svtr.md)
可以尝试以下实验: 1、使用SVTR的中文或者英文预训练模型; 2、如果长文本数据很多,可以去掉 - RecConAug 数据增强方法; 3、将mixer的Local替换为Conv、local_mixer全部修改为[5, 5]
请问,方便提供一下测试用例和其预测结果吗?这样方便分析。