diff --git a/CLAUDE.md b/CLAUDE.md index 771eabc..cd40bcd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -40,6 +40,7 @@ 補足: **Step 8-14 候補 γ (D1 ROI 整合の再確認) 完了 — クリア (2026-06-02)**.他の物理モデル変更に進む前の事前確認として実施.設定変更ゼロで,既存設定の数値検証のみ.シミュ ROI (24, 37, 464, 450) の物理範囲 (X∈[-45.31, +45.31] mm × Y∈[-46.92, +44.48] mm,幅 90.63×91.41 mm) と実機 ROI (539, 1015, 1400, 1409) の物理範囲 (実機 PNG の評価板黒縁検出から物理分解能 0.0654 mm/px を確定 → 幅 91.54×92.13 mm) を比較した結果,**物理サイズ差 < 1%・中心位置差 < 1 mm で整合**.3 列パネル `output/_slide_panels/roi_alignment_check.png` (①実機画像 + 評価板境界・実機 ROI / ②シミュ輝度マップ + 評価板境界・シミュ ROI / ③物理座標系で重ね合わせ) でも視覚確認.**残差 2.63× の主因は ROI 整合ではない**ことが確定.過去の設定者 (`scripts/select_white_board.py` GUI 選択 + シミュ ortho_scale 設計値) が物理整合性を意識して ROI を揃えていたことが裏付けられた.副次発見: 評価板は実機画像中央から下方向に約 4.2 mm (65 px) オフセット配置されているが (取付位置のミリ精度差),ROI もそのオフセットに沿って選択されているため物理領域として整合.次のアクション: 残候補 β (A1 単独) / α (A8+A9) / δ (β+α 全部入り) を選択して Step 8-14 を実施. 補足: **Step 8-14 候補 β (A1 内壁の非 Lambertian 性) 完了 — クリア (2026-06-02)**.候補リスト 🥇 1 位だった A1 を 3×3 グリッド感度分析で検証.スキーマ拡張 (`BlendBSDFConfig` + `RoughConductorBSDFConfig` 追加,`MaterialConfig` Union 拡張,forward reference + `model_rebuild()`) と `materials.py` 再帰変換 (`_build_bsdf_dict`) を新規実装.テンプレ `configs/scene_baseline_blend.yaml` + スイープスクリプト `scripts/sweep_blend_bsdf.py` + 比較パネルスクリプト `scripts/build_blend_bsdf_panel.py`.新規テスト 89 件追加 (608 → 697 全通過).**weight ∈ {0.05, 0.15, 0.30} × α ∈ {0.1, 0.3, 0.6} の 9 ジョブ実走 (75.5 分)**.結果: ベースライン純 diffuse (CoV=0.1826, 勾配=24.65%, C/P=1.327, 動径 min/max=0.615) と比較して **全 9 パターンが悪化または不変** (最良 w=0.05/α=0.6 で CoV=0.1851,最悪 w=0.30/α=0.1 で CoV=0.2433).実機 (CoV=0.0695) 方向と **逆方向に動く**.「形」は w=0.30 で下端中央に 2 つの specular 集中スポットが顕在化.物理的解釈: 純 Lambertian は cos 重み散乱で多重反射の均一化作用が最大.specular 成分は特定方向に光を集中させ均一化を阻害.**3D プリンタ白フィラメントは完全 Lambertian として扱うのが実機挙動に近い近似** と判明 (TECH_09 LED Lambertian 整合と並ぶ「物理モデル妥当性の裏付け」).**A1 は残差 2.63× の主因ではない**ことが確定.TECH_10 優先順位を更新: A1 を「クリア」化,🥇 1 位 A8 反射率 R=0.89 / 🥈 2 位 A9 max_depth 16+ / 🥉 3 位 B1 幾何精度 に繰り上げ.副次成果: スキーマ層に `blendbsdf` + `roughconductor` のサポートが入り,今後の物理モデル試行で再利用可能.比較パネル `output/_slide_panels/blend_bsdf_sweep.png` + `blend_bsdf_metrics.png`,全 9 ジョブ集約 `output/blend_sweep/summary.csv`.[TECH_10 § A1 検証結果](docs/05_TECH/TECH_10_残差主因候補の網羅整理.md#a1-検証結果2026-06-02-完了) / [TEST_01 § Step 8-14 候補 β](docs/06_TEST/TEST_01_キャリブレーション検証履歴.md#step-8-14-候補-β-a1-内壁の非-lambertian-性--混合-bsdf-感度分析) / [SPEC_02 materials](docs/04_SPEC/SPEC_02_シーン定義仕様.md#materials) 参照.次のアクション: Step 8-14 候補 α (A8 R=0.89 + A9 depth=16) の組み合わせ実施. 補足: **LED グループ別 sanity check 完了 — TEST_07 として報告 (2026-06-03)**.Step 8 系キャリブの主軸ではなく「シミュが下/右/左の 3 LED 基板を物理位置どおりに独立にモデル化できているか」の基礎健全性確認.`scripts/sanity_led_groups.py` で各基板の 6 LED だけを ON にした一時 YAML を生成 → 3 ジョブ sm-render (約 25 分) → 比較パネル.結果: **方向性 ✓** (bottom は下端中央/right は右側面寄り/left は左側面寄り),**左右対称性 ✓** (right mean=47.10 vs left mean=47.08),**量的バランスは bottom が right/left の 2.10× で強い**.ユーザー観察「bottom は上下の島,right/left は中心の円」は LED 配置で説明: bottom LED は評価板の下端真下に X 中央寄り集中 → 直接光が広範囲を叩く / right/left LED は側面外側で Y 中央付近に分散 → 直接光は端のみ・中央は多重反射経由 → 「直接光寄与が大きい bottom」vs「多重反射寄与が大きい right/left」の構造的違い.**線形性検証は別途未実施**(既存 `output/baseline/luminance.npy` が Step 8-1 時点の古いもので和との比較不可.Mitsuba は理論線形なので baseline 再生成で一致見込み).副次発見: 実機の right (Y∈[-25,+3]) と left (Y∈[-33,-5]) は **完全な左右対称設計ではない**(Fusion STL 実位置と整合).[TEST_07 LED グループ別動作確認](docs/06_TEST/TEST_07_LEDグループ別動作確認.md) 参照.**シミュレーションは 3 つの照明源を物理位置どおりに独立にモデル化できている**ことが確定し,Step 8 系の残差 2.63× 議論の前提が担保された. +補足: **scene_baseline.yaml の max_depth を 8 → 16 へ更新 (2026-06-03)**.Step 8-14 候補 α 前半の結論「d=16 が実用収束点」を反映.SPEC_03 の既知差分 #6 (未対処の max_depth=8) を解消.SPEC_03 の関連箇所 4 箇所 (パラメータ表 / 多重反射の説明 / 制限セクション / 既知差分一覧) を一括更新.TEST_02 の `output/baseline/` 行に「d=8 時代の古い結果」注記を追加(output/baseline/luminance.npy は 2026-05-18 生成で d=8、現 scene_baseline.yaml の d=16 とは不整合.必要時に再生成).影響: 今後の sm-render は自動的に d=16 で実行され、理論累積 92.6% を取り込む.計算時間は d=8 の約 2× (8.5 分 → 17 分) に増加するが、形状指標 4 つすべてが d=8 時代より実機方向に改善 (CoV 0.1817 → 0.1604, 勾配 24.01% → 20.59%).次のスイープ系 (A8 反射率, A10 サブサーフェス散乱等) は自動的に d=16 ベースで実行される. 補足: **Step 8-14 候補 α 前半 (A9 max_depth スイープ) 完了 — 数値改善のみクリア・形不変 (2026-06-03)**.ユーザー仮説「現状 d=8 では 0.85^8≈0.27 で取りこぼし大.0.01 未満まで増やすべき」を 5 値スイープ {8, 12, 16, 20, 28} で検証.`scripts/sweep_max_depth.py` (約 85 分) + `scripts/build_max_depth_panel.py` (収束カーブ + 数値表) を新規実装.結果: 全 4 形状指標 (CoV/勾配/C/P/動径 min/max) が **単調に実機方向に改善**.d=8→28 で **CoV=0.1817→0.1583** (残差 20.9% 縮小),勾配=24.01→20.24% (24.1%),C/P=1.316→1.254 (27.6%),動径 min/max=0.628→0.689 (26.3%).mean は 207.82 で固定 (アンカー正規化).**実用的な収束は d=16 で達成** (d=16→28 で CoV 1.3% のみ動く).理論累積 R^n より早く収束は「直接光と初期反射が支配的,後段は ambient のみ」の物理直感と整合.**「形」は完全に不変** (3 種類のパネル shared/independent/mean=1 正規化 全てで Y 軸単調勾配のまま contrast が緩むだけ).物理的解釈: 多重反射は **空間的に均一な ambient 成分**で,これを足しても暗/明領域の絶対差は縮むが空間配置は不変.「LED が下にしかない」配置の非対称性は除去不能.これは TEST_03「Step 8-1〜8-7 で形は全く変わっていない」と整合.**ユーザー仮説の評価**: 方向性は完全に正しい (21-28% 残差縮小).ただし実用収束は d=16 (理論累積より早い).d=28 まで増やしても追加改善 1% のみ.実機 (CoV=0.0695) には届かず,**残る残差は形改善で詰める必要**.**TECH_10 優先順位を再更新**: A9 を「数値改善のみクリア」化.**形改善の本筋候補は B1 幾何精度に集約**.A8 反射率 R=0.89 は数値改善目的では有効だが形改善は予想薄.新規候補として ε B1 と ζ LED 軸ティルトを追加.新キャリブベースライン候補: **d=16** (現状 d=8 は理論累積の 72.7% で取りこぼし大).副次成果: スイープ + 収束カーブ + 形比較パネル (`shape.png` 上下 2 段, `relative.png` mean=1) のテンプレが整備され今後の感度分析に流用可能.[TECH_10 § A9 検証結果](docs/05_TECH/TECH_10_残差主因候補の網羅整理.md#a9-検証結果2026-06-03-完了) / [TEST_01 § Step 8-14 候補 α 前半](docs/06_TEST/TEST_01_キャリブレーション検証履歴.md#step-8-14-候補-α-前半-a9-max_depth-スイープ-8-12-16-20-28) 参照.次のアクション: 候補 ε B1 筐体幾何精度 / 候補 ζ LED 軸方向ティルト仮説 のいずれかを実施. 補足: **形状指標の本質的見直しと新指標導入 (2026-06-03)**.Step 8-14 で「A9 max_depth スイープで数値が実機方向に動いても形は全く変わらない」「A1 非 Lambertian でも形は実機に近づかない」が続けて確定したため,ユーザー指摘「現状 4 指標は不均一性の絶対量しか測れず,Y 軸単調勾配と中央ピーク楕円を構造的に区別できない」に対応する **形を直接評価する 5 指標** を追加実装.`src/sm_tias_lightsim/evaluation/shape_metrics.py` (新規): `calc_intensity_centroid`(輝度重心 5 値)/ `calc_angular_radial_decomposition`(極座標分解,angular_ratio: 0=同心円, 1=方向依存)/ `calc_ssim`(scikit-image 依存, shape_reference 指定時)/ `calc_ncc`(正規化相関係数)/ `calc_intensity_pca`(weighted PCA 主軸・eccentricity)の純関数 5 つ.`MetricsConfig` に `shape_metrics: bool = False` / `shape_reference: str | None = None` を追加(後方互換).`cli/evaluate.py` に `_run_shape_metrics` 関数追加 + コンソールサマリ拡張.`configs/eval_baseline_dng_target_shape.yaml` を新規作成 (shape_metrics=true, shape_reference=null).`pyproject.toml` に `scikit-image>=0.21.0` を追加.[TECH_11 形状指標の見直しと新指標導入](docs/05_TECH/TECH_11_形状指標の見直しと新指標導入.md) で背景・計算式・シミュ vs 実機予想値・過去判断への遡及的注記を記録.TEST_01 俯瞰サマリ上に「形状指標は絶対量のみ測る」注記を追加.TECH_10 A9/A1 検証結果に「新指標での再評価が必要」注記を追加.今後の評価方針: **数値指標 4 + 形指標 5 + 視覚比較の 3 軸評価**で「数値改善のみで形が変わらない候補」と「形を変えうる候補」を明確に区別する. diff --git a/configs/scene_baseline.yaml b/configs/scene_baseline.yaml index 3eb42ae..638b4d9 100644 --- a/configs/scene_baseline.yaml +++ b/configs/scene_baseline.yaml @@ -403,5 +403,5 @@ render: variant: llvm_ad_rgb integrator: path - max_depth: 8 + max_depth: 16 spp: 1024 diff --git "a/docs/04_SPEC/SPEC_03_\345\237\272\346\272\226\350\250\255\350\250\210\343\201\256\347\211\251\347\220\206\346\247\213\346\210\220.md" "b/docs/04_SPEC/SPEC_03_\345\237\272\346\272\226\350\250\255\350\250\210\343\201\256\347\211\251\347\220\206\346\247\213\346\210\220.md" index 69d5287..3f0583c 100644 --- "a/docs/04_SPEC/SPEC_03_\345\237\272\346\272\226\350\250\255\350\250\210\343\201\256\347\211\251\347\220\206\346\247\213\346\210\220.md" +++ "b/docs/04_SPEC/SPEC_03_\345\237\272\346\272\226\350\250\255\350\250\210\343\201\256\347\211\251\347\220\206\346\247\213\346\210\220.md" @@ -170,7 +170,7 @@ | 項目 | 値 | 意味 | | --- | --- | --- | | `integrator` | `path` | **多重反射を考慮した** path tracing.LED → 内壁 → 評価板 のような間接照明経路もすべて積分する | -| `max_depth` | 8 | ray の最大反射回数.**キャリブで判明: 8 はキャリブ精度には不足**(depth=12 比で勾配を約 +2.6pt 過大評価.下記「キャリブレーション経過」参照).確定 YAML は現状 8 のまま(既知の差分 #6).キャリブ用途は depth≥12 推奨 | +| `max_depth` | **16** | ray の最大反射回数.**Step 8-14 候補 α 前半 (2026-06-03) で d=16 に更新**.5 値スイープ {8,12,16,20,28} の結果 d=16 で形状指標 4 つすべてが実用的に収束(d=16→28 で CoV 改善は 1.3% のみで MC ノイズ同等).理論累積 92.6%.d=8 時代に比べて勾配を 24.01→20.59% に改善.既知差分 #6 解消([TEST_01 § Step 8-14 候補 α 前半](../06_TEST/TEST_01_キャリブレーション検証履歴.md#step-8-14-候補-α-前半-a9-max_depth-スイープ-8-12-16-20-28) 参照) | | `spp` | 1024 | pixel あたりサンプル数.大きいほどノイズ減・計算重.**spp 校正済み**(下記「キャリブレーション経過」参照).llvm_ad_rgb・512×512 で 1 レンダ約 9.6 分 | | `variant` | `llvm_ad_rgb` | LLVM JIT による RGB レンダリング.LLVM-C.dll が PATH(または DRJIT_LIBLLVM_PATH)で参照可能なこと | @@ -182,16 +182,16 @@ 2. **1 回反射**: LED → 内壁 → 評価板 3. **2 回反射**: LED → 内壁 → 内壁 → 評価板 4. ... -5. **max_depth (8) 回反射まで** +5. **max_depth (16) 回反射まで** MiniTIAS は **白い筐体内壁の多重反射で照明を均一化** する設計のため、多重反射の正確な計算が CoV 値の再現に必須. ### 制限 - [visualize/baker.py](../../src/sm_tias_lightsim/visualize/baker.py) は `mode="direct"`(直接照度のみ・後方互換)に加え `mode="path"`(scalar_rgb・完全シーン・コサイン重点 hemisphere MC による**多重反射込み per-face 照度**)を実装済み.3D ビューア(`sm-visualize`)の既定は全メッシュ path ベイク統一着色で、評価板も多重反射込みで色付く.ただし per-face ベイクはメッシュ境界の継ぎ目・粗メッシュのブロック感・低 samples の MC ノイズ・scalar_rgb の遅さ(高 samples は非現実的)という方式特性があり、**評価面の精細な照度マップ評価は引き続き 2D の `sm-render`/`sm-evaluate`(path tracer)で行う**(こちらが校正済みの定量結果).シーム解消には全メッシュ UV 統合のシームレスライトマップ基盤が必要(将来の別タスク). -- path ベイクの `max_depth` は `--bake-max-depth`(既定 16)で render 設定(`max_depth: 8`)から独立設定する.本ドキュメント記載の「depth=8 は均一化に効く後段多重反射を取りこぼし空間差を過大評価」の知見に基づき、3D ベイクは depth≥12 で内壁照度を物理どおり均一に近づける(2D の `sm-render` は校正都合で現状 8 のまま、独立). +- path ベイクの `max_depth` は `--bake-max-depth`(既定 16)で render 設定(`max_depth: 16`)から独立設定する.本ドキュメント記載の「depth=8 は均一化に効く後段多重反射を取りこぼし空間差を過大評価」の知見に基づき、3D ベイクは depth≥12 で内壁照度を物理どおり均一に近づける(2D の `sm-render` は Step 8-14 で d=16 へ更新済み、独立変更は不要). - 3D ビューアは既定で**幾何カリング(`--cull-outward`)**=法線がシーン外を向く「外向き面」を非描画にする.筐体の外向き面は空洞外=入射照度 ≈0 で、これを半透明描画すると暗殻の濁り・内壁との見かけ段差を生む(調査で判明:隣接内壁の照度自体は同一手法ベイクで ~1〜2 倍以内とほぼ均一.段差の主因は外向き ≈0 面の混在).カリングで内向き面のみ描画し、共有 clim も可視内向き面に密着させる. -- `max_depth` を超える反射は無視される.エネルギー的には `0.85^8 ≈ 27%` 減衰で小さいが、**キャリブ実測では無視できない**:同一条件で depth=8→12 にすると勾配が linear 空間で 24.65→22.08(−2.6pt)、sRGB 空間で 12.57→11.16(−1.4pt)下がった.8 回打ち切りはまさに均一化に効く後段反射を取りこぼし、勾配を系統的に過大評価する.キャリブ用途では depth≥12 を使うこと. +- `max_depth` を超える反射は無視される.現状 d=16 では `0.85^16 ≈ 7.4%` の最終 bounce 寄与で、理論累積の **92.6% を取り込み**.d=16→28 (98.7%) の追加改善は CoV 1.3% で MC ノイズ同等のため d=16 で実用収束.参考: 過去 d=8 では `0.85^8 ≈ 27%` 減衰で **キャリブ実測で無視できなかった**(depth=8→12 で勾配が linear 24.65→22.08 / sRGB 12.57→11.16).**Step 8-14 候補 α 前半で d=8 → 16 へ更新**.キャリブ用途は depth≥16 を使うこと. ## 筐体(材料) @@ -242,7 +242,7 @@ 5. ~~**linear vs sRGB のドメイン不一致(OETF 欠落)**~~(**最大要因・解消済み**): シミュ linear と実測 gamma 空間 luma を直接突合していた交絡で見かけ差の **約 2/3**.標準 sRGB OETF 順方向適用+実測 mean アンカーを `sm-evaluate` に正規実装して解消(`evaluation/oetf.py` + `EvaluationConfig.oetf`、`configs/eval_baseline.yaml` で有効化).以降の比較は OETF 後ドメインで行う.※ 旧版でここを「主因は ISP レンズシェーディング」としていたのは OETF を抜かした誤り. 6. **【残差の主因候補・未対処】ISP レンズシェーディング補正**: 実測 PNG は実機 ISP の周辺減光電子補正込み、シミュは未補正.OETF 適用後も残る 1.6〜1.9 倍差の主因候補.LSC 順方向モデル(物理動機づけ低自由度形、overfitting 回避)で対処予定. 7. **【残差・不確実・未対処】スマホ独自トーンマップ**: ISP は sRGB OETF に加え独自トーンマッピング/コントラストを掛けうる.真のトーンカーブ未知.残差の一部.調整で消さず正直に残す方針. -8. **【未対処】max_depth=8 が勾配を過大評価**: depth=8→12 で勾配 linear 24.65→22.08(−2.6pt)/ sRGB 12.57→11.16(−1.4pt).確定 YAML は現状 8 のまま(レンダコスト優先で変更保留).キャリブ用途は depth≥12 を使うこと. +8. ~~**【未対処】max_depth=8 が勾配を過大評価**~~(**解消済み 2026-06-03**): Step 8-14 候補 α 前半で d=8→16 へ更新.5 値スイープ {8,12,16,20,28} で d=16 が実用収束点(d=16→28 の追加改善は CoV 1.3% で MC ノイズ同等)と判明.d=8 時代の勾配 24.65% → d=16 で 20.59% に改善.参考: [TEST_01 § Step 8-14 候補 α 前半](../06_TEST/TEST_01_キャリブレーション検証履歴.md#step-8-14-候補-α-前半-a9-max_depth-スイープ-8-12-16-20-28). 9. ~~**評価 ROI の不一致**~~(**解消済み**): ROI を実機と物理対応させ(`configs/eval_baseline.yaml` = pixel (24,37,464,450))、`sm-evaluate` は実測 PNG に対し MiniTias-Evaluation と小数点 14 桁レベルで一致を確認済み.評価ロジック起因の差はない. ## 参照(References) diff --git "a/docs/06_TEST/TEST_02_\343\202\267\343\203\237\343\203\245\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\345\256\237\350\241\214\350\250\230\351\214\262.md" "b/docs/06_TEST/TEST_02_\343\202\267\343\203\237\343\203\245\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\345\256\237\350\241\214\350\250\230\351\214\262.md" index 8f7caf8..fa015e2 100644 --- "a/docs/06_TEST/TEST_02_\343\202\267\343\203\237\343\203\245\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\345\256\237\350\241\214\350\250\230\351\214\262.md" +++ "b/docs/06_TEST/TEST_02_\343\202\267\343\203\237\343\203\245\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\345\256\237\350\241\214\350\250\230\351\214\262.md" @@ -21,7 +21,7 @@ | ディレクトリ | 関連 Step | シーン設定 | 評価設定 | 主要指標 (mean / CoV / 勾配% / C/P) | 用途・参照元 | | --- | --- | --- | --- | --- | --- | -| `output/baseline/` | 8-1 確定基準 | `configs/scene_baseline.yaml` (R=0.85, d=8, spp=1024) | — (レンダのみ) | luminance.npy + render_uint8.png | 確定基準の生レンダ.他の評価の入力ソース | +| `output/baseline/` | 8-1 確定基準(**注: d=8 時代の古い結果**) | 当時の `configs/scene_baseline.yaml` (R=0.85, **d=8**, spp=1024) | — (レンダのみ) | luminance.npy + render_uint8.png | **生成時刻 2026-05-18 で当時の d=8 で計算**.2026-06-03 に scene_baseline.yaml が d=16 へ更新済のため、現状の設定とは不整合.必要時は新基準 (d=16) で再生成すべき | | `output/baseline_linear_npy/` | 8-1 比較基準 | (同上 luminance.npy 入力) | `configs/eval_baseline_linear.yaml` (OETF off) | 152.02 / 0.1826 / 24.65 / 1.327 | TEST_01 Step 8-7 で size 1.5×1.5 と比較する基準.輝度マップ追跡 (TEST_03) のパネル左下 | | `output/eval_oetf_r085/` | 8-3 OETF 後 | (同上 luminance.npy 入力) | `configs/eval_baseline.yaml` (OETF on) | 146.71 / 0.0907 / 11.16 / 1.126 | OETF 適用効果の代表結果.輝度マップ追跡 (TEST_03) パネル右上 | | `output/emitter_real/` | 8-7 検証 | `configs/scene_baseline_emitter_real.yaml` (size 1.5×1.5, radiance 12227, Φe 保存) | `configs/eval_baseline_linear.yaml` (OETF off) | 429.99 / 0.1863 / 26.21 / 1.355 | 点光源近似検証.形状指標 ≈ baseline_linear_npy で実証.輝度マップ追跡 (TEST_03) パネル右下 |