Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于RIFE从v3.8到v4.26版本演进的疑问:性能提升的关键因素 #124

Open
zehaisang opened this issue Dec 3, 2024 · 5 comments

Comments

@zehaisang
Copy link

首先感谢作者对社区的贡献,对RIFE带来了持续的改进。在观察RIFE从v3.8到v4.26的演进过程中,我发现了一些很有趣的现象:

  1. 质量提升:
    LPIPS指标有显著提高(成倍提升)
    实际应用中的视觉质量明显提升
    插帧结果更加稳定
  2. 值得关注的现象:
    核心架构(由粗到细的金字塔结构)基本保持不变
    模型参数量实际减少了
    尽管架构更简单,性能却大幅提升

这造成了一个很有趣的现象:

更简单的模型 ➡️ 更好的效果
相同的核心设计 ➡️ LPIPS指标成倍提升

因此想请教以下几点:

  1. 在这个演进过程中的关键设计原则或决策
  2. 在减少参数的同时提升质量的关键因素
  3. 您认为对于提升帧插值质量最重要的要素是什么

您的见解将对从事类似研究的社区很有帮助。

@hzwer
Copy link
Owner

hzwer commented Dec 3, 2024

我能想到的一些吧

  1. 关注训练和推理的 gap,早期的训练使用了不充足的尺度增广,导致在推理大运动场景会出现问题
  2. 以优化 lpips 为核心,而不看 psnr 指标
  3. 投入更多的训练时间
  4. 结构上去掉了 refine,增加了 warped feature

我觉得只要围绕 lpips 指标,并且有一些 hard case 辅助迭代模型,其实做的事情都是小修小改,慢慢累积起来就好了很多
还有一些可以参考 https://zhuanlan.zhihu.com/p/721430631

@zehaisang
Copy link
Author

感谢您的回复,我现在想进一步追问:

  1. 具体而言,hard case是如何辅助迭代模型的? 是通过将hard case与bad case调整损失函数及训练数据集,还是使用hard case对模型进行微调?
  2. “投入更多的训练时间”是指训练1000个epoch甚至更多epoch吗?
  3. 尺度增广指的是在获取图像时进行增广吗? 例如,在训练时进行1.5x、2x、4x的随机放大,是在dataset返回数据时做随机放大(即训练patch动态改变),还是在getimg或__getitem__之前进行随机放大?但训练时都是使用384x384的patch。
  4. 使用SSIM Loss以及1e-5 * Consistency Loss的具体作用是什么? 这些损失的权重相对于主要的0.1 * L1 Loss + VGG Loss要小很多。
  5. 您提到不能太早扩数据量,具体来说应该在什么时候扩数据量?
  6. 关于VGG Loss的一些调优:
    比如:
    weights = [1.0 / 32, 1.0 / 16, 1.0 / 8, 1.0 / 4, 1.0]
    这样做相比于:
    weights = [1.0 / 2.6, 1.0 / 4.8, 1.0 / 3.7, 1.0 / 5.6, 10 / 1.5]
    有哪些优势?

感谢您的解答!

@hzwer
Copy link
Owner

hzwer commented Dec 16, 2024

  1. 每次发模型前,肉眼观察几十个 hard case or bad case 是不是有提升,不涉及改训练集
  2. 是的
  3. 训练时是相同大小 patch,只是从不同增广的图中裁剪出来;动态 patch 我想也可以,但是写起来比较繁琐一点
  4. SSIM 看起来会让所有指标略好一点,所以有的时候保留;后一项是我观察到光流没有正则化时,在一些动漫场景会出现奇怪 artifacts,所以稍微处理了一下;这两项不要紧
  5. 至少对于 rife 这种模型,我观察扩数据量的增益不明显,我的意思是不要太多把精力花在这上边(如果你只有一个人),因为洗数据也很花时间
  6. 这个是从别人那抄的参数,可能他们基于某些统计方法平衡的系数,我不觉得会有很大区别,后者就是深层权重稍大了一点

@zehaisang
Copy link
Author

zehaisang commented Dec 19, 2024

感谢您的解答,我现在有以下进一步的问题想向您请教:

仅训练一个简单的两帧插入一帧的插帧模型,不使用timestep的情况下,

  1. 在使用如 Vimeo-Septuplet、SportSLoMo 或 Adobe240fps 等包含连续帧的数据集时,应该选择连续的三帧、左右间隔0-1帧、左右间隔0-2帧,还是随机选择帧?
  2. 推荐使用 Vimeo-Triplet、Vimeo-Septuplet中的哪个,还是两者兼用?
  3. 在训练过程中,Vimeo-Triplet、Vimeo-Septuplet、Adobe240fps、ATD-12K、SportSLoMo 这些数据集的重要性如何,也就是以哪个数据集为主?

感谢您的解答!

@hzwer
Copy link
Owner

hzwer commented Dec 20, 2024

  1. 建议对于帧率比较低的(~30fps) 选连续三帧,帧率高的选间隔大一点
  2. 只用 Vimeo-Septuplet,它包含 Vimeo-Triplet
  3. Vimeo-Septuplet 是主要的,其它可用可不用,我没有做出很明显的差异

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants