图像复原的损失函数总结——Loss Functions for Image Restoration with Neural Networks论文阅读

Loss Functions for Image Restoration with Neural Networks

  • 论文亮点
  • 摘要
  • 损失函数
    • L1 Loss
    • SSIM Loss
    • MS-SSIM Loss
    • 最好的选择:MS-SSIM + L1 Loss
  • 结果
  • 讨论
    • 损失函数的收敛性
    • SSIM和MS-SSIM的表现

该论文发表于 IEEE Transactions on Computational Imaging 2016,点击论文原文查看全文。
下面将记录笔者对论文的理解与掌握,对于作者最终提出的MS-SSIM+L1 Loss的损失函数,笔者尚未完全掌握如何计算 G σ G M G_{\sigma_{G}^{M}} GσGM与L1的结合。另外,作者在文中提到对于不同的损失函数使用相同的网络结构,但并未提到超参数(比如学习率)是否相同,如果有读者了解,还望不吝赐教。

论文亮点

【1】总结了L2 Loss、L1 Loss、SSIM Loss、与MS-SSIM Loss,并提出MS-SSIM Loss与L1 Loss的组合是最佳选择。
【2】对L1 Loss优于 L2 Loss的原因提出了见解,并指出了SSIM Loss与MS-SSIM Loss的缺陷。

摘要

  尽管神经网络在计算机视觉中运用的越来越多,但是损失函数似乎并没有引起人们太多的注意。目前默认的损失是 L 2 L2 L2损失。在这篇论文中,我们将注意力放在了图像复原任务中可代替的损失函数选择。特别是,当由人类观察进行评估时,我们展示了perceptually-motivated loss(比如SSIM Loss)的重要性。我们对比了几种损失的表现,并且提出了一个新的、可微分的损失函数,它在不改变网络结构的情况下,复原结果有显著的提升。作者提供了Caffe实现。
图像复原的损失函数总结——Loss Functions for Image Restoration with Neural Networks论文阅读_第1张图片
  上图展示了由不同的损失函数训练的网络的去噪和去马赛克结果对比。可以看出,L2 Loss(图(d))产生了有斑点的伪影。这是因为L2惩罚大误差,而对小误差比较容忍,忽略了图像的本质结构。

损失函数

L1 Loss

  L1 Loss的本质就是MAE(平均绝对误差),比较简单,计算公式及其导数见论文。
  尽管L1 Loss基于图像中的patch计算(有时候也直接取整个图像计算),但无论如何,反向传播时的导数是在每个像素上(像素级)计算的。
  需要注意的是,L1 Loss相比L2 Loss取得了更好的结果,如图1(e)中所示(没有了伪影),但它仍然不是最优结果。

SSIM Loss

  SSIM属于感知相关指标(perceptually motivated),对某一像素点 p p p的SSIM定义为:
SSIM ⁡ ( p ) = 2 μ x μ y + C 1 μ x 2 + μ y 2 + C 1 ⋅ 2 σ x y + C 2 σ x 2 + σ y 2 + C 2 = l ( p ) ⋅ c s ( p ) \begin{aligned} \operatorname{SSIM}(p) &=\frac{2 \mu_{x} \mu_{y}+C_{1}}{\mu_{x}^{2}+\mu_{y}^{2}+C_{1}} \cdot \frac{2 \sigma_{x y}+C_{2}}{\sigma_{x}^{2}+\sigma_{y}^{2}+C_{2}} \\ &=l(p) \cdot c s(p) \end{aligned} SSIM(p)=μx2+μy2+C12μxμy+C1σx2+σy2+C22σxy+C2=l(p)cs(p)
其中, X X X Y Y Y分别表示处理后图像与真实图像, μ x ( y ) \mu_{x(y)} μx(y)是X(Y)的均值, σ x ( y ) 2 \sigma_{x(y)}^{2} σx(y)2 X ( Y ) X(Y) X(Y)的方差, σ x y \sigma_{xy} σxy X X X Y Y Y的协方差, C 1 C_1 C1 C 2 C_2 C2分别是常数(为了避免分母为0而保持稳定),其计算公式为 C 1 = ( k 1 L ) 2 C_{1}=\left(k_{1} L\right)^{2} C1=(k1L)2 C 2 = ( k 2 L ) 2 C_{2}=\left(k_{2} L\right)^{2} C2=(k2L)2,其中 L L L为图像灰度变化范围(一般为255,若归一化到[0,1]后,则为1,若为[-1,1],则为2), k 1 k_1 k1 k 2 k_2 k2是两个常数,默认为0.01和0.03。
  一般通过高斯核与图像卷积来计算图像的均值和方差,计算代码可参考github上的code,需要注意的是上面的代码需要将图像归一化到[0,1]区间再计算SSIM 。
  对SSIM Loss有多种定义方法,比如:
L S S I M ( X , Y ) = − log ⁡ ( 1 2 ∣ P ∣ ∑ p ∈ P ( X , Y ) ( 1 + SSIM ⁡ ( p ) ) ) \mathcal{L}_{\mathrm{SSIM}}(X, Y)=-\log \left(\frac{1}{2|P|} \sum_{p \in P(X, Y)}(1+\operatorname{SSIM}(p))\right) LSSIM(X,Y)=log2P1pP(X,Y)(1+SSIM(p))
L S S I M ( P ) = 1 N ∑ p ∈ P 1 − SSIM ⁡ ( p ) \mathcal{L}^{\mathrm{SSIM}}(P)=\frac{1}{N} \sum_{p \in P} 1-\operatorname{SSIM}(p) LSSIM(P)=N1pP1SSIM(p)
L S S I M ( P ) = 1 N ∑ p ∈ P − SSIM ⁡ ( p ) \mathcal{L}^{\mathrm{SSIM}}(P)=\frac{1}{N} \sum_{p \in P} -\operatorname{SSIM}(p) LSSIM(P)=N1pPSSIM(p)
  其中 P P P指的是Patch像素集,一般为1,即逐像素计算SSIM最后求均值。
  经过笔者的实验发现,三种方法取得的结果没什么差别,在上述提到的计算代码中,选用了最后一种方式。

