SSIMLoss的用法(CoRRN)
结构相似性指数(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)相关推荐
- c语言中external,static关键字用法
static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...
- Pandas_transform的用法
先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...
- Python中yield和yield from的用法
yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...
- pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法
squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...
- python yield 和 yield from用法总结
#例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...
- tf.nn.embedding_lookup()的用法
函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...
- OpenMP用法大全
OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...
- Dorado用法与示例
Dorado用法与示例 dorado用后总结 一.dorado概念 dorado的产品全名是"dorado展现中间件".从产品形态上dorado由两部分组成,第一部分是一个具有AJ ...
- TensorFlow用法
TensorFlow用法 什么是TensorFlow TensorFlow是一个开源软件库,用于使用数据流图进行数值计算.图中的节点表示数学运算,而图的边缘表示流动的多维数据数组(张量).这种灵活的体 ...
最新文章
- Ext UI 第一步
- 为什么 Linux 需要 Swapping
- Science公布:全世界最前沿的125个科学问题
- 计算机硬盘怎么增加e盘和f盘,如何在我的电脑里新建一个磁盘区
- 单片机wifi模块与服务器通信协议,单片机常用的几种通信协议
- vs2008C1902数据库管理程序不匹配
- Simple2D-15(音乐播放器)使用 glfw 库
- vue-quill-editor富文本 回显数据样式失效
- 俄罗斯 Android 系统受限,或将转用 HarmonyOS?
- wxpython如何分开界面和运行代码_wxpython笔记:wxpython的界面布局方式(一)
- 360加固签名验证_android - 使用360加固的方法(需要在windows下面,先加固,再签名)...
- Python获取时光网电影数据
- ISCC -MISC-Retrieve_the_passcode
- RabbitMQ消息队列详细教程
- ubuntu搭建vpn步骤
- 如何裁剪动图的大小?教你一分钟快速裁剪gif
- “扫地机器人双子星”正在坠落之科沃斯
- Qt 矢量图标使用 FontAwesome Icon
- 【已解决】sftp命令没有反应
- Vue + Vuetify使用感受以及部分自定义组件
热门文章
- html5邮箱提示信息,JS实现的邮箱提示补全效果示例
- Vue学习笔记7 - 在Vscode中配置Vetur,ESlint,Prettier
- lg g pro 2android,机身不止有白灰黑 红色LG G Pro 2曝光
- hdu5304 Eastest Magical Day Seep Group's Summer 状压dp+生成树
- 苹果计算机重装系统步骤,如何重装苹果电脑系统|苹果电脑系统重装教程
- error CS0246: 未能找到类型或命名空间名“MySql”(是否缺少 using 指令或程序集引用?)
- 用四阶龙格-库塔方法求微分方程组
- Nexus 5X线刷教程
- MT5震荡突破双向挂单EA--策略说明
- h3c交换机怎么设置虚拟服务器,H3C交换机配置通用方法