Spaces:
Runtime error
Runtime error
| # | |
| # 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.md file. | |
| # | |
| # For inquiries contact [email protected] | |
| # | |
| from pathlib import Path | |
| import os | |
| from PIL import Image | |
| import torch | |
| import torchvision.transforms.functional as tf | |
| from utils.loss_utils import ssim | |
| from lpipsPyTorch import lpips | |
| import json | |
| from tqdm import tqdm | |
| from utils.image_utils import psnr | |
| from argparse import ArgumentParser | |
| def 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_names | |
| def 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 / method | |
| gt_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 parser | |
| parser = 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) | |