| import argparse |
| from pathlib import Path |
| import json |
| import matplotlib.pyplot as plt |
| import re |
|
|
|
|
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser() |
| parser.add_argument("dirs", nargs="+", help="One or more directories to process") |
| args = parser.parse_args() |
|
|
| plt.figure(figsize=(8, 6)) |
|
|
| for dir_path in args.dirs: |
| dir_path = Path(dir_path) |
| name = dir_path.name |
|
|
| step_numbers = [] |
| avg_psnrs = [] |
|
|
| step_dirs = [d for d in dir_path.iterdir() if re.fullmatch(r"iter_\d+", d.name)] |
| for step_dir in sorted(step_dirs, key=lambda x: int(x.name.split("_")[-1])): |
| if len(list(step_dir.iterdir())) == 0: |
| continue |
| if len(list(step_dir.iterdir())) != 501: |
| continue |
| psnrs = [] |
| for f in Path(step_dir).glob("*_metrics.json"): |
| with open(f, "r") as file: |
| data = json.load(file) |
| psnrs.append(data["psnr"]) |
| avg_psnr = sum(psnrs) / len(psnrs) if psnrs else 0.0 |
|
|
| step_num = int(step_dir.name.split("_")[-1]) |
| step_numbers.append(step_num) |
| avg_psnrs.append(avg_psnr) |
|
|
| print(f"Directory: {step_dir}") |
| print(f"Average PSNR: {avg_psnr:.2f} dB ({len(psnrs)} samples)") |
|
|
| plt.plot(step_numbers, avg_psnrs, marker="o", label=name) |
|
|
| plt.xlabel("Step", fontsize=14) |
| plt.ylabel("Average PSNR (dB)", fontsize=14) |
| plt.title("Average PSNR per Step", fontsize=16) |
| plt.grid(True) |
| plt.tight_layout(rect=[0, 0.05, 1, 1]) |
| plt.legend( |
| loc="upper center", |
| bbox_to_anchor=(0.5, -0.1), |
| frameon=False, |
| fontsize=14 |
| ) |
|
|
| plt.savefig("psnr.png", bbox_inches="tight") |
|
|