本ドキュメントは MiniTIAS 実機(baseline 1 枚 MiniTIAS_20260408_144434)に対するシミュレーション結果の キャリブレーション と 検証イテレーション を時系列で記録する.
目的:
関連ドキュメント:
reference_measurement/MiniTIAS_20260408_144434/baseline 1 枚(MiniTIAS_20260408_144434,ROI 1400×1409,sRGB 符号化済み Y' luma):
| 指標 | 値 |
|---|---|
| mean | 146.71 |
| CoV | 0.0427 |
| 勾配 % | 6.10 |
| 中心/周辺比 (C/P) | 1.0650 |
| std | 6.26 |
| max/min 比 | 1.392 |
評価は sm-evaluate で実施.シミュ側の比較は OETF 順方向適用後(Step 8-3 以降)に sRGB ドメインで行うのが正式.linear ドメイン比較は Step 8-3 以前または同一条件シミュ間の検証用.
時系列での主要指標推移.残差倍率 = (シミュ - 実測) / (初期残差 - 実測) として「初期からどれだけ縮まったか」を見る.
| Step | 設定 | 空間 | mean | CoV | 勾配% | C/P | CoV 残差倍率 |
|---|---|---|---|---|---|---|---|
| 実測 TARGET | — | sRGB | 146.71 | 0.0427 | 6.10 | 1.065 | 1.0× |
| 8-1 spp=128 | R0.85, d8, linear | linear | 151.79 | 0.236 | 24.83 | 1.330 | 5.5× |
| 8-1 spp=1024 (基準確定) | R0.85, d8, linear | linear | 152.02 | 0.183 | 24.72 | 1.328 | 4.3× |
| 8-2 R=0.92 sweep | R0.92, d12, linear | linear | — | 0.170 | 19.42 | 1.241 | 4.0× |
| 8-3 OETF 適用 | R0.85, d8, spp1024 | sRGB | 146.71* | 0.089 | 12.57 | 1.144 | 2.1× |
| 8-3 OETF + R=0.92 + d=12 | R0.92, d12 | sRGB | 146.71* | 0.081 | 9.72 | 1.108 | 1.9× |
| 8-7 size 1.5×1.5 (Φe 保存) | linear, R0.85, d8 | linear | 429.99 | 0.186 | 26.21 | 1.355 | (形状指標 ≈ 8-1) |
* mean アンカー固定.R, d, spp は reflectance, max_depth, samples_per_pixel.
最大の跳躍は 8-3 OETF(残差 4.3× → 2.1×).現時点の確定基準は R=0.85, d=8, spp=1024, OETF=on で残差 2.1×.残る 1.6〜1.9× の残差は LSC(ISP レンズシェーディング補正) が主因候補(未対処,Step 8-N 候補 参照).
日付: 2026-05-18
背景・問題意識: 初期シミュ(spp=128)と実測の差が CoV 0.236 vs 0.0427 ≈ 5.5 倍 と大きすぎる.これは MC ノイズなのか,物理モデルの構造的勾配なのか,切り分けないと方向性が定まらない.
仮説(物理動機): モンテカルロノイズは 1/√spp で減衰する独立成分.一方,物理由来の空間勾配は spp 非依存.spp を 8 倍にすればノイズ成分の寄与が 1/√8 ≈ 35% に減るので,残った差が「物理」だと確定できる.
試した変更: configs/scene_baseline.yaml の render.spp を 128 → 1024(8 倍).他は据え置き.
期待した効果: ノイズ系指標(max/min, std, CoV の量子化的外れ値成分)は減少.勾配や中心/周辺比は spp 非依存なら不変.
実際の結果:
| 指標 | spp=128 | spp=1024 | 動いた量 |
|---|---|---|---|
| CoV | 0.236 | 0.183 | -22% |
| std | 35.83 | 27.85 | -22% |
| max/min 比 | 11.59 | 4.27 | -63%(極端な外れ値が消えた) |
| mean | 151.79 | 152.02 | ≈ 不変 |
| 中心/周辺比 | 1.330 | 1.328 | ≈ 不変 |
| 勾配 % | 24.83 | 24.72 | ≈ 不変 |
解釈: max/min, std, CoV はノイズ由来成分を含んで動いた.中心/周辺比と勾配 % は spp 非依存 → 物理由来の構造的勾配.ノイズ分解 std² = 信号² + ノイズ²,ノイズ ∝ 1/√spp で逆算すると spp=1024 の残留ノイズ std ≈ 8.5,真の物理信号 std ≈ 26.5.spp→∞(ノイズゼロ)でも CoV は ≈ 0.174 までしか下がらない(実測 0.0427 の約 4 倍).
学び: spp を増やしても CoV は 0.183 → 0.174 程度で頭打ち.spp 増加は費用対効果なし.残差 4.3× は物理モデル要因と確定.spp=1024 を基準として確定.
次のアクション: 物理モデル側を疑う.最も効きそうな反射率を振る → Step 8-2 へ.
日付: 2026-05-18
背景・問題意識: 8-1 で「物理モデル要因」と確定.MiniTIAS は白筐体内壁の多重反射で照明を均一化する設計なので,内壁反射率が直接効くはず.暫定 0.85 が低めの可能性.
仮説(物理動機): 反射率↑ → 多重反射光(より均一な ambient 成分)↑ → 評価板全体が均一に近づく.インテグレーティングスフィア近似 1/(1-R) で R=0.85 → 0.92 で実効反射が 6.7 → 12.5(+88%).
試した変更: materials.printer_white.reflectance を 0.75, 0.80, 0.85(基準), 0.90, 0.92 の 5 点で振る.spp=256, depth=12, linear ドメイン評価.
期待した効果: 単調改善.実測 (CoV=0.0427) に近づける R を見つける.
実際の結果:
| R | CoV | 勾配 % | C/P |
|---|---|---|---|
| 0.75 | 0.2173 | 25.91 | 1.350 |
| 0.80 | 0.2034 | 24.00 | 1.316 |
| 0.85(基準) | 0.1893 | 22.08 | 1.283 |
| 0.90 | 0.1753 | 20.15 | 1.252 |
| 0.92(マット白プラ実用上限) | 0.1697 | 19.42 | 1.241 |
解釈: 全指標が R に対し単調・線形に改善するが感度が低い(∂勾配/∂R ≈ −38 %/単位,linear).実測 (CoV=0.0427) 到達には外挿で R ≈ 1.2〜1.4 が必要 = 物理範囲外.
学び: 反射率は弱い二次レバー.これ単独では差を閉じられない.構造的に違う何か(評価方法・座標系・ドメイン)を疑うべき.
次のアクション: もっと大きな自由度を持つレバーを探す.評価方法自体を疑う → Step 8-3 へ.
日付: 2026-05-18 頃(コミット 26904da)
背景・問題意識: 反射率スイープでも残差 4× を解消できない.「シミュ linear と実測 sRGB を直接比較」が成立しているか改めて疑った.実測データ提供側 README にも「シミュを線形のまま比較すると勾配/CoV の絶対値は変わる」と明示されていた(見落としていた).
仮説(物理動機): 実測 PNG は実機 ISP の sRGB ガンマ(OETF, IEC 61966-2-1) が掛かった非線形符号化値(Camera2 YUV_420_888 → BT.601 は定義上ガンマ済み R'G'B' 上の量).シミュは linear.「無次元指標はスケール不変」は線形変換のみ成立,非線形 OETF 下では成立しない(Σwᵢ·f(xᵢ) ≠ f(Σwᵢ·xᵢ)).OETF を順方向適用してドメインを揃えれば,物理量差ではなく「符号化ドメイン不一致」だった分が消える.
試した変更:
src/sm_tias_lightsim/evaluation/oetf.py を新規実装(標準 sRGB OETF + 露出ソルバ).EvaluationConfig.oetf スキーマ追加(SPEC_02 参照).sm-evaluate に統合.ROI 抽出後・指標算出前に OETF を順方向適用.configs/eval_baseline.yaml で有効化.configs/eval_real.yaml は非適用(実測 PNG への二重適用禁止).期待した効果: ガンマ非線形性で「同じ物理だが見かけが違う」分が解消,残差が大きく縮む.データに合わせて回す係数はゼロ.
実際の結果:
| ソース | 空間 | CoV | 勾配 % | C/P |
|---|---|---|---|---|
| R0.85, d8, spp1024 | linear | 0.183 | 24.65 | 1.327 |
| 〃 | sRGB | 0.089 | 12.57 | 1.144 |
| R0.85, d12, spp256 | sRGB | 0.091 | 11.16 | 1.126 |
| R0.92, d12, spp256 | sRGB | 0.081 | 9.72 | 1.108 |
| 実測 TARGET | sRGB | 0.0427 | 6.10 | 1.0650 |
解釈: 見かけ差の約 2/3 が符号化ドメイン不一致だったと判明.無彩色シーンでは「linear RGB → チャネル別 OETF → Rec.709 加重和」と「luminance 直接 OETF」が厳密一致(Rec.709 重みは合計 1,R=G=B の無彩色画素では Σwᵢ·f(x) = f(x) = f(x·Σwᵢ)).OETF は不整合を作るのではなく 消す操作.OETF 前のシミュ linear luma と実測 sRGB luma は別ドメインだった.
学び:
次のアクション:
26904da).max_depth=8 で打ち切ると 0.85^8 ≈ 27% のエネルギーが「未追跡」のまま残る.均一化に効く 後段多重反射 を取りこぼしている可能性.render.max_depth を 8 と 12 で比較レンダ.configs/scene_baseline.yaml の render.max_depth は 現状 8 のまま(既知差分 #8).--bake-max-depth 16 で render 設定から独立化(コミット a0fe07d).「2D 校正都合」と「3D 可視化忠実性」を分離.7181efa, c32ccd6, a0fe07d)src/sm_tias_lightsim/visualize/baker.py に mode="path"(scalar_rgb,コサイン重点 hemisphere MC,多重反射込み per-face 照度)追加.exclude_mesh_ids 対応.max_depth 引数で render 設定から独立.src/sm_tias_lightsim/visualize/viewer.py 全メッシュ統一着色(共有 lit-clim・log/linear・単一カラーバー・viridis・depth peeling)を既定化.--render <luminance.npy> で評価板への任意テクスチャ投影(E = π · L / ρ で壁と同一 W/m² スケール).--bake-cache <npz> で 1 回計算 → 以後即時.--cull-outward(既定 ON)で外向き ≈ 0 面を非描画.--bake-max-depth(既定 16)で render 設定から独立.--no-sensor-marker / --no-led-markers / --no-markers でマーカー個別非表示.sm-render/sm-evaluate(path tracer)で(校正済みの定量結果,不変)./implement).日付: 2026-05-27(コミット f5048a4)
背景・問題意識: SPEC_03 既知差分 #3「LED 1 個あたりの実 W 値が未検証」を残していた.現状 radiance=2807.247 は実測 mean アンカーで決まった校正値で,規格値からの導出ではない.LED 物性が確定すれば,独立に検証できる.
仮説(物理動機): 規格値から radiance を独立推定し,現校正値と並べる.大きく合えば 物理妥当性の担保,合わなければ何かのレバーの不確かさを炙り出せる(縮退の所在が分かる).
試した変更: LED Paradise 商品ページから物性取得.SPEC_03 LED セクションを拡張.
期待した効果: 校正値 2807 と規格推定が大きく合うか,どこに不確かさが残るかを明確化.
実際の結果: 規格値から radiance を独立計算
| ステップ | 値 |
|---|---|
| Φv(typ 中央値) | 17.5 lm |
| LER(4000K Ra98 典型値) | ≈ 280 lm/W |
| Φe = Φv / LER | 0.0625 W |
| A = 2.8 × 3.5 mm | 9.8 × 10⁻⁶ m² |
| 規格推定 L = Φe / (A·π) | ≈ 2030 W/(m²·sr) |
| 現状校正値 | 2807 W/(m²·sr) |
| 比 | 1.38× |
(1-0.85)/(1-0.89) = 1.36×(観測 1.38× とほぼ一致).R=0.89 はマット白プラ実用上限 0.92 の範囲内.解釈:
学び:
次のアクション: 次は LED 周辺幾何の検証(発光面サイズの妥当性)→ Step 8-7 へ.
日付: 2026-05-27
背景・問題意識: 「現実装はパッケージ外形 2.8 × 3.5 mm を発光面として使う」仮定が物理的に正しいか疑問.実 SMD 2835 の真の発光部は チップ + 蛍光体 ~1.5 × 1.5 mm(パッケージ面積の ~23%)のみで,周りは白プラスチック筐体(光らない).
仮説(物理動機,複数):
試した変更: configs/scene_baseline_emitter_real.yaml を Python ワンライナーで自動生成.
期待した効果: mean ≈ 不変,CoV/勾配/C/P/max-min/radial profile ≈ 不変(点光源近似が成立する遠方界).
実際の結果(linear,同条件):
| 指標 | 元 (2.8×3.5) | 検証 (1.5×1.5) | 比 | 評価 |
|---|---|---|---|---|
| mean | 152.52 | 429.99 | 2.82× | ⚠️ 予想外に大きく変化 |
| std | 27.85 | 80.12 | 2.88× | mean スケールに比例 |
| CoV | 0.1826 | 0.1863 | 1.02× | ✅ 形状指標 ≈ 不変 |
| 勾配 % | 24.65 | 26.21 | 1.06× | ✅ 形状指標 ≈ 不変 |
| C/P | 1.327 | 1.355 | 1.02× | ✅ 形状指標 ≈ 不変 |
| max/min | 4.28 | 4.36 | 1.02× | ✅ 形状指標 ≈ 不変 |
| 放射プロファイル中心/端 | 1.63 | 1.68 | 1.03× | ✅ 形状指標 ≈ 不変 |
画像保存先: output/baseline_linear_npy/ と output/emitter_real/(各 figures/luminance_map.png, radial_profile.png, histogram.png, zone_map.png).放射プロファイルの曲線形は目視で瓜二つ,色スケールのみ違う.
追跡調査: 予想外の 2.83× mean 上昇の機序を STL 幾何分析で追跡.
meshes/LED基板カバー.stl)は z=-66.6〜-64.1 の 2 階建て構造(天井梁 + 底板).解釈:
学び:
次のアクション:
configs/scene_baseline_emitter_real.yaml, configs/eval_baseline_linear.yaml, output/emitter_real/, output/baseline_linear_npy/ は 検証アーティファクトとして保持(後から再現できるように).evaluation/lsc.py 新規・eval スキーマ拡張・テスト)+ パラメータ推定(実機写真からの動径フィット)で 1〜2 日相当.イテレーション全体を俯瞰したときに残る判断指針:
数値指標 (CoV / 勾配 / C/P) は分布のばらつきを集約する量であり,「形そのもの」は捕えない.シミュレーションの「形」を実機に近づける観点は,指標残差の縮小とは別軸で追跡する必要がある.

