diff --git a/CLAUDE.md b/CLAUDE.md index f699a95..bc6f8e2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -27,6 +27,7 @@ 補足: **MiniTIAS 側で定量モード実装完了(2026-06-01)**.[TECH_03 実装報告 (MiniTIAS 側原稿)](docs/05_TECH/TECH_03_定量モード実装報告とSHADING_MODE相談.md) と [TECH_04 SmTIAS-LightSim 側回答](docs/05_TECH/TECH_04_MiniTIASへの回答.md) を取り込み.**AQUOS sense3 (SH-02M) は `LEVEL_3`(最上位)でハードウェア能力フル**.Phase 1〜5 全完了で **DNG (RAW_SENSOR) 経路を第 1 優先採用**.撮影設定: 1/60s + ISO 40 + AWB/NR/EDGE/AF/AE OFF + TONEMAP 線形 + BLACK_LEVEL_LOCK + SHADING_MODE=HIGH_QUALITY (★) + STATISTICS_LENS_SHADING_MAP_MODE=ON.LSC マップは 13×17.保存ファイルは `MiniTIAS_QM_*.{dng, meta.json, preview.jpg}` 3 種,meta.json に LSC マップ・実適用値・センサ特性も埋め込み.**SHADING_MODE 判断**: HIGH_QUALITY を本流維持(Mitsuba orthographic 出力 ≒「ISP が完璧に補正できた場合の理想値」で HIGH_QUALITY DNG と直接比較が物理整合).OFF 切替は将来のフォールバック条件 C1-C3 発動時のみ.データ転送は **adb pull 推奨**(MTP は大容量 DNG で不整合リスク).既存実機 PNG の Y' 抽出は BT.601 係数(Rec.709 ではない)も判明. 補足: **作業フェーズを A/B に分割(2026-06-01)**.「連射再現性が確保できてもシミュとの対応が取れなければ意味が薄い」という研究上の判断から,**フェーズ A: 1 ショット撮影でシミュ vs 実機対応を先に検証** → **フェーズ B: 対応が取れたら連射 V1 再現性検証**の二段階方式に変更.フェーズ A で MiniTIAS 側に依頼するのは **画素統計・Hot pixel map(高優先 2 件)と白板 1 ショット試し撮りのみ**.**連射 UI は高優先→フェーズ B に降格**.SmTIAS-LightSim 側は DNG/meta.json/LSC マップ読み込み I/F・新規 baseline config を実装し,1 ショット突合で既存通常モード baseline 残差 2.1× が定量モードで変化するかを観察.結果次第でフェーズ B 移行 or SHADING_MODE フォールバック条件 C1 検討 or 物理モデル見直しを判断.[TEST_01](docs/06_TEST/TEST_01_キャリブレーション検証履歴.md) に **Step 8-13: 定量モード 1 ショット対応検証** として記録予定. 補足: **DNG 対応を MiniTias-Evaluation 側にも依頼(2026-06-01)**.PNG から DNG への撮影フォーマット変更に伴い,MiniTias-Evaluation も実機データの一次窓口として DNG 読み込み I/F の追加が必要.既存パターン(`uniformity.py` を MiniTias-Evaluation から SmTIAS-LightSim にコピー)を踏襲する役割分担を採用:**MiniTias-Evaluation 側で正規実装 → SmTIAS-LightSim 側にコピー**.[TECH_05 MiniTias-Evaluation DNG 対応要求仕様](docs/05_TECH/TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md) に要求書を作成.主要 I/F: `load_image_dng(path, demosaic, black_level, output_format)` / `load_metadata(path)` / `load_lsc_map(path)` / `load_hot_pixel_list(path)` / `mask_hot_pixels` / `apply_lsc_inverse`(将来検証用).既存 PNG 経路と並列対応(後方互換).依存追加: `rawpy>=0.21.0`.想定実装工数 ~3.5 日(6 Phase).完了後 SmTIAS-LightSim 側 Claude セッションで `src/sm_tias_lightsim/evaluation/dng_loader.py` 等にコピー.次のアクション: MiniTias-Evaluation 側 Claude セッションで TECH_05 を受領 → Phase 1 から `/implement`.SmTIAS-LightSim 側のフェーズ A 受け入れ実装は MiniTias-Evaluation 完了後に着手. +補足: **MiniTias-Evaluation 側 Phase 1 完了とハンドオフ受領(2026-06-01)**.MiniTias-Evaluation 側で TECH_05 Phase 1 (DNG 読み込み I/F) と LSC 順適用プロトタイプ・新指標 (動径 min/max 比) が完成し,ハンドオフパッケージとして SmTIAS-LightSim 側に渡された.受領記録は [TECH_06 MiniTias-Evaluation 引き継ぎ受領](docs/05_TECH/TECH_06_MiniTias-Evaluation引き継ぎ受領.md),関連分析は [TEST_05 PNG/DNG 評価比較](docs/06_TEST/TEST_05_PNG_DNG評価比較.md) と [TEST_06 外乱光影響評価](docs/06_TEST/TEST_06_外乱光影響評価.md).**5 つの重要発見**: (1) **TECH_05 の `apply_lsc_inverse` は誤り**(DNG は LSC 未補正で逆ではなく順方向適用が正しい.TECH_05 §4 を訂正済).(2) **過去 Step 8 キャリブの残差 2.1× はドメイン不一致**(実機 PNG sRGB 0.0423 vs シミュ sRGB/linear 比較):正しい linear 比較では DNG linear+LSC 0.0689 vs シミュ linear 0.183 = **真の残差 2.66×**.(3) **新実機ターゲット = `MiniTIAS_QM_20260601_124500`(暗闇撮影)**: CoV=0.0695, 勾配=8.35%, 中心/周辺=1.0911, 動径 min/max=0.860.Step 8-13 以降の正規 baseline.(4) **外乱光ロバスト確認**: 室内灯 ON/OFF で指標差 < 1%.SmTIAS 自前照明が支配的で外乱光モデル化不要.(5) **新指標 `calc_radial_min_max_ratio`** (20 点輪帯平均 min/max 比) を追加.次フェーズ: S2 (dng_loader.py コピー + 新指標マージ + rawpy 依存追加) と S3 (sm-evaluate DNG 対応 + Step 8-13 突合) を別 `/implement` パイプラインで実施. 実装済みモジュール: - `src/sm_tias_lightsim/uniformity.py` — Rec.709 輝度変換 + CoV/std/max-min(MiniTias-Evaluation コピー) diff --git "a/docs/05_TECH/TECH_05_MiniTiasEvaluation_DNG\345\257\276\345\277\234\350\246\201\346\261\202\344\273\225\346\247\230.md" "b/docs/05_TECH/TECH_05_MiniTiasEvaluation_DNG\345\257\276\345\277\234\350\246\201\346\261\202\344\273\225\346\247\230.md" index 18d9fff..4b98a53 100644 --- "a/docs/05_TECH/TECH_05_MiniTiasEvaluation_DNG\345\257\276\345\277\234\350\246\201\346\261\202\344\273\225\346\247\230.md" +++ "b/docs/05_TECH/TECH_05_MiniTiasEvaluation_DNG\345\257\276\345\277\234\350\246\201\346\261\202\344\273\225\346\247\230.md" @@ -1,5 +1,7 @@ # MiniTias-Evaluation DNG 対応要求仕様 (DNG Support Specification for MiniTias-Evaluation) +> **★ 2026-06-01 訂正履歴**: 本ドキュメントの §4 LSC マップ関連機能は,当初「DNG は LSC 補正済み → 逆適用」の前提で書かれていたが,MiniTias-Evaluation 側の実装で「**DNG は LSC 未補正 → 順方向適用が正しい**」ことが判明したため訂正した.関連する誤解釈(過去の Step 8 キャリブにおけるシミュ vs 実機の残差解釈)の見直しは [TEST_05](../06_TEST/TEST_05_PNG_DNG評価比較.md) と [TECH_06](TECH_06_MiniTias-Evaluation引き継ぎ受領.md) を参照. + 本ドキュメントは SmTIAS-LightSim プロジェクトから **MiniTias-Evaluation** プロジェクトに対する **DNG 対応要求仕様** である.MiniTias 側で実装された定量撮影モード([TECH_01](TECH_01_定量撮影モード要求仕様.md) / [TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md))の出力フォーマットが PNG から DNG (RAW_SENSOR) に変更されたことに伴い,MiniTias-Evaluation 側にも DNG 読み込み・解析機能の追加を依頼する. ## 想定読者 (Intended Reader) @@ -191,29 +193,40 @@ """ ``` -### 4. LSC マップ参照機能(オプション・将来検証用) +### 4. LSC マップ順方向適用機能(★ 必須・本流処理) -本流の処理では使わないが,将来のフォールバック検証用に実装: +> **★ 2026-06-01 訂正**: 本節は当初「LSC 逆適用機能 (`apply_lsc_inverse`)」として「DNG は LSC 補正済 → 逆適用で raw に戻す」前提で書かれていたが,MiniTias-Evaluation 側の実装検証で **その前提が誤りであった**ことが判明した([TECH_06 §2.1](TECH_06_MiniTias-Evaluation引き継ぎ受領.md#21--dng-は-lsc-未補正--apply_lsc_inverse-は誤り)).実態は逆で,**RAW_SENSOR DNG は LSC 未補正**(rawpy も LSC を自動適用しない).照明ムラを評価するには **lscMap を順方向に適用**してレンズビネット(cos⁴ 由来の周辺暗)を除去する必要がある.本訂正により本節は「本流処理」として位置付けが変わった. ```python -def apply_lsc_inverse( +def apply_lsc_forward( image: numpy.ndarray, lsc_map: numpy.ndarray, ) -> numpy.ndarray: - """LSC マップを画像に逆適用する(補正前 raw 相当に戻す). + """LSC マップを画像に順方向適用する(レンズビネット除去). + + DNG (RAW_SENSOR) は LSC 未補正なので,meta.json の lscMap を + 順方向適用してレンズビネット(端ほど暗い)を除去する.残った成分が + 照明そのもののムラ. Args: - image: 補正済み画像 (H, W) or (H, W, 3).DNG (HIGH_QUALITY) を想定. - lsc_map: LSC ゲインマップ (4, M, N). + image: DNG 読み込み後の linear 画像 (H, W) or (H, W, 3).未補正. + lsc_map: LSC ゲインマップ (4, M, N).値域 ≥ 1.0(無補正). Returns: - 逆適用後の画像.image_raw = image / interpolate(lsc_map, image.shape). + 順適用後の画像.image_corrected = image * interpolate(lsc_map, image.shape). + 中央付近はほぼ不変,周辺は明るく増幅されてレンズビネットが除去される. """ ``` - LSC マップ (13×17) を画像解像度 (例 3264×2448) にバイリニア補間 -- 画素ごとに割り算で逆適用 -- SHADING_MODE = OFF 撮影との比較検証に使用([TECH_04](TECH_04_MiniTIASへの回答.md) フォールバック条件 C1〜C3) +- 画素ごとに乗算で順方向適用 +- 本流の照明均一性評価で使用(実機 DNG → linear → LSC 順適用 → ROI 抽出 → 指標算出) +- 補正前後の評価指標差は劇的([TEST_05 §2 結果比較](../06_TEST/TEST_05_PNG_DNG評価比較.md) 参照): CoV 0.1477 → 0.0689, 勾配 31.3% → 8.69% +- 既存実装の参考は MiniTias-Evaluation の `scripts/run_uniformity_dng.py`(プロトタイプ実装) + +#### SHADING_MODE = OFF との関係(補足) + +将来のフォールバック条件 C1〜C3([TECH_04](TECH_04_MiniTIASへの回答.md#将来-shading_off-切替のフォールバック条件))が発動して `SHADING_MODE = OFF` 撮影を試す場合,OFF 撮影は **そもそも LSC 未補正のセンサ生**を出す.現状の `SHADING_MODE = HIGH_QUALITY` 撮影でも DNG は LSC 未補正なので,両者の差は ISP の他の処理(noise reduction の有無等)が主で,LSC 補正残差の議論は本訂正により再構成が必要.LSC 補正は **後段の sm-evaluate 側で順方向適用する**ことに統一する. ### 5. 既存 PNG 経路との並列対応(後方互換) diff --git "a/docs/05_TECH/TECH_06_MiniTias-Evaluation\345\274\225\343\201\215\347\266\231\343\201\216\345\217\227\351\240\230.md" "b/docs/05_TECH/TECH_06_MiniTias-Evaluation\345\274\225\343\201\215\347\266\231\343\201\216\345\217\227\351\240\230.md" new file mode 100644 index 0000000..7afef99 --- /dev/null +++ "b/docs/05_TECH/TECH_06_MiniTias-Evaluation\345\274\225\343\201\215\347\266\231\343\201\216\345\217\227\351\240\230.md" @@ -0,0 +1,165 @@ +# MiniTias-Evaluation 引き継ぎ受領 (Receiving Hand-off from MiniTias-Evaluation) + +本ドキュメントは MiniTias-Evaluation 側で [TECH_05 DNG 対応要求仕様](TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md) の Phase 1(DNG 読み込み I/F)が完了したことの受領記録であり,併せて MiniTias-Evaluation 側から共有された **重要な設計判断・指摘事項** をまとめたものである. + +## 想定読者 (Intended Reader) + +- **SmTIAS-LightSim 側 Claude セッション**: 本ドキュメントを読んで取り込み作業を行う +- **人間レビュー (rinto)**: 受領内容と判断の妥当性を確認する + +## 受領元と日付 (Source) + +- **元プロジェクト**: MiniTias-Evaluation(`C:\Users\user\source\MiniTias-Evaluation\`) +- **受領日**: 2026-06-01 +- **元ハンドオフパッケージ**: `handoff_smtias_lightsim/`(一時アーティファクト,取り込み完了後に削除) + +## 1. 実装スコープ — 完了状況 (What is done / not done) + +[TECH_05](TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md) で要求した 6 Phase のうち,本受領時点で完了しているのは **Phase 1(DNG 読み込み I/F)のみ**. + +| Phase | 内容 | 受領状態 | +| --- | --- | --- | +| Phase 1 | DNG 読み込み I/F (`dng_loader.py`) | ✅ **完了**(コピー対象) | +| Phase 2 | メタデータ JSON 読み込み I/F (`metadata_loader.py`) | ❌ 未実装 | +| Phase 3 | LSC マップ参照・hot pixel マスク | △ LSC 順適用はプロトタイプのみ(`run_uniformity_dng.py` 内) | +| Phase 4 | 既存パイプライン統合 | ❌ 未着手 | +| Phase 5 | PNG vs DNG 検証 | △ 別撮影での比較のみ実施([TEST_05](../06_TEST/TEST_05_PNG_DNG評価比較.md)) | +| Phase 6 | SPEC 更新 | ❌ 未着手 | + +→ Phase 1 を SmTIAS-LightSim 側にコピーして統合する.Phase 2〜6 は SmTIAS-LightSim 側の必要性に応じて優先順位を判断する. + +## 2. ★ 重要な設計判断・注意点(コピーだけでは伝わらない) (Critical Design Decisions) + +以下は実装の前提であり,**[TECH_05 要求仕様](TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md) の記述と食い違う点を含む**.取り込み時に必ず反映すること. + +### 2.1 ★★★ DNG は LSC 未補正 — `apply_lsc_inverse` は誤り + +| 項目 | TECH_05 当初の前提(誤り) | 実態(MiniTias-Evaluation 側が発見) | +| --- | --- | --- | +| RAW_SENSOR DNG の状態 | LSC 補正済み | **LSC 未補正** | +| rawpy の挙動 | LSC 自動適用 | **LSC 適用しない**(OpcodeList2 GainMap は無視) | +| meta.json `lscMap` の位置付け | ISP 適用後の参考データ | **適用に使うべきマップ**(順方向適用が正しい) | +| シェーディング除去方法 | `image / interpolate(lscMap)` で逆適用 | **`image × interpolate(lscMap)` で順方向適用** | + +→ TECH_05 の `apply_lsc_inverse` 関数仕様は **物理的に逆方向で誤り**.正しくは `apply_lsc_forward`(順方向適用).TECH_05 をこの受領と同時に訂正する. + +### 2.2 linear 系出力は `output_color=raw` + +カラーマトリクスを通すとチャンネル混合で per-channel の比例が崩れる: + +- `rgb_float32` / `luma_float32`: `output_color=rawpy.ColorSpace.raw`(カラーマトリクス非適用) +- `rgb_uint8` のみ: `output_color=rawpy.ColorSpace.sRGB`(カラーマトリクス+ sRGB OETF 適用) + +これにより入射光量とセンサ信号の比例(放射輝度リニアリティ)を担保する. + +### 2.3 向き — DNG はセンサ native が landscape + +PNG / preview と同じ portrait にするには `numpy.rot90(image, -1)` で回転: + +- **左右反転は不要**:フロントカメラ id=1 の preview はミラーされるが RAW はミラーされない +- 既存 PNG 経路と向きを揃えるための必須処理 + +### 2.4 luma の Rec.709 は固定加重プロキシ + +`output_color=raw` のとき Rec.709 luma (R=0.2126, G=0.7152, B=0.0722) は **厳密な CIE 輝度ではなく,既存 PNG 経路と互換の固定加重輝度プロキシ**. + +Rec.709 係数を維持する理由: + +- 既存 PNG 経路(`uniformity.py` の `to_grayscale`)との方法論的一貫性 +- DNG / PNG 評価指標の直接比較のため + +### 2.5 PNG は厳密には linear 化できない + +PNG(既存通常モード)は以下のため真のシーン linear を復元できない: + +- トーンカーブが端末固有・非公開で焼き込まれている +- 8bit 量子化・クリップで不可逆な情報損失あり +- ICC プロファイル等の透過関数情報が PNG ファイルに付随しない + +→ inverse-sRGB OETF を掛けても得られるのは「表示参照 linear」で,入射光量との比例性は復元できない.これが定量 DNG モード採用の根拠(詳細は [TEST_05](../06_TEST/TEST_05_PNG_DNG評価比較.md)). + +## 3. コピー対象ファイル (Files to Copy) + +| コピー元(MiniTias-Evaluation) | コピー先(SmTIAS-LightSim) | 区分 | +| --- | --- | --- | +| `src/io/dng_loader.py` | `src/sm_tias_lightsim/evaluation/dng_loader.py` | ★ 正規コピー対象 | +| `scripts/run_uniformity_dng.py` | (参考)`cli/evaluate.py` 等への統合参考 | LSC 順適用・向き合わせ・評価フローの参考 | +| `src/analysis/spatial.py` の `calc_radial_min_max_ratio` | 既存 `evaluation/radial.py` または `zones.py` へ **マージ**(全体コピーは禁止) | 動径 min/max 比指標(追加指標) | + +### コピー時のファイル先頭注記 + +[TECH_05 §SmTIAS-LightSim 側へのコピー手順](TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md#smtias-lightsim-側へのコピー手順-copy-to-smtias-lightsim) の指定通り: + +```python +"""DNG 読み込みモジュール. + +MiniTias-Evaluation/src/io/dng_loader.py を SmTIAS-LightSim にコピーしたもの. +オリジナルは MiniTias-Evaluation 側で管理する.バグ修正・機能追加はそちらで行い, +本プロジェクトに反映する形を取る. +""" +``` + +### `spatial.py` のマージ方針 + +SmTIAS-LightSim 側の既存均一性コード(`evaluation/zones.py` の `calc_zone_stats` 等)と競合する関数が含まれるため,**丸ごとコピーせず `calc_radial_min_max_ratio` のみマージ**する. + +## 4. 引き渡された評価結果(暗闇=MiniTIAS のみ撮影) + +代表結果は **外乱光に汚染されていない「MiniTIAS の照明のみ」の撮影**(`MiniTIAS_QM_20260601_124500`,室内灯 OFF). + +評価条件: linear(output_color=raw)/ portrait / LSC 補正あり / 白板 ROI. + +| 指標 | 値 | +| --- | --- | +| CoV | **0.0695** | +| max/min 比 | 1.617 | +| 中心/周辺比 | 1.0911 | +| 勾配 (%) | 8.35 | +| 動径 min/max 比 | 0.8600 | + +→ 本値が **新しい正規実機ターゲット**([TEST_01](../06_TEST/TEST_01_キャリブレーション検証履歴.md) Step 8-13 以降).従来の通常モード PNG 値(CoV=0.0427)は,sRGB ガンマでムラが圧縮された **過小評価値**だったことが [TEST_05](../06_TEST/TEST_05_PNG_DNG評価比較.md) で確認された. + +成果物(評価結果図・CSV・meta.json)は元ハンドオフパッケージ `handoff_smtias_lightsim/results_dark_124500/` に同梱されていたが,S3(突合検証)段階で必要になった時点で再取得する. + +## 5. 取り込み計画(SmTIAS-LightSim 側 3 サブタスク) + +本受領を起点に,SmTIAS-LightSim 側で以下の 3 サブタスクを順次実施する: + +### S1: ドキュメント取り込み + TECH_05 訂正(本コミットで実施) + +- 本ファイル (TECH_06) で受領記録 +- [TEST_05](../06_TEST/TEST_05_PNG_DNG評価比較.md) として REPORT_02 を取り込み +- [TEST_06](../06_TEST/TEST_06_外乱光影響評価.md) として REPORT_03 を取り込み +- [TECH_05](TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md) の `apply_lsc_inverse` を `apply_lsc_forward` に訂正 +- CLAUDE.md / TEST_01 / TEST_03 に方針更新を追記 + +### S2: コード取り込み(次セッション・`/implement`) + +- `src/sm_tias_lightsim/evaluation/dng_loader.py` 新規作成(MiniTias-Evaluation からコピー+冒頭注記) +- `evaluation/radial.py` または `zones.py` に `calc_radial_min_max_ratio` をマージ +- `pyproject.toml` に `rawpy>=0.21.0` 追加 +- 新規テスト追加(DNG 読み込み・新指標) + +### S3: sm-evaluate DNG 対応 + Step 8-13 突合(次セッション・`/implement`) + +- `cli/evaluate.py` に DNG 入力経路追加(拡張子で自動判定) +- `configs/eval_baseline_quantitative.yaml` 新規作成 +- 既存シミュ luminance.npy と新規実機 DNG で評価指標を突合 +- [TEST_01](../06_TEST/TEST_01_キャリブレーション検証履歴.md) に **Step 8-13: 定量モード DNG での 1 ショット対応検証** として記録 + +## 6. 検証 (Verification — TECH_05 V4) + +S2 / S3 完了後に以下を確認: + +- SmTIAS-LightSim 側で同じ DNG (`MiniTIAS_QM_20260601_124500.dng`) を読み込んで,**§4 の表と同じ評価指標**が出ること +- 既存テストが全合格すること +- 依存追加: `rawpy>=0.21.0` + +## 7. 関連ドキュメント (Related Documents) + +- [TECH_05 MiniTias-Evaluation DNG 対応要求仕様](TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md) — 本受領の原始要求 +- [TEST_05 PNG/DNG 評価比較](../06_TEST/TEST_05_PNG_DNG評価比較.md) — REPORT_02 取り込み.ドメイン違いの分析 +- [TEST_06 外乱光影響評価](../06_TEST/TEST_06_外乱光影響評価.md) — REPORT_03 取り込み.室内灯ロバスト性 +- [TEST_01 キャリブレーション検証履歴](../06_TEST/TEST_01_キャリブレーション検証履歴.md) — Step 8 系.Step 8-13 として続編予定 +- [TEST_03 輝度マップ形状追跡](../06_TEST/TEST_03_輝度マップ形状追跡.md) — 形のずれ議論 +- [SPEC_04 評価仕様](../04_SPEC/SPEC_04_評価仕様.md) — sm-evaluate パイプライン diff --git "a/docs/06_TEST/TEST_05_PNG_DNG\350\251\225\344\276\241\346\257\224\350\274\203.md" "b/docs/06_TEST/TEST_05_PNG_DNG\350\251\225\344\276\241\346\257\224\350\274\203.md" new file mode 100644 index 0000000..1368583 --- /dev/null +++ "b/docs/06_TEST/TEST_05_PNG_DNG\350\251\225\344\276\241\346\257\224\350\274\203.md" @@ -0,0 +1,132 @@ +# PNG / DNG 照明均一性評価 比較 (PNG vs DNG Uniformity Evaluation Comparison) + +> **注**: 本ファイルは MiniTias-Evaluation で作成された [REPORT_02 PNG/DNG 評価比較報告書](https://github.com/rintoHasegawa/MiniTias-Evaluation) を SmTIAS-LightSim 側に取り込んだスナップショット.本文中で参照される他の MiniTias-Evaluation 側ドキュメント (REPORT_01, PROGRESS.md 等) のリンクは **MiniTias-Evaluation リポジトリ起点**で,SmTIAS-LightSim 側からは到達しない(リンク切れは許容).取り込みの位置付けは [TECH_06 MiniTias-Evaluation 引き継ぎ受領](../05_TECH/TECH_06_MiniTias-Evaluation引き継ぎ受領.md) を参照. + +## 概要 (Overview) + +MiniTIAS 撮影アプリの定量撮影モードの出力フォーマットが **PNG から DNG (RAW_SENSOR) に変更**された([TECH_01 (Evaluation 側) / TECH_05 (SmTIAS-LightSim 側)](../05_TECH/TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md))ことに伴い,照明均一性評価の結果が PNG 経路と DNG 経路でどのように変わるかを比較した. + +結論を先に述べると,**PNG→DNG は単なるファイル形式の変更ではなく,「何を測っているか」が変わる**.PNG は sRGB エンコード済み・端末 ISP でレンズシェーディング補正済みの「処理後」データであり,DNG は linear・補正前の「物理生信号」である.このため評価指標の数値は大きく変化する. + +## 前提・対象データ (Scope and Samples) + +| 項目 | 内容 | +| --- | --- | +| PNG サンプル | `data/minitias/whiteboard/MiniTIAS_20260408_140317.png`(2026-04-08 撮影) | +| DNG サンプル | `data/minitias/quantitative/MiniTIAS_QM_20260601_102753.dng`(2026-06-01 撮影,SH-02M 定量モード) | +| 評価領域 (ROI) | `config/roi_config.json` の `minitias.whiteboard`(白板中央,全条件で同一) | +| 向き | portrait に統一(DNG は landscape native のため `rot90(-1)` で PNG と整合) | +| 評価指標 | CoV / max-min比 / 中心-周辺比 / 勾配 / 動径 min/max 比(20点輪帯平均の最小/最大) | + +> **重要な前提(本報告書の限界)**: PNG(4月)と DNG(6月)は**別セッションの撮影でフレーミングが異なる**.したがって TECH_05 の検証 V1 が要求する「同一シーンを PNG/DNG で連続撮影した厳密な対照比較」**ではない**.**評価手法・ドメインの違いが指標に与える影響**を既存サンプルで定量的に示すものである.厳密な同一シーン比較は今後の課題(後述). + +## 評価条件(ドメイン)の違い (Domain Differences) + +PNG 経路と DNG 経路は,評価に入る前の信号の性質が根本的に異なる. + +| 観点 | PNG(従来) | DNG(新規・定量モード) | +| --- | --- | --- | +| 信号ドメイン | **sRGB**(OETF/ガンマ適用済み) | **linear**(TONEMAP=CONTRAST_CURVE_LINEAR,OETF 未適用) | +| レンズシェーディング | **端末 ISP で補正済み**(SHADING_MODE=HIGH_QUALITY が YUV/JPEG に適用) | **未補正**(RAW_SENSOR は ISP 前.補正は DNG OpcodeList2 の GainMap / meta.json の lscMap として付随するのみ) | +| ビット深度 | 8bit | 10bit | +| 入射光量との関係 | ガンマで非線形 | **比例(放射輝度リニア)** | + +→ つまり PNG をそのまま評価した「従来値」と,DNG を物理的に正しく評価した値は,**同じものを測っていない**.公平に比較するにはドメインを揃える必要がある. + +## 結果比較 (Results) + +同一 ROI で算出した均一性指標(数値が大きいほどムラが大きい.動径 min/max のみ 1.0 に近いほど均一): + +| 条件 | CoV | max/min | 中心/周辺比 | 勾配(%) | 動径 min/max | +| --- | --- | --- | --- | --- | --- | +| **PNG sRGB(従来評価)** | 0.0423 | 1.387 | 1.066 | 6.23 | 0.8964 | +| PNG 擬似linear化(inverse-sRGB 仮定)※ | 0.0901 | 2.031 | 1.148 | 12.88 | 0.7902 | +| DNG linear(LSC 補正なし) | 0.1477 | 2.287 | 1.456 | 31.33 | 0.5304 | +| **DNG linear(LSC 補正あり)** | 0.0689 | 1.641 | 1.095 | 8.69 | 0.8533 | + +> ※ **「PNG 擬似linear化」は近似であり,真のシーン linear(入射光量比例)ではない**.詳細は考察「4. PNG は厳密には linear 化できない」を参照. + +## 考察:なぜ結果が変わるのか (Analysis) + +数値変化は主に3つの要因に分解できる. + +### 1. ドメイン(sRGB ガンマ)の影響 — 最大の要因 + +同じ PNG データでも,**sRGB のまま(CoV 0.0423)か擬似linear化(CoV 0.0901)かで CoV が約2倍**変わる(撮影は同一,ドメインのみ変更).sRGB の OETF は暗部を持ち上げ明部を圧縮するため,**ムラを実際より穏やかに見せる**.従来の PNG 評価値(CoV 0.042)は,このガンマ圧縮により**楽観的に小さく出ていた**. + +なお CoV・max/min・動径比は**スケール不変**なので,0〜255 と 0〜1 のスケール差では変わらない.変化はあくまでドメイン(ガンマ)によるもの. + +### 2. レンズシェーディング補正の有無 + +DNG raw は未補正のため,**レンズビネット(端ほど暗い)が指標に混入**する.LSC 補正なしの DNG は中心/周辺比 1.456・勾配 31.3%・動径 min/max 0.530 と大きなムラを示すが,これは**照明ムラではなくレンズ特性**を多く含む.lscMap を順方向適用してレンズビネットを除去すると,中心/周辺比 1.456→1.095,勾配 31.3%→8.7%,動径 min/max 0.530→0.853 と**劇的に平坦化**する(残りが照明そのもののムラ). + +### 3. 撮影セッションの違い + +PNG(4月)と DNG(6月)は別撮影で,照明配置・フレーミング・距離が異なる.この差も数値に含まれるため,厳密な大小比較はできない(前提参照). + +### 4. PNG は厳密には linear 化できない(重要な限界) + +上表の「PNG 擬似linear化」は inverse-sRGB OETF を掛けたものだが,これは**真のシーン linear(入射光量比例)を復元しない**.理由: + +- **透過関数が不明**: 本サンプル PNG は ICC プロファイル・gAMA・EXIF を一切持たず,**sRGB である保証すらない**(sRGB と仮定して逆変換しているだけ). +- **トーンカーブが残る(最大の壁)**: 端末 PNG は `linear生信号 →[WB・カラー行列・レンズ補正・トーンカーブ・NR・シャープ化]→ 表示RGB → sRGB符号化 → 8bit` を経る.inverse-sRGB が戻せるのは最後の符号化だけで,得られるのは「**表示参照 linear**」.間のトーンカーブ(端末固有・非公開のコントラスト曲線)は焼き込まれたままで,入射光量には比例しない. +- **不可逆な損失**: 8bit 量子化(暗部の段差が逆ガンマで増幅)・クリップ(白飛び/黒潰れ)は復元不能. + +→ つまり **PNG は確実には linear 化できない**.これこそが定量 DNG モード採用の理由(TECH_05 背景「実機 PNG 自体が定量データとして揺らぐ」)であり,DNG (RAW_SENSOR, TONEMAP=CONTRAST_CURVE_LINEAR) は最初から真のシーン linear を出すことでこの問題を回避する. + +### 公平な比較(ドメインを揃える,ただし近似) + +両者を linear ドメインに寄せると比較の目安は得られる(PNG は上記の通り**擬似linear=近似**である点に注意): + +- **PNG 擬似linear化: CoV 0.0901**(近似) vs **DNG linear+LSC: CoV 0.0689**(真の linear) +- → 目安としては **DNG(LSC補正)の方が均一**.従来の「PNG 0.042 < DNG 0.069 で DNG が悪い」という見え方は,sRGB ガンマが PNG のムラを圧縮していた錯覚. +- ただし PNG 側が近似である以上この比較は厳密ではなく,**確実な比較には同一シーンを DNG で撮影することが必要**(後述 残課題). + +## 結論と推奨 (Conclusion) + +1. **PNG→DNG の移行で評価値が変わるのは正常**.主因は形式ではなく,sRGB→linear のドメイン変化とレンズシェーディング補正の有無. +2. **物理的に正しい照明均一性評価は DNG linear + LSC 補正経路**で行うべき.入射光量に比例した信号で,レンズ特性を分離して照明ムラのみを測れる. +3. 従来の **PNG sRGB 評価値は,ガンマ圧縮によりムラを過小評価**していた点に注意.過去の PNG 値と DNG 値を近づけるには PNG を擬似linear化(inverse-sRGB)できるが,**PNG は真のシーン linear を復元できない**(トーンカーブ・8bit・透過関数不明のため).したがって**厳密な比較には DNG での再撮影が必要**. +4. ノイズに弱い画素単位 max/min 比に代わり,**動径 min/max 比(20点輪帯平均)**をロバストな減衰指標として併用する. + +## SmTIAS-LightSim 側への含意 (Implications for SmTIAS-LightSim) + +本報告書の発見は SmTIAS-LightSim 側のキャリブレーション作業に重大な影響を与える: + +### 過去 Step 8 キャリブの解釈見直し + +過去のキャリブ作業([TEST_01](TEST_01_キャリブレーション検証履歴.md) Step 8-1〜8-12)で「シミュ vs 実機の残差 2.1×」と評価していたが,これは: + +- 実機側: **PNG sRGB CoV=0.0423**(ガンマ圧縮で過小評価) +- シミュ側: **linear CoV=0.183**(OETF 適用前) or **sRGB CoV=0.089**(OETF 順方向適用後) + +の比較で,**ドメイン整合性が不完全**だった可能性がある.特に: + +- 過去評価: PNG sRGB (0.0423) vs シミュ sRGB (0.089) = 残差 2.1× +- 正しい linear 比較: DNG linear+LSC (0.0689) vs シミュ linear (0.183) = **残差 2.66×** +- → 過去の「2.1× 残差」は楽観的.真の残差はやや大きいが,比較自体が物理的に意味を持つようになった + +### Step 8-13 以降の正規評価方針 + +- 実機側: **DNG linear + LSC 順方向適用 + 白板 ROI** +- シミュ側: **linear(OETF/正規化なし)+ 同じ ROI** +- 比較指標: CoV / 勾配 / C/P / max-min / **動径 min/max 比(新規)** + +これにより「シミュレーションの良し悪し」を物理的に妥当な土俵で評価できる. + +## 残課題 (Open Issues) + +- **厳密な V1 比較**: 同一シーン(白板)を同一フレーミングで PNG(通常モード)+ DNG(定量モード)連続撮影し,同条件で比較する(TECH_05 検証 V1). +- **ROI のフレーミング差対応**: PNG/DNG で白板の写る位置・スケールが異なるため,キャプチャごとの ROI 調整または同一フレーミング撮影が必要(TECH_05 Phase 5). +- **LSC 順適用機能の正式実装**: 現状は検証スクリプトでの順適用.本流の評価フローへ正式統合する(TECH_05 Phase 3〜4). +- **シミュ側の対応**: SmTIAS-LightSim 側の `sm-evaluate` に DNG 入力経路と LSC 順方向適用機能を実装し,[TEST_01](TEST_01_キャリブレーション検証履歴.md) に Step 8-13 として記録. + +## 関連ドキュメント (Related Documents) + +- [TECH_05 MiniTias-Evaluation DNG 対応要求仕様](../05_TECH/TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md) +- [TECH_06 MiniTias-Evaluation 引き継ぎ受領](../05_TECH/TECH_06_MiniTias-Evaluation引き継ぎ受領.md) +- [TEST_01 キャリブレーション検証履歴](TEST_01_キャリブレーション検証履歴.md) — 過去 Step 8 と Step 8-13 続編 +- [TEST_03 輝度マップ形状追跡](TEST_03_輝度マップ形状追跡.md) — 形のずれ議論 +- [TEST_06 外乱光影響評価](TEST_06_外乱光影響評価.md) — 同時に取り込まれた関連報告 +- 評価実装(MiniTias-Evaluation 側): `src/io/dng_loader.py`, `src/analysis/spatial.py`, `scripts/run_uniformity_dng.py` +- 設計判断・経緯の詳細: MiniTias-Evaluation `docs/PROGRESS.md` diff --git "a/docs/06_TEST/TEST_06_\345\244\226\344\271\261\345\205\211\345\275\261\351\237\277\350\251\225\344\276\241.md" "b/docs/06_TEST/TEST_06_\345\244\226\344\271\261\345\205\211\345\275\261\351\237\277\350\251\225\344\276\241.md" new file mode 100644 index 0000000..02ef862 --- /dev/null +++ "b/docs/06_TEST/TEST_06_\345\244\226\344\271\261\345\205\211\345\275\261\351\237\277\350\251\225\344\276\241.md" @@ -0,0 +1,102 @@ +# 外乱光影響評価 (Ambient Light Influence Evaluation) + +> **注**: 本ファイルは MiniTias-Evaluation で作成された [REPORT_03 外乱光影響評価報告書](https://github.com/rintoHasegawa/MiniTias-Evaluation) を SmTIAS-LightSim 側に取り込んだスナップショット.本文中で参照される他の MiniTias-Evaluation 側ドキュメントのリンクは **MiniTias-Evaluation リポジトリ起点**で,SmTIAS-LightSim 側からは到達しない(リンク切れは許容).取り込みの位置付けは [TECH_06 MiniTias-Evaluation 引き継ぎ受領](../05_TECH/TECH_06_MiniTias-Evaluation引き継ぎ受領.md) を参照. + +## 概要 (Overview) + +MiniTIAS の照明均一性測定が,**外部の室内照明(外乱光)にどれだけ影響を受けるか**を評価した.SmTIAS 装置自前の照明のみで撮影した DNG と,それに室内灯(外乱光)を加えて撮影した DNG を,同一指標で比較する. + +結論を先に述べると,**外乱光の有無で評価結果はほぼ変わらない(指標差 1% 未満)**.SmTIAS 自前照明が支配的で,測定は室内照明環境に対してロバストである. + +## 前提・対象データ (Scope and Samples) + +| 項目 | 内容 | +| --- | --- | +| 条件 A(MiniTIAS のみ) | `MiniTIAS_QM_20260601_124500`(室内灯 OFF,2026-06-01 12:45 撮影) | +| 条件 B(MiniTIAS + 外光) | `MiniTIAS_QM_20260601_102753`(室内灯 ON,2026-06-01 10:27 撮影) | +| 機種 / モード | SH-02M / 定量モード(RAW_SENSOR,露出・ISO 等は両者同一固定) | +| 評価領域 (ROI) | `config/roi_config.json` の `minitias.whiteboard`(白板中央,両者同一) | +| 評価条件 | linear(output_color=raw)/ portrait / LSC 補正あり・なし両方 | + +> **重要な前提(本評価の限界)**: 条件 A・B は**別セッションの撮影**(時刻が異なり,三脚固定でないため微小な位置ずれの可能性).したがって「外乱光の純粋な寄与」を厳密に分離したものではなく,**外乱光の影響がセッション間ばらつきと比べて支配的かどうか**を判定する位置づけである.厳密な切り分けは今後の課題(後述). + +## 結果 (Results) + +### raw センサ統計(黒レベル=64,全画素) + +| 条件 | raw mean | min | max | std | mean R/G/B | +| --- | --- | --- | --- | --- | --- | +| A: MiniTIAS のみ | 441.2 | 89 | 983 | 161.0 | 355.9 / 537.4 / 333.6 | +| B: MiniTIAS + 外光 | 431.4 | 90 | 949 | 155.7 | 349.4 / 525.4 / 325.1 | + +### 均一性指標(白板 ROI,数値が大きいほどムラ大.動径 min/max のみ 1.0 で均一) + +| 条件 | ROI mean | CoV | max/min | 中心/周辺比 | 勾配(%) | 動径 min/max | +| --- | --- | --- | --- | --- | --- | --- | +| **A: MiniTIAS のみ**(LSC 補正) | 207.82 | 0.0695 | 1.617 | 1.0911 | 8.35 | 0.8600 | +| **B: MiniTIAS + 外光**(LSC 補正) | 208.77 | 0.0689 | 1.641 | 1.0952 | 8.69 | 0.8533 | +| A: MiniTIAS のみ(LSC なし) | 170.58 | 0.1464 | — | 1.4511 | 31.09 | 0.5343 | +| B: MiniTIAS + 外光(LSC なし) | 171.39 | 0.1477 | — | 1.4563 | 31.33 | 0.5304 | +| **差(A−B,LSC 補正)** | −0.95 | +0.0006 | −0.024 | −0.004 | −0.34 | +0.007 | + +輝度マップ・ヒストグラムも両条件でほぼ重なり,空間パターン・分布形状に有意な違いは見られない. + +## 考察 (Analysis) + +### 1. 均一性指標はほぼ同一 — 外乱光の影響は評価に表れない + +LSC 補正後の CoV は 0.0695(A)vs 0.0689(B),勾配は 8.35%(A)vs 8.69%(B),動径 min/max は 0.860(A)vs 0.853(B)と,**すべて 1% 未満の差**.外乱光を加えても照明均一性の評価結果は実質的に変わらない.SmTIAS 自前照明が白板を支配的に照らしており,室内照明の寄与は相対的に微小と考えられる. + +### 2. 「外光を足したのに暗い」という矛盾 — 外乱光の寄与はばらつき以下 + +外乱光は信号を**加える**しかできないため,物理的には B(MiniTIAS+外光)≧ A(MiniTIAS のみ)の明るさになるはずである.しかし実測では **A の方が明るい**(raw mean 441.2 vs 431.4,R/G/B 各チャンネルとも A が上). + +これは,外乱光の寄与が **セッション間のばらつき(≈2〜3%:撮影時刻 10:27 vs 12:45 の差,微小な位置ずれ,照明のドリフト等)に埋もれている**ことを意味する.すなわち **外乱光の影響 < セッション間ばらつき**であり,外乱光の純寄与はこのデータからは分離できないほど小さい. + +### 3. 評価上の含意 + +照明均一性評価(CoV・勾配等)に対して,**通常の室内照明環境は実害を与えない**.これは測定器としての SmTIAS にとって望ましい性質(外乱光に対するロバスト性)である. + +## 結論 (Conclusion) + +1. **外乱光(室内照明)の有無で,照明均一性の評価指標はほぼ変わらない(差 1% 未満)**.SmTIAS 自前照明が支配的. +2. 明るさの差(≈2〜3%)はむしろ「MiniTIAS のみ」の方が明るく,物理的に逆向き.→ **外乱光の寄与はセッション間ばらつき以下**で,測定には埋もれて見えない. +3. したがって **MiniTIAS の照明均一性測定は,通常の室内照明環境に対してロバスト**と判断できる. + +## SmTIAS-LightSim 側への含意 (Implications for SmTIAS-LightSim) + +本評価結果は SmTIAS-LightSim 側のキャリブ作業に以下の影響を与える: + +### Step 8-13 での代表 baseline 選定 + +- 代表 baseline は **`MiniTIAS_QM_20260601_124500`(暗闇撮影)** を採用 +- 理由: 物理的に純粋な装置照明のみの状態(外乱光ゼロ) +- 数値ターゲット: CoV=0.0695, 勾配=8.35%, 動径 min/max=0.860([TEST_05](TEST_05_PNG_DNG評価比較.md) §結果比較 と整合) + +### シミュ側のモデル化前提 + +- Mitsuba シーンは「装置内部の LED 照明 + 反射のみ」をモデル化しており,外乱光は含まない +- 実機側で外乱光の影響が < 1% と確認されたため,**シミュ vs 実機の比較で「外乱光をモデル化していないこと」は実害ゼロ** +- 将来の議論で「シミュは外乱光を考慮していない」が懸念される場面では本報告書を根拠に却下できる + +### 撮影運用への要望 + +- 厳密性を追求する場合は **室内灯 OFF で撮影**(実害は小だが純粋性のため) +- 通常運用は **室内灯 ON のままで OK**(測定値が信頼できる) + +## 限界と厳密な切り分け方法 (Limitations & Controlled Test) + +本評価は別セッション撮影のため,外乱光の純寄与を 2〜3% のばらつきから分離できていない.外乱光の影響「だけ」を正確に測るには,以下の対照実験が必要: + +- **位置・露出を完全固定**(三脚等)し,**室内灯のみを ON/OFF** した連続2枚を撮影する(A: MiniTIAS のみ / B: MiniTIAS + 外光). +- 差分画像 **B − A** が外乱光の純寄与.これにより「一様なオフセットか/窓・照明方向の勾配か」「何 DN 乗るか」まで定量できる. +- この方式ならセッション間ばらつきを排除でき,外乱光の空間分布・絶対量を分離評価できる. + +## 関連ドキュメント (Related Documents) + +- [TEST_05 PNG/DNG 評価比較](TEST_05_PNG_DNG評価比較.md) — 同時に取り込まれた関連報告.DNG linear+LSC 補正経路の妥当性 +- [TECH_05 MiniTias-Evaluation DNG 対応要求仕様](../05_TECH/TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md) +- [TECH_06 MiniTias-Evaluation 引き継ぎ受領](../05_TECH/TECH_06_MiniTias-Evaluation引き継ぎ受領.md) +- [TEST_01 キャリブレーション検証履歴](TEST_01_キャリブレーション検証履歴.md) — Step 8-13 で本評価結果を baseline として使用予定 +- 評価実装(MiniTias-Evaluation 側): `scripts/run_uniformity_dng.py`(linear + LSC 補正経路) +- 対象データ: MiniTias-Evaluation 側 `data/minitias/quantitative/`(gitignore 対象)