https://arxiv.org/pdf/2203.09195.pdf https://github.com/csjliang/LDL
图像超分要想具有优异的纹理信息,那么GAN就是必经之路。但是,GAN存在训练不稳定问题与伪影问题。关于GAN的训练不稳定问题,目前已经有了一些trick缓解;但是关于GAN导致的伪影问题,暂无有效的方案。
本文对GAN生成的伪影问题进行了探索并提出一种行之有效的方案:局部区域统计信息有助于伪影判别并进而生成mask引导训练过程。所提方案简单有效,可以轻易嵌入到现有超分方案中并提升其性能。
一般来讲,GAN-SR方案的训练损失可以描述如下:
其中,
分别表示重建损失、感知损失以及对抗损失。如SRGAN一文所分析:仅采用重建损失训练会导致重建结果过于模糊,而对抗损失引入可以重建更多纹理,但同时会引入伪影问题。
上图给出了ESRGAN在不同类型区域的重建前后下过对比,可以看到:
上图从训练稳定性角度出发对前述三种类型块的MAD(
)信息进行了对比,可以看到:A类图像块的训练比较稳定;B类图像块存在大波动(意味着更高不确定性);C类图像块具有最大的波动与不稳定性。
结合前述分析,为使得GAN-SR具有更优异的重建效果,我们需要抑制C类型块的伪影生成,同时保持A和B类型块的纹理重建效果。为达成该目的,我们精心设计了一种pixel-wise map进行伪影与细节的判别并用于引导GAN-SR训练,下图各处了该map生成过程示意图。
上表与图给出了合成数据集上不同方案的性能与重建效果对比,可以看到:
上图给出了真实尝尽盲超分的效果对比,可以看到:相比BSRGAN与Real-ESRGAN,RealESRGAN+LDL方案重建结果具有更少的伪影、更锐利的纹理细节。
由于作者既进行了合成数据实验(对标ESRGAN),也进行了盲超分实验(对标Real-ESRGAN),所以我们对比一下这两组code即可:
从对比可以看到,区别仅在这四行code:
pixel_weight = get_refined_artifact_map(self.gt, self.output, self.output_ema, 7)
l_g_artifacts = self.cri_artifacts(torch.mul(pixel_weight, self.output), torch.mul(pixel_weight, self.gt))
l_g_total += l_g_artifacts
loss_dict['l_g_artifacts'] = l_g_artifacts
def get_local_weights(residual, ksize):
pad = (ksize - 1) // 2
residual_pad = F.pad(residual, pad=[pad, pad, pad, pad], mode='reflect')
unfolded_residual = residual_pad.unfold(2, ksize, 1).unfold(3, ksize, 1)
pixel_level_weight = torch.var(unfolded_residual, dim=(-1, -2), unbiased=True, keepdim=True).squeeze(-1).squeeze(-1)
return pixel_level_weight
def get_refined_artifact_map(img_gt, img_output, img_ema, ksize):
residual_ema = torch.sum(torch.abs(img_gt - img_ema), 1, keepdim=True)
residual_SR = torch.sum(torch.abs(img_gt - img_output), 1, keepdim=True)
patch_level_weight = torch.var(residual_SR.clone(), dim=(-1, -2, -3), keepdim=True) ** (1/5)
pixel_level_weight = get_local_weights(residual_SR.clone(), ksize)
overall_weight = patch_level_weight * pixel_level_weight
overall_weight[residual_SR < residual_ema] = 0
return overall_weight