NeRF 模型评价指标PSNR,MS-SSIM, LPIPS 详解和python实现

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: NeRF 模型评价指标PSNR,MS-SSIM, LPIPS 详解和python实现

PSNR:

PSNR(Peak Signal-to-Noise Ratio,峰值信噪比)是一种常用于衡量图像或视频质量的指标。它用于比较原始图像与经过处理或压缩后的图像之间的差异。PSNR通过计算原始图像与重建图像之间的均方误差(Mean Squared Error,MSE)来量化它们之间的差异。 PSNR的计算公式如下:

8e1546bfa9da4c43b235517bc682bb14.png

其中,MAX表示像素值的最大可能取值(例如,对于8位图像,MAX为255),MSE是原始图像与重建图像之间的均方误差。

PSNR的值越高,表示图像的质量与原始图像的相似度越高。常见的PSNR范围通常在20到50之间,数值越高表示图像质量越好。然而,PSNR作为一种图像质量评估指标也有其局限性。

它主要关注均方误差,忽略了人眼对于不同频率成分的敏感度差异以及感知失真的影响。因此,在某些情况下,PSNR可能不能准确地反映人类感知到的图像质量差异。

在实际应用中,除了PSNR,还有其他更全面和准确的图像质量评估指标,例如结构相似性指标(Structural Similarity Index,SSIM)、感知质量评估指标(Perceptual Quality Assessment,如VIF、MSSSIM)等,这些指标综合考虑了人眼感知和图像结构信息,能够提供更全面的图像质量评估。

PSNR代码:

from PIL import Image
import numpy as np
img1 = np.array(Image.open('original.jpg')).astype(np.float64)
img2 = np.array(Image.open('compress.jpg')).astype(np.float64)
def psnr(img1, img2):
    mse = np.mean((img1-img2)**2)
    if mse == 0:
        return float('inf')
    else:
        return 20*np.log10(255/np.sqrt(mse))
if __name__ == "__main__":
    print(psnr(img1, img2))

或者

from skimage.metrics import peak_signal_noise_ratio as psnr
from PIL import Image
import numpy as np
img1 = np.array(Image.open('original.jpg'))
img2 = np.array(Image.open('compress.jpg'))
if __name__ == "__main__":
    print(psnr(img1, img2))

意义:

PSNR接近 50dB ,代表压缩后的图像仅有些许非常小的误差。

PSNR大于 30dB ,人眼很难查觉压缩后和原始影像的差异。

PSNR介于 20dB 到 30dB 之间,人眼就可以察觉出图像的差异。

PSNR介于 10dB 到 20dB 之间,人眼还是可以用肉眼看出这个图像原始的结构,且直观上会判断两张图像不存在很大的差异。

PSNR低于 10dB,人类很难用肉眼去判断两个图像是否为相同,一个图像是否为另一个图像的压缩结果。

MS-SSIM:

MS-SSIM(Multi-Scale Structural Similarity Index)是一种用于评估图像质量的指标,它是结构相似性指数(SSIM)在多个尺度上的扩展。

SSIM是一种衡量两幅图像相似性的指标,它考虑了图像的亮度、对比度和结构等方面。而MS-SSIM在SSIM的基础上引入了多个尺度,以更好地捕捉图像的细节信息。

具体而言,MS-SSIM的计算过程如下:

将原始图像和重建图像划分为不同尺度的子图像。

对每个尺度的子图像计算SSIM指数。

对每个尺度的SSIM指数进行加权平均,得到最终的MS-SSIM值。

MS-SSIM的值范围在0到1之间,数值越接近1表示重建图像与原始图像的相似度越高,图像质量越好。

相比于PSNR,MS-SSIM考虑了图像的结构信息,能够更好地反映人眼对图像质量的感知。它在评估图像质量方面具有更高的准确性和敏感性。

需要注意的是,MS-SSIM计算复杂度相对较高,因为它需要对图像进行多尺度的分解和计算。然而,由于其良好的性能,在图像压缩、图像处理等领域得到广泛应用,并且被认为是一种较为可靠的图像质量评估指标。

MS-SSIM代码实现:

