- 从三个地方入手修改了SRGAN:
- 网络结构
- adversarial loss
- perceptual loss
- 网络结构主要是引入了RRDB的结构,并且去掉了BN层,使用residual scaling和smaller initialization,就是residual在加的时候乘一个小于1的系数,在w初始化的时候用更小的varience
- adversarial loss是把discriminator 修改为Relativistic average GAN:
公式是这样的: D R a ( x r , x f ) = σ ( C ( x r ) − E x f [ C ( x f ) ] ) D_{Ra}(x_r, x_f ) = σ(C(x_r) − E_{x_f} [C(x_f )]) DRa(xr,xf)=σ(C(xr)−Exf[C(xf)]), E x f E_{x_f} Exf是指在一个minibatch的fake data里面取均值, σ ( ⋅ ) σ(·) σ(⋅)是一个sigmoid function,所以对discriminator和generator来说,loss分别是
- perceptual loss是把原先比较activation function后的feature map改为比较activation层之前的feature map,而且探索了把VGG从分类任务的pretrained变成recognition任务的pretrained,认为这样的VGG更注重纹理,虽然只获得了微小的margin
- BN层去掉是因为如果test和train有不同的分布,会引入不合理的纹理,去掉效果更好,一般SR和debluring都会去掉
- 最终的loss是这样的 L G = L p e r c e p + λ L G R a + η L 1 L_G = L_{percep} + λL^{Ra}_G + ηL_1 LG=Lpercep+λLGRa+ηL1其中 L 1 = E x i ∣ ∣ G ( x i ) − y ∣ ∣ 1 L_1=E_{x_i}||G(x_i) − y||_1 L1=Exi∣∣G(xi)−y∣∣1,是SR和GT差的L1norm
- 提出一种network interpolate的方法,即先用PSNR-orentied的loss训练出来一个generator,在此基础上再用上本论文提出的ESRGAN的模型去finetune它得到另一个状态下的参数,并对这两个generator参数进行插值可以得到一系列的网络参数,分别对应从平滑到sharp的SR模型参数。其实还有另外两种方法来获得这个效果,一个是对两个模型生成的图片直接进行插值,但是结果有噪声和模糊,另一个是对loss函数的超参数值进行插值,但是这样太costly