描述
图像生成任务的平均ssim,psnr,lpips的计算。pred文件夹有生成的若干图片,gt文件夹真实的若干图片。要求图片名字有相关性。
要求
1.名称对应。名称一样或按照顺序。
2.图片像素MAX值为255。如果是灰度图要调整代码中的255为1.0
3.包版本分别为:
scikit-image 0.18.3
lpips 0.1.4
安装命令:
pip install scikit-image==0.18.3
以及
pip install lpips==0.1.4
核心代码
ssim
ssim_v = ssim(img1_np,img2_np, data_range=255.0, multichannel=True)
psnr
psnr_v = psnr(img1_np,img2_np, data_range=255.0)
lpips
lpips_val = lpips_model.forward(transform(img1_np).cuda(), transform(img2_np).cuda())
完整代码
import os
from tqdm import tqdm
import torch
import numpy as np
import lpips
from torchvision import transforms
lpips_model = lpips.LPIPS(net='alex').cuda()
from skimage.metrics import structural_similarity as ssim
from skimage.metrics import peak_signal_noise_ratio as psnr
test_folder = './test_folder'
out_folder = './out_folder'
ssim_list = []
psnr_list = []
lpip_list = []
img_size = 512
from PIL import Image
transform = transforms.Compose([transforms.ToTensor()])
list1 = sorted(os.listdir(test_folder))
list2 = sorted(os.listdir(out_folder))
for i,j in tqdm(zip(list1,list2),total=len(list1)):
img1_path = os.path.join(test_folder,i)
img2_path = os.path.join(out_folder,j)
# img1 = Image.open(img1_path).convert('L')
# img2 = Image.open(img2_path).convert('L')
img1 = Image.open(img1_path)
img2 = Image.open(img2_path)
img1 = img1.resize((img_size,img_size))
img2 = img2.resize((img_size,img_size))
img1_np = np.array(img1)
img2_np = np.array(img2)
ssim_v = ssim(img1_np,img2_np, data_range=255.0, multichannel=True)
psnr_v = psnr(img1_np,img2_np, data_range=255.0)
lpips_val = lpips_model.forward(transform(img1_np).cuda(), transform(img2_np).cuda())
ssim_list.append(ssim_v)
psnr_list.append(psnr_v)
lpip_list.append(lpips_val.item())
print('ssim',np.mean(ssim_list))
print('psnr',np.mean(psnr_list))
print('lpips',np.mean(lpip_list))
print('OK')