[{"data":1,"prerenderedAt":367},["ShallowReactive",2],{"finding:p1-a-eval-convention-audit":3,"finding-runs:p1-a-eval-convention-audit":294,"finding-related:p1-a-eval-convention-audit":295},{"meta":4,"impact":39,"sections":45},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":17,"task_code":29,"related_runs":30,"related_findings":33},"p1-a-eval-convention-audit","P1.A eval convention audit (統合) — 7 軸の diff 確定、apparent gap 推定 -3〜-6 dB","brush trainer (37.40 dB) と splat-rs (24.879 dB) の 12.56 dB gap の真因切り分けとして、両 trainer の eval pipeline を file:line 単位で完全 audit。両者は逆方向の convention を採用しており、特に (1) split file (splat=val 100view \u002F brush=test 200view)、(2) background composite (splat=GT に white pre-comp \u002F rendered 未合成 vs brush=両者 premultiplied-α で bg=ZERO)、(3) 8-bit roundtrip 有無、の 3 軸が apparent gap の主因候補。PSNR formula 自体 (MAX=1, log10, RGB only, per-view mean) は同等で、algorithmic gap ではない。P1.M1 gate 充足: 数式 diff の定量化完了、A.3 reproducer で apparent\u002Freal gap 仕分け実施予定。","P1 Phase A · M1 gate · 統合 finding","2026-05-24","stable","audit","neutral",[14,15,16],1,2,3,[18,19,20,21,22,23,24,25,26,27,11,28],"p1","phase-a","milestone-m1","brush-parity","eval","convention","psnr","premultiplied","alpha","split","synthesis","P1.A (M1)",[31,32],"lego-sh3-30k (splat-rs 24.879 dB)","brush-lego-sh3-30k (37.40 dB report)",[34,35,36,37,38],"p1-a-1-brush-eval-audit","p1-a-2-splat-eval-audit","brush-vs-splat-37dB-gap-analysis","a-4-nerf-synthetic-scene-results","m4-brush-bench",{"summary":40,"rank":41,"verdict":42,"delta_wallclock":43,"delta_psnr":44},"両 trainer の eval pipeline を file:line で完全 audit、PSNR formula 本体 (MAX=1 \u002F log10 \u002F RGB only \u002F per-view mean) は同等だが、(1) test split (200 view) vs val split (100 view)、(2) background composite convention の **完全逆方向**、(3) 8-bit roundtrip 有無、(4) α-mask 経路、(5) clamp\u002Fquantize 等 7 軸で diff を確認。最大の発見は brush の premultiplied-α + bg=ZERO eval が NeRF Synthetic の透明領域で構造的に PSNR を +3 dB 以上嵩上げする一方、splat-rs は target に white pre-composite \u002F rendered に bg 合成なしの mismatch で convergence 残差が MSE に直接残る。apparent gap の推定 -3〜-6 dB を A.3 reproducer で実証予定、残り -6〜-9 dB が真の algorithmic gap。","high","audit-complete-gate-passed","N\u002FA (audit task)","推定 -3〜-6 dB (apparent gap 縮小、A.3 で実測予定)",[46,49,54,57,112,114,118,120,121,125,127,129,131,134,141,143,145,151,153,184,188,190,196,198,200,207,209,215,217,268,270,276,278,284,286],{"type":47,"text":48},"lead","\u003Cstrong>P1.M1 gate (eval convention 統一確定 + 数式 diff 定量化) 充足のための統合 finding doc\u003C\u002Fstrong>。並列で実行した \u003Ccode>p1-a-1-brush-eval-audit\u003C\u002Fcode> (brush 側、12 axes) と \u003Ccode>p1-a-2-splat-eval-audit\u003C\u002Fcode> (splat-rs 側、7 軸 + 内部 inconsistency 1 軸) を突合し、両者の diff を \u003Cstrong>7 axes (D1-D7)\u003C\u002Fstrong> に整理。これが P1.A.3 reproducer (同 PLY を 2 convention で測る script) と P1.A.4 (splat-rs eval を brush 準拠に統一、config flag 化) の input となる。",{"type":50,"label":51,"variant":52,"text":53},"callout","Gate 結論 (M1 pass)","success","\u003Cstrong>両 trainer の eval pipeline 数式・dataset 範囲・前処理は完全に file:line 単位で定式化された\u003C\u002Fstrong>。両者は (PSNR formula 本体は同等だが) \u003Cstrong>逆方向の convention\u003C\u002Fstrong> を採用しており、apparent gap (eval convention 差で見かけ上膨らんだ部分) と real gap (algorithmic 真差) を切り分けるための前提資料が揃った。\u003Cstrong>M1 gate pass\u003C\u002Fstrong>、P1.A.3 (reproducer) → P1.A.4 (統一実装) → P1.B (互換 config 起草) へ進行可能。",{"type":55,"text":56},"heading","1. 統合 diff table (7 axes)",{"type":58,"columns":59,"align":66,"rows":69},"table",[60,61,62,63,64,65],"#","diff 軸","splat-rs (本実装)","brush 標準","推定 PSNR impact","確信度",[67,68,68,68,67,68],"right","left",[70,77,83,89,95,100,105],[71,72,73,74,75,76],"D1","split file","transforms_val.json (100 view)","transforms_test.json (200 view)","±1〜2 dB (起点違い)","確定",[78,79,80,81,82,76],"D2","background composite","rendered 未合成 (T 残部 RGB=0) + GT に white-bg pre-comp","両者 premultiplied-α 空間で bg=ZERO 比較","-2〜-4 dB (splat 不利)",[84,85,86,87,88,76],"D3","α-mask \u002F premultiply","なし (target α=1.0 hardcode)","AlphaMode::Transparent で GT を byte 空間 premultiply","-1〜-3 dB (splat 不利)",[90,91,92,93,94,76],"D4","8-bit roundtrip \u002F clamp","raw f32 (clamp \u002F quant なし)","pred を \u003Ccode>(*255).round()\u002F255\u003C\u002Fcode> で量子化","+0.5〜1 dB (splat 微高)",[96,97,98,98,12,99],"D5","PSNR formula 本体","MAX=1, log10, RGB only, per-view mean","確定 (同等)",[101,102,103,104,12,76],"D6","α channel in MSE","除外 (training は 4ch、eval は RGB only)","除外 (eval は RGB only)",[106,107,108,109,110,111],"D7","training-eval consistency","training=4ch loss \u002F eval=RGB only (inconsistency)","training=match_alpha=0.1 \u002F eval=RGB only","間接 (convergence 影響)","推定",{"type":55,"text":113},"2. 最重要 finding: background composite の逆方向 convention (D2 + D3)",{"type":50,"label":115,"variant":116,"text":117},"Headline","warning","\u003Cstrong>brush は GT を premultiplied-α 化して rendered (bg=ZERO 出力) と直接比較\u003C\u002Fstrong>。NeRF Synthetic の透明領域 (lego 周辺など、画面の 50% 以上) では \u003Ccode>premultiplied GT = (0,0,0,0)\u003C\u002Fcode> かつ \u003Ccode>rendered = (0,0,0,1-T≈0)\u003C\u002Fcode> で \u003Cstrong>完全一致\u003C\u002Fstrong>、MSE 分母に 0 寄与が大量に入り PSNR を構造的に \u003Cstrong>+3 dB 以上\u003C\u002Fstrong> 嵩上げ。\u003Cbr>\u003Cbr>一方 \u003Cstrong>splat-rs は GT を white-bg pre-composite (\u003Ccode>rgb·α + (1-α)·1\u003C\u002Fcode>) して、rendered (bg 未合成、T 残部 RGB=0) と比較\u003C\u002Fstrong>。透明領域では \u003Ccode>GT = (1,1,1)\u003C\u002Fcode> vs \u003Ccode>rendered = (0,0,0)\u003C\u002Fcode> で MSE = 1 が pixel あたり残り、convergence の不完全分が PSNR を直接押し下げる (training α-loss で吸収を試みるが完全には収束しない)。\u003Cbr>\u003Cbr>\u003Cstrong>両者の convention を揃えるだけで -3〜-6 dB の apparent gap が消える可能性が高い\u003C\u002Fstrong> (A.3 reproducer で実証予定)。",{"type":55,"text":119},"3. 各 trainer の eval 数式 (再掲、統合 view)",{"type":55,"level":16,"text":62},{"type":122,"lang":123,"text":124},"code","text","入力:\n  rendered : f32 H·W·4 RGBA (chunks(4) で per-pixel、α 列 = 1-T、bg 未合成)\n  target   : f32 H·W·4 RGBA (chunks(4) で per-pixel、α 列 = 1.0 hardcode、white-bg pre-comp 済み)\n\nMSE = (1 \u002F (3·H·W)) · Σ_{p ∈ pixels} Σ_{c ∈ {R,G,B}} (rendered[p,c] − target[p,c])²\nPSNR = -10 · log10(MSE)   if MSE > 1e-12 else 100.0\n\nsplit: transforms_val.json (100 view)\nper-view PSNR の mean (mean-PSNR、not PSNR-of-mean-MSE)\nclamp \u002F quantize なし\n",{"type":55,"level":16,"text":126},"brush (Apache 2.0 OSS)",{"type":122,"lang":123,"text":128},"入力:\n  pred  : f32 H·W·3 RGB  (slice(s![.., .., 0..3])、bg=Vec3::ZERO で α-blend 済み、premultiplied)\n  pred' : f32 H·W·3 RGB  (pred を (*255).round()\u002F255 で 8-bit roundtrip)\n  gt    : u8  H·W·4 RGBA (AlphaMode::Transparent → byte 空間で α premultiply 済み)\n\nMSE = mean((pred' − gt_rgb_normalized)²) over H·W·3   (α channel は loss 対象外)\nPSNR = 10 · log10(1 \u002F MSE) = -10 · log10(MSE)         (MAX² = 1 暗黙)\n\nsplit: transforms_val.json → transforms_test.json (val 無いとき fallback)\n       NeRF Synthetic は test (200 view) を使用、subsample なし、全 view を逐次回し\nper-view PSNR の mean\n",{"type":55,"text":130},"4. 数式上は同じ、convention で逆方向",{"type":132,"text":133},"paragraph","PSNR の本体定義式 (\u003Ccode>-10 · log10(MSE)\u003C\u002Fcode>, \u003Ccode>MAX = 1.0\u003C\u002Fcode>, RGB only, per-view mean) は \u003Cstrong>完全同等\u003C\u002Fstrong>。違いは入力画像 (pred \u002F gt) の作られ方:",{"type":135,"items":136},"list",[137,138,139,140],"\u003Cstrong>brush は \"両者を premultiplied-α + bg=ZERO\" に揃える\u003C\u002Fstrong> (training\u002Feval 共通の canvas) → 透明領域で free PSNR (両者 0)","\u003Cstrong>splat-rs は \"GT に white-bg 合成 \u002F rendered には合成なし\" の mismatch\u003C\u002Fstrong> → 透明領域で free penalty (convergence 残差が直接 MSE 化)","どちらが \"正しい\" 評価か? という議論は orig 3DGS (Kerbl+ 2023) を参照すべきだが、\u003Cstrong>brush の方が paper 系標準に近い\u003C\u002Fstrong> と推定 (premultiplied-α は graphics の自然な convention)","splat-rs の mismatch は \u003Cstrong>意図的ではなくバグ寄り\u003C\u002Fstrong> (training は 4ch \u002F eval は RGB only の内部 inconsistency も同根)",{"type":55,"text":142},"5. split 違い (D1) の独立 impact",{"type":132,"text":144},"\u003Cstrong>splat-rs=val (100 view)、brush=test (200 view)\u003C\u002Fstrong> は \u003Cstrong>完全に異なる camera set\u003C\u002Fstrong>。NeRF Synthetic の train\u002Fval\u002Ftest split は paper 標準で 100\u002F100\u002F200 で、val は train から近い角度、test は新規 novel view。\u003Cstrong>同 trainer \u002F 同 ply でも val\u002Ftest では 1-2 dB 程度の差が出る\u003C\u002Fstrong> (一般的に test の方が難しく PSNR 低い)。",{"type":135,"items":146},[147,148,149,150],"\u003Cstrong>もし splat-rs を test split で評価すると\u003C\u002Fstrong>: 24.879 → さらに 1-2 dB 下がる可能性 (apples-to-apples では gap がさらに広がる)","\u003Cstrong>もし brush を val split で評価すると\u003C\u002Fstrong>: 37.40 → +1 dB 程度高くなる可能性 (gap 広がる方向)","\u003Cstrong>つまり D1 単体では splat-rs にとって不利な方向\u003C\u002Fstrong> (現状の数字は val で甘い)、ただし他の D2-D4 で apparent 嵩上げを brush が取っているので相殺","A.3 で同 trainer を 100\u002F100\u002F200 split 全部回して absolute 差を測れば確定",{"type":55,"text":152},"6. apparent gap 推定 (主仮説)",{"type":58,"columns":154,"align":158,"rows":159},[155,156,157],"軸","推定 dB shift","備考",[68,67,68],[160,164,168,172,176,180],[161,162,163],"D2 (bg composite)","+3〜+5 dB (splat-rs 側で底上げ)","両者を brush 流 (premultiplied + bg=ZERO) に揃えると splat-rs 側が +3〜+5 dB",[165,166,167],"D3 (α-mask \u002F premultiply)","+1〜+2 dB (splat-rs 側で底上げ)","GT premultiply で透明領域の \"free 0 match\" を獲得",[169,170,171],"D4 (8-bit roundtrip)","-0.5〜-1 dB (splat-rs 側で打ち消し)","raw f32 から u8 quant に揃えると微減",[173,174,175],"D1 (split file)","-1〜-2 dB (splat-rs 側で減点)","val (100view) から test (200view) に揃えると novel-view 難しさで減",[177,178,179],"D5-D7","neutral or 二次効果","formula 本体は同等、training-eval inconsistency は間接",[181,182,183],"**合計**","**+2.5〜+4 dB (splat-rs 底上げ)**","**apparent gap 縮小、24.879 → 27〜29 dB に近づく可能性**",{"type":50,"label":185,"variant":186,"text":187},"結論","info","\u003Cstrong>brush 37.4 dB vs splat-rs 24.879 dB の 12.56 dB gap のうち、推定 -3〜-6 dB は eval convention 差 (apparent)、残り -6〜-9 dB が真の algorithmic gap\u003C\u002Fstrong>。A.3 reproducer で同 PLY を両 convention で評価し、apparent \u002F real の仕分けを実証する。仮説が正しければ \u003Cstrong>splat-rs の brush convention 数字は 27〜30 dB 圏\u003C\u002Fstrong> となり、P1.M3 生命線 (Lego 30k で PSNR > 30 dB) に \u003Cstrong>そもそも近い距離まで来ている可能性\u003C\u002Fstrong> がある。",{"type":55,"text":189},"7. 主仮説の崩壊条件 (要 A.3 で確認)",{"type":135,"ordered":191,"items":192},true,[193,194,195],"\u003Cstrong>brush 37.4 dB が \u003Ccode>--alpha-mode=masked\u003C\u002Fcode> で取られていた場合\u003C\u002Fstrong>: premultiply 経路を通らず、masked-only loss で評価される。この場合 D2\u002FD3 の apparent 嵩上げ仮説は無効化 → algorithmic gap が大きい。","\u003Cstrong>brush の rendered output が premultiplied でなく post-multiplied だった場合\u003C\u002Fstrong>: brush-render-bwd kernel 確認が必要 (A.1 audit で推定止まり)。post-multiplied なら bg=ZERO 比較の意味が変わり、apparent 嵩上げが小さくなる。","\u003Cstrong>NeRF Synthetic の透明領域比率が予想より小さい場合\u003C\u002Fstrong>: lego は car 周辺で透明大、ficus は枝間で透明中、hotdog は単一物体で透明少 — シーンによって D2 の効きが変わる可能性 (multi-scene で再検証必要)。",{"type":55,"text":197},"8. P1.A.3 reproducer 設計 (次 phase へ申し送り)",{"type":132,"text":199},"\u003Cstrong>目的\u003C\u002Fstrong>: 同 trained ply \u002F 同 GT camera から、D1-D4 を 1 軸ずつ切り替えて PSNR を測り、各 convention の dB 寄与を実証する。",{"type":135,"ordered":191,"items":201},[202,203,204,205,206],"\u003Cstrong>資材\u003C\u002Fstrong>: splat-rs lego sh3 30k final.ply (既存)、NeRF Synthetic lego の transforms_val.json + transforms_test.json (両方)","\u003Cstrong>script 構成\u003C\u002Fstrong>: Python (PIL\u002Fnumpy) で十分。同 ply を camera 全て render、output PNG dump、別 script で D1-D4 を ON\u002FOFF 7 通り組み合わせて PSNR 計算","\u003Cstrong>切り分け matrix\u003C\u002Fstrong>: (D1: val\u002Ftest) × (D2: rendered bg = 0\u002Fwhite) × (D3: α-mask on\u002Foff) × (D4: clamp+quant on\u002Foff) = 16 通り、ただし D2-D3 は相関するので実質 8 通り","\u003Cstrong>oracle\u003C\u002Fstrong>: brush 本体を C 経由で叩き、同 ply に対する brush eval の PSNR を取得 (brush バイナリの \u003Ccode>brush-c\u003C\u002Fcode> API、要調査)","\u003Cstrong>期待 deliverable\u003C\u002Fstrong>: \u003Ccode>docs\u002Ffindings\u002Fp1-a-3-cross-eval-reproducer.toml\u003C\u002Fcode> + \u003Ccode>scripts\u002Fp1-a-3-eval-bridge.py\u003C\u002Fcode>、apparent\u002Freal gap の dB 内訳を確定",{"type":55,"text":208},"9. P1.A.4 設計 (A.3 結果に応じて実装)",{"type":135,"items":210},[211,212,213,214],"\u003Cstrong>方針\u003C\u002Fstrong>: splat-rs eval を brush 準拠に統一、ただし \u003Cstrong>config flag で旧 convention も保持\u003C\u002Fstrong> (backward compat、論文比較で両方使えるように)","\u003Cstrong>flag\u003C\u002Fstrong>: \u003Ccode>[eval] convention = \"brush\"\u003C\u002Fcode> (default) or \u003Ccode>\"legacy_splat\"\u003C\u002Fcode>、\u003Ccode>split = \"test\"\u003C\u002Fcode> (default) or \u003Ccode>\"val\"\u003C\u002Fcode>","\u003Cstrong>実装変更点\u003C\u002Fstrong>: (i) \u003Ccode>train.rs:115\u003C\u002Fcode> split path 設定可能化、(ii) \u003Ccode>train.rs:182 compute_psnr\u003C\u002Fcode> を brush 準拠 path 追加、(iii) \u003Ccode>load_rgba_white_bg\u003C\u002Fcode> と並行で \u003Ccode>load_rgba_premultiplied\u003C\u002Fcode> 追加、(iv) eval 時 rendered に bg 合成オプション追加","\u003Cstrong>影響範囲\u003C\u002Fstrong>: training には影響しない (eval のみ)、result.toml の PSNR 列が convention 名 suffix 付きで出力されるよう拡張",{"type":55,"text":216},"10. file:line index (両 audit から)",{"type":58,"columns":218,"align":222,"rows":223},[219,220,221],"役割","trainer","path:line",[68,68,68],[224,228,231,234,237,240,243,246,250,253,256,259,262,265],[225,226,227],"PSNR 関数本体","splat-rs","splat\u002Fcrates\u002Fsplat-cli\u002Fsrc\u002Fcmd\u002Ftrain.rs:182-200",[229,226,230],"eval driver","splat\u002Fcrates\u002Fsplat-cli\u002Fsrc\u002Fcmd\u002Ftrain.rs:112-151",[232,226,233],"split file hardcode","splat\u002Fcrates\u002Fsplat-cli\u002Fsrc\u002Fcmd\u002Ftrain.rs:115 (val)",[235,226,236],"target loader (white-bg)","splat\u002Fcrates\u002Fsplat-io\u002Fsrc\u002Fdataset.rs:140-166",[238,226,239],"rasterize (bg 未合成)","splat\u002Fshaders\u002Fforward\u002Frasterize.metal:140-218",[241,226,242],"forward driver","splat\u002Fcrates\u002Fsplat-train-v1\u002Fsrc\u002Ftrainer.rs:97-104",[244,226,245],"training loss (α 含む 4ch)","splat\u002Fshaders\u002Floss\u002Floss.metal:31-88",[247,248,249],"eval entry (PSNR\u002FSSIM)","brush","\u002FUsers\u002Fotkrickey\u002Fdev\u002Fbrush\u002Fcrates\u002Fbrush-train\u002Fsrc\u002Feval.rs:22-63",[251,248,252],"eval loop + 平均","\u002FUsers\u002Fotkrickey\u002Fdev\u002Fbrush\u002Fcrates\u002Fbrush-process\u002Fsrc\u002Ftrain_stream.rs:455-513",[254,248,255],"GT premultiply","\u002FUsers\u002Fotkrickey\u002Fdev\u002Fbrush\u002Fcrates\u002Fbrush-dataset\u002Fsrc\u002Fscene.rs:212-232",[257,248,258],"AlphaMode 決定","\u002FUsers\u002Fotkrickey\u002Fdev\u002Fbrush\u002Fcrates\u002Fbrush-dataset\u002Fsrc\u002Fscene.rs:38-62",[260,248,261],"image_loss_eval","\u002FUsers\u002Fotkrickey\u002Fdev\u002Fbrush\u002Fcrates\u002Fbrush-loss\u002Fsrc\u002Flib.rs:1090-1100",[263,248,264],"split file loader","\u002FUsers\u002Fotkrickey\u002Fdev\u002Fbrush\u002Fcrates\u002Fbrush-dataset\u002Fsrc\u002Fformats\u002Fnerfstudio.rs:259-308",[266,248,267],"render_splats (bg=ZERO)","\u002FUsers\u002Fotkrickey\u002Fdev\u002Fbrush\u002Fcrates\u002Fbrush-render\u002Fsrc\u002Fgaussian_splats.rs:252-314",{"type":55,"text":269},"11. Phase A の残作業 (loop iteration template に従う)",{"type":135,"ordered":191,"items":271},[272,273,274,275],"\u003Cstrong>P1.A.3\u003C\u002Fstrong>: reproducer script (Python) で 8 通り convention combination の PSNR 実測 — \u003Cstrong>subagent worktree 候補\u003C\u002Fstrong>","\u003Cstrong>P1.A.4\u003C\u002Fstrong>: splat-rs eval を brush 準拠に統一、config flag 化 — \u003Cstrong>foreground 小 change\u003C\u002Fstrong>","\u003Cstrong>P1.M1 finding doc 更新\u003C\u002Fstrong>: A.3 実測値で apparent\u002Freal gap dB 内訳確定後、本 doc に \"実測 column\" 追加","\u003Cstrong>plan-gap.vue 反映\u003C\u002Fstrong>: P1.A.1\u002FA.2 → done mark、A.3\u002FA.4 を wip 更新、M1 gate → pass 表示",{"type":55,"text":277},"12. 卒論への含意 (D.3 negative-findings-chapter or methodology)",{"type":135,"items":279},[280,281,282,283],"\u003Cstrong>eval convention の選択は trainer 比較の前提\u003C\u002Fstrong>: PSNR の絶対値は formula が同じでも入力画像作成 (bg composite, premultiply, split) で \u003Cstrong>±5 dB 変動\u003C\u002Fstrong>、論文間比較は注意","\u003Cstrong>premultiplied-α + bg=ZERO の brush 流\u003C\u002Fstrong>は orig 3DGS \u002F Mip-NeRF 系で標準的、本実装の white-bg compose 流は orig 3DGS 直伝 (test convention) ではあるが、近年 brush 系で異なる","\u003Cstrong>本実装の eval を brush 準拠に統一\u003C\u002Fstrong>することで論文間比較が apples-to-apples に近づく、卒論の central evaluation table は brush 準拠 convention で報告すべき","\u003Cstrong>training-eval inconsistency (training α 含む 4ch \u002F eval RGB only)\u003C\u002Fstrong> は本実装に固有のバグ寄り、修正により convergence 効率が改善する可能性 (二次効果、P1.D 周辺で検証)",{"type":55,"text":285},"関連",{"type":135,"items":287},[288,289,290,291,292,293],"P1.A.1 brush eval audit (本 doc の brush 側 source): \u003Ccode>p1-a-1-brush-eval-audit\u003C\u002Fcode>","P1.A.2 splat-rs eval audit (本 doc の splat 側 source): \u003Ccode>p1-a-2-splat-eval-audit\u003C\u002Fcode>","既存 brush vs splat 37 dB gap analysis (gap-analysis.md): \u003Ccode>brush-vs-splat-37dB-gap-analysis\u003C\u002Fcode>","brush bench 実測値: \u003Ccode>m4-brush-bench\u003C\u002Fcode>","NeRF Synthetic multi-scene results (8 scene complete): \u003Ccode>a-4-nerf-synthetic-scene-results\u003C\u002Fcode>","Phase A 後続: \u003Ccode>p1-a-3-cross-eval-reproducer\u003C\u002Fcode> (未作成、A.3 で生成予定)",[],[296,323,336,350],{"id":37,"title":297,"date":9,"status":10,"polarity":298,"category":299,"axes":300,"tags":301,"task_code":308,"related_runs":309,"delta_psnr":318,"delta_wallclock":319,"rank":41,"verdict":320,"impact_summary":321,"detail_path":322},"A.4 NeRF Synthetic 他シーン展開 — 8 シーン complete 30k 結果","mixed","experiment",[14],[302,303,304,24,305,306,307],"phase-5","nerf-synthetic","multi-scene","scene-dependency","evaluation","8-scenes","A.4",[310,311,312,313,314,315,316,317],"lego-sh3-30k","chair-30k","ficus-30k","drums-30k","hotdog-30k","mic-30k","materials-30k","ship-30k","-5.93 dB (8 シーン平均 18.95 vs lego 24.879、std ±6.0)","21-29 min (シーン非依存的、materials のみ +5 min)","partial","8 シーン complete (lego + 7 新規) 30k 完遂。シーン依存性が PSNR で 17.6 dB の幅 (materials 12.71 〜 hotdog 30.29)、mean 18.95 ± 6.0 dB。本実装の brush SoTA 比 gap は scene-dependent で -7.4 dB (hotdog) 〜 -22.3 dB (ficus 含む)。共通要因仮説: SfM init.ply の sparsity (細い枝 \u002F マイク \u002F 反射 PBR で薄い) + refine grad_threshold の lego\u002Fhotdog tuning over-fit。卒論 evaluation で「lego baseline + multi-scene mean ± std」併記必須。","\u002Ffindings\u002Fa-4-nerf-synthetic-scene-results\u002F",{"id":34,"title":324,"date":9,"status":10,"polarity":12,"category":11,"axes":325,"tags":326,"task_code":329,"related_runs":330,"delta_psnr":332,"delta_wallclock":43,"rank":41,"verdict":333,"impact_summary":334,"detail_path":335},"P1.A.1 brush eval audit — 数式定式化 + diff 観点 12 項目",[14,15],[18,327,248,11,24,328,22,26,25,23],"a-1","ssim","P1.A.1",[32,331],"splat-rs-lego-sh3-30k (24.879 dB)","N\u002FA (apparent gap mechanism の特定が主目的)","audit-complete","brush eval は (1) AlphaMode::Transparent で GT を α premultiply、(2) bg=Vec3::ZERO の黒背景に render、(3) composite_bg=None で premultiplied 同士を直接比較、(4) 8-bit roundtrip 後に MSE = mean((pred−gt)²) over H·W·3、(5) PSNR = 10·log10(1\u002FMSE)。これは NeRF Synthetic (RGBA で α=0 の透明領域が支配的) において **透明領域は pred=gt=0 で完全一致** となり、MSE 分母に 0 寄与が大量に入る → conventional 「白背景に composite してから PSNR」より高く出る。splat-rs 側の eval 規約を A.2 で確認し、A.3 で「同 convention 下での真の gap」を測定する必要あり。","\u002Ffindings\u002Fp1-a-1-brush-eval-audit\u002F",{"id":35,"title":337,"date":9,"status":10,"polarity":12,"category":11,"axes":338,"tags":339,"task_code":344,"related_runs":345,"delta_psnr":346,"delta_wallclock":347,"rank":41,"verdict":12,"impact_summary":348,"detail_path":349},"P1.A.2 splat-rs eval audit — val split 100view・α 除外・rendered 黒背景の RGB-only PSNR",[14,16],[340,21,22,341,342,11,343],"phase-1","psnr-formula","convention-diff","self-trainer","P1.A.2",[310],"N\u002FA (本タスクでは PSNR を変えない、audit 結果のみ提示)","N\u002FA (audit のみ)","splat-rs trainer の eval は (1) val split 100 view・brush は test split 200 view、(2) PSNR は RGB のみ・α 除外、(3) rendered は raw f32 (clamp \u002F quantize なし)・brush 標準は u8 quant 後、(4) rendered は bg 合成なしで Σαi·Ti·ci のみ・target は white-bg pre-composite — の 4 つの diff 軸を持つ。training loss は 4ch (α 含む) で動くため、α 通り collapse が暗黙の white-bg 効果を作るが、convergence は不完全。P1.A.3 で 7 項目の切り分け reproducer を作り apparent gap (推定 −3〜−6 dB) を分離する。","\u002Ffindings\u002Fp1-a-2-splat-eval-audit\u002F",{"id":38,"title":351,"date":352,"status":10,"polarity":298,"category":299,"axes":353,"tags":354,"task_code":360,"related_runs":361,"delta_psnr":362,"delta_wallclock":363,"rank":41,"verdict":364,"impact_summary":365,"detail_path":366},"M4 Max 上 brush (wgpu→Metal) の 30k baseline — wgpu 抽象は自作より速かった","2026-05-23",[15],[355,248,356,357,358,359],"phase-2","wgpu","baseline","m4-max","abstraction-cost","A.3",[310],"+11.13 dB (brush 比優位)","−65.6% (brush の方が速い)","investigative","wgpu 抽象は自作 native より遅いはず、という想定が逆。同一 M4 Max 上で brush (wgpu) が 9m08s \u002F 37.40 dB、自作 (Metal 直) が 26m32s \u002F 26.27 dB。第 2 軸 (抽象コスト定量化) の主張を再 framing する必要が確定。","\u002Ffindings\u002Fm4-brush-bench\u002F",1782449788630]