SplatAtlas / scripts /plot_c1_c2_figures.py
KCBtheone's picture
Upload SplatAtlas benchmark pipeline code
23e73f9 verified
Raw
History Blame Contribute Delete
2.57 kB
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pathlib import Path
# 设置学术图表样式
plt.rcParams.update({'font.size': 12, 'pdf.fonttype': 42, 'ps.fonttype': 42})
sns.set_theme(style="whitegrid", context="paper")
OUT_DIR = Path("/root/autodl-tmp/SplatAtlas/outputs/surfel_hypothesis_7tnt_all/")
df_method = pd.read_csv(OUT_DIR / "method_mean_7tnt.csv")
df_scene = pd.read_csv(OUT_DIR / "scene_mean_7tnt.csv")
# 过滤掉 V3 为空的行(比如 2DGS)
df_v3 = df_method.dropna(subset=['v3_normal_median_deg', 'center_pca_normal_median_deg']).copy()
# ==========================================
# Figure 1: V3 vs Center-PCA Scatter Plot
# ==========================================
plt.figure(figsize=(6, 5))
ax = sns.scatterplot(
data=df_v3, x='center_pca_normal_median_deg', y='v3_normal_median_deg',
hue='group', style='group', s=80, alpha=0.8, palette="deep"
)
# 画 y=x 的对角线
lims = [10, 65]
plt.plot(lims, lims, '--', color='gray', zorder=0)
plt.fill_between(lims, lims, 70, color='red', alpha=0.05, zorder=0) # 上半区标红(V3更差)
plt.fill_between(lims, 0, lims, color='green', alpha=0.05, zorder=0) # 下半区标绿(V3更好)
plt.title("Covariance Orientation vs. Center PCA Normal")
plt.xlabel("Center-PCA Normal Median Error (deg)")
plt.ylabel("V3 Covariance Normal Median Error (deg)")
plt.xlim(10, 65)
plt.ylim(25, 70)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', title="Method Group")
plt.text(12, 60, "V3 is Worse", color='red', fontsize=12, fontweight='bold', alpha=0.5)
plt.text(50, 30, "V3 is Better", color='green', fontsize=12, fontweight='bold', alpha=0.5)
plt.tight_layout()
plt.savefig(OUT_DIR / "Fig1_V3_vs_PCA_Scatter.pdf", bbox_inches='tight')
print(f"✅ Saved Fig 1 to {OUT_DIR / 'Fig1_V3_vs_PCA_Scatter.pdf'}")
# ==========================================
# Figure 2: Surface Near Ratio by Scene Barplot
# ==========================================
plt.figure(figsize=(7, 4))
df_scene_sorted = df_scene.sort_values(by='surface_near_ratio', ascending=False)
sns.barplot(data=df_scene_sorted, x='scene', y='surface_near_ratio', palette="viridis")
plt.title("Proximity of Gaussian Centers to True Surface Across Scenes")
plt.xlabel("Tanks & Temples Scene")
plt.ylabel("Surface-Near Ratio ($< 2\\tau$)")
plt.axhline(y=df_scene['surface_near_ratio'].mean(), color='r', linestyle='--', label='Global Mean')
plt.legend()
plt.tight_layout()
plt.savefig(OUT_DIR / "Fig2_Surface_Proximity_Bar.pdf")
print(f"✅ Saved Fig 2 to {OUT_DIR / 'Fig2_Surface_Proximity_Bar.pdf'}")