import cv2
import numpy as np
def ms_ssim(img1, img2):
    # 转换为灰度图像
    img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
    # 计算MS-SSIM
    weights = np.array([0.0448, 0.2856, 0.3001, 0.2363, 0.1333])  # 不同尺度的权重
    levels = weights.size
    mssim = np.zeros(levels)
    mcs = np.zeros(levels)
    for i in range(levels):
        ssim_map, cs_map = ssim(img1, img2)
        mssim[i] = np.mean(ssim_map)
        mcs[i] = np.mean(cs_map)
        img1 = cv2.resize(img1, (img1.shape[1] // 2, img1.shape[0] // 2), interpolation=cv2.INTER_LINEAR)
        img2 = cv2.resize(img2, (img2.shape[1] // 2, img2.shape[0] // 2), interpolation=cv2.INTER_LINEAR)
    # 整体MS-SSIM计算
    overall_mssim = np.prod(mcs[:-1] ** weights[:-1]) * (mssim[-1] ** weights[-1])
    return overall_mssim
def ssim(img1, img2, k1=0.01, k2=0.03, win_size=11, L=255):
    C1 = (k1 * L) ** 2
    C2 = (k2 * L) ** 2
    # 计算均值和方差
    mu1 = cv2.GaussianBlur(img1, (win_size, win_size), 1.5)
    mu2 = cv2.GaussianBlur(img2, (win_size, win_size), 1.5)
    mu1_sq = mu1 ** 2
    mu2_sq = mu2 ** 2
    mu1_mu2 = mu1 * mu2
    sigma1_sq = cv2.GaussianBlur(img1 * img1, (win_size, win_size), 1.5) - mu1_sq
    sigma2_sq = cv2.GaussianBlur(img2 * img2, (win_size, win_size), 1.5) - mu2_sq
    sigma12 = cv2.GaussianBlur(img1 * img2, (win_size, win_size), 1.5) - mu1_mu2
    # 计算相似性度量
    ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * (sigma1_sq + sigma2_sq + C2))
    cs_map = (2 * sigma12 + C2) / (sigma1_sq + sigma2_sq + C2)
    return ssim_map, cs_map
# 读取图像
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')
# 计算MS-SSIM
ms_ssim_score = ms_ssim(img1, img2)
print("MS-SSIM score:", ms_ssim_score)

LPIPS:

LPIPS(Learned Perceptual Image Patch Similarity)是一种基于学习的感知图像补丁相似性指标,用于评估图像的感知质量。

LPIPS的设计灵感来自于人眼对图像的感知,它通过学习一个神经网络模型来近似人类感知的视觉相似性。该模型使用卷积神经网络(CNN)对图像的局部补丁进行特征提取,并计算补丁之间的相似性得分。

具体而言,LPIPS的计算过程如下:

使用预训练的CNN模型(通常是基于深度学习的图像分类模型)提取原始图像和重建图像的特征表示。

将提取的特征表示作为输入,通过一个距离度量函数计算图像之间的相似性得分。

相似性得分表示图像之间在感知上的差异,数值越小表示图像之间的感知差异越小,图像质量越好。

LPIPS的得分范围通常是0到1之间,数值越小表示图像的感知质量越高。

与传统的图像质量评估指标(如PSNR和SSIM)相比,LPIPS更加注重于人眼感知的因素,能够更好地捕捉到图像之间的感知差异。它在图像生成、图像编辑等任务中被广泛应用,特别适用于需要考虑感知质量的场景。

需要注意的是,LPIPS是一种基于学习的指标,它的性能受到所使用的CNN模型和训练数据的影响。因此,在使用LPIPS进行图像质量评估时,需要使用与训练模型相似的数据集和预训练模型,以保证评估结果的准确性和可靠性。

LPIPS代码实现:

import torch
import torchvision.transforms as transforms
from PIL import Image
from models import dist_model
# 加载预训练的LPIPS模型
model = dist_model.DistModel()
model.initialize(model='net-lin', net='alex', use_gpu=True)
# 图像预处理
preprocess = transforms.Compose([
    transforms.Resize((256, 256)),
    transforms.ToTensor()
])
# 加载图像并进行预处理
image1 = Image.open('image1.jpg').convert('RGB')
image2 = Image.open('image2.jpg').convert('RGB')
image1 = preprocess(image1).unsqueeze(0)
image2 = preprocess(image2).unsqueeze(0)
# 将图像转换为PyTorch张量并计算LPIPS
with torch.no_grad():
    lpips_score = model.forward(image1, image2).item()
print("LPIPS score:", lpips_score)

PSNR,MS-SSIM, LPIPS三者对比:

PSNR(Peak Signal-to-Noise Ratio):PSNR是一种常用的图像质量评估指标,用于衡量原始图像与重建图像之间的差异。它通过计算均方误差(MSE)来量化两个图像之间的差异,数值越高表示图像质量越好。

MS-SSIM(Multi-Scale Structural Similarity Index):MS-SSIM是一种结构相似性指标,它在计算图像相似性时考虑了多个尺度的信息。与传统的结构相似性指标(SSIM)相比,MS-SSIM将图像分解成多个尺度,并在每个尺度上计算结构相似性指标,最后取平均值作为最终的相似性评估。MS-SSIM相较于PSNR更能反映人眼对于图像感知的差异。

LPIPS(Learned Perceptual Image Patch Similarity):LPIPS是一种学习的感知图像补丁相似性指标,它通过训练神经网络来学习图像补丁之间的感知相似性。LPIPS考虑了人眼对于图像感知的敏感性,通过计算图像补丁之间的感知距离来评估图像质量。与传统的结构相似性指标(如SSIM)相比,LPIPS在学习感知距离时更加准确和全面。

这些指标在图像质量评估中都有广泛的应用。PSNR主要用于衡量图像的重建误差,而MS-SSIM和LPIPS更加关注人眼对图像感知的差异。在实际应用中,不同的指标可以结合使用,以综合评估图像质量。


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
2天前
|
机器学习/深度学习 数据采集 自然语言处理
使用Python实现深度学习模型:智能社交媒体内容分析
使用Python实现深度学习模型:智能社交媒体内容分析
100 69
|
11天前
|
机器学习/深度学习 人工智能 算法框架/工具
使用Python实现深度学习模型:智能家电控制与优化
使用Python实现深度学习模型:智能家电控制与优化
56 22
使用Python实现深度学习模型:智能家电控制与优化
|
1天前
|
机器学习/深度学习 算法 数据可视化
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
特征工程是机器学习流程中的关键步骤,通过将原始数据转换为更具意义的特征,增强模型对数据关系的理解能力。本文重点介绍处理数值变量的高级特征工程技术,包括归一化、多项式特征、FunctionTransformer、KBinsDiscretizer、对数变换、PowerTransformer、QuantileTransformer和PCA,旨在提升模型性能。这些技术能够揭示数据中的潜在模式、优化变量表示,并应对数据分布和内在特性带来的挑战,从而提高模型的稳健性和泛化能力。每种技术都有其独特优势,适用于不同类型的数据和问题。通过实验和验证选择最适合的变换方法至关重要。
12 5
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
|
7天前
|
机器学习/深度学习 监控 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用模型 问题分析、数学模型及Python代码
2024年中国研究生数学建模竞赛E题要求建立高速公路应急车道紧急启用模型,以缓解特定路段的拥堵问题。题目提供了四个视频观测点的数据,需分析交通流参数随时间的变化规律,建立拥堵预警模型,并验证模型有效性。此外,还需设计合理的应急车道启用规则和算法,优化视频监控点布局,以提升决策科学性和成本效益。涉及视频数据处理、非线性动态系统建模和机器学习等技术。适合交通工程、数学、计算机科学等多个专业学生参与。需利用Python等工具进行数据处理和建模。具体问题包括统计参数变化、建立拥堵模型、验证模型有效性、设计启用规则和优化监控点布局。
649 12
【BetterBench博士】2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用模型 问题分析、数学模型及Python代码
|
8天前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
52 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
5天前
|
数据采集 机器学习/深度学习 算法
【BetterBench博士】2024年华为杯E题:高速公路应急车道紧急启用模型 Python代码实现
本文介绍了2024年“华为杯”中国研究生数学建模竞赛的选题分析,重点讨论了高速公路应急车道启用模型的问题。文章详细描述了如何使用YOLOv5和SORT算法进行车辆检测与跟踪,计算车流密度、流量及速度,并利用随机森林回归预测交通拥堵。此外,还提出了多情景动态分析和虚拟应急车道控制策略,以及优化数据采集点布置的方法。提供了完整的Python代码和B站视频教程链接,帮助读者深入理解并实践该模型。
79 6
【BetterBench博士】2024年华为杯E题:高速公路应急车道紧急启用模型 Python代码实现
|
2天前
|
机器学习/深度学习 数据采集 自然语言处理
使用Python实现深度学习模型:智能新闻生成与校对
使用Python实现深度学习模型:智能新闻生成与校对
27 10
|
3天前
|
机器学习/深度学习 数据采集 自然语言处理
使用Python实现深度学习模型:智能广告创意生成
使用Python实现深度学习模型:智能广告创意生成
18 4
|
4天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现深度学习模型:智能电影制作与剪辑
使用Python实现深度学习模型:智能电影制作与剪辑
25 5
|
2天前
|
数据挖掘 Python
Python随机效应模型
Python随机效应模型