From 5b98432d1e0da74ed4eea8fb3ae12003d26878ea Mon Sep 17 00:00:00 2001 From: chu-jiaming Date: Wed, 14 Oct 2026 20:45:41 +0800 Subject: [PATCH] chore: post-release cleanup and docs fixes - Link the v1.0.0 release checkpoints from both README Quickstarts; bump version to 1.0.0 - analyze_warmup_results --diagnostics reads the archived GT traces for published inputs; run it in CI - Write repository-relative input paths into the generated report - Drop the two first-round historical reports whose figures were never archived - .gitignore: ignore .DS_Store, drop unused /datasets/ Co-Authored-By: Claude Opus 5.5 --- .github/workflows/tests.yml | 2 +- .gitignore | 4 +- README.md | 6 +- README.zh-CN.md | 2 +- artifacts/README.md | 8 +- .../naive_failure_analysis.md | 104 ------- .../analysis/pose_optimization/report.md | 288 ------------------ docs/RUNNING.md | 10 +- pyproject.toml | 2 +- scripts/analysis/analyze_warmup_results.py | 21 +- uv.lock | 2 +- 11 files changed, 35 insertions(+), 414 deletions(-) delete mode 100644 artifacts/analysis/pose_optimization/naive_failure_analysis.md delete mode 100644 artifacts/analysis/pose_optimization/report.md diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a2f4bb6..35ee3d4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,5 +19,5 @@ jobs: - run: uv run python -m unittest discover -s tests -p "test_script_portability.py" -v - run: uv run python -m unittest discover -s tests -p "test_orchestration.py" -v - run: uv run python -m unittest discover -s tests -p "test_alignment.py" -v - - run: uv run python scripts/analysis/analyze_warmup_results.py --plots + - run: uv run python scripts/analysis/analyze_warmup_results.py --plots --diagnostics - run: uv run python scripts/showcase/make_figures.py --output "$RUNNER_TEMP/figures" diff --git a/.gitignore b/.gitignore index 6b4ee7a..14dd724 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# macOS Finder metadata +.DS_Store + # Generated Python caches __pycache__/ *.py[cod] @@ -12,7 +15,6 @@ __pycache__/ # Large experiment inputs and outputs stay on the training server. /data/ -/datasets/ *.ckpt *.npy *.npz diff --git a/README.md b/README.md index 4d11f24..183f512 100644 --- a/README.md +++ b/README.md @@ -125,8 +125,10 @@ uv run python scripts/analysis/analyze_warmup_results.py --plots uv run python -m unittest discover -s tests -p "test_alignment.py" -v ``` -Training, resuming, auditing and aligned rendering need a CUDA GPU. See -[docs/RUNNING.md](docs/RUNNING.md). +The seven final checkpoints behind the GT alignment table and the T5 comparison +are on the [v1.0.0 release](https://github.com/chu-jiaming/PoseGuard-NeRF/releases/tag/v1.0.0), +with SHA-256 sums and loading steps. Training, resuming, auditing and aligned +rendering need a CUDA GPU. See [docs/RUNNING.md](docs/RUNNING.md). ## Repository layout diff --git a/README.zh-CN.md b/README.zh-CN.md index 3b25b2c..4ab8cb5 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -93,7 +93,7 @@ uv run python scripts/analysis/analyze_warmup_results.py --plots uv run python -m unittest discover -s tests -p "test_alignment.py" -v ``` -训练、断点续跑、位姿审计和对齐渲染都需要 CUDA GPU,步骤见 [docs/RUNNING.md](docs/RUNNING.md)(英文)。 +GT 对齐表和 T5 对比所用的 7 个最终 checkpoint 发布在 [v1.0.0 Release](https://github.com/chu-jiaming/PoseGuard-NeRF/releases/tag/v1.0.0),附 SHA-256 校验和与加载步骤。训练、断点续跑、位姿审计和对齐渲染都需要 CUDA GPU,步骤见 [docs/RUNNING.md](docs/RUNNING.md)(英文)。 ## 目录结构 diff --git a/artifacts/README.md b/artifacts/README.md index 3c4b99c..8166f2b 100644 --- a/artifacts/README.md +++ b/artifacts/README.md @@ -22,7 +22,7 @@ | 内容 | 入口 | |---|---| | 固定相机基线 | [9 条件汇总](analysis/baseline/SV100_full_summary.csv)、[平移对照](analysis/baseline/SV100_translation_sweep.csv)、[旋转对照](analysis/baseline/SV100_rotation_sweep.csv) | -| 首轮三方法比较 | [27 行汇总](analysis/pose_optimization/summary.csv)、[历史报告](analysis/pose_optimization/report.md)、[Naive 失败分析](analysis/pose_optimization/naive_failure_analysis.md) | +| 首轮三方法比较 | [27 行汇总](analysis/pose_optimization/summary.csv) | | Warm-up 配对比较 | [汇总](analysis/warmup/summary.csv)、[配对差值](analysis/warmup/paired_metrics.csv)、[统计](analysis/warmup/aggregate_metrics.json)、[阶段报告](analysis/warmup/report.md) | | GT 完整对齐评估 | [汇总](analysis/alignment_full/summary.csv)、[报告](analysis/alignment_full/report.md)、[结论](analysis/alignment_full/findings.md) | | GT 预览对齐评估 | [汇总](analysis/alignment_preview/summary.csv)、[报告](analysis/alignment_preview/report.md)、[结论](analysis/alignment_preview/findings.md) | @@ -44,10 +44,10 @@ README 中的渲染图和视频由服务器在同一批 checkpoint 上推理生 ## 读取与重新分析 -在仓库根目录运行 `uv run python scripts/analysis/analyze_warmup_results.py`,可从归档 CSV 重新计算配对统计,默认输出到 `results/published_analysis/`。加 `--plots` 可重画质量对比图,需要 NumPy 和 Matplotlib。 +在仓库根目录运行 `uv run python scripts/analysis/analyze_warmup_results.py`,可从归档 CSV 重新计算配对统计,默认输出到 `results/published_analysis/`。加 `--plots` 可重画质量对比图,加 `--diagnostics` 可用 `analysis/training_curves/diagnostics/` 中归档的 GT 轨迹重画早期漂移图,两者都需要 NumPy 和 Matplotlib。 -发布档案不含原始数据、checkpoint、TensorBoard、原始渲染数组或完整训练日志。重新渲染需要原模型和数据;重画早期漂移需要原服务器的 `diagnostics.jsonl`。完整评估使用 200 张 800×800 图,预览使用 20 张 200×200 图,两者的指标应分开比较。 +发布档案不含原始数据、checkpoint、TensorBoard、原始渲染数组或完整训练日志。重新渲染需要原模型和数据,7 个最终 checkpoint 见 [v1.0.0 Release](https://github.com/chu-jiaming/PoseGuard-NeRF/releases/tag/v1.0.0)。完整评估使用 200 张 800×800 图,预览使用 20 张 200×200 图,两者的指标应分开比较。 -两份首轮历史报告保留当时文字及未打包图片的路径。Warm-up 阶段报告早于对齐诊断,其中 GT 对齐的后续工作已完成,多种子实验未执行;后续对齐解释见对应 findings。 +Warm-up 阶段报告早于对齐诊断,其中 GT 对齐的后续工作已完成,多种子实验未执行;后续对齐解释见对应 findings。 `records/`、配置及完成标记中的服务器绝对路径属于历史来源信息,不能在新机器直接用于恢复。所有现存记录均保留,目录整理没有重新训练或重新计算图像指标。通过 Git status 和 Git diff 查看档案变更。 diff --git a/artifacts/analysis/pose_optimization/naive_failure_analysis.md b/artifacts/analysis/pose_optimization/naive_failure_analysis.md deleted file mode 100644 index 53e7382..0000000 --- a/artifacts/analysis/pose_optimization/naive_failure_analysis.md +++ /dev/null @@ -1,104 +0,0 @@ -# Pose optimization — naive phase complete - -Single seed 42; vanilla-NeRF; target 30000 steps. Fixed baselines: 30000 steps. -Test cameras remain in original coordinates. Sim(3) alignment is used only for pose diagnostics. - -| Case | Method | Status | PSNR | SSIM | LPIPS | Raw rot ° | Aligned rot ° | -|---|---|---|---:|---:|---:|---:|---:| -| SV100-GT | fixed | SUCCESS | 27.117351531982422 | 0.9003052115440369 | 0.07902220636606216 | — | — | -| SV100-GT | naive | SUCCESS | 17.908571243286133 | 0.7507554292678833 | 0.14861881732940674 | 0.17414969937534208 | 0.14286414140689588 | -| SV100-GT | camp | PENDING | — | — | — | — | — | -| SV100-T0.5 | fixed | SUCCESS | 23.16393280029297 | 0.8242353796958923 | 0.19025984406471252 | — | — | -| SV100-T0.5 | naive | SUCCESS | 17.72048568725586 | 0.75315260887146 | 0.14314380288124084 | 0.16016191246733955 | 0.15316289264650607 | -| SV100-T0.5 | camp | PENDING | — | — | — | — | — | -| SV100-T1 | fixed | SUCCESS | 20.352632522583008 | 0.7836681604385376 | 0.24935901165008545 | — | — | -| SV100-T1 | naive | SUCCESS | 15.900127410888672 | 0.7369078993797302 | 0.1968562752008438 | 0.37691880466686223 | 0.25735811810525144 | -| SV100-T1 | camp | PENDING | — | — | — | — | — | -| SV100-T2 | fixed | SUCCESS | 17.410005569458008 | 0.7545003890991211 | 0.3104111850261688 | — | — | -| SV100-T2 | naive | SUCCESS | 16.844139099121094 | 0.747525691986084 | 0.1714111864566803 | 0.3576907654318797 | 0.17645954241835496 | -| SV100-T2 | camp | PENDING | — | — | — | — | — | -| SV100-T5 | fixed | SUCCESS | 14.144984245300293 | 0.7271924018859863 | 0.38807252049446106 | — | — | -| SV100-T5 | naive | SUCCESS | 17.533849716186523 | 0.7530051469802856 | 0.15946823358535767 | 0.30762172229369367 | 0.3024573854516597 | -| SV100-T5 | camp | PENDING | — | — | — | — | — | -| SV100-R0.5 | fixed | SUCCESS | 20.094165802001953 | 0.7804862260818481 | 0.24594688415527344 | — | — | -| SV100-R0.5 | naive | SUCCESS | 20.562286376953125 | 0.793068528175354 | 0.11532619595527649 | 0.14250513597009293 | 0.10354943495223193 | -| SV100-R0.5 | camp | PENDING | — | — | — | — | — | -| SV100-R1 | fixed | SUCCESS | 17.114395141601562 | 0.7534263134002686 | 0.31077659130096436 | — | — | -| SV100-R1 | naive | SUCCESS | 15.528212547302246 | 0.7332556247711182 | 0.20048755407333374 | 0.2700870145416624 | 0.2634725693301638 | -| SV100-R1 | camp | PENDING | — | — | — | — | — | -| SV100-R2 | fixed | SUCCESS | 14.811619758605957 | 0.7333740592002869 | 0.3723008334636688 | — | — | -| SV100-R2 | naive | SUCCESS | 16.13628387451172 | 0.7383190989494324 | 0.1885874718427658 | 0.30028402066716964 | 0.21096732084116376 | -| SV100-R2 | camp | PENDING | — | — | — | — | — | -| SV100-R5 | fixed | SUCCESS | 12.007059097290039 | 0.6993001103401184 | 0.47173792123794556 | — | — | -| SV100-R5 | naive | SUCCESS | 17.4700870513916 | 0.7498352527618408 | 0.16173501312732697 | 0.41562610770552155 | 0.22216747809338858 | -| SV100-R5 | camp | PENDING | — | — | — | — | — | - -## SV100-GT - -[Convergence curves](figures/SV100-GT_curves.png) - -naive: oscillation candidate; inspect curves and camera updates. -naive: test PSNR is below the fixed-pose baseline. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -## SV100-T0.5 - -[Convergence curves](figures/SV100-T0.5_curves.png) - -naive: oscillation candidate; inspect curves and camera updates. -naive: test PSNR is below the fixed-pose baseline. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -## SV100-T1 - -[Convergence curves](figures/SV100-T1_curves.png) - -naive: late validation stagnation/decline candidate (batch-sampling noise possible). -naive: oscillation candidate; inspect curves and camera updates. -naive: test PSNR is below the fixed-pose baseline. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -## SV100-T2 - -[Convergence curves](figures/SV100-T2_curves.png) - -naive: oscillation candidate; inspect curves and camera updates. -naive: test PSNR is below the fixed-pose baseline. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -## SV100-T5 - -[Convergence curves](figures/SV100-T5_curves.png) - -naive: oscillation candidate; inspect curves and camera updates. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -## SV100-R0.5 - -[Convergence curves](figures/SV100-R0.5_curves.png) - -naive: late validation stagnation/decline candidate (batch-sampling noise possible). -naive: oscillation candidate; inspect curves and camera updates. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -## SV100-R1 - -[Convergence curves](figures/SV100-R1_curves.png) - -naive: oscillation candidate; inspect curves and camera updates. -naive: test PSNR is below the fixed-pose baseline. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -## SV100-R2 - -[Convergence curves](figures/SV100-R2_curves.png) - -naive: oscillation candidate; inspect curves and camera updates. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -## SV100-R5 - -[Convergence curves](figures/SV100-R5_curves.png) - -naive: oscillation candidate; inspect curves and camera updates. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. diff --git a/artifacts/analysis/pose_optimization/report.md b/artifacts/analysis/pose_optimization/report.md deleted file mode 100644 index ae2e0ce..0000000 --- a/artifacts/analysis/pose_optimization/report.md +++ /dev/null @@ -1,288 +0,0 @@ -# Pose optimization — SUCCESS - -Single seed 42; vanilla-NeRF; target 30000 steps. Fixed baselines: 30000 steps. -Test cameras remain in original coordinates. Sim(3) alignment is used only for pose diagnostics. - -| Case | Method | Status | PSNR | SSIM | LPIPS | Raw rot ° | Aligned rot ° | -|---|---|---|---:|---:|---:|---:|---:| -| SV100-GT | fixed | SUCCESS | 27.117351531982422 | 0.9003052115440369 | 0.07902220636606216 | — | — | -| SV100-GT | naive | SUCCESS | 17.908571243286133 | 0.7507554292678833 | 0.14861881732940674 | 0.17414969937534208 | 0.14286414140689588 | -| SV100-GT | camp | SUCCESS | 19.900388717651367 | 0.7828549742698669 | 0.12358926236629486 | 0.179176459151136 | 0.12297168531717992 | -| SV100-T0.5 | fixed | SUCCESS | 23.16393280029297 | 0.8242353796958923 | 0.19025984406471252 | — | — | -| SV100-T0.5 | naive | SUCCESS | 17.72048568725586 | 0.75315260887146 | 0.14314380288124084 | 0.16016191246733955 | 0.15316289264650607 | -| SV100-T0.5 | camp | SUCCESS | 16.106420516967773 | 0.732803463935852 | 0.18781548738479614 | 0.1242628895735921 | 0.11853224280988138 | -| SV100-T1 | fixed | SUCCESS | 20.352632522583008 | 0.7836681604385376 | 0.24935901165008545 | — | — | -| SV100-T1 | naive | SUCCESS | 15.900127410888672 | 0.7369078993797302 | 0.1968562752008438 | 0.37691880466686223 | 0.25735811810525144 | -| SV100-T1 | camp | SUCCESS | 16.826087951660156 | 0.7462030053138733 | 0.17205750942230225 | 0.49968487667531386 | 0.1411148348250654 | -| SV100-T2 | fixed | SUCCESS | 17.410005569458008 | 0.7545003890991211 | 0.3104111850261688 | — | — | -| SV100-T2 | naive | SUCCESS | 16.844139099121094 | 0.747525691986084 | 0.1714111864566803 | 0.3576907654318797 | 0.17645954241835496 | -| SV100-T2 | camp | SUCCESS | 19.009138107299805 | 0.7670914530754089 | 0.13473717868328094 | 0.17372837416469378 | 0.14094812948916072 | -| SV100-T5 | fixed | SUCCESS | 14.144984245300293 | 0.7271924018859863 | 0.38807252049446106 | — | — | -| SV100-T5 | naive | SUCCESS | 17.533849716186523 | 0.7530051469802856 | 0.15946823358535767 | 0.30762172229369367 | 0.3024573854516597 | -| SV100-T5 | camp | SUCCESS | 19.71722412109375 | 0.7721560597419739 | 0.1357286274433136 | 0.15153271372571678 | 0.12746115740062552 | -| SV100-R0.5 | fixed | SUCCESS | 20.094165802001953 | 0.7804862260818481 | 0.24594688415527344 | — | — | -| SV100-R0.5 | naive | SUCCESS | 20.562286376953125 | 0.793068528175354 | 0.11532619595527649 | 0.14250513597009293 | 0.10354943495223193 | -| SV100-R0.5 | camp | SUCCESS | 18.255605697631836 | 0.7683975696563721 | 0.1436251699924469 | 0.2220425716671775 | 0.14080875617020408 | -| SV100-R1 | fixed | SUCCESS | 17.114395141601562 | 0.7534263134002686 | 0.31077659130096436 | — | — | -| SV100-R1 | naive | SUCCESS | 15.528212547302246 | 0.7332556247711182 | 0.20048755407333374 | 0.2700870145416624 | 0.2634725693301638 | -| SV100-R1 | camp | SUCCESS | 16.700990676879883 | 0.7418728470802307 | 0.16722877323627472 | 0.1793806701179328 | 0.12620268885861477 | -| SV100-R2 | fixed | SUCCESS | 14.811619758605957 | 0.7333740592002869 | 0.3723008334636688 | — | — | -| SV100-R2 | naive | SUCCESS | 16.13628387451172 | 0.7383190989494324 | 0.1885874718427658 | 0.30028402066716964 | 0.21096732084116376 | -| SV100-R2 | camp | SUCCESS | 19.151582717895508 | 0.763823390007019 | 0.13089749217033386 | 0.2058375743406228 | 0.1255037679640463 | -| SV100-R5 | fixed | SUCCESS | 12.007059097290039 | 0.6993001103401184 | 0.47173792123794556 | — | — | -| SV100-R5 | naive | SUCCESS | 17.4700870513916 | 0.7498352527618408 | 0.16173501312732697 | 0.41562610770552155 | 0.22216747809338858 | -| SV100-R5 | camp | SUCCESS | 15.084413528442383 | 0.7246410846710205 | 0.22007404267787933 | 0.38123366847465284 | 0.13798784586962257 | - -## SV100-GT - -[Convergence curves](figures/SV100-GT_curves.png) - -naive: oscillation candidate; inspect curves and camera updates. -naive: test PSNR is below the fixed-pose baseline. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. -camp: oscillation candidate; inspect curves and camera updates. -camp: test PSNR is below the fixed-pose baseline. -camp: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -[View 0 rgb comparison](figures/SV100-GT_view_000_rgb.png) - -[View 0 depth comparison](figures/SV100-GT_view_000_depth.png) - -[View 0 accumulation comparison](figures/SV100-GT_view_000_accumulation.png) - -[View 50 rgb comparison](figures/SV100-GT_view_050_rgb.png) - -[View 50 depth comparison](figures/SV100-GT_view_050_depth.png) - -[View 50 accumulation comparison](figures/SV100-GT_view_050_accumulation.png) - -[View 100 rgb comparison](figures/SV100-GT_view_100_rgb.png) - -[View 100 depth comparison](figures/SV100-GT_view_100_depth.png) - -[View 100 accumulation comparison](figures/SV100-GT_view_100_accumulation.png) - -## SV100-T0.5 - -[Convergence curves](figures/SV100-T0.5_curves.png) - -naive: oscillation candidate; inspect curves and camera updates. -naive: test PSNR is below the fixed-pose baseline. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. -camp: oscillation candidate; inspect curves and camera updates. -camp: test PSNR is below the fixed-pose baseline. -camp: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -[View 0 rgb comparison](figures/SV100-T0.5_view_000_rgb.png) - -[View 0 depth comparison](figures/SV100-T0.5_view_000_depth.png) - -[View 0 accumulation comparison](figures/SV100-T0.5_view_000_accumulation.png) - -[View 50 rgb comparison](figures/SV100-T0.5_view_050_rgb.png) - -[View 50 depth comparison](figures/SV100-T0.5_view_050_depth.png) - -[View 50 accumulation comparison](figures/SV100-T0.5_view_050_accumulation.png) - -[View 100 rgb comparison](figures/SV100-T0.5_view_100_rgb.png) - -[View 100 depth comparison](figures/SV100-T0.5_view_100_depth.png) - -[View 100 accumulation comparison](figures/SV100-T0.5_view_100_accumulation.png) - -## SV100-T1 - -[Convergence curves](figures/SV100-T1_curves.png) - -naive: late validation stagnation/decline candidate (batch-sampling noise possible). -naive: oscillation candidate; inspect curves and camera updates. -naive: test PSNR is below the fixed-pose baseline. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. -camp: oscillation candidate; inspect curves and camera updates. -camp: test PSNR is below the fixed-pose baseline. -camp: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -[View 0 rgb comparison](figures/SV100-T1_view_000_rgb.png) - -[View 0 depth comparison](figures/SV100-T1_view_000_depth.png) - -[View 0 accumulation comparison](figures/SV100-T1_view_000_accumulation.png) - -[View 50 rgb comparison](figures/SV100-T1_view_050_rgb.png) - -[View 50 depth comparison](figures/SV100-T1_view_050_depth.png) - -[View 50 accumulation comparison](figures/SV100-T1_view_050_accumulation.png) - -[View 100 rgb comparison](figures/SV100-T1_view_100_rgb.png) - -[View 100 depth comparison](figures/SV100-T1_view_100_depth.png) - -[View 100 accumulation comparison](figures/SV100-T1_view_100_accumulation.png) - -## SV100-T2 - -[Convergence curves](figures/SV100-T2_curves.png) - -naive: oscillation candidate; inspect curves and camera updates. -naive: test PSNR is below the fixed-pose baseline. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. -camp: oscillation candidate; inspect curves and camera updates. -camp: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -[View 0 rgb comparison](figures/SV100-T2_view_000_rgb.png) - -[View 0 depth comparison](figures/SV100-T2_view_000_depth.png) - -[View 0 accumulation comparison](figures/SV100-T2_view_000_accumulation.png) - -[View 50 rgb comparison](figures/SV100-T2_view_050_rgb.png) - -[View 50 depth comparison](figures/SV100-T2_view_050_depth.png) - -[View 50 accumulation comparison](figures/SV100-T2_view_050_accumulation.png) - -[View 100 rgb comparison](figures/SV100-T2_view_100_rgb.png) - -[View 100 depth comparison](figures/SV100-T2_view_100_depth.png) - -[View 100 accumulation comparison](figures/SV100-T2_view_100_accumulation.png) - -## SV100-T5 - -[Convergence curves](figures/SV100-T5_curves.png) - -naive: oscillation candidate; inspect curves and camera updates. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. -camp: oscillation candidate; inspect curves and camera updates. - -[View 0 rgb comparison](figures/SV100-T5_view_000_rgb.png) - -[View 0 depth comparison](figures/SV100-T5_view_000_depth.png) - -[View 0 accumulation comparison](figures/SV100-T5_view_000_accumulation.png) - -[View 50 rgb comparison](figures/SV100-T5_view_050_rgb.png) - -[View 50 depth comparison](figures/SV100-T5_view_050_depth.png) - -[View 50 accumulation comparison](figures/SV100-T5_view_050_accumulation.png) - -[View 100 rgb comparison](figures/SV100-T5_view_100_rgb.png) - -[View 100 depth comparison](figures/SV100-T5_view_100_depth.png) - -[View 100 accumulation comparison](figures/SV100-T5_view_100_accumulation.png) - -## SV100-R0.5 - -[Convergence curves](figures/SV100-R0.5_curves.png) - -naive: late validation stagnation/decline candidate (batch-sampling noise possible). -naive: oscillation candidate; inspect curves and camera updates. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. -camp: oscillation candidate; inspect curves and camera updates. -camp: test PSNR is below the fixed-pose baseline. -camp: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -[View 0 rgb comparison](figures/SV100-R0.5_view_000_rgb.png) - -[View 0 depth comparison](figures/SV100-R0.5_view_000_depth.png) - -[View 0 accumulation comparison](figures/SV100-R0.5_view_000_accumulation.png) - -[View 50 rgb comparison](figures/SV100-R0.5_view_050_rgb.png) - -[View 50 depth comparison](figures/SV100-R0.5_view_050_depth.png) - -[View 50 accumulation comparison](figures/SV100-R0.5_view_050_accumulation.png) - -[View 100 rgb comparison](figures/SV100-R0.5_view_100_rgb.png) - -[View 100 depth comparison](figures/SV100-R0.5_view_100_depth.png) - -[View 100 accumulation comparison](figures/SV100-R0.5_view_100_accumulation.png) - -## SV100-R1 - -[Convergence curves](figures/SV100-R1_curves.png) - -naive: oscillation candidate; inspect curves and camera updates. -naive: test PSNR is below the fixed-pose baseline. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. -camp: oscillation candidate; inspect curves and camera updates. -camp: test PSNR is below the fixed-pose baseline. -camp: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -[View 0 rgb comparison](figures/SV100-R1_view_000_rgb.png) - -[View 0 depth comparison](figures/SV100-R1_view_000_depth.png) - -[View 0 accumulation comparison](figures/SV100-R1_view_000_accumulation.png) - -[View 50 rgb comparison](figures/SV100-R1_view_050_rgb.png) - -[View 50 depth comparison](figures/SV100-R1_view_050_depth.png) - -[View 50 accumulation comparison](figures/SV100-R1_view_050_accumulation.png) - -[View 100 rgb comparison](figures/SV100-R1_view_100_rgb.png) - -[View 100 depth comparison](figures/SV100-R1_view_100_depth.png) - -[View 100 accumulation comparison](figures/SV100-R1_view_100_accumulation.png) - -## SV100-R2 - -[Convergence curves](figures/SV100-R2_curves.png) - -naive: oscillation candidate; inspect curves and camera updates. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. -camp: oscillation candidate; inspect curves and camera updates. -camp: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -[View 0 rgb comparison](figures/SV100-R2_view_000_rgb.png) - -[View 0 depth comparison](figures/SV100-R2_view_000_depth.png) - -[View 0 accumulation comparison](figures/SV100-R2_view_000_accumulation.png) - -[View 50 rgb comparison](figures/SV100-R2_view_050_rgb.png) - -[View 50 depth comparison](figures/SV100-R2_view_050_depth.png) - -[View 50 accumulation comparison](figures/SV100-R2_view_050_accumulation.png) - -[View 100 rgb comparison](figures/SV100-R2_view_100_rgb.png) - -[View 100 depth comparison](figures/SV100-R2_view_100_depth.png) - -[View 100 accumulation comparison](figures/SV100-R2_view_100_accumulation.png) - -## SV100-R5 - -[Convergence curves](figures/SV100-R5_curves.png) - -naive: oscillation candidate; inspect curves and camera updates. -naive: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. -camp: oscillation candidate; inspect curves and camera updates. -camp: image/pose metrics diverge; scene-camera compensation is a hypothesis, not a proven cause. - -[View 0 rgb comparison](figures/SV100-R5_view_000_rgb.png) - -[View 0 depth comparison](figures/SV100-R5_view_000_depth.png) - -[View 0 accumulation comparison](figures/SV100-R5_view_000_accumulation.png) - -[View 50 rgb comparison](figures/SV100-R5_view_050_rgb.png) - -[View 50 depth comparison](figures/SV100-R5_view_050_depth.png) - -[View 50 accumulation comparison](figures/SV100-R5_view_050_accumulation.png) - -[View 100 rgb comparison](figures/SV100-R5_view_100_rgb.png) - -[View 100 depth comparison](figures/SV100-R5_view_100_depth.png) - -[View 100 accumulation comparison](figures/SV100-R5_view_100_accumulation.png) diff --git a/docs/RUNNING.md b/docs/RUNNING.md index ae9363b..cd081d2 100644 --- a/docs/RUNNING.md +++ b/docs/RUNNING.md @@ -9,11 +9,11 @@ No GPU, dataset or checkpoint is needed. ```bash uv sync --extra analysis -uv run python scripts/analysis/analyze_warmup_results.py --plots +uv run python scripts/analysis/analyze_warmup_results.py --plots --diagnostics ``` This reads `artifacts/analysis/pose_optimization/` and `artifacts/analysis/warmup/` -and writes the paired CSV, aggregate JSON, report and plot to +and writes the paired CSV, aggregate JSON, report and plots to `results/published_analysis/`. `--original` / `--warmup` select other directories containing `summary.csv`; `--output` changes the destination. It only re-aggregates existing metrics; nothing is trained or rendered. @@ -121,8 +121,10 @@ uv run --no-sync python scripts/analysis/analyze_warmup_results.py \ --plots ``` -`--diagnostics` additionally plots early pose drift; it needs the full run -directories with the `diagnostics.jsonl` files referenced by `state.json`. +`--diagnostics` additionally plots early pose drift. For new runs it needs the +full run directories with the `diagnostics.jsonl` files referenced by `state.json`; +with the default published inputs it reads the archived GT traces in +`artifacts/analysis/training_curves/diagnostics/`. ## 6. Pose audit and aligned rendering diff --git a/pyproject.toml b/pyproject.toml index 5126325..d8b8adb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "poseguard-nerf" -version = "0.1.0" +version = "1.0.0" description = "Controlled study of camera-pose perturbation, joint pose optimization and global coordinate drift in NeRF." readme = "README.md" license = { text = "MIT" } diff --git a/scripts/analysis/analyze_warmup_results.py b/scripts/analysis/analyze_warmup_results.py index 0a2b396..d1f370f 100644 --- a/scripts/analysis/analyze_warmup_results.py +++ b/scripts/analysis/analyze_warmup_results.py @@ -10,6 +10,11 @@ 'raw_translation_pct', 'aligned_translation_pct'] +def shown(path): + """Repository-relative path for reports, so they do not embed a local checkout location.""" + return str(path.relative_to(ROOT)) if ROOT in path.parents else str(path) + + def read_rows(path): with (path/'summary.csv').open() as stream: return {(r['method'], r['case']): r for r in csv.DictReader(stream)} @@ -21,7 +26,8 @@ def main(): parser.add_argument('--warmup', type=Path, default=ROOT/'artifacts/analysis/warmup') parser.add_argument('--output', type=Path, default=ROOT/'results/published_analysis') parser.add_argument('--plots', action='store_true', help='Draw quality comparison; requires NumPy and Matplotlib') - parser.add_argument('--diagnostics', action='store_true', help='Also plot runtime traces referenced by state.json; requires original server files') + parser.add_argument('--diagnostics', action='store_true', help='Also plot early GT pose drift; published inputs use the archived traces, ' + 'new runs need the diagnostics.jsonl files referenced by state.json') args = parser.parse_args() original, warmup, output = args.original.resolve(), args.warmup.resolve(), args.output.resolve() if output == ROOT/'artifacts' or ROOT/'artifacts' in output.parents: @@ -63,7 +69,7 @@ def main(): plot_drift(original, warmup, output) lines = ['# Warm-up 配对分析', '', '从输入 summary.csv 重新计算差值与条件平均;不加载模型,不重新渲染图像。', - '原始输入:`'+str(original)+'`;warm-up 输入:`'+str(warmup)+'`。', '', + '原始输入:`'+shown(original)+'`;warm-up 输入:`'+shown(warmup)+'`。', '', '| 方法 | PSNR 前→后 | 平均 ΔPSNR | PSNR 改善条件 | SSIM 改善条件 | LPIPS 改善条件 |', '|---|---:|---:|---:|---:|---:|'] for method, values in aggregate.items(): @@ -119,12 +125,13 @@ def plot_drift(OLD, NEW, OUT): import matplotlib.pyplot as plt fig,axes=plt.subplots(2,2,figsize=(11,7),layout='constrained') for col,method in enumerate(('naive','camp')): - for directory,label,style in ((OLD,'no warm-up','--'),(NEW,'warm-up','-')): - state_directory = directory + for directory,label,style,suffix in ((OLD,'no warm-up','--',''),(NEW,'warm-up','-','_warmup')): if directory.parent == ROOT/'artifacts/analysis': - state_directory = ROOT/'artifacts/records'/directory.name - state=json.loads((state_directory/'state.json').read_text()) - trace=Path(state['experiments'][method+'/SV100-GT']['attempt'])/'diagnostics.jsonl' + # Archived state.json files point at server paths; the GT traces are archived separately. + trace=ROOT/'artifacts/analysis/training_curves/diagnostics'/f'{method}{suffix}_SV100-GT.jsonl' + else: + state=json.loads((directory/'state.json').read_text()) + trace=Path(state['experiments'][method+'/SV100-GT']['attempt'])/'diagnostics.jsonl' rows={d['step']:d for d in map(json.loads,trace.read_text().splitlines())} data=[rows[k] for k in sorted(rows) if k<=10000] for row,(metric,unit) in enumerate((('rotation_deg_mean','Rotation error (degrees)'), diff --git a/uv.lock b/uv.lock index 10c1f02..fe7f7e3 100644 --- a/uv.lock +++ b/uv.lock @@ -1915,7 +1915,7 @@ wheels = [ [[package]] name = "poseguard-nerf" -version = "0.1.0" +version = "1.0.0" source = { virtual = "." } [package.optional-dependencies]