Newer
Older
SmTIAS-LightSim / docs / 05_TECH / TECH_08_実機変更とシミュ側対応.md
@rintoHasegawa rintoHasegawa on 2 Jun 23 KB [update] TECH_08 「対応不要」を 2 タイプに細分化 — §許容している構造的差異 セクション新規追加.「対応不要」の理由を 2 種類に分類: タイプ I (本質構造同一・Mitsuba に対応概念なし) = AWB/NR/EDGE/LSC/量子化 等.タイプ II (構造的差異あり・白板で許容) = AF/絞り口径食/ピクセル積分/センサノイズ/QE 波長依存/シャッター方式/温度依存.特に AF (CONTROL_AF_MODE=OFF 固定焦点) を §II-1 焦点モデル として独立詳述: 実機 perspective + 固定焦点で被写界深度 (DoF) と焦点ボケが存在する vs シミュ orthographic は全画素平行光線で焦点・DoF 概念なし (常に完璧合焦相当) という構造的な違いを明示.白板撮影では DoF 内固定 + 一様パターンで許容できるが「ゼロ影響」ではなく舌模型評価時や残差精緻化フェーズで再評価対象.他のタイプ II 項目 (II-2 絞り口径食 = lscMap で補正済 / II-3 ピクセル積分 = spp=1024 で緩和 / II-4 センサノイズ = 白板高輝度で相対影響小 / II-5 QE 波長依存・シャッター・温度・個体差) も白板許容理由を明示.対応マッピング表の AF 行を「対応不要・許容 (§許容している構造的差異 参照)」と再分類.サマリ表をタイプ I/II 区分で更新.Step 8-13 残差 2.63× の主因はタイプ II ではなくシミュ物理モデル誤差と推定する従来結論は維持.タイプ II 寄与は小さいが完全排除不能で,Step 8-14 以降の物理モデル精緻化と並行してタイプ II 独立評価の余地ありと記述.CLAUDE.md 進捗欄にタイプ I/II 分類と AF の構造的差異を追記

実機変更とシミュ側対応の整合マッピング (Device Setup Changes & Simulation-side Correspondence)

本ドキュメントは MiniTias 撮影アプリの定量モード導入に伴う 実機側撮影条件の変更に対して,SmTIAS-LightSim 側で どこを変える必要があったか/不要だったか を網羅的にマッピングしたものである.Step 8-13 で残差 2.63× が判明した際に「シミュ側の対応漏れではないか」を切り分けるために整理した結果である.

結論(先に) (Conclusion First)

実機側で 8 項目の設定変更を行ったが,シミュ側で実際に対応が必要だったのは「sm-evaluate の評価 config レベルでの OETF 無効化と mean アンカー調整」のみ.他の 7 項目はシミュ側に対応物が存在しない(Mitsuba は物理量を直接計算するため)か,既に等価ドメインに到達している.

観点結論
シミュ側対応漏れなし(15 項目以上で網羅チェック済み)
対応が必要だった項目2 項目: ガンマ補正(OETF)→ Step C' で対応済 / AE OFF(mean アンカー)
対応不要だった項目残り全項目.ただし 2 タイプに分かれる(後述)
タイプ I(本質構造同一)AWB / NR / EDGE / LSC / 量子化 等 — シミュと実機は本質的に同じ
タイプ II(許容している構造的差異)AF(焦点) / 絞り・口径食 / ピクセル積分 / センサノイズ 等 — 構造的差異はあるが白板撮影では影響軽微で許容
Step 8-13 残差 2.63× の解釈ISP 関連の対応漏れではなく,シミュ物理モデル誤差が主因.タイプ II の寄与は小さいが排除不能

背景・経緯 (Background)

実機側変更の経緯は別ドキュメントに記録済み:

段階内容ドキュメント
1MiniTias アプリに定量撮影モード追加(PNG → DNG,ISP オート → マニュアル制御)TECH_01
2MiniTias 側で実装完了.AQUOS sense3 は LEVEL_3 で全機能サポートTECH_03
3SHADING_MODE = HIGH_QUALITY 維持を決定TECH_04
4MiniTias-Evaluation 側で DNG 読み込み + LSC 順方向適用を実装TECH_05 / TECH_06
5LSC 取り扱いの設計判断を明文化TECH_07
6実機側変更全般に対するシミュ側対応の整合確認(本ドキュメント)TECH_08(本ファイル)

実機側 8 項目の変更一覧 (Device-Side Changes)

MiniTias 定量撮影モードで実機側に施した設定変更:

