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

询问网络细节 #20

Closed
splinter21 opened this issue Jun 6, 2019 · 9 comments
Closed

询问网络细节 #20

splinter21 opened this issue Jun 6, 2019 · 9 comments

Comments

@splinter21
Copy link

很棒的工作!看完模型代码和论文,有几个问题。
1、Relu层的选择,是否有什么经验?比如,大多数SR网络用Relu,DBPN/RBPN用PRelu,ESRGAN和EDVR用LRelu,是基于什么考究?或者说是否以后的实验我什么都别管,直接用LRelu就是最优的?
2、Resblock_noBN中,对Conv1Conv2使用kaiming初始化带来的提升我记得在ESRGAN的补充材料里也出现过,是否也是以后直接用就行,无计算成本的性能提升?
3、如果要拓展参数量,一个是channel的变化,这个很简单,因为所有块都对齐了nf的;
如果是拓展block数量呢?EDVR的输入参数,前后RB是可变的,但是PCD和AttentionFusion module,block是固定写死的,是否意味着,如果靠拓展深度加大网络参数量和计算量从而提升指标,A、这2个模块的深度不用管,加大深度不划算?B、如果这2个模块也要加大深度,应该加大哪些层的深度?C、第三个选择,只加大backRB的深度,frontRB和2个module的深度不用管?
Table4对照实验中的配置,和比赛最终结果的配置,是否只有channel和fusion后RB的深度变化了?
4、相比SISR中常用的self-ensemble,8倍的计算量,EDVR的测试脚本中只有4倍,少了90度旋转的过程,这个是基于什么考究?是否因为提升几乎很小,所以就不用再通过2x计算量来提升指标了?
5、Table5中4个track均以碾压的优势取得第一,这个非常值得肯定。第二名的方法在论文《Adapting Image Super-Resolution State-of-the-arts and Learning Multi-model Ensemble for Video Super-Resolution》中(arxiv上可以搜到),idea非常simple,是典型的刷榜流做法,第一个idea,把SISR(RCAN、RDN)中的输入改为相邻帧输入,直接改第一个Conv的输入channel,就已经提升了1dB,超过DUF,第二个idea就是3模型结果ensemble,结果进一步提升0.12(作用很小了,可能还不如self-ensemble带来的提升,不划算,这个先不提)。这里想看下DUF、标配RDN、RCAN和EDVR比赛配置的GFLOPS对比
6、预先进行拉伸在SISR中一直被视为不太好的做法,EDVR中用了bilinear拉伸LR_center和HR做残差,这个有实验过去掉这步吗?收敛速度上我觉得做拉伸做残差更快,但是精度不一定。(这个的目的是不是和EDSR-Pytorch中”add_mean”和”sub_mean”差不多的?)
7、训练细节上,本文使用的是Charbonnier Loss,这个最早我记得是在LapSRN中出现,之后普遍用L1Loss。这个是有什么考究吗?训练浅层网络作为深层网络的初始化,这个求具体细节,是哪些层的权重初始化了,深浅改变的是什么层的深度?
8、有关PCD对齐模块
(1)108、117行forward中,offset_conv2里concat乘2是什么作用?(后面TSA层好像也有乘2的)
(2)为什么不排除中间帧(t=t+i)只做4个?不可以直接采用l1_fea的输入吗?

谢谢!

@splinter21
Copy link
Author

还有2个问题
这个能否是SISR的特殊情况?
比如,一,5张LR都是自身
二,中间LR对应HR,其余4张为完全无关的LR

@xinntao
Copy link
Owner

xinntao commented Jun 7, 2019

  1. ReLU, PRELU, LReLU实际上的差异没有很明显。 使用LReLU而不用ReLU是因为结果稍微好一些, 保留negative部分的信息有一定的作用,但也是marginal的。 PReLU的capacity会更大一些, 但是它影响计算速度, 并且不能inplace计算, 就没有使用。
  2. 初始化不会带来额外的成本, pytorch默认的初始化已经很好了(kaiming uniform), 在有residual的结构时候, 我们发现乘以一个<1的系数, 比如0.1,会更好。
  3. PCD上增加block带来的计算量是巨大的,因为它要对每一个输入的帧都处理。 比赛中,我们试验了一下, 发现带来的提升和计算代价相比不划算。 A. 目前我觉得这两个模块加大深度不划算。B. 如果要增加, 应该是对align有帮助的才好。C,尽早fusion越好, 这其实在VESPCN里面也有类似的发现。 我们发现额外的conv放在后面较好。
  4. 因为后面的提升太小了。
  5. 比赛有比赛的技巧。 我们一方面为了比赛, 另外一方面也想发掘一下到底什么是对VideoResotoration是重要的。 EDVR最后的model其是非常大的, 这是出于比赛的考虑。
    这里可以多说一些我们的想法:
    1)我们还是认为video resotoration里面alignment和fusion是非常重要的两个方面, 是它区别于SISR的地方。 因此我们的探究也着重放在这两个方面。EDVR提供了一个角度,但也还是很初步的。 其实我们自己对于这个结构是有点不满意的。 比如在训练的过程中有些问题(这个我们后面会在repo中总结一下)。 我们在之后又做了一些探究,能够对EDVR有更深入的理解。 到时候可以关注我们的后续工作。
    2)我们也想趁着这个机会建立一下OpenVideoRestoration, 对目前的方法做一个总结, 包括代码和文档。这样无论对我们自己研究,还是其他人的研究都会有帮助。当然这个目前正在完善中。
  6. 什么叫预先进行拉升。我不是很理解。
  7. Charbonnier Loss和L1的loss差异不大。训练的具体细节我们也在整理中。 比赛过程中的训练是异常的繁杂的,我们希望能够整理出一个较为清晰的版本。
    8、
    (1)x2是出于, 在光流中, 如果放大两倍, 则其值要乘以2。 这样的设计是为了遵照这个原则。
    (2)你说的这个方式, TDAN中是这样做的。但是我们发现这样效果不好。 一个原因是把reference帧放进去,相当于多一个约束,能够帮助alignment的训练。
  8. 你可以尝试,会发想performance降低很多, 很多细节恢复不出来了。 我们是认为多帧信息利用得好的话, 帮助是非常大的。

