结构相似性指数(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. Ext UI 第一步
  2. 为什么 Linux 需要 Swapping
  3. Science公布:全世界最前沿的125个科学问题
  4. 计算机硬盘怎么增加e盘和f盘,如何在我的电脑里新建一个磁盘区
  5. 单片机wifi模块与服务器通信协议,单片机常用的几种通信协议
  6. vs2008C1902数据库管理程序不匹配
  7. Simple2D-15(音乐播放器)使用 glfw 库
  8. vue-quill-editor富文本 回显数据样式失效
  9. 俄罗斯 Android 系统受限,或将转用 HarmonyOS?
  10. wxpython如何分开界面和运行代码_wxpython笔记:wxpython的界面布局方式(一)
  11. 360加固签名验证_android - 使用360加固的方法(需要在windows下面,先加固,再签名)...
  12. Python获取时光网电影数据
  13. ISCC -MISC-Retrieve_the_passcode
  14. RabbitMQ消息队列详细教程
  15. ubuntu搭建vpn步骤
  16. 如何裁剪动图的大小?教你一分钟快速裁剪gif
  17. “扫地机器人双子星”正在坠落之科沃斯
  18. Qt 矢量图标使用 FontAwesome Icon
  19. 【已解决】sftp命令没有反应
  20. Vue + Vuetify使用感受以及部分自定义组件

热门文章

  1. html5邮箱提示信息,JS实现的邮箱提示补全效果示例
  2. Vue学习笔记7 - 在Vscode中配置Vetur,ESlint,Prettier
  3. lg g pro 2android,机身不止有白灰黑 红色LG G Pro 2曝光
  4. hdu5304 Eastest Magical Day Seep Group's Summer 状压dp+生成树
  5. 苹果计算机重装系统步骤,如何重装苹果电脑系统|苹果电脑系统重装教程
  6. error CS0246: 未能找到类型或命名空间名“MySql”(是否缺少 using 指令或程序集引用?)
  7. 用四阶龙格-库塔方法求微分方程组
  8. Nexus 5X线刷教程
  9. MT5震荡突破双向挂单EA--策略说明
  10. h3c交换机怎么设置虚拟服务器,H3C交换机配置通用方法