From 5a7ed9dd31dbfda7f64a37f93bfc7e933fe58460 Mon Sep 17 00:00:00 2001 From: chu-jiaming Date: Wed, 14 Oct 2026 18:35:55 +0800 Subject: [PATCH] docs: add T5 camera-correction figure --- README.md | 6 +++ README.zh-CN.md | 4 ++ docs/RUNNING.md | 5 ++- docs/assets/camera_correction.png | Bin 0 -> 99318 bytes scripts/showcase/make_figures.py | 59 +++++++++++++++++++++++++++++- 5 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 docs/assets/camera_correction.png diff --git a/README.md b/README.md index d581f4b..4d11f24 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,12 @@ Fixed cameras win only with exact poses or 0.5% translation noise. In the other seven noisy conditions Naive + warm-up is best in six and 0.09 dB behind CamP-style + warm-up in the seventh (2° rotation). +The recovered cameras show why. Joint optimization pulls the noisy training +cameras back to within 0.025 scene units on average (from 0.16); removing one +global similarity transform brings that to 0.016. + +![Training-camera center errors before and after joint pose optimization, magnified 10x](docs/assets/camera_correction.png) + ### 2. Most of the "drop from perfect poses" is coordinate drift ![Ground truth, fixed-camera, naive raw and naive aligned renders with per-pixel error maps](docs/assets/hero_drift.png) diff --git a/README.zh-CN.md b/README.zh-CN.md index 0d520b1..3b25b2c 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -52,6 +52,10 @@ flowchart LR 固定相机只在位姿完全正确或只有 0.5% 平移扰动时最好。其余 7 种扰动条件里,Naive + warm-up 在 6 种中最好,剩下的 2° 旋转条件下只比 CamP-style + warm-up 低 0.09 dB。 +从恢复出的相机位置可以看出原因:联合优化把带噪声的训练相机拉回到平均距 GT 0.025 个场景单位以内(原始扰动为 0.16);再去掉一个全局相似变换,误差降到 0.016。 + +![联合位姿优化前后的训练相机中心误差(放大 10 倍显示)](docs/assets/camera_correction.png) + ### 2. "从正确位姿出发反而变差",主要是坐标漂移 ![GT、固定相机、Naive 原坐标与 Naive 对齐后的渲染及逐像素误差图](docs/assets/hero_drift.png) diff --git a/docs/RUNNING.md b/docs/RUNNING.md index c9def18..ae9363b 100644 --- a/docs/RUNNING.md +++ b/docs/RUNNING.md @@ -162,7 +162,10 @@ With that directory available locally: uv run python scripts/showcase/import_delivery.py path/to/delivery_20261014 # Rebuild every figure in docs/assets/ (the GIF needs ffmpeg on PATH). -uv run python scripts/showcase/make_figures.py --delivery path/to/delivery_20261014 +# --gt-transforms is the public NeRF-Synthetic lego/transforms_train.json; the T5 +# perturbation is regenerated from it with seed 42 and checked against the archive. +uv run python scripts/showcase/make_figures.py --delivery path/to/delivery_20261014 \ + --gt-transforms path/to/nerf_synthetic/lego/transforms_train.json ``` ## 8. Tests and help diff --git a/docs/assets/camera_correction.png b/docs/assets/camera_correction.png new file mode 100644 index 0000000000000000000000000000000000000000..1b284aaaeaab9dd93952da2dacb2710cd815cdb7 GIT binary patch literal 99318 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 literal 0 HcmV?d00001 diff --git a/scripts/showcase/make_figures.py b/scripts/showcase/make_figures.py index d7f00f4..eddff25 100644 --- a/scripts/showcase/make_figures.py +++ b/scripts/showcase/make_figures.py @@ -3,7 +3,8 @@ Metric figures read artifacts/ only. Render figures and the GIF also need the extracted delivery_/ directory (800x800 stills, 400x400 video); pass it with ---delivery or they are skipped. The GIF needs ffmpeg on PATH. +--delivery or they are skipped. The GIF needs ffmpeg on PATH. The camera figure +needs the public NeRF-Synthetic lego/transforms_train.json (--gt-transforms). """ import argparse import csv @@ -11,8 +12,10 @@ from pathlib import Path import shutil import subprocess +import sys ROOT = Path(__file__).resolve().parents[2] +sys.path.insert(0, str(ROOT)) ARTIFACTS = ROOT/'artifacts/analysis' CONDITIONS = ['SV100-GT', 'SV100-T0.5', 'SV100-T1', 'SV100-T2', 'SV100-T5', 'SV100-R0.5', 'SV100-R1', 'SV100-R2', 'SV100-R5'] @@ -175,6 +178,57 @@ def perturbation_grid(plt, stills, output, view=175): fig.savefig(output/'perturbation_grid.png', dpi=100); plt.close(fig) +def perturbed_poses(gt_transforms, condition_args): + """Re-create a perturbed training split with the original script and seed.""" + import tempfile + with tempfile.TemporaryDirectory() as directory: + source = Path(directory)/'lego' + source.mkdir() + shutil.copy2(gt_transforms, source/'transforms_train.json') + subprocess.run([sys.executable, str(ROOT/'scripts/data/perturb_poses.py'), '--src', str(source), + '--dst', str(Path(directory)/'noisy'), *condition_args, '--seed', '42'], + check=True, capture_output=True) + frames = json.loads((Path(directory)/'noisy/transforms_train.json').read_text())['frames'] + return [frame['transform_matrix'] for frame in frames] + + +def camera_correction(plt, gt_transforms, output, magnify=10): + """T5 training-camera centers: injected noise vs. what Naive + warm-up leaves after optimization.""" + import numpy as np + from poseguard.alignment import fit_sim3, transform_poses + gt = np.array([f['transform_matrix'] for f in json.loads(Path(gt_transforms).read_text())['frames']])[:, :3] + noisy = np.array(perturbed_poses(gt_transforms, ['--translation-ratio', '0.05']))[:, :3] + record = json.loads((ROOT/'artifacts/experiments/warmup/naive/SV100-T5/optimized_poses.json').read_text()) + optimized = np.array(record['poses'])[:, :3] + stored = record['initial_errors'].get('raw', record['initial_errors'])['translation_radius_pct_mean'] + radius = np.linalg.norm(gt[:, :, 3], axis=1).mean() + error = lambda poses: np.linalg.norm(poses[:, :, 3]-gt[:, :, 3], axis=1).mean() + if abs(100*error(noisy)/radius-stored) > 1e-6: + raise ValueError('Regenerated perturbation does not match the archived run') + aligned = transform_poses(optimized, fit_sim3(optimized[:, :, 3], gt[:, :, 3])) + panels = [(noisy, '#52514e', 'Injected noise (5%% translation)\nmean camera-center error %.3f' % error(noisy)), + (optimized, BLUE, 'After Naive + warm-up, 30k steps\nmean error %.3f, %.3f after one global Sim(3)' + % (error(optimized), error(aligned)))] + fig = plt.figure(figsize=(11, 4.4)) + for index, (poses, color, title) in enumerate(panels, 1): + ax = fig.add_subplot(1, 2, index, projection='3d') + centers, offsets = gt[:, :, 3], (poses[:, :, 3]-gt[:, :, 3])*magnify + for start, offset in zip(centers, offsets): + ax.plot(*np.stack((start, start+offset)).T, color=color, linewidth=1.6, solid_capstyle='round') + ax.scatter(*centers.T, s=12, color='#b5b4ae', depthshade=False) + ax.scatter([0], [0], [0], s=60, marker='s', color=INK) + ax.text(0, 0, -.7, 'scene', ha='center', fontsize=9, color=MUTED) + ax.set_title(title, fontsize=10.5, loc='left', y=1.0, pad=0) + ax.view_init(elev=24, azim=-60) + ax.set_box_aspect((1, 1, .55), zoom=1.2) + ax.set_xlim(-5, 5); ax.set_ylim(-5, 5); ax.set_zlim(-.8, 5.2) + ax.set_axis_off() + fig.subplots_adjust(left=0, right=1, bottom=-.08, top=.86, wspace=0) + fig.text(.5, .015, 'Lego training cameras (gray, %.2f units from the scene). Segments: camera-center error, ' + 'drawn ×%d.' % (radius, magnify), ha='center', fontsize=9.5, color=MUTED) + fig.savefig(output/'camera_correction.png', dpi=130); plt.close(fig) + + def side_by_side_gif(delivery, output): ffmpeg = shutil.which('ffmpeg') if not ffmpeg: @@ -188,6 +242,7 @@ def side_by_side_gif(delivery, output): def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--delivery', type=Path, help='extracted delivery_/ directory (renders, videos)') + parser.add_argument('--gt-transforms', type=Path, help='NeRF-Synthetic lego/transforms_train.json') parser.add_argument('--output', type=Path, default=ROOT/'docs/assets') args = parser.parse_args() import matplotlib @@ -201,6 +256,8 @@ def main(): hero(plt, args.delivery/'stills', args.output) perturbation_grid(plt, args.delivery/'stills', args.output) side_by_side_gif(args.delivery, args.output) + if args.gt_transforms: + camera_correction(plt, args.gt_transforms, args.output) for path in sorted(args.output.iterdir()): print('%-28s %7.0f KB' % (path.name, path.stat().st_size/1024))