#設定過去(通常モード)新規(定量モード)目的
1画像フォーマットPNG (8-bit sRGB)DNG (10-bit RAW_SENSOR linear)量子化誤差・ガンマ非線形性の排除
2AWB(自動 WB)ONOFF(gains=1,1,1,1, identity matrix)色温度ドリフトの排除
3AE(自動露光)ONOFF(露光 1/60s 固定,ISO 40 固定)撮影ごとの露光変動の排除
4ガンマ補正sRGB OETF 適用CONTRAST_CURVE 線形(OETF なし)入射光量との比例性確保
5NR(ノイズ削減)デフォルト(多分 FAST)OFFアーティファクト排除
6EDGE(エッジ強調)デフォルト(多分 FAST)OFF偽エッジ排除
7LSC(レンズシェーディング補正)デフォルトHIGH_QUALITY 維持 + lscMap 取得後段で順方向適用するため取得
8LSC 順方向適用(ISP 内で完結)MiniTias-Evaluation 側で適用レンズビネット除去 → 照明ムラのみ評価

→ 撮影段階 (#1〜#7) + 評価段階 (#8) の合計 8 項目.詳細は各 TECH ドキュメント参照.

シミュ側の「3 層」構造 (Simulation 3-Layer Structure)

シミュ側を 3 層に分けると,各層がどの実機側変更に対応するかが明確になる:

層場所役割物理的意味
(α) Mitsuba シーン定義configs/scene_*.yaml, src/sm_tias_lightsim/scene/シーン構築・光線追跡物理量 (放射輝度 L, W/m²/sr) を計算
(β) sm-render CLIsrc/sm_tias_lightsim/cli/render.pyMitsuba 実行 + luminance.npy 出力物理量を float32 配列として保存
(γ) sm-evaluate CLIsrc/sm_tias_lightsim/cli/evaluate.py + configs/eval_*.yaml評価指標算出 + ドメイン整合実機との比較ドメインを合わせる

対応マッピング表 (Correspondence Table)

実機側 8 項目に対して,シミュ側 3 層 (α/β/γ) で何をしたかを網羅:

#実機側変更(α) シーン定義(β) sm-render(γ) sm-evaluate状態
1PNG → DNG(量子化)概念なしfloat32 出力(量子化なし)DNG 直接読みは MiniTias-Evaluation の責務対応不要
2AWB OFFper-channel 独立計算(AWB 概念なし)——対応不要
3AE OFF露光時間概念なし—mean アンカーで実機 mean=207.82 にスケール調整(既存 normalization 機能で対応)対応済 (γ)
4ガンマ補正なしlinear radiance を計算linear のまま保存OETF セクションを config に書かない(Step C' で対応)対応済 (γ)
5NR OFFNR をかけない——対応不要
6EDGE OFFエッジ強調しない——対応不要
7LSC HIGH_QUALITY 維持orthographic で cos⁴ falloff を持たない(TECH_07 §物理的根拠 参照)——対応不要(構造的に等価)
8LSC 順方向適用(実機側で実施)———対応不要(実機側で完結)

→ シミュ側で実際に対応した項目は #3 と #4 のみ.いずれも sm-evaluate の config レベルで完結.Mitsuba シーン定義 (α) も sm-render (β) も 無変更.

各項目の詳細解説 (Per-Item Details)

#1 PNG → DNG (量子化・ビット深度)

実機: PNG (8-bit sRGB, 0-255) → DNG (10-bit linear, 0-1023, 黒レベル 64 で実効 0-959) シミュ: Mitsuba は float32 で放射輝度 L (W/m²/sr) を出力.量子化なし. 理由: Mitsuba の物理計算は連続値.量子化はそもそも持ち込まないので「対応不要」.

なお,DNG の直接読み込みは MiniTias-Evaluation の責務(TECH_07 §役割分担 参照).sm-evaluate にも dng_loader.py をコピーで持っているが(S2 で実装),これは将来の検証用ツールであり,本流評価では使わない.

#2 AWB OFF

実機: gains=1,1,1,1 + identity color matrix.ISP の AWB 補正を無効化. シミュ: Mitsuba の path integrator は per-channel 独立で物理量を計算.R/G/B チャネル間の混合はそもそも行わない.AWB の概念がない. 理由: シミュは最初から「AWB OFF 相当」.「対応不要」.

#3 AE OFF(露光時間 / ISO 固定)

実機: 露光時間 1/60s + ISO 40 固定.mean = 207.82(白板撮影). シミュ: Mitsuba は露光時間の概念を持たない.物理量 (W/m²/sr) を直接出力.絶対値スケールは実機と直接比較できない. 対応: evaluation/normalize.py の apply_mean_anchor() で mean アンカー正規化.configs/eval_baseline_dng_target.yaml で normalization.target_mean: 207.82 を指定.線形ゲインなので形状指標 (CoV/勾配/中心-周辺/動径 min/max) は厳密に不変.→ (γ) で対応済.

既存 evaluation/normalize.py は Step 8-8 で実装済み.新規 config で値を 207.82 に設定するだけで対応完了.

#4 ガンマ補正なし(最重要対応項目) {#step-c-での対応}

実機: TONEMAP_MODE = CONTRAST_CURVE 線形.sRGB OETF (γ ≈ 2.2) を適用しない.画像値は入射光量に比例 (linear). シミュ: Mitsuba は元から linear radiance を出力.

過去の問題(Step 8-3 当時): 実機 PNG が sRGB ドメイン,シミュが linear ドメインで ドメイン不一致.これを揃えるため sm-evaluate に OETF 順方向適用ステップを追加した(evaluation/oetf.py).

現在の対応: 実機 DNG が linear になった今,シミュ側でも OETF を適用すると逆にドメイン不一致になる.したがって OETF を sm-evaluate で適用しないよう新規 config を作成.具体的には configs/eval_baseline_dng_target.yaml で oetf: セクションを 意図的に書かない(既定で無効).

ConfigOETF用途
configs/eval_baseline.yaml有効 (oetf.enabled: true)過去 Step 8-1〜8-7 の sRGB 比較用(歴史的設定として保持)
configs/eval_baseline_linear.yaml無効Step 8-8〜8-12 の linear 比較用(target_mean=146.71)
configs/eval_baseline_dng_target.yaml無効Step 8-13 以降の新方針(target_mean=207.82)
configs/eval_real.yaml無効実機 PNG 評価用(過去再現)

→ (γ) で対応済.既存 OETF 機能は無効にして使うだけ.コード変更なし.

#5 NR OFF

実機: Camera2 API の NOISE_REDUCTION_MODE = OFF.センサ raw に近い値を保持. シミュ: Mitsuba の path tracer は物理計算のみで NR をかけない. 理由: シミュは最初から「NR OFF 相当」.「対応不要」.

#6 EDGE OFF

実機: Camera2 API の EDGE_MODE = OFF.エッジ強調による偽の高周波成分を排除. シミュ: Mitsuba はエッジ強調しない. 理由: 「対応不要」.

#7 LSC HIGH_QUALITY 維持

実機: SHADING_MODE = HIGH_QUALITY(ISP の LSC 補正が有効).ただし DNG (RAW_SENSOR) は LSC 未補正で出力され,lscMap が meta.json に保存される. シミュ: Mitsuba orthographic sensor は全画素平行光線で,物理 cos⁴ falloff を そもそも持たない.「ISP が完璧に LSC 補正できた場合の理想値」と構造的に等価.

詳細は TECH_07 §物理的根拠 参照.対応不要(構造的に等価).

#8 LSC 順方向適用(実機側で実施)

実機側 (MiniTias-Evaluation): DNG 読み込み後に lscMap を画像解像度にバイリニア補間して順方向乗算.レンズビネット除去. シミュ: 上記 #7 の通り,シミュは cos⁴ falloff を持たないので適用不要. 理由: 実機側で完結.「対応不要」.

追加チェック項目 (Additional Items)

念のため,議論に出ていない実機側設定でもシミュ側影響を確認した:

実機側設定シミュ側影響対応要否
CONTROL_MODE: OFF(マニュアル全制御)Mitsuba は ISP 概念なし不要
SENSOR_FRAME_DURATION: 30fps 相当Mitsuba はフレームレート概念なし不要
BLACK_LEVEL_LOCK: trueDNG 読み込み時に黒レベル除去(rawpy が自動)不要(読み込み側で対応)
COLOR_CORRECTION_GAINS: 1,1,1,1per-channel 独立計算不要
COLOR_CORRECTION_TRANSFORM: identity同上不要
CONTROL_AF_MODE: OFF(固定焦点)Mitsuba orthographic は焦点概念なし(無限遠相当)対応不要・許容(§許容している構造的差異 参照)
CONTROL_VIDEO_STABILIZATION_MODE: OFFシミュに振動概念なし不要

→ 追加で 7 項目チェックしたが,すべて対応不要 or 許容範囲.計 15 項目以上で網羅チェック済み.

ただし AF モードは厳密にはシミュと実機の 構造的な違い(実機 perspective + 固定焦点 vs シミュ orthographic 無限遠相当)であり,「対応物が存在しない」AWB/NR/EDGE と同列ではない.次節で「許容している差異」として明示的に分類する.

許容している構造的差異 (Accepted Structural Differences)

上記までの「対応不要」項目は,理由を 2 種類に分類できる:

タイプ説明例
タイプ Iシミュと実機の 本質的構造が同じ.Mitsuba の物理計算に対応概念がそもそも存在しないAWB / NR / EDGE / LSC (orthographic で自然対応)
タイプ IIシミュと実機に 構造的な違いが存在する.ただし白板撮影では影響が小さく許容しているAF / 絞り / ピクセル積分 など

タイプ II は「対応不要」ではあるが,Step 8-13 残差 2.63× の要因候補として残っている可能性がある.「許容している」は「ゼロ影響」ではなく「影響は小さいと仮定している」という意味であり,将来の物理モデル精緻化で再評価すべき項目である.

II-1. 焦点モデル (AF / Focus)

実機: AQUOS sense3 のフロントカメラは 固定焦点(CONTROL_AF_MODE = OFF のみサポート,無限遠ハイパーフォーカル相当 0.8189).perspective レンズで物体距離に依存した焦点が存在し,被写界深度(DoF)が定義される.

シミュ: Mitsuba orthographic sensor は全画素が平行光線で,焦点・被写界深度の概念がない.すべての画素位置が常に「完全に合焦」した状態でサンプリングされる.

構造的な違い:

  • 実機は被写体距離が DoF を外れると 焦点ボケで輝度の空間滲みが発生
  • シミュは焦点ボケがない(完璧合焦相当)

白板撮影では許容できる理由:

  • 評価板(白板)はアタッチメント内で 固定位置にあり,常に DoF 内
  • 白板自体が「ボケても変わらない一様パターン」なので焦点ボケの影響は実質ゼロ
  • 仮に若干のボケがあっても,照明ムラ(CoV / 勾配等)の指標値には大きく効かない

将来の物理モデル精緻化で再評価する条件:

  • 評価対象を白板から 舌模型・舌に変えた時(DoF が問題になる可能性)
  • 残差 2.63× の主因切り分けで他要因を潰した後(最後の候補として)

II-2. 絞り・口径食 (Aperture / Vignetting)

実機: 固定 F 値の絞りを持つ.レンズ通過時に物理 cos⁴ falloff(口径食)が発生.

シミュ: Mitsuba orthographic は絞りを持たず,cos⁴ falloff も発生しない.

構造的な違い:

  • 実機は周辺ほど暗い物理 cos⁴ falloff
  • シミュは完全に均一に光線取得

白板撮影では許容できる理由:

  • 実機側で lscMap 順方向適用により ISP の補正(≒ 物理 cos⁴ の逆)が掛かる(TECH_07 参照)
  • 結果,両者は「LSC 完璧補正後の理想値」相当のドメインに揃う
  • ISP 補正残差は若干残るが,現状の評価精度では許容範囲

将来の精緻化条件:

  • TECH_04 フォールバック条件 C1〜C3 のいずれか発動時

II-3. センサ ピクセル積分 (Sensor Pixel Integration)

実機: 各画素は有限面積でセンサ表面に到達した光を積分する(ピクセル積分).

シミュ: Mitsuba は画素中心で点サンプリング + 多重サンプリング(spp)で評価.

構造的な違い:

  • 実機は画素サイズで空間積分(ローパスフィルタ的効果)
  • シミュは点サンプリングのため,原理的にエイリアシング可能性あり(spp で緩和)

白板撮影では許容できる理由:

  • spp=1024 で十分な多重サンプリング
  • 白板は低空間周波数のシーン(一様パターン)でエイリアシング感度低
  • ROI 内で平均化される指標(mean / CoV / 勾配等)には影響軽微

II-4. 暗電流・読み出しノイズ (Dark Current / Read Noise)

実機: センサ固有の暗電流・読み出しノイズ・熱雑音.センサ温度や ISO 設定で変動. シミュ: Mitsuba にはセンサノイズ概念なし(MC 計算ノイズのみ).

構造的な違い: 実機にはセンサ起因のノイズフロアが存在.

白板撮影では許容できる理由:

  • 白板は 高輝度シーンでセンサノイズの相対影響は小(ショットノイズが支配的)
  • ISO 40 で読み出しノイズも最小化されている
  • 暗部の評価では効くが,白板評価では影響軽微

II-5. その他の許容差異

項目構造的差異白板で許容できる理由
量子効率の波長依存性実機は QE が波長で変化.シミュは RGB チャネル独立無彩色シーン(白板)では影響なし
シャッター方式実機はローリングシャッター歪み等可能性.シミュは瞬間取得静止白板撮影では影響なし
温度依存性実機センサは温度で挙動変化通常使用温度範囲で安定
センサ毎の個体差実機ごとに微差あり1 個体での評価では問題なし

タイプ I と II の対応マッピング再整理

§対応マッピング表 §追加チェック項目 を タイプ I / II で再分類すると:

区分項目
タイプ I(本質構造同一・対応概念なし)AWB OFF(#2) / NR OFF(#5) / EDGE OFF(#6) / LSC HIGH_QUALITY(#7) / LSC 順方向適用(#8) / 量子化(#1) / COLOR_CORRECTION_GAINS / COLOR_CORRECTION_TRANSFORM / CONTROL_VIDEO_STABILIZATION_MODE
タイプ II(構造的差異あり・白板で許容)CONTROL_AF_MODE(焦点モデル) / 絞り・口径食 / センサ ピクセル積分 / 暗電流・読み出しノイズ / QE 波長依存 / シャッター方式 / 温度依存
対応必要だった項目AE OFF(#3 = mean アンカー) / ガンマ補正(#4 = OETF 無効化)

残差 2.63× との関係

Step 8-13 残差 2.63× について:

  • タイプ I(対応概念なし)が原因の可能性は ゼロ(実機側で揃えた)
  • タイプ II(許容差異)が原因の可能性は 小さいが排除不能
    • AF: 白板評価では影響軽微と推定.ただし舌模型評価時は再考必要
    • 絞り口径食: lscMap 補正残差として若干寄与
    • ピクセル積分: spp=1024 で緩和済み
    • センサノイズ: 白板高輝度で相対影響小
  • シミュ物理モデル誤差(タイプ II とは別)が 最有力候補
    • 反射率精度・LED 配光モデル・メッシュ幾何精度等

つまり残差 2.63× の主因は タイプ II の許容差異ではなく,シミュ物理モデル誤差の側にある可能性が高い.それでもタイプ II の候補は完全には排除できないため,将来 Step 8-14 以降で物理モデル精緻化と並行して タイプ II 寄与の独立評価も検討する余地はある.

動作確認の根拠 (Verification Evidence)

Step C' 完了時の動作確認(uv run sm-evaluate --image output/baseline/luminance.npy --config configs/eval_baseline_dng_target.yaml)で以下を確認:

確認項目結果
新 config が正しく読み込まれる✓
mean アンカー正規化が動作(alpha=1.36257, シミュ mean を 152.52 → 207.82 に揃え)✓
OETF が適用されない(linear のまま)✓(コンソール出力に OETF 関連メッセージなし)
動径 min/max 比が出力される✓(radial min/max : 0.6151)
既存 569 + 新規 39 = 608 テスト全通過✓(Step D 完了時に確認済)

→ シミュ側 (γ) の対応が 正常動作することを確認.

Step 8-13 残差 2.63× の解釈(再確認) (Residual 2.63× Interpretation)

実機側 8 項目の変更に すべて整合させた上で Step 8-13 を計測した結果:

指標実機 (DNG+LSC)シミュ (Step 8-13)残差
CoV0.06950.18262.63×
勾配 %8.3524.652.95×
中心/周辺1.0911.327絶対差 0.236
動径 min/max0.8600.615絶対差 0.245

この残差は 以下のいずれでもない:

残差候補解消状況
ガンマ補正のズレ✓ 解消済(両者 linear)
AWB のズレ✓ 解消済(実機 identity, シミュ per-channel 独立)
AE のズレ(絶対値スケール)✓ 解消済(mean アンカーで揃え)
NR/EDGE のアーティファクト✓ 解消済(実機 OFF)
LSC のズレ✓ 解消済(実機側で順方向適用)
ガンマ圧縮による過小評価✓ 解消済(DNG linear で正直な値)

→ 残差 2.63× は ISP 関連の対応漏れではなく,シミュ側の物理モデル誤差が主因と推定.候補:

物理モデル要素想定される影響
反射率の精度(現状 R=0.85)多重反射量の精度 → 形状指標に直接影響
LED 配光モデル(現状 Lambertian)評価板への直接照射パターン → 中心/周辺比に影響
メッシュ幾何精度(mm 精度)多重反射経路の集積 → 全体的なムラ
LED 位置の精度過去 Step 8-9 で Fusion 360 STL から抽出済(ほぼ十分)
その他(センサ位置・FOV 等)過去 Step 8 で網羅試行済(影響軽微)

詳細な切り分けは別タスク(Step 8-14 以降の物理モデル精緻化)として残す.

TECH 系(設計判断)

TEST 系(試行検証)

SPEC 系(仕様)