| """Plot edge/flat densification-event ratio over training steps (Exp 2 curve).""" |
| import os, json, argparse |
| import matplotlib |
| matplotlib.use("Agg") |
| import matplotlib.pyplot as plt |
| import numpy as np |
|
|
|
|
| def main(): |
| ap = argparse.ArgumentParser() |
| ap.add_argument("--methods", nargs="+", default=["vanilla_logged","vanillasgf_logged"]) |
| ap.add_argument("--scenes", nargs="+", default=["francis","m60","panther","bonsai","bicycle","garden"]) |
| ap.add_argument("--outputs_root", default="/root/autodl-tmp/SplatAtlas/outputs") |
| ap.add_argument("--out", default="/root/autodl-tmp/SplatAtlas/densification_timeseries.png") |
| ap.add_argument("--bin_size", type=int, default=1000) |
| args = ap.parse_args() |
|
|
| fig, ax = plt.subplots(figsize=(8, 5)) |
| colors = {"vanilla_logged":"#888888", "vanillasgf_logged":"#1f77b4"} |
| for method in args.methods: |
| all_steps, all_ratios = [], [] |
| for scene in args.scenes: |
| p = os.path.join(args.outputs_root, f"{method}_{scene}", "densification_events.json") |
| if not os.path.exists(p): continue |
| for e in json.load(open(p)): |
| all_steps.append(e["step"]) |
| all_ratios.append(e["n_edge"] / max(e["n_flat"], 1)) |
| if not all_steps: |
| print(f"no data for {method}"); continue |
| steps, ratios = np.array(all_steps), np.array(all_ratios) |
| bins = np.arange(0, int(steps.max())+args.bin_size, args.bin_size) |
| bc, bm = [], [] |
| for i in range(len(bins)-1): |
| m = (steps >= bins[i]) & (steps < bins[i+1]) |
| if m.sum() > 0: |
| bc.append((bins[i]+bins[i+1])/2); bm.append(ratios[m].mean()) |
| ax.plot(bc, bm, label=method, marker='o', markersize=4, linewidth=1.5, |
| color=colors.get(method)) |
| ax.axhline(1.0, color="black", linewidth=0.5, linestyle="--", alpha=0.5) |
| ax.set_xlabel("Training step"); ax.set_ylabel("Edge / Flat densification-event ratio") |
| ax.legend(loc="best", frameon=False) |
| ax.set_title("Densification event redistribution over training") |
| plt.tight_layout(); plt.savefig(args.out, dpi=120, bbox_inches="tight") |
| print(f"saved {args.out}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|