From 80122b627c07f06c95a40f48e855ac01157e0772 Mon Sep 17 00:00:00 2001 From: MrKarimiD Date: Thu, 29 May 2025 14:27:04 -0400 Subject: [PATCH] Add visualization for rendering and data --- lantern_scripts/calculate_metrics.py | 38 +++++++++++- lantern_scripts/data_visualization.py | 21 +++++++ lantern_scripts/res_table_1.py | 38 ++++++------ lantern_scripts/results_visualization.py | 77 ++++++++++++++++++++++++ lantern_scripts/tonemap.py | 9 ++- 5 files changed, 161 insertions(+), 22 deletions(-) create mode 100644 lantern_scripts/data_visualization.py create mode 100644 lantern_scripts/results_visualization.py diff --git a/lantern_scripts/calculate_metrics.py b/lantern_scripts/calculate_metrics.py index 8f65b89e1..c4e372962 100644 --- a/lantern_scripts/calculate_metrics.py +++ b/lantern_scripts/calculate_metrics.py @@ -85,8 +85,7 @@ if __name__ == '__main__': old_path = os.path.join(renders_lin, old_path) shutil.move(old_path, new_path) print(f"Renamed {os.path.basename(old_path)} to {new_filename}") - - + print("Step 4b: Verifying filename consistency between GT and renders...") try: gt_files = set(f for f in os.listdir(gt_exr) if f.endswith('.exr')) @@ -158,3 +157,38 @@ if __name__ == '__main__': "--hdr_dir", gt_exr, "--output_dir", gt_hdr ], check=True) + + # 9. Convert EXR panos to LDR format: + print("Converting EXR panos to LDR visualization...") + subprocess.run([ + "python", "lantern_scripts/tonemap.py", + "--data_dir", renders_lin, + "--out_dir", renders_lin + ], check=True) + subprocess.run([ + "python", "lantern_scripts/tonemap.py", + "--data_dir", gt_exr, + "--out_dir", gt_exr + ], check=True) + subprocess.run([ + "python", "lantern_scripts/tonemap.py", + "--data_dir", lin_renders, + "--out_dir", lin_renders + ], check=True) + subprocess.run([ + "python", "lantern_scripts/tonemap.py", + "--data_dir", gt_exr_renders, + "--out_dir", gt_exr_renders + ], check=True) + + # 9. Convert EXR panos to LDR format: + print("Preparing the HTML visualization...") + subprocess.run([ + "python", "lantern_scripts/results_visualization.py", + "--gt_dir", gt_exr, + "--gt_render_dir", gt_exr_renders, + "--pandora_dir", renders_lin, + "--pandora_render_dir", lin_renders, + "--out_dir", args.input_dir, + "--name", args.metric_name + ], check=True) diff --git a/lantern_scripts/data_visualization.py b/lantern_scripts/data_visualization.py new file mode 100644 index 000000000..50c022dfe --- /dev/null +++ b/lantern_scripts/data_visualization.py @@ -0,0 +1,21 @@ +from os import makedirs +from html4vision import Col, imagetable +import argparse +import json + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('--input_dir', type=str, default='/mnt/data/nerfstudio_ds/real_data/coffeeroom_1102H/GT/GT_exr') + args = parser.parse_args() + + cols = [ + Col('id1', 'ID'), # 1-based indexing + Col('img', 'Left Pano', args.input_dir + 'left_e1/output_*.png'), + Col('img', 'Left Mask', args.input_dir + 'masks/left_e1/output_*.png.masked.png'), + Col('img', 'Right Pano', args.input_dir + 'right_e2/output_*.png'), + Col('img', 'Right Mask', args.input_dir + 'masks/right_e2/output_*.png.masked.png'), + ] + + # imagetable(cols, 'another-dir/pathrep.html', 'Path Replace Example', pathrep=('/mnt/data', '/home-local2/mokad6.extra.nobkp')) + imagetable(cols, args.input_dir + 'data_index.html', 'NeRF sequence', pathrep=(args.input_dir, './'), imscale=0.1, zebra=True, sticky_header=True, overlay_toggle=True) \ No newline at end of file diff --git a/lantern_scripts/res_table_1.py b/lantern_scripts/res_table_1.py index 02ce80244..0a0f0e4d8 100755 --- a/lantern_scripts/res_table_1.py +++ b/lantern_scripts/res_table_1.py @@ -92,11 +92,13 @@ def calculate_metrics(results_dataset_roots, gt_dataset_root, output_folder, dat si_mse = {} angular = {} psnr_error = {} + metrics = {} for key in dataset_names: mse[key] = [] si_mse[key] = [] angular[key] = [] psnr_error[key] = [] + metrics[key] = {} gt_dataset_files = sorted([os.path.join(gt_dataset_root, f) for f in os.listdir(gt_dataset_root) if f.endswith('.exr')]) @@ -121,6 +123,15 @@ def calculate_metrics(results_dataset_roots, gt_dataset_root, output_folder, dat scale_invariant_mse_result = si_wrmse(gt_dataset_img_exr, result_dataset_img_exr, mask) angular_result = angular_error(gt_dataset_img_exr, result_dataset_img_exr, mask) psnr_result = psnr(gt_dataset_img_exr_for_PSNR, result_dataset_img_exr_for_PSNR) + + key = gt_dataset_file.split('/')[-1] + metrics[dataset_name][key] = { + 'mse': str(mse_result), + 'si_rmse': str(scale_invariant_mse_result), + 'angular': str(angular_result), + 'psnr': str(psnr_result) + } + mse[dataset_name].append(mse_result) si_mse[dataset_name].append(scale_invariant_mse_result) angular[dataset_name].append(angular_result) @@ -128,28 +139,22 @@ def calculate_metrics(results_dataset_roots, gt_dataset_root, output_folder, dat si_mse[dataset_name].append(scale_invariant_mse_result) mse[dataset_name] = remove_nan_and_sort(mse[dataset_name]) - + mse_ours = np.mean(mse[dataset_name]) si_mse_ours = np.mean(si_mse[dataset_name]) angular_ours = np.mean(angular[dataset_name]) psnr_ours = np.mean(psnr_error[dataset_name]) + + metrics[dataset_name]['mean'] = { + 'mse': str(mse_ours), + 'si_rmse': str(si_mse_ours), + 'angular': str(angular_ours), + 'psnr': str(psnr_ours) + } - # print(dataset_name + ', si_RMSE: {}'.format(si_mse_ours)) - # print(dataset_name + ', RMSE: {}'.format(mse_ours)) - # print(dataset_name + ', angular: {}'.format(angular_ours)) - # print(dataset_name + ', PSNR: {}'.format(psnr_ours)) - - output_dict = {} - output_dict['model_name'] = dataset_name - output_dict['si_RMSE'] = str(si_mse_ours) - output_dict['RMSE'] = str(mse_ours) - output_dict['angular'] = str(angular_ours) - output_dict['PSNR'] = str(psnr_ours) - - output_addr = output_folder + 'render_results.json' - + output_addr = output_folder + dataset_name + '_results.json' with open(output_addr, 'w') as f: - json.dump(output_dict, f, indent=4) + json.dump(metrics, f, indent=4) if __name__ == '__main__': argparser = argparse.ArgumentParser() @@ -157,7 +162,6 @@ if __name__ == '__main__': argparser.add_argument("--gt_dataset_root", type=str, default="/mnt/data/coffee_room2/GT/GT_exr_renders/") argparser.add_argument("--output_folder", type=str, default="/mnt/data/coffee_room2/metrics/results_table/") argparser.add_argument("--dataset_names", type=str, default="/mnt/data/coffee_room2/metrics/results_table/") - args = argparser.parse_args() calculate_metrics(args.results_dataset_roots, args.gt_dataset_root, args.output_folder, args.dataset_names) \ No newline at end of file diff --git a/lantern_scripts/results_visualization.py b/lantern_scripts/results_visualization.py new file mode 100644 index 000000000..11f58b49f --- /dev/null +++ b/lantern_scripts/results_visualization.py @@ -0,0 +1,77 @@ +import os +from os import makedirs +from html4vision import Col, imagetable +import argparse +import json + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('--gt_dir', type=str, default='/mnt/data/nerfstudio_ds/real_data/coffeeroom_1102H/GT/GT_exr') + parser.add_argument('--gt_render_dir', type=str, default='/mnt/data/nerfstudio_ds/real_data/coffeeroom_1102H/GT/GT_exr_renders') + parser.add_argument('--pandora_dir', type=str, default='/mnt/data/nerfstudio_ds/real_data/coffeeroom_1102H/metrics/images/pandora_cam_opt_on_lin') + parser.add_argument('--pandora_render_dir', type=str, default='/mnt/data/nerfstudio_ds/real_data/coffeeroom_1102H/metrics/images/pandora_cam_opt_on_lin_renders') + parser.add_argument('--out_dir', type=str, default='/mnt/data/nerfstudio_ds/real_data/coffeeroom_1102H') + parser.add_argument("--name", type=str, required=True, default="unaligned", help="Name of the method, used for naming output directories") + args = parser.parse_args() + + results_json = os.path.join(args.out_dir, 'metrics/results_table') + results_json = os.path.join(results_json, args.name + '_results.json') + with open(results_json, 'r') as file: + metrics = json.load(file) + img_keys = metrics[args.name].keys() - ['mean'] + + gt = [] + gt_render = [] + out = [] + out_render = [] + + mse = [] + si_rmse = [] + psnr = [] + angular = [] + + for key in img_keys: + img_name = key.replace('exr', 'png') + + mse.append(metrics[args.name][key]['mse']) + si_rmse.append(metrics[args.name][key]['si_rmse']) + psnr.append(metrics[args.name][key]['psnr']) + angular.append(metrics[args.name][key]['angular']) + + gt.append( os.path.join(args.gt_dir, img_name) ) + gt_render.append( os.path.join(args.gt_render_dir, img_name) ) + out.append( os.path.join(args.pandora_dir, img_name) ) + out_render.append( os.path.join(args.pandora_render_dir, img_name) ) + + cols = [ + Col('text', 'Name', list(img_keys)), # Col('id1', 'ID'), # 1-based indexing + Col('img', 'GT Pano', gt), + Col('img', 'GT Render', gt_render), + Col('img', 'Pandora Output', out), + Col('img', 'Pandora Render', out_render), + Col('text', 'MSE', mse), + Col('text', 'si-RMSE', si_rmse), + Col('text', 'PSNR', psnr), + Col('text', 'Angular', angular), + ] + + + # imagetable(cols, os.path.join(args.out_dir, 'results_' + args.name + '_index.html'), 'Pandora outputs', pathrep=(args.out_dir, './'), + # imscale=0.1, + # sort_style='materialize', + # sortable=True, + # zebra=True, + # sticky_header=True, + # overlay_toggle=True + # ) + + imagetable(cols, os.path.join(args.out_dir, 'results_' + args.name + '_index.html'), 'Pandora outputs', pathrep=(args.out_dir, './'), + sort_style='materialize', + imsize=(300, 300), + hori_center_img=True, + sortable=True, + zebra=True, + sticky_header=True, + overlay_toggle=True + ) \ No newline at end of file diff --git a/lantern_scripts/tonemap.py b/lantern_scripts/tonemap.py index a43d560ed..9a7165407 100644 --- a/lantern_scripts/tonemap.py +++ b/lantern_scripts/tonemap.py @@ -15,7 +15,8 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('--data_dir', type=str, default='/Volumes/Momo/Adobe_2023/Evaluation/test_sets/weber_test_set_original_hdr_panos/') parser.add_argument('--out_dir', type=str, default='/Users/momo/Desktop/camera_ready/FID_test_set_256x512/') - parser.add_argument("--resolution", type=int, default=256) + parser.add_argument('--do_resize', '-v', action='store_true', help='Enable verbose output') + parser.add_argument("--resolution", type=int, default=1024) args = parser.parse_args() test_images = [] @@ -37,6 +38,8 @@ if __name__ == "__main__": pano_file = os.path.basename(pano_addr) pano_file = pano_file.replace('.exr', '.png') gt_ldr_addr = os.path.join(args.out_dir, pano_file) - # Image.fromarray(gt_ldr).resize((2 * args.resolution, args.resolution), resample=Image.LANCZOS).save(gt_ldr_addr) - Image.fromarray(gt_ldr).save(gt_ldr_addr) + if args.do_resize: + Image.fromarray(gt_ldr).resize((2 * args.resolution, args.resolution), resample=Image.LANCZOS).save(gt_ldr_addr) + else: + Image.fromarray(gt_ldr).save(gt_ldr_addr) print("Done!") \ No newline at end of file