# Copyright (C) 2023, Inria# GRAPHDECO research group, https://team.inria.fr/graphdeco# All rights reserved.## This software is free for non-commercial, research and evaluation use# under the terms of the LICENSE_inria.md file.## For inquiries contact george.drettakis@inria.frfrom pathlib import Pathimport osfrom PIL import Imageimport torchimport torchvision.transforms.functional as tffrom utils.loss_utils import ssimfrom lpipsPyTorch import lpipsimport jsonfrom tqdm import tqdmfrom utils.image_utils import psnrfrom argparse import ArgumentParserdef readImages(renders_dir, gt_dir):renders = []gts = []image_names = []for fname in os.listdir(renders_dir):render = Image.open(renders_dir / fname)gt = Image.open(gt_dir / fname)renders.append(tf.to_tensor(render).unsqueeze(0)[:, :3, :, :].cuda())gts.append(tf.to_tensor(gt).unsqueeze(0)[:, :3, :, :].cuda())image_names.append(fname)return renders, gts, image_namesdef evaluate(model_paths):full_dict = {}per_view_dict = {}full_dict_polytopeonly = {}per_view_dict_polytopeonly = {}print("")for scene_dir in model_paths:try:print("Scene:", scene_dir)full_dict[scene_dir] = {}per_view_dict[scene_dir] = {}full_dict_polytopeonly[scene_dir] = {}per_view_dict_polytopeonly[scene_dir] = {}test_dir = Path(scene_dir) / "test"for method in os.listdir(test_dir):print("Method:", method)full_dict[scene_dir][method] = {}per_view_dict[scene_dir][method] = {}full_dict_polytopeonly[scene_dir][method] = {}per_view_dict_polytopeonly[scene_dir][method] = {}method_dir = test_dir / methodgt_dir = method_dir/ "gt"renders_dir = method_dir / "renders"renders, gts, image_names = readImages(renders_dir, gt_dir)ssims = []psnrs = []lpipss = []for idx in tqdm(range(len(renders)), desc="Metric evaluation progress"):ssims.append(ssim(renders[idx], gts[idx]))psnrs.append(psnr(renders[idx], gts[idx]))lpipss.append(lpips(renders[idx], gts[idx], net_type='vgg'))print(" SSIM : {:>12.7f}".format(torch.tensor(ssims).mean(), ".5"))print(" PSNR : {:>12.7f}".format(torch.tensor(psnrs).mean(), ".5"))print(" LPIPS: {:>12.7f}".format(torch.tensor(lpipss).mean(), ".5"))print("")full_dict[scene_dir][method].update({"SSIM": torch.tensor(ssims).mean().item(),"PSNR": torch.tensor(psnrs).mean().item(),"LPIPS": torch.tensor(lpipss).mean().item()})per_view_dict[scene_dir][method].update({"SSIM": {name: ssim for ssim, name in zip(torch.tensor(ssims).tolist(), image_names)},"PSNR": {name: psnr for psnr, name in zip(torch.tensor(psnrs).tolist(), image_names)},"LPIPS": {name: lp for lp, name in zip(torch.tensor(lpipss).tolist(), image_names)}})with open(scene_dir + "/results.json", 'w') as fp:json.dump(full_dict[scene_dir], fp, indent=True)with open(scene_dir + "/per_view.json", 'w') as fp:json.dump(per_view_dict[scene_dir], fp, indent=True)except:print("Unable to compute metrics for model", scene_dir)if __name__ == "__main__":device = torch.device("cuda:0")torch.cuda.set_device(device)# Set up command line argument parserparser = ArgumentParser(description="Training script parameters")parser.add_argument('--model_paths', '-m', required=True, nargs="+", type=str, default=[])args = parser.parse_args()evaluate(args.model_paths)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。