pytorch?ssim計(jì)算詳細(xì)代碼例子
前言
在PyTorch中,可以使用 torchvision 庫中的 SSIM 函數(shù)來計(jì)算結(jié)構(gòu)相似性指數(shù) (SSIM)。
SSIM 函數(shù)的簽名如下:
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')
其中,參數(shù)的含義如下:
- data_range:輸入數(shù)據(jù)的范圍,通常為1.0或255.0。
- win_size:滑動(dòng)窗口的大小。
- win_sigma:滑動(dòng)窗口的高斯核標(biāo)準(zhǔn)差。
- k1、k2:SSIM計(jì)算公式中的常數(shù)。
- nonnegative_ssim:是否將SSIM限制在非負(fù)數(shù)范圍內(nèi)。
- eps:數(shù)值穩(wěn)定性的參數(shù)。
- reduction:用于計(jì)算損失的降維方法,可以取值為 mean、sum 或 none。
下面是一個(gè)使用 SSIM 函數(shù)計(jì)算兩張圖片的 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) # 計(jì)算 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 是兩張待比較的圖片。首先使用 pil_loader 函數(shù)讀取圖片,然后使用 resize 函數(shù)將圖片大小調(diào)整為256x256,最后使用 to_tensor 函數(shù)將 PIL.Image 對(duì)象轉(zhuǎn)換為 PyTorch 張量。
在計(jì)算 SSIM 值時(shí),我們需要先創(chuàng)建一個(gè) SSIM 對(duì)象,然后將兩張圖片作為參數(shù)傳入即可。計(jì)算結(jié)果將會(huì)是一個(gè)標(biāo)量張量
使用skimage計(jì)算
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(結(jié)構(gòu)相似性指標(biāo))是一種用于測(cè)量圖像質(zhì)量的方法,其取值范圍為-1到1之間,其中1表示兩幅圖像完全相同,-1表示兩幅圖像完全不同。通常情況下,SSIM值越高,表示兩幅圖像越相似,質(zhì)量也越好。常見的SSIM取值范圍如下:
1:完美匹配
0.9 - 1:非常好
0.7 - 0.9:良好
0.5 - 0.7:一般
0.3 - 0.5:差
0 - 0.3:非常差
需要注意的是,SSIM是一種相對(duì)度量,而不是絕對(duì)度量。這意味著SSIM值的實(shí)際意義取決于它與其他圖像的比較結(jié)果。因此,在評(píng)估圖像質(zhì)量時(shí),應(yīng)該使用多個(gè)SSIM值進(jìn)行比較,以便得出更準(zhǔn)確的結(jié)論。
關(guān)于取到負(fù)數(shù):SSIM(結(jié)構(gòu)相似性指標(biāo))可以取到負(fù)數(shù)。SSIM的取值范圍是-1到1之間,其中1表示兩幅圖像完全相同,0表示兩幅圖像沒有相似性,而-1表示兩幅圖像完全不同。在實(shí)際應(yīng)用中,SSIM值通常是在0到1之間,表示圖像的相似度越高,SSIM值越接近1。但是,在一些情況下,SSIM值可能會(huì)低于0,這通常發(fā)生在比較的兩幅圖像之一具有負(fù)值像素時(shí)。在這種情況下,SSIM將返回一個(gè)負(fù)數(shù)。因此,當(dāng)使用SSIM作為圖像質(zhì)量度量時(shí),需要注意檢查SSIM值是否為負(fù),并對(duì)其進(jìn)行解釋。
附:PyTorch中的SSIM損失函數(shù)的參數(shù)
F.ssim_loss函數(shù)有一些可選參數(shù),可以用于調(diào)整計(jì)算SSIM損失的方式。下面是一些常用參數(shù)的說明:
- data_range:指定圖像像素值的范圍,默認(rèn)為1.0。如果圖像像素值在0到1之間,可以保持默認(rèn)值。
- size_average:指定是否對(duì)每個(gè)像素的SSIM進(jìn)行平均,默認(rèn)為True。如果設(shè)置為False,將返回每個(gè)像素的SSIM值。
例如,如果想計(jì)算每個(gè)像素的SSIM值,并且圖像像素值范圍在0到255之間,可以使用以下代碼:
import torch import torch.nn.functional as F # 隨機(jī)生成兩個(gè)圖像,假設(shè)圖像大小為256x256 x = torch.rand((1, 3, 256, 256)) y = torch.rand((1, 3, 256, 256)) # 計(jì)算每個(gè)像素的SSIM損失,圖像像素值范圍為0到255 loss = 1 - F.ssim_loss(x, y, data_range=255, size_average=False) print(loss)
總結(jié)
到此這篇關(guān)于pytorch ssim計(jì)算的文章就介紹到這了,更多相關(guān)pytorch ssim計(jì)算內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django項(xiàng)目如何獲得SSL證書與配置HTTPS
本文總結(jié)了如何獲得SSL證書并給Django項(xiàng)目配置HTTPS,建議先收藏再閱讀,將來有一天你很可能會(huì)用到它。2021-04-04TensorFlow實(shí)現(xiàn)RNN循環(huán)神經(jīng)網(wǎng)絡(luò)
這篇文章主要介紹了TensorFlow實(shí)現(xiàn)RNN循環(huán)神經(jīng)網(wǎng)絡(luò),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02Tensorflow模型實(shí)現(xiàn)預(yù)測(cè)或識(shí)別單張圖片
這篇文章主要為大家詳細(xì)介紹了Tensorflow模型實(shí)現(xiàn)預(yù)測(cè)或識(shí)別單張圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07Python3 中作為一等對(duì)象的函數(shù)解析
這篇文章主要介紹了Python3 中作為一等對(duì)象的函數(shù),本文通過實(shí)例代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12Python實(shí)現(xiàn)合并兩個(gè)列表的方法分析
這篇文章主要介紹了Python實(shí)現(xiàn)合并兩個(gè)列表的方法,結(jié)合實(shí)例形式對(duì)比分析了常見的Python列表合并操作技巧,需要的朋友可以參考下2018-05-05pytorch中tensor轉(zhuǎn)換為float的實(shí)現(xiàn)示例
本文主要介紹了pytorch中tensor轉(zhuǎn)換為float,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03