|
import pyiqa |
|
import os |
|
import argparse |
|
from pathlib import Path |
|
import torch |
|
from utils import util_image |
|
import tqdm |
|
|
|
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") |
|
|
|
print(pyiqa.list_models()) |
|
def evaluate(in_path, ref_path, ntest): |
|
metric_dict = {} |
|
metric_dict["clipiqa"] = pyiqa.create_metric('clipiqa').to(device) |
|
metric_dict["musiq"] = pyiqa.create_metric('musiq').to(device) |
|
metric_dict["niqe"] = pyiqa.create_metric('niqe').to(device) |
|
metric_dict["maniqa"] = pyiqa.create_metric('maniqa').to(device) |
|
metric_paired_dict = {} |
|
|
|
in_path = Path(in_path) if not isinstance(in_path, Path) else in_path |
|
assert in_path.is_dir() |
|
|
|
ref_path_list = None |
|
if ref_path is not None: |
|
ref_path = Path(ref_path) if not isinstance(ref_path, Path) else ref_path |
|
ref_path_list = sorted([x for x in ref_path.glob("*.[jpJP][pnPN]*[gG]")]) |
|
if ntest is not None: ref_path_list = ref_path_list[:ntest] |
|
|
|
metric_paired_dict["psnr"]=pyiqa.create_metric('psnr', test_y_channel=True, color_space='ycbcr').to(device) |
|
metric_paired_dict["lpips"]=pyiqa.create_metric('lpips').to(device) |
|
metric_paired_dict["dists"]=pyiqa.create_metric('dists').to(device) |
|
metric_paired_dict["ssim"]=pyiqa.create_metric('ssim', test_y_channel=True, color_space='ycbcr' ).to(device) |
|
|
|
lr_path_list = sorted([x for x in in_path.glob("*.[jpJP][pnPN]*[gG]")]) |
|
if ntest is not None: lr_path_list = lr_path_list[:ntest] |
|
|
|
print(f'Find {len(lr_path_list)} images in {in_path}') |
|
result = {} |
|
for i in tqdm.tqdm(range(len(lr_path_list))): |
|
_in_path = lr_path_list[i] |
|
_ref_path = ref_path_list[i] if ref_path_list is not None else None |
|
|
|
im_in = util_image.imread(_in_path, chn='rgb', dtype='float32') |
|
im_in_tensor = util_image.img2tensor(im_in).cuda() |
|
for key, metric in metric_dict.items(): |
|
with torch.cuda.amp.autocast(): |
|
result[key] = result.get(key, 0) + metric(im_in_tensor).item() |
|
|
|
if ref_path is not None: |
|
im_ref = util_image.imread(_ref_path, chn='rgb', dtype='float32') |
|
im_ref_tensor = util_image.img2tensor(im_ref).cuda() |
|
for key, metric in metric_paired_dict.items(): |
|
result[key] = result.get(key, 0) + metric(im_in_tensor, im_ref_tensor).item() |
|
|
|
if ref_path is not None: |
|
fid_metric = pyiqa.create_metric('fid') |
|
result['fid'] = fid_metric(in_path, ref_path) |
|
|
|
for key, res in result.items(): |
|
if key == 'fid': |
|
print(f"{key}: {res:.2f}") |
|
else: |
|
print(f"{key}: {res/len(lr_path_list):.5f}") |
|
|
|
if __name__ == "__main__": |
|
parser = argparse.ArgumentParser() |
|
parser.add_argument('-i',"--in_path", type=str, required=True) |
|
parser.add_argument("-r", "--ref_path", type=str, default=None) |
|
parser.add_argument("--ntest", type=int, default=None) |
|
args = parser.parse_args() |
|
evaluate(args.in_path, args.ref_path, args.ntest) |
|
|