结构相似性指数(SSIM)用于度量两幅图像间的结构相似性。
通过亮度、对比度、结构来测量两个图像之间的相似性。
SSIM值越大,图像越相似,当两幅图像完全相同时,SSIM=1。所以作为损失函数时,应该要取负号,例如: loss = 1 - SSIM 。

参考

来自CoRRN中的SSIMLoss代码详解:

import torch
import torch.nn.functional as F
from torch.autograd import Variable
import numpy as np
from math import exp# 计算一维的高斯分布向量
def gaussian(window_size, sigma):gauss = torch.Tensor([exp(-(x - window_size/2)**2/float(2*sigma**2)) for x in range(window_size)])return gauss/gauss.sum()# 创建高斯核,通过两个一维高斯分布向量进行矩阵乘法得到
def create_window(window_size, channel):_1D_window = gaussian(window_size, 1.5).unsqueeze(1)_2D_window = _1D_window.mm(_1D_window.t()).float().unsqueeze(0).unsqueeze(0)window = Variable(_2D_window.expand(channel, 1, window_size, window_size).cuda())return window# 计算SSIM
# 直接使用SSIM的公式,但是在计算均值时,不是直接求像素平均值,而是采用归一化的高斯核卷积来代替。
# 在计算方差和协方差时用到了公式Var(X)=E[X^2]-E[X]^2, cov(X,Y)=E[XY]-E[X]E[Y].
# 正如前面提到的,上面求期望的操作采用高斯核卷积代替
def _ssim(img1, img2, window, window_size, channel, size_average = True):mu1 = F.conv2d(img1, window, padding = window_size/2, groups = channel)mu2 = F.conv2d(img2, window, padding = window_size/2, groups = channel)mu1_sq = mu1.pow(2)mu2_sq = mu2.pow(2)mu1_mu2 = mu1*mu2sigma1_sq = F.conv2d(img1*img1, window, padding = window_size/2, groups = channel) - mu1_sq #Var(X)=E[X^2]-E[X]^2sigma2_sq = F.conv2d(img2*img2, window, padding = window_size/2, groups = channel) - mu2_sqsigma12 = F.conv2d(img1*img2, window, padding = window_size/2, groups = channel) - mu1_mu2  #cov(X,Y)=E[XY]-E[X]E[Y]C1 = 0.01**2C2 = 0.03**2ssim_map = ((2*mu1_mu2 + C1)*(2*sigma12 + C2))/((mu1_sq + mu2_sq + C1)*(sigma1_sq + sigma2_sq + C2))if size_average:return ssim_map.mean()else:return ssim_map.mean(1).mean(1).mean(1)
#类重用窗口
class SSIMLoss(torch.nn.Module):def __init__(self, window_size = 11, size_average = True):super(SSIMLoss, self).__init__()  #对继承自父类的属性进行初始化。而且是用父类的初始化方法来初始化继承的属性。self.window_size = window_sizeself.size_average = size_averageself.channel = 1self.window = create_window(window_size, self.channel)def forward(self, img1, img2):(_, channel, _, _) = img1.size()if channel == self.channel:window = self.windowelse:window = create_window(self.window_size, channel)self.window = windowself.channel = channelreturn 1 - _ssim(img1, img2, window, self.window_size, channel, self.size_average)def ssim(img1, img2, window_size = 11, size_average = True):(_, channel, _, _) = img1.size()window = create_window(window_size, channel)return _ssim(img1, img2, window, window_size, channel, size_average)

SSIMLoss的用法(CoRRN)相关推荐

  1. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  2. Pandas_transform的用法

    先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...

  3. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  4. pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

  5. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...

  6. tf.nn.embedding_lookup()的用法

    函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...

  7. OpenMP用法大全

    OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...

  8. Dorado用法与示例

    Dorado用法与示例 dorado用后总结 一.dorado概念 dorado的产品全名是"dorado展现中间件".从产品形态上dorado由两部分组成,第一部分是一个具有AJ ...

  9. TensorFlow用法

    TensorFlow用法 什么是TensorFlow TensorFlow是一个开源软件库,用于使用数据流图进行数值计算.图中的节点表示数学运算,而图的边缘表示流动的多维数据数组(张量).这种灵活的体 ...

最新文章

  1. 转载:售前十年,你在第几年
  2. Google adwords新手推广常见错误
  3. 无痛苦的软件维护——文档和代码
  4. android edittext最多输入,android 中如何限制 EditText 最大输入字符数
  5. 卧槽!Intellij IDEA中竟然有这么多炫酷的插件,啪啪啪~
  6. 181024词霸有道扇贝每日一句
  7. 登陆csdn卡死机,进入不了csdn内容管理页面终极解决方案
  8. SnakeYAML配置文件解析器
  9. Involution: Inverting the Inherence of Convolution for Visual Recognition(CVPR2021)
  10. 区块链资产证券化调研整理
  11. R语言探索性因子分析练习
  12. cwRsync同步工具的使用
  13. 计算力矩——计算关节力矩以平衡端点力和力矩
  14. 历经300多年难得的那一刹那: 日全食
  15. 第四篇:ROS常用命令行指令【重点】
  16. 物联网的物流企业信息集成综合管理平台,主要有哪些特征?
  17. 中国最低调的河,长约1000公里,却养育了上亿人口
  18. Service Mesh 发展趋势:云原生中流砥柱
  19. 如何绘制motif结构图
  20. 常用流媒体协议(HLS/HTTP/RTP组播/RTSP)提取流的方法

热门文章

  1. 基于深度学习的视频检测(一)
  2. 【蓝桥杯】 数独游戏 (经典深搜题型)
  3. 高德地图Loca 数据可视化 API 2.0的用法
  4. Android 打开webView黑屏闪烁问题排查
  5. 交通天堂:未来城市如何为人与无人车设计街道? | 探索
  6. 人类对于人工智能的担忧来源于什么(下)
  7. FFMPEG对视频进行裁剪
  8. ppp项目模式风口再现 什么是PPP概念股一览
  9. Eigen Matrix 详解
  10. 音频服务器未响应错误代码1068,win7启动windows audio提示错误1068的解决方法