pytorch ssim计算详细代码例子

 更新时间:2023年12月18日 08:26:41   作者:樱木之  
这篇文章主要给大家介绍了关于pytorch ssim计算的相关资料,结构相似性(SSIM)是一种测量两幅图像的相似度的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在PyTorch中,可以使用 torchvision 库中的 SSIM 函数来计算结构相似性指数 (SSIM)。

SSIM 函数的签名如下:

torchvision.metrics.SSIM(data_range: Union[int, float] = 1, win_size: int = 11, win_sigma: float = 1.5, k1: float = 0.01, k2: float = 0.03, nonnegative_ssim: bool = False, eps: float = 1e-8, reduction: str = 'mean')

其中,参数的含义如下:

  • data_range:输入数据的范围,通常为1.0或255.0。
  • win_size:滑动窗口的大小。
  • win_sigma:滑动窗口的高斯核标准差。
  • k1、k2:SSIM计算公式中的常数。
  • nonnegative_ssim:是否将SSIM限制在非负数范围内。
  • eps:数值稳定性的参数。
  • reduction:用于计算损失的降维方法,可以取值为 mean、sum 或 none。

下面是一个使用 SSIM 函数计算两张图片的 SSIM 值的例子:

import torch
import torchvision.transforms.functional as F
import torchvision.metrics as metrics

# 读取两张图片
img1 = F.to_tensor(F.resize(F.pil_loader('img1.jpg'), (256, 256))).unsqueeze(0)
img2 = F.to_tensor(F.resize(F.pil_loader('img2.jpg'), (256, 256))).unsqueeze(0)

# 计算 SSIM
ssim = metrics.SSIM(data_range=1.0, win_size=11, win_sigma=1.5, k1=0.01, k2=0.03, eps=1e-8, reduction='mean')
print(ssim(img1, img2))

其中,img1.jpg 和 img2.jpg 是两张待比较的图片。首先使用 pil_loader 函数读取图片,然后使用 resize 函数将图片大小调整为256x256,最后使用 to_tensor 函数将 PIL.Image 对象转换为 PyTorch 张量。

在计算 SSIM 值时,我们需要先创建一个 SSIM 对象,然后将两张图片作为参数传入即可。计算结果将会是一个标量张量

使用skimage计算

from skimage.measure import compare_ssim as ssim


def ssim_metric(target: object, prediction: object, win_size: int=21):
    """
    introduce:
        calculate ssim.
        
    args:
        :param ndarray target: target, like ndarray[256, 256].
        :param ndarray prediction: prediction, like ndarray[256, 256].
        :param int win_size: default.
    
    return:
        :param float cur_ssim: return ssim, between [-1, 1], like 0.72.
    """
    cur_ssim = ssim(
        target,
        prediction,
        win_size=win_size,
        data_range=target.max() - target.min(),
    )

    return cur_ssim

SSIM取值范围

SSIM(结构相似性指标)是一种用于测量图像质量的方法,其取值范围为-1到1之间,其中1表示两幅图像完全相同,-1表示两幅图像完全不同。通常情况下,SSIM值越高,表示两幅图像越相似,质量也越好。常见的SSIM取值范围如下:

1:完美匹配
0.9 - 1:非常好
0.7 - 0.9:良好
0.5 - 0.7:一般
0.3 - 0.5:差
0 - 0.3:非常差

需要注意的是,SSIM是一种相对度量,而不是绝对度量。这意味着SSIM值的实际意义取决于它与其他图像的比较结果。因此,在评估图像质量时,应该使用多个SSIM值进行比较,以便得出更准确的结论。

关于取到负数:SSIM(结构相似性指标)可以取到负数。SSIM的取值范围是-1到1之间,其中1表示两幅图像完全相同,0表示两幅图像没有相似性,而-1表示两幅图像完全不同。在实际应用中,SSIM值通常是在0到1之间,表示图像的相似度越高,SSIM值越接近1。但是,在一些情况下,SSIM值可能会低于0,这通常发生在比较的两幅图像之一具有负值像素时。在这种情况下,SSIM将返回一个负数。因此,当使用SSIM作为图像质量度量时,需要注意检查SSIM值是否为负,并对其进行解释。

附:PyTorch中的SSIM损失函数的参数

F.ssim_loss函数有一些可选参数,可以用于调整计算SSIM损失的方式。下面是一些常用参数的说明:

  • data_range:指定图像像素值的范围,默认为1.0。如果图像像素值在0到1之间,可以保持默认值。
  • size_average:指定是否对每个像素的SSIM进行平均,默认为True。如果设置为False,将返回每个像素的SSIM值。

例如,如果想计算每个像素的SSIM值,并且图像像素值范围在0到255之间,可以使用以下代码:

import torch
import torch.nn.functional as F

# 随机生成两个图像,假设图像大小为256x256
x = torch.rand((1, 3, 256, 256))
y = torch.rand((1, 3, 256, 256))

# 计算每个像素的SSIM损失,图像像素值范围为0到255
loss = 1 - F.ssim_loss(x, y, data_range=255, size_average=False)

print(loss)

总结

到此这篇关于pytorch ssim计算的文章就介绍到这了,更多相关pytorch ssim计算内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何将自己的python代码发布在pip install给别人使用你知道吗

    如何将自己的python代码发布在pip install给别人使用你知道吗

    这篇文章主要介绍了python如何发布自已的pip项目,方便大家学习,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-08-08
  • python zip()函数的使用示例

    python zip()函数的使用示例

    这篇文章主要介绍了python zip()的使用示例,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-09-09
  • Python获取百度热搜的完整代码

    Python获取百度热搜的完整代码

    这篇文章主要介绍了Python获取百度热搜的完整代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Python爬虫学习之requests的使用教程

    Python爬虫学习之requests的使用教程

    requests库是一个常用的用于 http 请求的模块,它使用 python 语言编写,可以方便的对网页进行爬取。本文将通过示例详细讲讲requests库的使用,需要的可以参考一下
    2022-08-08
  • Python中的 enum 模块源码详析

    Python中的 enum 模块源码详析

    这篇文章主要给大家介绍了关于Python中 enum 模块的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • python密码学各种加密模块教程

    python密码学各种加密模块教程

    这篇文章主要为大家介绍了python密码学各种加密模块教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • django之从html页面表单获取输入的数据实例

    django之从html页面表单获取输入的数据实例

    这篇文章主要介绍了django之从html页面表单获取输入的数据实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • python实现支持目录FTP上传下载文件的方法

    python实现支持目录FTP上传下载文件的方法

    这篇文章主要介绍了python实现支持目录FTP上传下载文件的方法,适用于windows及Linux平台FTP传输文件及文件夹,需要的朋友可以参考下
    2015-06-06
  • 如何在django中实现分页功能

    如何在django中实现分页功能

    这篇文章主要介绍了如何在django中实现分页功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 解决Python安装后pip不能用的问题

    解决Python安装后pip不能用的问题

    今天小编就为大家分享一篇解决Python安装后pip不能用的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06

最新评论