常用损失函数(L1、L2、SSIM和MS-SSIM)对比简介

文章探讨了在图像恢复任务中不同损失函数的效果,包括L1、L2、SSIM和MS-SSIM。L2损失函数可能会放大误差并对异常点敏感,而L1损失则可能导致亮度和颜色的变化。SSIM和MS-SSIM考虑了人类视觉系统,提供更好的图像质量。结合MS-SSIM与L1损失函数可以平衡亮度、颜色和高频信息的保留。实验结果显示,MS-SSIM+L1在多个任务上表现最佳,但评价图像质量应结合主观和客观标准。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.介绍

    本文的介绍主要是参考论文:Loss Functions for Image Restoration with Neural Networks,而作者是从这三个实验(image super-resolution, JPEG artifactsremoval, and joint denoising plus demosaicking)上来证明这几个损失函数的好坏。

 

2.损失函数

    L1损失函数: 基于逐像素比较差异,然后取绝对值

c88c93dc8868afe50b679d3941514c6b.png

    L2损失函数: 基于逐像素比较差异,然后取平方

8d7acdf8f18b72c49a14dd1581a9d618.png

    相对于L1损失函数,L2损失函数会放大最大误差和最小误差之间的差距(比如2*2 和0.1*0.1),另外L2损失函数对异常点也比较敏感。如果我们在训练网络的时候,只用L1损失函数或者L2损失函数的时候,很容易陷入到局部最优解中,如果选择交替训练的话,说不定会取得不错的效果。

5aa1667693cf168d3712e59930ded4db.png

 

   在图像质量评价指标中,有一个指标是PSNR(Peak Signal-to-Noise Ratio) 峰值信噪比,它正好对标L1和L2损失函数,但L1和L2是有一个共性:它们都是基于逐像素比较差异,没有考虑人类视觉感知,更没有考虑人的审美观,所以PSNR指标高,并不一定代表图像质量就好。在下面公式中,如果图片中每个像素都由 8 位二进制来表示,那么MAX就为 255

f60efcf607f05f4b20007692f2081639.png

 

   SSIM(结构相似)损失函数:考虑了亮度 (luminance)、对比度 (contrast) 和结构 (structure)指标,这就考虑了人类视觉感知,一般而言,SSIM得到的结果会比L1,L2的结果更有细节

a2d9a711599a4d637649ec12826c16cb.png

 

   MS-SSIM(多尺度结构相似)损失函数:基于多层(图片按照一定规则,由大到小缩放)的SSIM损失函数,相当于考虑了分辨率

441778b9476d8683f93181b59cc998fd.png

 

   MS-SSIM+L1损失函数:作者这样组合的原因是,MS-SSIM容易导致亮度的改变和颜色的偏差,但它能保留高频信息(图像的边缘和细节),而L1损失函数能较好的保持亮度和颜色不变化。公式中α为0.84,是作者试验出来的,而G为高斯分布参数(MS-SSIM里面也要用到这个)

f849e590cc8f578a160ec7e99e0352ed.png

 

3.效果对比

超分辨率:放大图片对比会发现L2中出现光栅失真现象,最好去原论文放大看看

25e4ce9d5d04f07048ae4a5439dfe694.png

b48ac576dd746171e6c846de32acfa97.png

 

JPEG去块:放大图片对比会发现L2中还是有比较严重的块状现象,最好去原论文放大看看

71a5f2c17ba2a65c8535f5e4a3e00d7f.png

6a185c297f9612715a8ffc82606746f3.png

 

去噪+去马赛克:一眼看出,L2的效果明显差一些,就不用放大了

1dd85d4ef5312c835143e3d3009dea7d.png

 

    我个人觉得评价一张图片的质量好不好,或者那个算法的效果好不好,应该结合主观和客观来评价,下图的客观数据也表明:MS-SSIM+L1损失函数是最好的

9f3f620bba0136e87cf3057945db8364.png

 

4.总结

     1.既然用了L2损失函数,为何不尝试一下L1损失函数

     2.如果不看PSNR指标,那就用MS-SSIM或者SSIM损失函数吧

     3.如果想获得奇效,试一下组合损失函数也为何不可

 

SSIM(结构相似性指数)损失函数是一种衡量两个图像相似度的指标,其基本思想是通过比较图像的亮度、对比结构信息来量化图像质量。SSIM常用于评估图像处理算法,比如压缩、增强重建等的效果。在深度学习中,SSIM可以作为损失函数来训练模型,以生成与参考图像更相似的图像。 在深度学习框架中,如PyTorch或TensorFlow,你可能需要使用现成的库或者自己实现SSIM损失函数。以下是在PyTorch中引用SSIM的一个例子: 首先,你可以从一些开源代码库中导入现成的SSIM函数,例如: ```python from pytorch_msssim import ssim as calculate_ssim ``` 然后,你可以在你的模型训练过程中使用这个函数来计算SSIM损失。以下是如何在一个简单的图像恢复任务中使用SSIM损失的示例: ```python import torch import torch.nn as nn from pytorch_msssim import ssim class SSIMLoss(nn.Module): def __init__(self, window_size=11, size_average=True): super(SSIMLoss, self).__init__() self.window_size = window_size self.size_average = size_average self.channel = 1 self.window = self.create_window(window_size) def create_window(self, window_size): # 这里实现高斯窗口的创建 ... def forward(self, x, y): (_, channel, _, _) = x.size() self.channel = channel return 1 - ssim(x, y, data_range=1.0, size_average=self.size_average, channel=self.channel, win=self.window) # 假设pred是模型输出的图像,target是真实的图像 ssim_loss = SSIMLoss() loss = ssim_loss(pred, target) ``` 请注意,这里的`pytorch_msssim`是一个第三方库,你需要先使用`pip`安装它。 如果你选择自己实现SSIM函数,你需要根据其数学定义来编写代码,包括计算亮度、对比结构相似性三个部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值