@splinter21
Copy link
Author

1、2、那么以后设计网络可以直接按这个来了,不错的贡献。
3、如果是5帧,那么fusion前就是5倍的计算量,所以在fusion后增加深度。
4、那就直接按github中代码的self-ensemble方式来。
5、嗯,我也一直在思考,多帧超分,相比SISR,真正能带来提升的点到底是在哪里。当然,为了比赛训练很大的模型是可以理解的。
6、这个是指SISR早期的做法,先bicubic放大到HR尺度再学习。一个是计算量太大,第二个,拉大了再拉回来,不会和以前一样了,损失了信息,引入了噪声。
放到这里,第一个问题没有,因为后面都是在LR尺度学习的。主要是第二个问题,如果把bilinear改成nearest这种可逆的缩放算法,会不会更好?或者,用预训练的简易SISR网络,也肯定比直接bilinear拉伸和HR得到残差来训练,指标更强一点。
7、嗯,期待训练细节。看其他issue,一个较头疼的问题是DCNv2的训练不稳定,要特殊处理。
8、(1)乘2这种simple的做法,感觉网络自身也能学习到,实际上没什么用。当然motivation上和光流一致,也没有多少额外计算量,不是大问题。
9、提出这个问题主要是考虑到,实际应用中,不会像研究里这么帮你每个序列都切好了。有的场景帧多,有的场景帧少,而且跨场景那几帧怎么弄。如果缺帧用自身代替可行的话那就没问题了。如果相邻帧是别的场景的无关帧,那么进一步,预先判断同一视频不同场景切开来的步骤也不用了。

@xinntao
Copy link
Owner

xinntao commented Jun 7, 2019

  1. 这是参照了VDSR学习residual的方式, 用NN和blinear应该差异不大的, 如果使用几层的conv来做, 效果应该会有提升。总的来说, 1)学习image residual是更好的,2)至于方式, 我觉得差异没有那么大,或者不是一个很关键的问题。
  2. 是的, 只是一开始设计的时候就仿照光流的一些做法。 我们后来的改进中是去除了这个x2的
  3. 实际中是有转镜头的情况, 这是一个可以探究的细节。 其实我们在处理边缘帧的时候, 也稍微探究了一下这个, 到底怎么补全缺失的帧。 因此在测试代码中会发现有一个index_generation 函数。 这部分对于那几帧边缘帧其实影响是很大的。(但是由于最后是100帧平均了, 因此对最后的影响不大。)

PS: 之后提issue最好用英文。这样,在这里的讨论,其他更多的人也能够看懂~

@izhx
Copy link

izhx commented Jun 10, 2019

There is a function with 4 padding mode in the test code. Thus a short sequence can filled to the nFrames.

@splinter21
Copy link
Author

@xinntao Have you tried introducing the unligned loss in TDAN?

@xinntao
Copy link
Owner

xinntao commented Jun 10, 2019

We will include TDAN codes later in this repo.
Actually, we have found the alignment loss in TDAN will degrade the performance.

@geyanteng
Copy link

Hi, a network structure problem:
In the code, the 'spatial attention' part receives the input 'aligned_fea', but in the paper, I found 'Spatial attention masks are then computed from the fused features'. It seems that 'spatial attention' part should receive the fused feature 'fea'. I got confused. Which should be right?
Thank you.

EDVR/codes/models/modules/EDVR_arch.py

   aligned_fea = aligned_fea.view(B, -1, H, W) * cor_prob
    #### fusion
    fea = self.lrelu(self.fea_fusion(aligned_fea))
    #### spatial attention
    att = self.lrelu(self.sAtt_1(aligned_fea))
    att_max = self.maxpool(att)
    att_avg = self.avgpool(att)

@xinntao
Copy link
Owner

xinntao commented Jul 26, 2019

@geyanteng
Thanks for reporting this inconsistent part. I think it does not matter (it is not the key point).
You can use the code version.

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

4 participants