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