MS-SSIM Loss

  对于SSIM的计算而言,计算图像均值、方差的高斯核的尺寸大小的选择尤为重要。如果选小了,则由它计算出来的SSIM Loss无法很好地保持图像局部结构,并且会出现伪影。如果选大了,网络则会在图像边缘处产生一些噪声。
  相比于花大力气去调整高斯核尺寸,人们提出了使用多尺度的SSIM(multi-scale SSIM,简称为MS-SSIM),MS-SSIM的论文可单击查看,其中详细介绍了SSIM和MS-SSIM的公式推导。
  多尺度的实质就是对生成图像和真实图像不断地以2为因子进行下采样(一般下采样4次,即取5个尺度(分辨率)),从而得到具有多个分辨率的图像。并对这些不同分辨率的图像依次进行SSIM的评估,最后以某种方式将这些SSIM融合成一个值,就是MS-SSIM。关于MS-SSIM和SSIM的计算与Python实现,笔者后面会专门写一篇博客进行讲解。
  MS-SSIM Loss的定义方式和SSIM完全一致,只不过把计算SSIM改成了计算MS-SSIM而已。

最好的选择:MS-SSIM + L1 Loss

  在设计上,SSIM和MS-SSIM都对均匀的偏差非常不敏感,这导致了(使用它们作为损失函数)会带来颜色的平移或亮度的改变,处理结果会变得阴暗。然而,相比其他损失函数,MS-SSIM可以保留高频区域的对比(preserves the contrast in high-frequency regions)。另一方面,L1可以保留颜色和亮度,但是它会忽略局部结构。
  因此,我们将它们进行了结合:
L M i x = α ⋅ L M S − S S I M + ( 1 − α ) ⋅ G σ G M ⋅ L ℓ 1 \mathcal{L}^{\mathrm{Mix}}=\alpha \cdot \mathcal{L}^{\mathrm{MS}-\mathrm{SSIM}}+(1-\alpha) \cdot G_{\sigma_{G}^{M}} \cdot \mathcal{L}^{\ell_{1}} LMix=αLMSSSIM+(1α)GσGML1
其中 α \alpha α被凭经验地设置成了0.84(选择这个参数的原因是使得两种损失的值能大致平衡,当我们测试了一些不同值的时候,我们并没有进行详细的调查。我们发现结果并没有随着 α \alpha α的小变化而变得敏感)。
  对二者结合的导数相当于二者分别求导的结果相加 G σ G M G_{\sigma_{G}^{M}} GσGM是计算MS-SSIM中的第M个尺度的高斯核,它与L1的逐点乘法是因为MS-SSIM基于像素点q对中心像素点p的MS-SSIM的贡献来反向传播,而这个贡献用高斯权重来确定(这种结合倒是很少见,高斯核是四维张量,计算出的L1 Loss是二维张量,这二者如何相乘?)。

结果

  作者对比了使用L1,L2,不同高斯核标准差的SSIM。MS-SSIM与MS-SSIM+L1作为损失函数的结果。
  结果说明L1相比L2取得了更好的结果(在讨论中进行了说明),MS-SSIM相比SSIM在去马赛克和去噪声上并没有取得明显的优势(在讨论中进行了说明),MS-SSIM+L1取得了最好的结果,同时作者还发现,结合MS-SSIM对模型性能有更大的提升,L2+MS-SSIM在视觉感知度量上超越了单独的L2结果。

讨论

损失函数的收敛性

  L1相比L2取得了更好的结果(更低的Loss)。作者提出这是因为L2更容易陷入局部最优,而L1更容易达到更好的最小值。为了测试这个假设,作者进行了如下实验:分别训练两个网络,一个先用L1训练,再用L2训练直到收敛,另一个则先用L2训练,再用L1训练直到收敛(这种实验设计思想可学习:如果满足假设,则用L2 Loss的会收敛到更大的损失值,而L1会更易收敛到更小的损失值,于是在训练过程中互换对比效果)。其结果如下图所示:
图像复原的损失函数总结——Loss Functions for Image Restoration with Neural Networks论文阅读_第2张图片
  由图可看出,在不改变损失函数之前,L1 Loss在测试集上取得了更低的损失值,即表现更好,而当交换了损失函数之后,二者都能收敛到一个比较小的值,这证明了L2 Loss在之前陷入了局部最优。但最终,它们的结果都不如组合MS-SSIM和L1的结果好。

SSIM和MS-SSIM的表现

  SSIM存在两个问题,一个是对边缘噪声的度量有缺陷,另一个则是对平坦区域的颜色变化不敏感。由于多尺度性质,MS-SSIM解决了边缘噪声问题,但它仍然对平坦区域的颜色变化不敏感,特别是当只是有一个通道很强时,比如天空。当然,这属于图像质量评估的问题,不是本文的研究范围。
  最后,我们要指出的是,在彩色图像的上下文中使用基于SSIM的损失引入了近似因为这些度量最初是为灰度图像设计的。一种更具原则的方法是将损失函数建立在专门为彩色图像(如FSIMc)定义的度量上。然而,据我们所知,还没有提出这种可微的度量损失。我们计划在今后的工作中解决这个问题。

你可能感兴趣的:(计算机视觉与图像处理,深度学习,损失函数)