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') # h x w x c im_in_tensor = util_image.img2tensor(im_in).cuda() # 1 x c x h x w 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') # h x w x c 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)