実機 vs シミュ全 Step を並べて見て判明したこと:
Step 8-N 候補 (LSC 順方向モデル) は,単に「指標残差 1.6〜1.9× を縮める」だけでなく,「シミュの空間勾配パターンに動径補正を重ね,実機の中央ピーク形状を作る」根本的な構造的改善である.これは数値指標の改善より重要な観点で,以後の改善判断はこの 2 軸 (数値 + 形) で行う.
新規 Step 完了後はこの比較パネルを再生成して形の変化を追跡する:
uv run python scripts/build_luminance_evolution_panel.py
新規 Step を追加するには scripts/build_luminance_evolution_panel.py の PANELS リストに 1 エントリ追加するだけで自動で並ぶ.
output/ ディレクトリの索引)src/sm_tias_lightsim/evaluation/oetf.py(Step 8-3)src/sm_tias_lightsim/visualize/baker.py(Step 8-5)src/sm_tias_lightsim/visualize/viewer.py(Step 8-5)configs/scene_baseline_emitter_real.yaml(Step 8-7)configs/eval_baseline_linear.yaml(Step 8-7)output/emitter_real/(Step 8-7 検証レンダ)output/baseline_linear_npy/(Step 8-7 比較基準)scripts/build_luminance_evolution_panel.py(比較パネル生成スクリプト)docs/06_TEST/figures/luminance_map_evolution.png(生成された比較パネル画像)26904da(OETF 正規実装),7181efa / c32ccd6 / a0fe07d(3D ビュー改善),f5048a4(LED 物性反映)