cálculo ssim de pytorch

En PyTorch, el índice de similitud estructural (SSIM) se puede calcular utilizando la función SSIM en la biblioteca de torchvision.

La firma de la función SSIM es la siguiente:

torchvision.metrics.SSIM(data_range: Union[int, float] = 1, win_size: int = 11, win_sigma: float = 1.5, k1: float = 0.01, k2: float = 0.03, nonnegative_ssim: bool = False, eps: float = 1e-8, reduction: str = 'mean')

Entre ellos, el significado de los parámetros es el siguiente:

data_range: el rango de los datos de entrada, normalmente 1,0 o 255,0.
win_size: El tamaño de la ventana deslizante.
win_sigma: desviación estándar del núcleo gaussiano para ventanas deslizantes.
k1, k2: constantes en la fórmula de cálculo SSIM.
nonnegative_ssim: Si limitar SSIM a un rango no negativo.
eps: parámetro de estabilidad numérica.
reducción: El método de reducción de dimensionalidad utilizado para calcular la pérdida, que puede tomar el valor de media, suma o ninguno.
El siguiente es un ejemplo del uso de la función SSIM para calcular el valor SSIM de dos imágenes:

import torch
import torchvision.transforms.functional as F
import torchvision.metrics as metrics

# 读取两张图片
img1 = F.to_tensor(F.resize(F.pil_loader('img1.jpg'), (256, 256))).unsqueeze(0)
img2 = F.to_tensor(F.resize(F.pil_loader('img2.jpg'), (256, 256))).unsqueeze(0)

# 计算 SSIM
ssim = metrics.SSIM(data_range=1.0, win_size=11, win_sigma=1.5, k1=0.01, k2=0.03, eps=1e-8, reduction='mean')
print(ssim(img1, img2))

Entre ellos, img1.jpg e img2.jpg son dos imágenes para comparar. Primero use la función pil_loader para leer la imagen, luego use la función de cambio de tamaño para cambiar el tamaño de la imagen a 256x256 y finalmente use la función to_tensor para convertir el objeto PIL.Image en un tensor PyTorch.

Al calcular el valor SSIM, primero debemos crear un objeto SSIM y luego pasar dos imágenes como parámetros. El resultado del cálculo será un tensor escalar

Calculado usando skimage

from skimage.measure import compare_ssim as ssim


def ssim_metric(target: object, prediction: object, win_size: int=21):
    """
    introduce:
        calculate ssim.
        
    args:
        :param ndarray target: target, like ndarray[256, 256].
        :param ndarray prediction: prediction, like ndarray[256, 256].
        :param int win_size: default.
    
    return:
        :param float cur_ssim: return ssim, between [-1, 1], like 0.72.
    """
    cur_ssim = ssim(
        target,
        prediction,
        win_size=win_size,
        data_range=target.max() - target.min(),
    )

    return cur_ssim

Rango de valores SSIM

SSIM (Structural Similarity Index) es un método utilizado para medir la calidad de la imagen, y su valor varía de -1 a 1, donde 1 significa que dos imágenes son exactamente iguales y -1 significa que dos imágenes son completamente diferentes. En general, cuanto mayor sea el valor de SSIM, más similares serán las dos imágenes y mejor será la calidad. Los rangos de valores comunes de SSIM son los siguientes:

1:完美匹配
0.9 - 1:非常好
0.7 - 0.9:良好
0.5 - 0.7:一般
0.3 - 0.5:差
0 - 0.3:非常差

Cabe señalar que SSIM es una medida relativa, no una medida absoluta. Esto significa que la importancia real del valor SSIM depende de cómo se compara con otras imágenes. Por lo tanto, al evaluar la calidad de la imagen, se deben usar múltiples valores de SSIM para comparar y sacar conclusiones más precisas.

Acerca de tomar números negativos : SSIM (Índice de similitud estructural) puede tomar números negativos. El rango de valores de SSIM está entre -1 y 1, donde 1 significa que las dos imágenes son idénticas, 0 significa que las dos imágenes no tienen similitud y -1 significa que las dos imágenes son completamente diferentes. En aplicaciones prácticas, el valor de SSIM suele estar entre 0 y 1, lo que indica que cuanto mayor sea la similitud de la imagen, más cercano estará el valor de SSIM a 1. Sin embargo, en algunos casos, el valor de SSIM puede caer por debajo de 0, lo que generalmente ocurre cuando una de las dos imágenes que se comparan tiene píxeles de valor negativo. En este caso, SSIM devolverá un número negativo. Por lo tanto, al usar SSIM como una métrica de calidad de imagen, se debe tener cuidado para verificar los valores negativos de SSIM e interpretarlos.

Supongo que te gusta

Origin blog.csdn.net/qq_43369406/article/details/129211386
Recomendado
Clasificación