LapSRN:多尺度超分辨率的拉普拉斯金字塔网络.
现存的超分辨率模型存在三个主要的问题:
- 采用预定义的上采样操作(例如双三次插值)会产生不必要的计算代价,并且结果可能会有重建伪影。而使用反卷积层操作来替换预定义的上采样操作,网络结构又比较简单,性能较差,不能很好地学习复杂的映射;
- 使用$L2$损失函数时,不可避免地会产生模糊的预测,恢复出的高分辨图片往往会过于平滑;
- 大部分的方法都只有一次上采样的步骤,这就会使得对于更高倍数的训练变得困难。
为解决上述问题,本文提出了LapSRN,与其他模型的对比如下:
网络结构
模型由特征提取分支和图像重构分支构成。
- 特征提取分支(Feature Extraction Branch):采用转置卷积对图像逐级放大,并将每一级放大结果传递给图像重构分支;
- 图像重构分支(Image Reconstruction Branch):使用双线性插值放大图像,并结合特征提取分支得到的图像特征重构图像。
模型学习的是每一个尺度(phase)下原图像与插值图像之间的残差。
损失函数
作者使用Charbonnier Loss作为对$L1$损失函数的近似:
作者分析该损失函数相比于$L2$损失函数,对outlier不敏感,能获得更好的效果:
Pytorch
实现如下:
class L1_Charbonnier_loss(torch.nn.Module):
"""L1 Charbonnierloss."""
def __init__(self):
super(L1_Charbonnier_loss, self).__init__()
self.eps = 1e-3
def forward(self, X, Y):
diff = torch.add(X, -Y)
error = torch.sqrt(diff * diff + self.eps)
loss = torch.mean(error)
return loss