diff --git a/CLAUDE.md b/CLAUDE.md index 6053285..de92b4a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,7 +5,7 @@ ## 開発進捗 -最新: フェーズ 7(実装)— Step 8 基準設計キャリブレーションの **Step 8-14(物理モデル精緻化)** 進行中.**面光源スケール軸バグを発見・修正**(`lights.py` が LED の高さを潰れた Z 軸に入れ縦 Y を無補正→全 LED が幅3mm×高さ2mの巨大ストリップ化).実機単灯実測との突合で **下灯 2.1× がこのバグのアーティファクト**と判明,修正後は 3 灯均等・下灯最暗で実機一致.ただし合成 CoV は 0.1815→0.1641(残差 2.63×→2.36×)の小改善にとどまり,**残る不一致は各単灯フットプリントの拡散不足**(シミュ peak/mean≈1.7 vs 実機≈1.2)=論点は配光 ξ/ディフューザー拡散のモデル化へ移動([TEST_08](docs/06_TEST/TEST_08_面光源スケール軸バグの発見と修正.md)).A1 非 Lambertian / A8 反射率 / A9 max_depth はクリア(数値改善のみ or 逆効果).詳細な経緯・設計判断・失敗パターンは [docs/PROGRESS.md](docs/PROGRESS.md). +最新: フェーズ 7(実装)— Step 8 基準設計キャリブレーションの **Step 8-14(物理モデル精緻化)** 進行中.**面光源スケール軸バグを発見・修正**(`lights.py` が LED の高さを潰れた Z 軸に入れ縦 Y を無補正→全 LED が幅3mm×高さ2mの巨大ストリップ化).実機単灯実測との突合で **下灯 2.1× がこのバグのアーティファクト**と判明,修正後は 3 灯均等・下灯最暗で実機一致.ただし合成 CoV は 0.1815→0.1641 の小改善にとどまり,**残る不一致は各単灯フットプリントの形(拡散不足)**(シミュ peak/mean≈1.7 vs 実機≈1.2)=**形の一致を最優先**に方針転換([TEST_08](docs/06_TEST/TEST_08_面光源スケール軸バグの発見と修正.md)).**実機にディフューザー無しを確認**(むき出し LED+白筐体),実機の平らさは筐体多重反射由来.bottom 単灯 spp=1024 で max_depth 分解(実験1)と反射率スイープ(実験2)を実施→**いずれも形を平らにできず**(実機 1.22 に対し d16 で 1.65・R0.98 で 1.44 止まり,NCC 改善せず)=**混ぜ具合は本筋でなく,形の残差は B1 筐体幾何(箱の閉じ漏れ)に絞り込み**.次は幾何の漏れ点検(実験3)([TEST_09](docs/06_TEST/TEST_09_照明分布の形不一致の原因切り分け.md)).A1 非 Lambertian / A8 反射率 / A9 max_depth はクリア(数値改善のみ or 逆効果,ただし旧結論はバグ込みのため要再検証).詳細な経緯・設計判断・失敗パターンは [docs/PROGRESS.md](docs/PROGRESS.md). 実装済みモジュール: - `src/sm_tias_lightsim/uniformity.py` — Rec.709 輝度変換 + CoV/std/max-min(MiniTias-Evaluation コピー) diff --git "a/docs/06_TEST/TEST_09_\347\205\247\346\230\216\345\210\206\345\270\203\343\201\256\345\275\242\344\270\215\344\270\200\350\207\264\343\201\256\345\216\237\345\233\240\345\210\207\343\202\212\345\210\206\343\201\221.md" "b/docs/06_TEST/TEST_09_\347\205\247\346\230\216\345\210\206\345\270\203\343\201\256\345\275\242\344\270\215\344\270\200\350\207\264\343\201\256\345\216\237\345\233\240\345\210\207\343\202\212\345\210\206\343\201\221.md" new file mode 100644 index 0000000..c6b1181 --- /dev/null +++ "b/docs/06_TEST/TEST_09_\347\205\247\346\230\216\345\210\206\345\270\203\343\201\256\345\275\242\344\270\215\344\270\200\350\207\264\343\201\256\345\216\237\345\233\240\345\210\207\343\202\212\345\210\206\343\201\221.md" @@ -0,0 +1,120 @@ +# 照明分布の形不一致の原因切り分け (Shape Mismatch Root-Cause Investigation) + +本ドキュメントは,[TEST_08 面光源スケール軸バグ](TEST_08_面光源スケール軸バグの発見と修正.md) の修正後もなお残る**「照明分布の“形”が実機と一致しない」問題**について,原因を実験で切り分けていく継続記録である. + +> **最優先の判定基準**: 本調査は CoV/勾配などの**数値の絶対量ではなく,実機マップとの「形の一致」**を唯一の判定基準とする.形が一致しない限り「筐体を仮想的に変えて結果を予測する」というツール本来の目的(筐体改善の事前検討)が成立しないため.判定には実機マップを参照とした **NCC/SSIM + 視覚比較 + 放射プロファイル**を用い,peak/mean(中心の尖り具合)を補助指標とする. + +## 出発点 — バグ修正後も「形」は不一致 + +TEST_08 の面光源バグ修正で**灯間バランス(下灯 2.1×)は解消**したが,各単灯・合成の**分布の形**は実機と一致しないまま: + +- **実機 単灯**: ほぼ一様(peak/mean ≈ 1.2,放射プロファイルは中心 1.05 → 周辺 0.9 でほぼ平坦) +- **シミュ 単灯**: 中心が尖り(peak/mean ≈ 1.7)+上暗下明の縦勾配,周辺の落ち込みが急 + +比較図: `output/_slide_panels/sim_vs_real_shape_fixed.png` / `sim_vs_real_colormap_fixed.png` + +## 重要な前提確認 — ディフューザーは存在しない + +実機ハードの確認結果(ユーザー回答): + +- **LED カバー(`LED基板カバー*.stl`)は筐体と同じ不透明白材**(3D プリンタ白フィラメント,printer_white).光は透過しない. +- **LED とは別のディフューザー(すりガラス・乳白アクリル・拡散シート等)は一切挟んでいない**. +- → 実機は **むき出し LED + 白い筐体のみ**. + +含意:**実機単灯のあの「平らさ」を作っているのは光学部品ではなく,白い筐体内の多重反射(積分球的な拡散)**でしかありえない.逆に言えば,形を再現する鍵は新部品ではなく**筐体(反射+幾何)の正しいモデル化**にある. + +## 重要な注意 — 過去の「形は変わらない」結論はバグ込み + +[PROGRESS](../PROGRESS.md) に記録された「**A8 反射率・A9 max_depth・A1 BSDF を振っても形は変わらない**」という Step 8-14 の結論は,**すべて面光源バグ(2m 縦長ストリップ)が入った状態で得たもの**であり,TEST_07 と同様に**再検証が必要**.特に「筐体が光をかき混ぜて平らにする」効果は反射回数・反射率に依存するはずで,バグで巨大ストリップが支配していたため形が動かなかった可能性がある.本調査は**修正後の正しい LED で**やり直す. + +## 実験1 — bottom 単灯 max_depth バウンス分解(spp=1024) + +### 目的・条件 + +「形を平らにするレバーが現エミッタで存在するか」を確かめる第一歩.**bottom 単灯のみ・spp=1024 固定**で,**max_depth 以外をすべて一定**にし,反射回数を `{1, 2, 4, 8, 16, 32}` で振る.「バウンスを増やすほど実機の平らな形に近づくか/頭打ちか」を見る. + +- config: `configs/_tmp_depth_bottom/d{1,2,4,8,16,32}.yaml`(`_tmp_sanity_1024/scene_bottom.yaml` ベース,max_depth のみ変更) +- 出力: `output/depth_bottom/d{N}/luminance.npy` +- 比較図: `output/_slide_panels/depth_bottom_shape.png` + +### 結果 + +| max_depth | mean | peak/mean | SSIM(対実機) | NCC(対実機) | +| --- | --- | --- | --- | --- | +| 1 | **0.000(真っ暗)** | – | – | – | +| 2 | **0.000(真っ暗)** | – | – | – | +| 4 | 1.474 | 2.223 | 0.428 | 0.690 | +| 8 | 3.484 | 1.815 | 0.425 | 0.688 | +| 16 | 4.678 | **1.653** | 0.396 | 0.670 | +| 32 | 4.904 | **1.657** | 0.397 | 0.666 | +| **実機 bottom** | – | **1.218** | – | – | + +### 読み取れること + +1. **depth=1, 2 が完全に真っ暗(mean=0)** → LED は板に背を向けており(emitter 法線 -Z,板は +Z 側),**板は完全に間接光のみ**で照らされる(3〜4 回反射してようやく到達).TEST_08 で示した「LED は板と反対を向き間接光で照らす」を実証. +2. **バウンスを増やすと多少は平らになる**(peak/mean 2.22 → 1.65)が,**depth=16 で完全に頭打ち**(d16 と d32 がほぼ同一:1.653 vs 1.657,NCC 0.670 vs 0.666). +3. しかし**頭打ちの到達点(peak/mean 1.65)が実機(1.22)に全く届かない**.NCC も 0.67 で頭打ち(むしろ深さとともに微減).上暗下明の縦勾配も最後まで消えない. + +### 解釈 + +- **「混ざり不足(バウンス不足)」は原因ではない**.反射を理論上限(d32)まで積んでもシミュは尖ったまま. +- **完全に閉じた白い箱なら,無限反射で必ず均一(積分球)になる**はず.シミュが d32 でも尖り+縦勾配を残す=**光が箱内で混ざりきる前にどこかへ逃げている**=**シミュ筐体が実機ほど閉じていない(壁の欠け・隙間・開口)**疑いが濃厚. +- → 形の残差の本筋は **B1 筐体幾何**側にある可能性が高い,と実験で絞り込めた(反射回数では詰められない). + +## 実験2 — bottom 単灯 反射率スイープ(spp=1024, d=16) + +### 目的・条件 + +実験1で「混ぜ不足ではない」と分かったため,**「反射率が足りないだけ」なのか「幾何が漏れている」のか**を切り分ける.**bottom 単灯・spp=1024・max_depth=16 固定**(実験1で d16≈d32 と反射飽和を確認済み)で,筐体材 `printer_white` の反射率を `{0.85, 0.90, 0.95, 0.98}` に上げる.holder_dark(0.5)・phone_body_dark(0.05) は据え置き. + +- config: `configs/_tmp_refl_bottom/r{90,95,98}.yaml`(R=0.85 は実験1の `output/depth_bottom/d16` を再利用) +- 出力: `output/refl_bottom/run_r{90,95,98}/luminance.npy` +- 比較図: `output/_slide_panels/refl_bottom_shape.png` +- 判定: 閉じた箱なら R↑で一気に平ら(実機方向)→ 反射率の問題/漏れた箱なら R↑でも尖ったまま → 幾何(閉じ漏れ)が確定 + +### 結果 + +| R (printer_white) | mean | peak/mean | top/bot | SSIM(対実機) | NCC(対実機) | +| --- | --- | --- | --- | --- | --- | +| 0.85 | 4.678 | 1.653 | 0.867 | 0.396 | 0.670 | +| 0.90 | 6.594 | 1.602 | 0.878 | 0.411 | 0.659 | +| 0.95 | 9.468 | 1.460 | 0.888 | 0.410 | 0.649 | +| 0.98 | 11.874 | 1.441 | 0.894 | 0.415 | 0.640 | +| **実機 bottom** | – | **1.218** | **0.931** | – | – | + +### 読み取れること + +1. **R を上げると確かに少し平らになる**(peak/mean 1.65→1.44,縦勾配 top/bot 0.867→0.894 で実機方向). +2. **しかし R=0.98(3D プリンタ白では非現実的に高い値)でも peak/mean 1.44 止まりで,実機 1.22 に届かない**. +3. **肝心の形の一致度(NCC)は改善しない**(0.670→0.640 でむしろ微減).SSIM もほぼ横ばい(0.40→0.42). + +### 解釈 + +- **反射率も「形の本筋」ではない**.実験1(バウンス回数)と実験2(反射率)で,**「筐体が光をかき混ぜる強さ」を司る 2 つのレバーを両方とも上限まで振っても,シミュは実機の平らさに構造的に届かない**ことが確定.NCC が頭打ち=形の不一致は混ぜ具合では埋まらない. +- 反射率を上げても recirculation が効ききらない=**箱が閉じておらず光が逃げている**疑いが,実験1(無限バウンスでも尖り+縦勾配が残る)と整合して裏付けられた. +- → **形の残差の本筋は B1 筐体幾何(光の入り方・箱の閉じ方)に絞り込まれた**. + +## 2 実験の総括と次の予定 + +| レバー | 実験 | 形への効果 | 判定 | +| --- | --- | --- | --- | +| 反射回数 max_depth | 実験1 | d16 で頭打ち,peak/mean 1.65 止まり | 本筋でない | +| 反射率 R | 実験2 | R=0.98 でも 1.44 止まり,NCC 改善せず | 本筋でない | +| **筐体幾何 B1** | 実験3(予定) | — | **最有力** | + +### 次(実験3)— 幾何の漏れ点検 + +「光がどこから逃げているか/箱が閉じているか」を直接調べる: + +- **漏れの定量化**: bottom 単灯で,放出フラックスのうち何割が評価板に届き,何割が開口から外へ逃げているかを測る +- **閉じテスト**: シミュ筐体の開いている面(センサ側開口など)を仮の白壁で塞いで再レンダ → 平らになれば「閉じ漏れ」が原因と確定 + +### 補足 — 実機の平らさの素性確認(実験3 前に要検討) + +実機マップは **LSC 補正済み**(`dng_luminance(apply_lsc=True)`).LSC はレンズ周辺減光を割り戻す処理で**本来は照明分布を平らにしない**はずだが,「実機の平らさが本物の照明分布か,処理由来か」を実験3 前に一度確認しておくと安全([TECH_07 LSC 取り扱い方針](../05_TECH/TECH_07_LSC取り扱い方針.md) 参照). + +## 関連ドキュメント + +- [TEST_08 面光源スケール軸バグの発見と修正](TEST_08_面光源スケール軸バグの発見と修正.md) — 本調査の前提(バグ修正で灯間バランスは解決済み) +- [TEST_07 LED グループ別動作確認](TEST_07_LEDグループ別動作確認.md) — バグ込みの旧結論(訂正済み) +- 実機入力: `lightsim/luminance_maps/bottom_*.npy`(単灯実測,`.gitignore` 対象) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index e84171f..0e5f7f8 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -61,3 +61,7 @@ - **検証 (spp=1024, max_depth=16)**: 灯間 mean 比は bottom 2.099→**1.000(最暗)** / left 1.000→1.028 / right 1.000→1.026 となり,**実機の「3 灯均等・下灯最暗」順序に一致**.線形性(単灯和≈全灯)誤差 0.34%.全灯合成 linear CoV は **0.1815→0.1641**(公式 sm-evaluate,残差 2.63×→2.36×)の**小改善にとどまる**.center/周辺比・勾配はほぼ不変. - **論点の移動**: 灯間バランス問題は解決したが,**残る不一致は各単灯フットプリントの拡散不足**(修正後 peak/mean≈1.7 vs 実機≈1.2,シミュは中央尖り+上暗下明,実機はほぼ一様).本筋は**配光 ξ/ディフューザー拡散のモデル化**へ移った.成果物: 修正後出力 `output/{sanity_fix_1024,baseline_fix_1024}/`,比較図 `output/_slide_panels/{sim_vs_real_shape_fixed,sim_vs_real_colormap_fixed}.png`,記録 [TEST_08](06_TEST/TEST_08_面光源スケール軸バグの発見と修正.md). - **過去結論の訂正**: [TEST_07](06_TEST/TEST_07_LEDグループ別動作確認.md) の「下灯 2.1× は直接光効率の幾何的優位で物理的に正しい/意図した設計」は**誤り**(バグ込み出力を物理で後付け正当化していた).TEST_07 冒頭に訂正注記を追加.**教訓**: シミュ出力を物理で後付け説明するとバグを設計意図と取り違える危険があり,実機グラウンドトゥルースとの灯ごと突合が有効だった.なお `lightsim/` は実測入力として `.gitignore` 対象. +- **照明分布の「形」不一致の原因切り分け開始 — 混ぜ具合では詰められず B1 幾何に絞り込み (2026-06-29)**: バグ修正後も残る「形が実機と一致しない」問題(実機単灯は peak/mean≈1.2 のほぼ一様,シミュは≈1.7 で中央尖り+上暗下明)を,**形の一致(実機マップ参照の NCC/SSIM+視覚+放射プロファイル)を唯一の判定基準**に切り分け開始.[TEST_09](06_TEST/TEST_09_照明分布の形不一致の原因切り分け.md) に記録.**前提確認**: 実機は **LED カバー=筐体と同じ不透明白材・別ディフューザー無し**(ユーザー確認)=むき出し LED+白筐体のみ → 実機の平らさは筐体多重反射(積分球的拡散)由来でしかありえず,鍵は新部品でなく筐体(反射+幾何)のモデル化.**重要**: 過去 Step 8-14 の「A8/A9/A1 を振っても形は変わらない」はすべて面光源バグ込みの結論で,TEST_07 同様に要再検証. + - **実験1(bottom 単灯 spp=1024 max_depth バウンス分解 {1,2,4,8,16,32})**: depth=1,2 が**真っ暗(mean=0)**=LED は板に背を向け **板は完全に間接光のみ**(3〜4 反射でやっと到達).バウンス増で多少平らになるが **d16 で頭打ち**(d16≈d32),到達点 peak/mean **1.65** が実機 **1.22** に届かず・NCC 0.67 頭打ち.**混ぜ不足は原因でない**.完全閉箱なら無限反射で均一化するはずが尖り+縦勾配が残る=**光が混ざりきる前に逃げている**疑い.出力 `output/depth_bottom/d{N}/`,図 `output/_slide_panels/depth_bottom_shape.png`. + - **実験2(bottom 単灯 spp=1024 d=16 反射率スイープ R={0.85,0.90,0.95,0.98})**: R↑で少し平ら(peak/mean 1.65→1.44,縦勾配 top/bot 0.867→0.894 で実機方向)だが **R=0.98(非現実的高反射)でも 1.44 止まりで実機 1.22 に届かず,NCC は改善せず微減**(0.670→0.640).**反射率も本筋でない**.出力 `output/refl_bottom/run_r{90,95,98}/`,図 `output/_slide_panels/refl_bottom_shape.png`. + - **総括**: 「筐体が光をかき混ぜる強さ」を司る 2 レバー(反射回数・反射率)を両方上限まで振っても形は実機の平らさに構造的に届かない → **形の残差の本筋は B1 筐体幾何(光の入り方・箱の閉じ漏れ)に絞り込み**.次は実験3(漏れの定量化/開口を白壁で塞ぐ閉じテスト).補足: 実機マップは LSC 補正済みのため,実験3 前に「実機の平らさが本物の照明分布か処理由来か」を一度確認すると安全.