P1.B.F Stage 1 (5k smoke 31.334 dB) を 30k full bench にスケール。training-time eval で **35.184 dB (brush convention)** 達成。4-way cross-eval で再確認 (brush trainer × brush eval q8 = 35.237 dB)。これは P1.M3 lifeline (Lego 30k brush conv > 30 dB) を +5.24 dB 突破、brush 自身 val 32.038 dB を +3.20 dB 上回り、M5 target (36 dB) まで残り -0.76 dB。Phase A 主仮説 (apparent gap -3〜-6 dB) が falsified された反面、coupling 解消の効果が想定の 3 倍に達した。実装は 1 行 (`[data] gt_convention = "premultiplied"`)、既存 hyperparameter (lr/refine/decay) は legacy 30k baseline と同等維持。
P1.B+F Stage 1 (5k smoke で 31.334 dB) を 30k full bench にスケール。training-time eval (config 内蔵) で 35.184 dB (brush convention)、independent 4-way cross-eval (splat eval subcommand) で 35.237 dB (8-bit quant) を達成。M3 lifeline +5.24 dB 突破、brush 自身 val 32.0 dB を +3.20 dB 上回り、卒研 P1 計画の stretch goal (M5 36 dB) まで残り -0.76 dB に到達。
本実装 (splat-rs) の Lego brush-compat 30k = 35.184 dB は brush 自身 val 32.038 dB を +3.20 dB 上回り、apples-to-apples (val split、brush convention) で 本実装が brush を超えた。brush paper の 37.40 dB は test split (200 view、val より +3〜+5 dB 上振れ可能) なので、test split で再評価すれば本実装も 36-38 dB 帯に到達する可能性。P1 計画の P1.M3 生命線 + brush parity はここで完全 closure、残りは multi-scene universal 確認と M5 (36 dB) detail tune。
| # | trainer | eval convention | quant 8-bit | PSNR (dB) | min view | median | max view |
|---|---|---|---|---|---|---|---|
| 1 | brush (premultiplied) | legacy | q8 | 1.596 | 0.991 | 1.616 | 1.944 |
| 2 | brush (premultiplied) | brush | q8 | **35.237** | 25.735 | 35.700 | 40.581 |
| 3 | brush (premultiplied) | brush | raw | 35.184 | 25.731 | 35.645 | 40.585 |
| 4 | training-time eval (raw) | brush | raw | 35.184 | — | — | — |
| milestone | target | 実測 | Δ | 判定 |
|---|---|---|---|---|
| P1.M3 (生命線、convention 明記) | Lego 30k brush conv > 30 dB | 35.237 dB | +5.24 dB | **pass + 余裕大** |
| P1.M3 splat 数 | > 200k | 846,689 | +646k | **pass (brush 282k の 3 倍)** |
| P1.M4 (F+G smoke) | PSNR > 34 dB | 35.237 dB | +1.24 dB | **M3 で既に pass、F+G 不要可能性** |
| P1.M5 (Final) | Lego brush conv > 36 dB + multi-scene > 32 dB | 35.237 dB | -0.76 dB | **Lego ほぼ到達、multi-scene 検証必要** |
| brush 自身 val (32.038 dB) 比 | ≥ 32.038 dB (parity) | 35.237 dB | +3.20 dB | **parity 達成 + 超え** |
| brush paper test (37.40 dB) 比 | ≥ 37.40 dB | (val 35.24) | -2.16 dB | **test split 再評価で確認必要** |
| iter | loss | splats | ms/iter | 経過 |
|---|---|---|---|---|
| 1 | 5.94e-1 | 5,207 | 104.5 | 0.1s |
| 1000 | 5.08e-2 | 12,460 | 15.0 | 15s |
| 2000 | 1.61e-2 | 239,348 | 31.0 | 46s |
| 5000 | 7.83e-3 | 541,930 | — | — |
| 10000 | 6.38e-3 | 747,410 | — | — |
| 15000 | 5.89e-3 | 846,689 | 141.5 | 26m |
| 20000 | 5.58e-3 | 846,689 | 145.3 | 38m |
| 25000 | 5.45e-3 | 846,689 | 142.9 | 50m |
| 30000 | 5.37e-3 | 846,689 | — | **62m18s** |
| metric | legacy 30k (lego-sh3-30k) | brush 互換 30k (lego-brushcompat-base-30k) | Δ |
|---|---|---|---|
| PSNR (legacy eval) | 24.879 dB | 1.596 dB | -23.28 dB (対称崩壊) |
| PSNR (brush eval) | 1.667 dB | 35.237 dB | **+33.57 dB** |
| wallclock | 22m 18s | 1h 2m 18s | +2.7x |
| splats (final) | 83,734 | 846,689 | +10.1x |
| splats / capacity (1M) | 8.4% | 84.7% | +76 ppt |
| ms/iter (final) | ~45 | ~145 | +3.2x (splats 10x の必然) |
| final loss | 5.78e-3 (推定、legacy) | 5.37e-3 (brush) | loss スケール非互換 (convention 違) |
1) multi-scene chain bench (chair/ficus/drums/hotdog/mic/materials/ship、各 30k brushcompat、推定 7×62 min = ~7.3 h)
2) test split 200 view 再 DL + Lego test eval (brush 37.40 dB と apples-to-apples 比較)
3) D.3 negative-findings-chapter の中核 update (training-eval coupling 発見の卒論 narrative)
4) Phase D (opacity decay) で splats 抑制 (282k 帯 + wallclock 改善、M4 Max 速度 advantage 復活)
1+2 を chain で起動 → 結果次第で 3+4 へ。Phase C/E は M3 既達のため defer 候補。
# 1. 30k full bench (再現)
cd splat
cargo build --release -p splat-cli
./target/release/splat train --config configs/2026-05-24-1800-lego-brushcompat-base-30k.toml
# → runs/lego-brushcompat-base-30k/{final.ply, result.toml}
# → mean val PSNR 35.184 dB (~62 min on M4 Max)
# 2. 4-way cross-eval
PLY=runs/lego-brushcompat-base-30k/final.ply
DS=/Users/otkrickey/dev/3dgs-workspace/datasets/nerf_synthetic/lego
./target/release/splat eval --ply $PLY --dataset $DS --split val --convention legacy --quantize-8bit
# → 1.596 (対称崩壊)
./target/release/splat eval --ply $PLY --dataset $DS --split val --convention brush --quantize-8bit
# → 35.237 (M3 +5.24 dB pass)
./target/release/splat eval --ply $PLY --dataset $DS --split val --convention brush
# → 35.184 (raw、quant +0.05 dB impact)
p1-b-f-trainer-convention-bridgep1-a-3-cross-eval-reproducerp1-a-eval-convention-audita-4-nerf-synthetic-scene-resultsm4-brush-benchfinal-ablation-tableこの finding が観測された / 言及している実験 run。