pytorchのssim計算

PyTorch では、torchvision ライブラリの SSIM 関数を使用して構造類似性指数 (SSIM) を計算できます。

SSIM 関数の署名は次のとおりです。

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')

このうちパラメータの意味は以下の通りです。

data_range: 入力データの範囲。通常は 1.0 または 255.0。
win_size: スライディング ウィンドウのサイズ。
win_sigma: スライディング ウィンドウのガウス カーネル標準偏差。
k1、k2:SSIM計算式の定数。
nonnegative_ssim: SSIM を非負の範囲に制限するかどうか。
eps: 数値安定性のためのパラメータ。
削減: 損失の計算に使用される次元削減方法。平均値、合計値、またはなしの値を取ることができます。
以下は、SSIM 関数を使用して 2 つの画像の SSIM 値を計算する例です。

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))

このうち、img1.jpg と img2.jpg が比較対象の 2 つの画像です。最初に pil_loader 関数を使用してイメージを読み取り、次に、resize 関数を使用してイメージのサイズを 256x256 に変更し、最後に to_tensor 関数を使用して PIL.Image オブジェクトを PyTorch テンソルに変換します。

SSIM 値を計算するときは、最初に SSIM オブジェクトを作成し、次に 2 つの画像をパラメータとして渡す必要があります。計算の結果はスカラー テンソルになります

スキイメージを使用して計算

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

SSIM 値の範囲

SSIM (構造類似性指数) は画質を測定するために使用される手法で、その値の範囲は -1 から 1 までです。1 は 2 つの画像がまったく同じであることを意味し、-1 は 2 つの画像が完全に異なることを意味します。一般に、SSIM 値が高いほど、2 つの画像はより類似し、品質が高くなります。一般的な SSIM 値の範囲は次のとおりです。

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

SSIM は相対的な尺度であり、絶対的な尺度ではないことに注意してください。これは、SSIM 値の実際の重要性は、他の画像との比較に依存することを意味します。したがって、画質を評価する場合、より正確な結論を導くために、複数の SSIM 値を比較に使用する必要があります。

負の数値の取得について: SSIM (構造類似性指数) は負の数値を取得できます。SSIM の値の範囲は -1 ~ 1 です。1 は 2 つのイメージが同一であることを意味し、0 は 2 つのイメージに類似性がないことを意味し、-1 は 2 つのイメージが完全に異なることを意味します。実際のアプリケーションでは、SSIM 値は通常 0 から 1 の間であり、画像の類似性が高いほど SSIM 値が 1 に近づくことを示しています。ただし、場合によっては、SSIM 値が 0 を下回ることがあります。これは通常、比較されている 2 つの画像のうちの 1 つに負の値のピクセルがある場合に発生します。この場合、SSIM は負の数を返します。したがって、SSIM を画質メトリクスとして使用する場合は、負の SSIM 値を確認し、それらを解釈することに注意する必要があります。

おすすめ

転載: blog.csdn.net/qq_43369406/article/details/129211386