PaddleOCR icon indicating copy to clipboard operation
PaddleOCR copied to clipboard

请问SVTR是否支持输入图片宽度变长?

Open songkq opened this issue 2 years ago • 18 comments

@Topdu https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/doc/doc_ch/algorithm_rec_svtr.md

songkq avatar May 11 '22 00:05 songkq

SVTR使用了矫正模块和绝对位置编码,所以目前不支持变长。 如果有变长的需求,可以使用支持变长的PP-OCRv3识别算法SVTR-LCNet:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/doc/doc_ch/PP-OCRv3_introduction.md#3

Topdu avatar May 11 '22 01:05 Topdu

@Topdu 感谢回复,如果不使用绝对位置编码,精度会差多少,另外想请教下有支持变长的position embedding嘛?

songkq avatar May 11 '22 02:05 songkq

没有做过不使用绝对位置编码的实验,但是位置编码SVTR中不是关键部分,可以尝试直接将绝对位置编码去掉。 支持变长的position embedding可以参考SWin、CSwin、Uniformer等论文。

Topdu avatar May 11 '22 03:05 Topdu

@Topdu 感谢分享,实测可扩展为变长推理 还想请教下,Local mixer提供的mask在模型训练过程中会通过学习的方式更新嘛?另外,(1)Local mixer + Global mixer 和(2)Conv mixer + Global mixer 两种组合方式的效果有比较过嘛?

songkq avatar May 11 '22 08:05 songkq

DropPath在SVTR实际训练过程中有使用嘛?影响收敛速度和收敛效果嘛? 另外pos_embed为什么采用trunc_normal_初始化? 另外激活函数选用了nn.GELU,这个对模型收敛速度和精度提升有收益嘛?

songkq avatar May 11 '22 08:05 songkq

@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的通用配置,并没有进行消融实验。

Topdu avatar May 11 '22 09:05 Topdu

@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数量对识别效果影响大嘛?Local mixer 的窗口大小是根据实验确定的,和输入图像大小和patch数量是强相关嘛?

假设训练阶段采用固定大小图像训练模型,推理阶段采用宽度变长(小于等于训练时图片宽度),根据输入图像宽度变化动态生成mask,替换训练阶段使用的mask,会影响Local mixer效果嘛?

songkq avatar May 11 '22 09:05 songkq

patch的size是固定的4*4,如果patch的数量改变,也就是输入大小改变了,一般来说,输入大小越大性能越高。

Local mixer可以看做卷积特殊形式,卷积的kernal size是和输入大小无关的,也就是理论上讲Local mixer和输入大小无关,但是现在Local mixer的实现方式是不灵活的,一个类似Local mixer机制的实现方式可以参考 Neighborhood-Attention-Transformer ,这种实现方式更灵活,可以实现与输入大小无关,完全当作卷积使用,但是对于文本识别这种输入size相对较小的任务,这种实现方式速度会慢一些,后续SVTR也会考虑使用这种方式实现一版。

如果把local mixer当成卷积,训练和推理都可以使用变长的输入。

Topdu avatar May 11 '22 10:05 Topdu

patch的size是固定的4*4,如果patch的数量改变,也就是输入大小改变了,一般来说,输入大小越大性能越高。

Local mixer可以看做卷积特殊形式,卷积的kernal size是和输入大小无关的,也就是理论上讲Local mixer和输入大小无关,但是现在Local mixer的实现方式是不灵活的,一个类似Local mixer机制的实现方式可以参考 Neighborhood-Attention-Transformer ,这种实现方式更灵活,可以实现与输入大小无关,完全当作卷积使用,但是对于文本识别这种输入size相对较小的任务,这种实现方式速度会慢一些,后续SVTR也会考虑使用这种方式实现一版。

如果把local mixer当成卷积,训练和推理都可以使用变长的输入。

嗯嗯。后面尝试下。 看模型里use_lenhead,这个有啥用啊,是打算做一些类似文本字符计数的辅助监督嘛?

songkq avatar May 11 '22 11:05 songkq

嗯嗯。后面尝试下。 看模型里use_lenhead,这个有啥用啊,是打算做一些类似文本字符计数的辅助监督嘛?

是的,加一个长度分类器和长度的监督celoss即可,这部分并未在SVTR论文中使用,代码没有放出来

Topdu avatar May 11 '22 12:05 Topdu

嗯嗯。后面尝试下。 看模型里use_lenhead,这个有啥用啊,是打算做一些类似文本字符计数的辅助监督嘛?

是的,加一个长度分类器和长度的监督celoss即可,这部分并未在SVTR论文中使用,代码没有放出来

长度分类器?区分长文本和短文本行?不是直接回归文本行字符数量嘛?

songkq avatar May 11 '22 12:05 songkq

长度分类器?区分长文本和短文本行?不是直接回归文本行字符数量嘛?

嗯嗯,你理解的对,可以理解为字符数量分类器,英文单词一般最长25个,所以将len_x分为25类,做celoss的监督,字符数量的标签也很容易获得。

Topdu avatar May 11 '22 12:05 Topdu

@Topdu hi,请问你在中文训练集上训练SVTR-Tiny收敛快嘛?训练过程的ctcloss曲线可以看下嘛?

songkq avatar Jun 09 '22 07:06 songkq

@Topdu 老哥,请问在现有模型权重基础上finetuning,初始学习率设置多少比较合适?试了下感觉多轮次finetuning对初始学习率比较敏感

songkq avatar Jun 16 '22 07:06 songkq

@Topdu hi,请问你在中文训练集上训练SVTR-Tiny收敛快嘛?训练过程的ctcloss曲线可以看下嘛?

这里不太方便提供loss曲线,loss下降趋势可参考反函数1/x的趋势。

@Topdu 老哥,请问在现有模型权重基础上finetuning,初始学习率设置多少比较合适?试了下感觉多轮次finetuning对初始学习率比较敏感

finetune时,学习率可以调小一点,但是还是对于不同的数据集需要实验验证,这里没有很好建议。

Topdu avatar Jun 16 '22 08:06 Topdu

好的,谢谢

songkq avatar Jun 16 '22 12:06 songkq

长度分类器?区分长文本和短文本行?不是直接回归文本行字符数量嘛?

嗯嗯,你理解的对,可以理解为字符数量分类器,英文单词一般最长25个,所以将len_x分为25类,做celoss的监督,字符数量的标签也很容易获得。

您好,您这里说的字符数量的标签是通过什么获得的呢?

yulm-1 avatar Oct 23 '22 08:10 yulm-1

您好,您这里说的字符数量的标签是通过什么获得的呢?

通过已有文本标注的识别数据集获得:len(label)

Topdu avatar Oct 24 '22 06:10 Topdu