diff --git a/.claude/rules/testing.md b/.claude/rules/testing.md index ba5acda..ebefdc8 100644 --- a/.claude/rules/testing.md +++ b/.claude/rules/testing.md @@ -27,7 +27,7 @@ │ └── test_schema.py ├── render/ │ └── test_runner.py # 軽量シーンの end-to-end -├── test_uniformity.py # MiniTias-Evaluation 互換の数値検証 +├── test_uniformity.py # SmTIAS-Evaluation 互換の数値検証 └── evaluation/ ├── test_roi.py └── test_zones.py @@ -43,7 +43,7 @@ - **核計算ロジック**: `uniformity.py`, `evaluation/zones.py`, `evaluation/radial.py` - 既知の入力(合成輝度マップ)に対して期待値を確認 - - MiniTias-Evaluation の元実装と数値が一致することを保証 + - SmTIAS-Evaluation の元実装と数値が一致することを保証 - **入力バリデーション**: `scene/schema.py` - 不正 YAML が `ValidationError` を投げること - 必須フィールド欠落・参照不整合を検出すること diff --git a/.gitignore b/.gitignore index df19d3f..cd62a8e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,10 +4,6 @@ # harness の wakeup スケジュール内部状態(環境固有) .claude/*.lock -# サブプロジェクト(一旦トラッキング対象外) -MiniTIAS/ -MiniTias-Evaluation/ - # シミュ・評価結果(コミット対象外) output/ @@ -31,7 +27,7 @@ # 目視確認用の一時スクリーンショット(リポジトリルートに上書き生成される作業ファイル) /image.png -# MiniTias-Evaluation 側から受け取った実測リファレンスデータ(個人ローカル) +# SmTIAS-Evaluation 側から受け取った実測リファレンスデータ(個人ローカル) reference_measurement/ # Python / uv diff --git a/CLAUDE.md b/CLAUDE.md index edb1b07..a75a2c8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,20 +1,38 @@ # SmTIAS-LightSim -MiniTIAS(スマートフォン舌画像撮影装置)の照明均一性を実機制作前に検討するための光散乱シミュレーションツール. -LED 配置・ディフューザー形状を仮想的に変えながら,MiniTIAS-Evaluation と同じ指標(CoV/3 ゾーン分析等)で均一性を定量評価できるようにする. +SmTIAS(スマートフォン舌画像撮影装置)の照明均一性を実機制作前に検討するための光散乱シミュレーションツール. +LED 配置・ディフューザー形状を仮想的に変えながら,SmTIAS-Evaluation と同じ指標(CoV/3 ゾーン分析等)で均一性を定量評価できるようにする. + +## 外部参照リポジトリ + +関連プロジェクトのローカルコピーは置かない.参照が必要になったときに `gh` CLI で GitHub から直接最新を読むこと. + +- SmTIAS(スマホ撮影アプリ本体)→ [rintoHasegawa/SmTIAS-Capture](https://github.com/rintoHasegawa/SmTIAS-Capture) +- SmTIAS-Evaluation(照明均一性評価ツール)→ [rintoHasegawa/SmTIAS-Evaluation](https://github.com/rintoHasegawa/SmTIAS-Evaluation) + +```bash +# ファイル一覧(リポジトリ構造の把握) +gh api "repos/rintoHasegawa/SmTIAS-Evaluation/git/trees/main?recursive=1" --jq '.tree[].path' + +# ファイル内容の取得(常に main の最新) +gh api -H "Accept: application/vnd.github.raw" \ + "repos/rintoHasegawa/SmTIAS-Evaluation/contents/docs/PROGRESS.md" +``` + +これらの内容の修正は各リポジトリ側で行う(本リポジトリからは読み取り専用として扱う). ## 開発進捗 最新: フェーズ 7(実装)— Step 8 基準設計キャリブレーションの **Step 8-14(物理モデル精緻化)** 進行中.[TEST_10](docs/06_TEST/TEST_10_後側ロフト変形w1p4実験.md) の**初の幾何変更実験**(後側ロフト,blend w0.05_a0.1・spp=1024・d=16)を全灯ロフト重みスイープ w ∈ {0.5, 1.4, 2.0, 4.0} まで拡張完了.**bottom 単灯 peak/mean 1.672→1.508 と幾何レバーが形を動かすことは初実証**したが,**灯間 NCC は不動=対称なキャビティ拡大では非対称相補性(実機 0.85/0.61/0.41 がアンカー)に近づかず,全灯はロフト重みに実質不感**(CoV 0.170〜0.177 で横ばい,w4.0 のみ微悪化・絶対照度 -29%).実機側はロフト w=1.4 版を印刷し初の実機測定 `MiniTIAS_QM_20260726_183416.dng` を取得済み(SmTIAS-Evaluation 分析待ち=シミュ予測「従来筐体とほぼ同じ」の検証).次は実験4(幾何の漏れ点検=漏れの定量化・開口の閉じテスト).詳細な経緯・設計判断・失敗パターンは [docs/PROGRESS.md](docs/PROGRESS.md). 実装済みモジュール: -- `src/sm_tias_lightsim/uniformity.py` — Rec.709 輝度変換 + CoV/std/max-min(MiniTias-Evaluation コピー) +- `src/sm_tias_lightsim/uniformity.py` — Rec.709 輝度変換 + CoV/std/max-min(SmTIAS-Evaluation コピー) - `src/sm_tias_lightsim/evaluation/zones.py` — 正規化楕円距離マップ + 3 ゾーン分類 + ゾーン別統計 - `src/sm_tias_lightsim/evaluation/radial.py` — 20 ビン放射状輝度プロファイル - `src/sm_tias_lightsim/evaluation/roi.py` — `image_pixel` 型矩形 ROI 抽出(2D/3D 配列対応) - `src/sm_tias_lightsim/evaluation/oetf.py` — 標準 sRGB OETF(IEC 61966-2-1)+ 露出ソルバ(OETF 後 ROI mean を実測値に対数二分でアンカー)+ 順方向適用.シミュ linear を実測 sRGB ドメインへ変換 - `src/sm_tias_lightsim/evaluation/normalize.py` — linear mean anchor 正規化(`apply_mean_anchor`).OETF と排他適用,形状指標は厳密不変で mean のみ target_mean に揃う.`configs/eval_baseline_linear.yaml` で有効化 -- `src/sm_tias_lightsim/evaluation/visualize.py` — matplotlib 可視化(輝度マップ / ヒストグラム / 放射プロファイル / ゾーンマップ).MiniTias-Evaluation 互換スタイル(hot cmap,zone_map は luminance 背景 + 境界線) +- `src/sm_tias_lightsim/evaluation/visualize.py` — matplotlib 可視化(輝度マップ / ヒストグラム / 放射プロファイル / ゾーンマップ).SmTIAS-Evaluation 互換スタイル(hot cmap,zone_map は luminance 背景 + 境界線) - `src/sm_tias_lightsim/scene/schema.py` — Pydantic ベース YAML スキーマ + ローダ.SensorConfig は perspective / orthographic 両対応.materials は `DiffuseMaterial` / `RoughConductorBSDFConfig` (alpha + distribution=ggx/beckmann,material="none" 固定で完全反射体) / `BlendBSDFConfig` (weight + components×2,再帰ネスト可能,forward reference + `model_rebuild()`) を Union として並列サポート.後方互換維持 - `src/sm_tias_lightsim/geometry/loader.py` — STL 読込(trimesh)+ `LoadedMesh` データクラス - `src/sm_tias_lightsim/geometry/transforms.py` — mm⇄m 単位スケール変換 @@ -32,8 +50,8 @@ - `src/sm_tias_lightsim/geometry/subdivide.py` — 三角形メッシュ均一分割の純関数(新規).`subdivide_mesh_to_max_edge(vertices, faces, max_edge)`=`trimesh.remesh.subdivide_to_size` で「最大辺長 ≤ max_edge」まで決定論的に三角形分割(同一入力→同一出力,baker と viewer が独立呼び出しでも face 配列一致).単位は呼び出し側座標系に従う(m 系で呼べば m).STL の三角形サイズが極端に不均一(曲面 ~1mm² vs 平面壁 最大 4794mm²)でも均一な空間解像度の per-face ベイクを可能にする - `src/sm_tias_lightsim/cli/visualize.py` — `sm-visualize` CLI(YAML → 3D 表示 / screenshot).`--bake-mode {direct,path}` / `--bake-samples` / `--bake-max-depth`(path ベイクの反射回数、既定 16、render 設定から独立)/ `--bake-cache `(1回計算→以後即時.`--bake-subdivide` 設定値も npz に記録し不一致なら自動再ベイク)/ `--cull-outward|--no-cull-outward`(既定 ON)/ `--opacity` / `--hide-below` / `--bake-smooth` / `--bake-scale {linear,log}` / `--clip-percentile` / `--no-sensor-marker`・`--no-led-markers`・`--no-markers` / `--render `(任意・テクスチャ投影).**発表スライド向け(Step 8-14 期に追加)**: `--style {default,slide}` / `--cmap NAME`(既定: style に応じ viridis/hot)/ `--bake-subdivide MM`(三角形を最大辺長 MM mm 以下に均一分割)/ `--bake-denoise N`(メディアンデノイズ反復)/ `--bake-smooth-radius MM`(物理半径 MM mm のガウス平滑化)/ `--backface-cull`(背面カリング).mm 引数は内部で ×0.001 して m 系で show_scene/baker へ.`--render` 無し=全面統一ベイク(既定) - `src/sm_tias_lightsim/runtime/llvm_init.py` — LLVM JIT 初期化ヘルパ.`ensure_drjit_libllvm_path()` で `DRJIT_LIBLLVM_PATH` 未設定時に Windows/POSIX 標準パスを自動探索して `os.environ` 設定.`log_variant_status()` で variant 経路(llvm_/cuda_/scalar_)を INFO 明示,要求 llvm_* で実 scalar_* なら WARNING 追加.`runner.py` / `baker.py` から呼ばれ環境変数未設定時のサイレントクラッシュを防ぐ -- `src/sm_tias_lightsim/evaluation/dng_loader.py` — DNG 読み込みモジュール.MiniTias-Evaluation `src/io/dng_loader.py` を SmTIAS-LightSim にコピーしたもの (オリジナルは MiniTias-Evaluation 側で管理.バグ修正・機能追加はそちらで反映).主要 API: `load_image_dng(path, demosaic, black_level, output_format)`.`output_format` は `rgb_float32` / `luma_float32` / `rgb_uint8`.linear 系出力 (`rgb_float32` / `luma_float32`) は `output_color=raw` でカラーマトリクス非適用・per-channel 比例性保持.`gamma=(1,1) + no_auto_bright=True + use_camera_wb=False + user_wb=[1,1,1,1]` で linear raw を保つ.依存: `rawpy>=0.21.0` -- `src/sm_tias_lightsim/evaluation/radial.py` — 20 ビン放射状輝度プロファイル.既存 `calc_radial_profile` に加えて MiniTias-Evaluation `src/analysis/spatial.py:calc_radial_min_max_ratio` をマージ.動径 min/max 比 (20 点輪帯平均) は画素単位 max/min よりノイズに対しロバスト.nan ビン除外を移植時に補強 (既存 `calc_radial_profile` は空ビンを nan で返す) +- `src/sm_tias_lightsim/evaluation/dng_loader.py` — DNG 読み込みモジュール.SmTIAS-Evaluation `src/io/dng_loader.py` を SmTIAS-LightSim にコピーしたもの (オリジナルは SmTIAS-Evaluation 側で管理.バグ修正・機能追加はそちらで反映).主要 API: `load_image_dng(path, demosaic, black_level, output_format)`.`output_format` は `rgb_float32` / `luma_float32` / `rgb_uint8`.linear 系出力 (`rgb_float32` / `luma_float32`) は `output_color=raw` でカラーマトリクス非適用・per-channel 比例性保持.`gamma=(1,1) + no_auto_bright=True + use_camera_wb=False + user_wb=[1,1,1,1]` で linear raw を保つ.依存: `rawpy>=0.21.0` +- `src/sm_tias_lightsim/evaluation/radial.py` — 20 ビン放射状輝度プロファイル.既存 `calc_radial_profile` に加えて SmTIAS-Evaluation `src/analysis/spatial.py:calc_radial_min_max_ratio` をマージ.動径 min/max 比 (20 点輪帯平均) は画素単位 max/min よりノイズに対しロバスト.nan ビン除外を移植時に補強 (既存 `calc_radial_profile` は空ビンを nan で返す) - `src/sm_tias_lightsim/evaluation/shape_metrics.py` — 輝度分布「形」評価指標モジュール(新規).現状 CoV/勾配/C/P/動径 min/max は不均一性の絶対量しか測れず,Y 軸単調勾配と中央ピーク楕円を構造的に区別できない問題を解決する 5 つの純関数: `calc_intensity_centroid`(輝度重心,5 値)/ `calc_angular_radial_decomposition`(極座標分解,angular_ratio が 0=同心円〜1=方向依存,3 値)/ `calc_ssim`(構造的類似度,scikit-image 依存,shape_reference 指定時のみ)/ `calc_ncc`(正規化相関係数,絶対輝度不変)/ `calc_intensity_pca`(weighted PCA で主軸角度と eccentricity,4 値).mask 省略可能,完全均一画像で angular_ratio/NCC は NaN を返す.`MetricsConfig.shape_metrics=true` / `shape_reference` フィールドで有効化,後方互換保持.依存追加: `scikit-image>=0.21.0`.詳細: [TECH_11 形状指標の見直し](docs/05_TECH/TECH_11_形状指標の見直しと新指標導入.md) ※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴(動機・設計判断・失敗パターン)は [docs/PROGRESS.md](docs/PROGRESS.md) に追記する.運用ルールは `.claude/rules/progress-log.md` を参照(該当ファイル編集時に自動ロードされる). diff --git a/configs/eval_baseline_dng_target.yaml b/configs/eval_baseline_dng_target.yaml index a4a4af9..6c52f26 100644 --- a/configs/eval_baseline_dng_target.yaml +++ b/configs/eval_baseline_dng_target.yaml @@ -1,7 +1,7 @@ # Step 8-13 用:定量モード DNG + LSC 順方向適用後の実機ターゲットと直接比較する # シミュ評価設定(過去 Step 8-1〜8-12 の評価 config 群と並列に残し,Step 8-13 評価条件を固定化する). # -# 実機側 (MiniTias-Evaluation): DNG → LSC 順方向適用 → linear → 白板 ROI で評価 +# 実機側 (SmTIAS-Evaluation): DNG → LSC 順方向適用 → linear → 白板 ROI で評価 # mean=207.82, CoV=0.0695, 中心/周辺=1.0911, 勾配=8.35%, 動径 min/max=0.860 # (`reference_measurement/quantitative/MiniTIAS_QM_20260601_124500.dng` 暗闇撮影, # 詳細は docs/06_TEST/TEST_05_PNG_DNG評価比較.md と TEST_06_外乱光影響評価.md) @@ -21,7 +21,7 @@ # - configs/eval_baseline_dng_target.yaml ← 本設定: Step 8-13〜 (OETF off, linear, mean=207.82) # - configs/eval_real.yaml : 実機 PNG 評価 (過去 sRGB ターゲット算出用,現状参考扱い) # -# 詳細: docs/05_TECH/TECH_06_MiniTias-Evaluation引き継ぎ受領.md +# 詳細: docs/05_TECH/TECH_06_SmTIAS-Evaluation引き継ぎ受領.md roi: type: image_pixel x: 24 diff --git a/configs/scene_baseline.yaml b/configs/scene_baseline.yaml index 638b4d9..2783d5a 100644 --- a/configs/scene_baseline.yaml +++ b/configs/scene_baseline.yaml @@ -1,5 +1,5 @@ name: baseline_minitias -description: MiniTIAS 基準設計シーン(Step 8-9).LED 位置を Fusion 360 設計 STL から抽出した正確な値に更新(configs/leds_extracted.yaml +description: SmTIAS 基準設計シーン(Step 8-9).LED 位置を Fusion 360 設計 STL から抽出した正確な値に更新(configs/leds_extracted.yaml 経由).orthographic センサで評価板の裏面(-Z 側 = スマホ側)の照度分布マップを 2D 画像として直接取得する. geometry: meshes: diff --git a/configs/scene_baseline_blend.yaml b/configs/scene_baseline_blend.yaml index 903fda8..662ea0f 100644 --- a/configs/scene_baseline_blend.yaml +++ b/configs/scene_baseline_blend.yaml @@ -15,7 +15,7 @@ # 参考: TECH_10 残差主因候補 §A1「内壁の非 Lambertian 性(光沢成分混合 BSDF)」 name: baseline_minitias_blend description: > - MiniTIAS 基準設計シーン(Step 8-14 感度分析). + SmTIAS 基準設計シーン(Step 8-14 感度分析). printer_white を diffuse + roughconductor の blendbsdf に変更して 内壁の光沢成分が輝度分布「形」に与える影響を観察する. weight=0.15, alpha=0.3 はスイープの中間値(起点). diff --git a/configs/scene_baseline_datasheet.yaml b/configs/scene_baseline_datasheet.yaml index bdd437a..8e1c551 100644 --- a/configs/scene_baseline_datasheet.yaml +++ b/configs/scene_baseline_datasheet.yaml @@ -1,5 +1,5 @@ name: baseline_minitias -description: 'MiniTIAS scene aligned with LP-2835D90VW data sheet (Step 8-11). LED: +description: 'SmTIAS scene aligned with LP-2835D90VW data sheet (Step 8-11). LED: spot emitter with cos^1.2 equivalent profile (cutoff=85deg, beam=26.72deg, I_0=0.021951 W/sr, flux Phi_e=0.0625 W). Reflectance 0.89 (Step 8-6 physical consistency).' geometry: diff --git a/configs/scene_baseline_emitter_real.yaml b/configs/scene_baseline_emitter_real.yaml index 4423c2e..aa69799 100644 --- a/configs/scene_baseline_emitter_real.yaml +++ b/configs/scene_baseline_emitter_real.yaml @@ -1,5 +1,5 @@ name: baseline_minitias -description: MiniTIAS 基準設計シーン(発光面実サイズ検証用、size 1.5x1.5、radiance スケール調整で Φe 不変).Step +description: SmTIAS 基準設計シーン(発光面実サイズ検証用、size 1.5x1.5、radiance スケール調整で Φe 不変).Step 8 点光源近似の実証用一時設定. geometry: meshes: diff --git a/configs/scene_baseline_spot.yaml b/configs/scene_baseline_spot.yaml index 5c31198..14ea326 100644 --- a/configs/scene_baseline_spot.yaml +++ b/configs/scene_baseline_spot.yaml @@ -1,5 +1,5 @@ name: baseline_minitias -description: 'MiniTIAS scene with spot emitters (data-sheet config: cutoff=90deg, +description: 'SmTIAS scene with spot emitters (data-sheet config: cutoff=90deg, beam_width=30deg, FWHM=120deg). LED area light replaced by spot light with flux-preserved intensity I_0=0.02678 W/sr. Test config for emitter directionality experiment.' geometry: diff --git "a/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" "b/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" index 205816f..fdaed37 100644 --- "a/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" +++ "b/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" @@ -2,14 +2,14 @@ ## 概要 (Overview) -Fusion 360 で設計中の MiniTIAS 筐体を CPU 上で光学シミュレーションし, -MiniTias-Evaluation と互換の指標で照明均一性を評価できるようにする. +Fusion 360 で設計中の SmTIAS 筐体を CPU 上で光学シミュレーションし, +SmTIAS-Evaluation と互換の指標で照明均一性を評価できるようにする. ## 言語・実行環境 (Language & Runtime) | 項目 | 採用 | 備考 | | --- | --- | --- | -| 言語 | Python | MiniTias-Evaluation と揃え,評価コード(`uniformity.py`)を共有しやすくするため | +| 言語 | Python | SmTIAS-Evaluation と揃え,評価コード(`uniformity.py`)を共有しやすくするため | | Python バージョン | 3.12(`.python-version` で固定) | Mitsuba 3 の Windows wheel が安定して配布されている範囲 | | OS | Windows 10 / 11(主) | macOS / Linux でも理論上動作するが優先サポートしない | | ハードウェア | CPU のみ(当面) | 将来 GPU(CUDA)への移行はオプションとして残す(後述) | @@ -32,7 +32,7 @@ ### 既存ツールとの比較(なぜ自作 Mitsuba 3 か) -本プロジェクトの本質は「きれいな絵を作る」ことではなく,**実機センサが吐く数値を物理的に再現し,実測との差の原因を切り分けられること**にある(MiniTIAS は白い筐体内壁の多重反射で照明を均一化する設計のため.[SPEC_03 参照](../04_SPEC/SPEC_03_基準設計の物理構成.md)).この性質が選定をほぼ決める. +本プロジェクトの本質は「きれいな絵を作る」ことではなく,**実機センサが吐く数値を物理的に再現し,実測との差の原因を切り分けられること**にある(SmTIAS は白い筐体内壁の多重反射で照明を均一化する設計のため.[SPEC_03 参照](../04_SPEC/SPEC_03_基準設計の物理構成.md)).この性質が選定をほぼ決める. | 候補 | ライセンス費 | 物理量の直接取得 | 評価指標コードの実機共有 | キャリブの透明性(ISP/OETF 切分け) | 拡張性(スペクトル / 自動微分) | | --- | --- | --- | --- | --- | --- | @@ -43,7 +43,7 @@ 決め手(上記「採用理由」を補完する観点): - **コスト**: この種の商用照明シミュレータは買い切りでなく年額ライセンス・かつ見積もりベースで,1 シート年間数十万〜数百万円規模と一般に言われる水準.研究室での単一目的(照明均一性の事前検討)には過大投資.正確な金額はベンダー見積もり次第のため断定しないが,桁感としては妥当. -- **評価指標コードの実機共有(決定的)**: `uniformity.py` を MiniTias-Evaluation から直接コピーし(下記「[MiniTias-Evaluation コードの取り扱い](#minitias-evaluation-コードの取り扱い-reuse-policy)」),シミュと実測を**同一実装**で評価する.差が出れば「純粋に物理差」と断言できる.閉じた商用ツールでは内部の輝度変換・指標計算を実機系 OSS とビット一致させられず,この担保が構造的に不可能. +- **評価指標コードの実機共有(決定的)**: `uniformity.py` を SmTIAS-Evaluation から直接コピーし(下記「[SmTIAS-Evaluation コードの取り扱い](#minitias-evaluation-コードの取り扱い-reuse-policy)」),シミュと実測を**同一実装**で評価する.差が出れば「純粋に物理差」と断言できる.閉じた商用ツールでは内部の輝度変換・指標計算を実機系 OSS とビット一致させられず,この担保が構造的に不可能. - **キャリブレーションの透明性**: sRGB OETF / ISP レンズシェーディング / spp / max_depth といった交絡を自前でモデル化し,一つずつ切り分けられる.実例として Step 8 では見かけ差の**約 2/3 が sRGB 符号化ドメイン不一致**だったと特定している([SPEC_03「キャリブレーション経過」§寄与順の訂正と残差](../04_SPEC/SPEC_03_基準設計の物理構成.md):寄与順は OETF(最大)> ISP レンズシェーディング > 反射率).中身が全て見える自作ならではの分析. - **拡張性**: スペクトル変種(`llvm_ad_rgb` → spectral)への切替で色再現検証へ,自動微分(AD)で将来の逆設計(最適 LED 配置の勾配ベース探索)へ,同一基盤のまま拡張できる. @@ -101,11 +101,11 @@ OBJ / 3MF も将来検討可.現時点では情報量と Python での扱いやすさのバランスで STL を採用. -## MiniTias-Evaluation コードの取り扱い (Reuse Policy) +## SmTIAS-Evaluation コードの取り扱い (Reuse Policy) 均一性評価コードは **コピーして独立運用**(方針 a). -- `MiniTias-Evaluation/src/uniformity.py` を本リポジトリ内に複製して使う +- `SmTIAS-Evaluation/src/analysis/uniformity.py`(旧 `src/uniformity.py`)を本リポジトリ内に複製して使う - 配置先(仮): `src/sm_tias_lightsim/uniformity.py` - ファイル冒頭に元の SHA / 出典を docstring で明記 - シミュレータ向けに必要があれば自由に拡張する(例: float64 直接入力の関数追加) @@ -119,7 +119,7 @@ ├── geometry/ # STL 読込・座標変換 ├── scene/ # Mitsuba シーン構築(光源・材料・センサ) ├── render/ # レンダリング実行・画像出力 - ├── uniformity.py # 評価指標(MiniTias-Evaluation からコピー) + ├── uniformity.py # 評価指標(SmTIAS-Evaluation からコピー) └── pipeline.py # 全体パイプライン CLI configs/ # シーン・材料・LED 配置の YAML/JSON output/ # 結果(画像・CSV・図) diff --git "a/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" index d4b9cb0..fd62943 100644 --- "a/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" +++ "b/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -36,6 +36,8 @@ cd SmTIAS-LightSim ``` +※ 関連リポジトリ([SmTIAS-Capture](https://github.com/rintoHasegawa/SmTIAS-Capture)・[SmTIAS-Evaluation](https://github.com/rintoHasegawa/SmTIAS-Evaluation))はローカルに置かず,必要時に `gh` CLI 等で GitHub から直接参照する(CLAUDE.md「外部参照リポジトリ」参照). + ### 3. 依存と Python ランタイムを同期 ```powershell diff --git "a/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" index b402665..8e45cc4 100644 --- "a/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" +++ "b/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -7,7 +7,7 @@ - [x] `rintoHasegawa/SmTIAS-LightSim` を Private で作成 - [x] `main` ブランチを作成・初期コミット - [x] programming-template から初回同期(`/sync-template`) -- [x] `MiniTIAS/` と `MiniTias-Evaluation/` を `.gitignore` に追加(参照用ローカルコピーのため) +- [x] `SmTIAS/` と `SmTIAS-Evaluation/` を `.gitignore` に追加(参照用ローカルコピーのため) ## 2. uv の動作確認(完了済み) diff --git "a/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" "b/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" index ac7200c..7ee7a08 100644 --- "a/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" +++ "b/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" @@ -3,12 +3,12 @@ ## プロジェクト概要 (Project Overview) - プロジェクト名: SmTIAS-LightSim -- 目的: MiniTIAS(スマートフォン舌画像撮影装置)の照明ユニットを試作する前に, +- 目的: SmTIAS(スマートフォン舌画像撮影装置)の照明ユニットを試作する前に, LED 配置・ディフューザー形状・筐体内反射条件を仮想的に変更しながら照明均一性を シミュレーションし,設計の方向性を絞り込む - 背景: - - 既存の MiniTIAS は中心/周辺比 ≈ 1.064,勾配 ≈ 6% の照明ムラが実測で確認されている - ([MiniTias-Evaluation/REPORT_01](../../MiniTias-Evaluation/REPORT_01_照明均一性評価報告書.md)) + - 既存の SmTIAS は中心/周辺比 ≈ 1.064,勾配 ≈ 6% の照明ムラが実測で確認されている + ([SmTIAS-Evaluation/TEST_01](https://github.com/rintoHasegawa/SmTIAS-Evaluation/blob/main/docs/06_TEST/TEST_01_照明均一性評価報告書.md)) - 実機制作→撮影→評価のサイクルは筐体 3D プリントや回路組み立てのコストが高く, 設計変更を数多く試せない - Fusion 360 で筐体 3D モデルを試作中のため,そのジオメトリを取り込めると設計変更が速い @@ -28,7 +28,7 @@ - **照明均一性の事前シミュレーション**: - 白板相当の平面(ROI 相当)での輝度分布を算出 - 出力は実機の撮影画像(PNG)と同じ形式の擬似撮影画像,または輝度マップ -- **MiniTias-Evaluation と同じ指標での評価**: +- **SmTIAS-Evaluation と同じ指標での評価**: - Rec.709 輝度,CoV,標準偏差,最大/最小比 - 3 ゾーン分析(center / middle / periphery)・放射状プロファイル - **設計バリエーションの比較**: @@ -36,8 +36,8 @@ ### やらないこと (Out of Scope) -- MiniTIAS アプリ(Flutter/Dart)の修正(`MiniTIAS/` は参照用) -- 実測データの処理(MiniTias-Evaluation の範疇) +- SmTIAS アプリ(Flutter/Dart)の修正(`SmTIAS/` は参照用) +- 実測データの処理(SmTIAS-Evaluation の範疇) - 筐体の構造・熱・強度解析(光学のみ) - GUI / Web アプリ化(CLI or スクリプト実行) - リアルタイムシミュレーション @@ -47,7 +47,7 @@ | 優先度 | 対象 | 評価項目 | 備考 | | --- | --- | --- | --- | -| 1(最初) | 基準設計の再現 | MiniTIAS 実測値との一致(均一性指標) | 現行構成をモデル化してキャリブレーション | +| 1(最初) | 基準設計の再現 | SmTIAS 実測値との一致(均一性指標) | 現行構成をモデル化してキャリブレーション | | 2 | 光源配置の最適化 | CoV,中心/周辺比の改善 | LED 個数・角度・位置を変数化 | | 3 | ディフューザー形状の検討 | CoV の改善 | 透過率・散乱特性をパラメータ化 | | 4(将来) | 色再現性の事前検討 | ΔE | 均一性の課題解決後に着手 | @@ -60,12 +60,12 @@ - 材料パラメータ(反射率・透過率・散乱係数等) - **出力**: - シミュレーション画像(PNG)または輝度マップ(NumPy/PNG) - - 均一性指標 CSV(MiniTias-Evaluation と同フォーマット) + - 均一性指標 CSV(SmTIAS-Evaluation と同フォーマット) - 設計比較レポート(表 + 可視化 PNG) ## 検証の進め方 (Evaluation Strategy) -1. 現行 MiniTIAS の構成を仮想モデル化し,実測値(CoV ≈ 0.0426,勾配 ≈ 6%)と +1. 現行 SmTIAS の構成を仮想モデル化し,実測値(CoV ≈ 0.0426,勾配 ≈ 6%)と 比較してシミュレーション精度をキャリブレーション 2. 光源配置・ディフューザー形状の改良案を複数作り,同じ指標で比較 3. 有望な改良案を Fusion 360 側に反映し,実機試作へ diff --git "a/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" "b/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" index f7dd922..eb4995b 100644 --- "a/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" +++ "b/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" @@ -37,7 +37,7 @@ | 1〜3 | なし | テスト結果の目視 | テスト全通過 | | 4 | なし | **レンダリング PNG の目視確認**(光が物理的に妥当か) | 最小シーンが完走 | | 5 | なし | CLI 入出力の確認 | コマンドが期待動作 | -| 6 | MiniTias-Evaluation の実測 PNG | **実測と評価結果の数値一致を確認** | 既知値と一致 | +| 6 | SmTIAS-Evaluation の実測 PNG | **実測と評価結果の数値一致を確認** | 既知値と一致 | | **7** | なし | **sm-visualize の 3D 表示確認(LED 位置・照度分布の目視)** | minimal scene で照度分布が解析解と数 % 以内 | | **8** | **Fusion 360 → STL,LED 配置,材料初期値** | **実測との突合.パラメータ調整判断**(反復) | **許容範囲内で一致.数値を本ファイルに記録** | | **9** | **改良案の Fusion 360 → STL(複数)** | **各バリエーションの結果評価と採用候補の選定** | **比較表完成.最低 1 案がベースライン改善** | @@ -50,8 +50,8 @@ - **目的**: 評価ロジックを最初に確定.ステップ 7 で「実測との比較」をするための物差しを先に作る - **やること**: - - `MiniTias-Evaluation/src/uniformity.py` を `src/sm_tias_lightsim/uniformity.py` にコピー - - 元の SHA を docstring に明記(取得元: `https://github.com/rintoHasegawa/MiniTias-Evaluation`) + - `SmTIAS-Evaluation/src/uniformity.py` を `src/sm_tias_lightsim/uniformity.py` にコピー + - 元の SHA を docstring に明記(取得元: `https://github.com/rintoHasegawa/SmTIAS-Evaluation`) - `evaluation/zones.py`:3 ゾーン分析(中心 d<0.33 / 中間 / 周辺 d≥0.66) - `evaluation/radial.py`:放射状プロファイル - テスト:合成輝度マップ(既知の CoV)に対して期待値が出ること @@ -107,7 +107,7 @@ - `evaluation/roi.py`:`image_pixel` 型 ROI 抽出(最初は矩形のみ.`scene_face` は後回し可) - `evaluation/visualize.py`:輝度マップ / ヒストグラム / 放射プロファイル / ゾーンマップを matplotlib で出力 - `cli/evaluate.py`:`sm-evaluate --image --config --output ` を実装 - - テスト: 実測 PNG(MiniTias-Evaluation サンプル)と既知の指標値が一致すること + - テスト: 実測 PNG(SmTIAS-Evaluation サンプル)と既知の指標値が一致すること - **完了条件**: シミュ PNG と実測 PNG の両方で同じ指標 CSV が出る ### Step 7: 3D 照度ビューア(キャリブ調査ツール) @@ -125,7 +125,7 @@ - **目的**: シミュレーションの妥当性を実測値で検証.以降の改良案の基準を作る - **やること**: - - 現行 MiniTIAS のジオメトリを Fusion 360 から STL でエクスポート + - 現行 SmTIAS のジオメトリを Fusion 360 から STL でエクスポート - LED の配置(位置・向き・個数)を `configs/scene_baseline.yaml` に記述 - 材料パラメータの初期値を仮置き(ディフューザー透過率・筐体内壁反射率) - `sm-render → sm-evaluate` で指標を算出 diff --git "a/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" "b/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" index 252e24f..a2a551d 100644 --- "a/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" +++ "b/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" @@ -5,9 +5,9 @@ SmTIAS-LightSim は次の 2 段階を独立した CLI として提供する. 1. **render**: シーン定義 YAML + STL メッシュを入力に,Mitsuba 3 で擬似撮影画像(PNG)と輝度マップを出力する. -2. **evaluate**: PNG または輝度マップ + ROI 設定を入力に,MiniTias-Evaluation 互換の均一性指標(CSV)と可視化(PNG)を出力する. +2. **evaluate**: PNG または輝度マップ + ROI 設定を入力に,SmTIAS-Evaluation 互換の均一性指標(CSV)と可視化(PNG)を出力する. -evaluate を独立させることで,**実測 PNG(MiniTIAS で撮影したもの)にも同じコマンドが使える**.シミュレーションと実測を同じ物差しで比較できる. +evaluate を独立させることで,**実測 PNG(SmTIAS で撮影したもの)にも同じコマンドが使える**.シミュレーションと実測を同じ物差しで比較できる. ## 全体パイプライン (Pipeline) @@ -68,7 +68,7 @@ │ └── output.py # HDR film → PNG / luminance.npy 出力 ├── runtime/ │ └── llvm_init.py # LLVM JIT 初期化(DRJIT_LIBLLVM_PATH 自動探索・variant 経路ログ) -├── uniformity.py # MiniTias-Evaluation からコピー(Rec.709, CoV, max/min) +├── uniformity.py # SmTIAS-Evaluation からコピー(Rec.709, CoV, max/min) ├── evaluation/ │ ├── roi.py # 画像 ROI 抽出(image_pixel 型) │ ├── zones.py # 3 ゾーン分析(center / middle / periphery) @@ -102,7 +102,7 @@ | `render/output` | 輝度配列 → PNG / luminance.npy ファイル | tone mapping 等の選択肢を持つ | | `runtime/llvm_init` | LLVM JIT 環境初期化 | `DRJIT_LIBLLVM_PATH` 自動探索 + variant 経路の INFO/WARNING ログ | | `evaluation/roi` | 画像 + ROI 定義 → ROI 内の輝度配列 | image_pixel 型(scene_face は将来実装) | -| `uniformity` | 輝度配列 → 均一性指標 dict | MiniTias-Evaluation 仕様準拠 | +| `uniformity` | 輝度配列 → 均一性指標 dict | SmTIAS-Evaluation 仕様準拠 | | `evaluation/zones` | 輝度配列 → 中心 / 中間 / 周辺の各統計 | 距離正規化を内部で行う | | `evaluation/radial` | 輝度配列 → 中心からの距離 vs 平均輝度 + 動径 min/max 比 | プロット用データ | | `evaluation/oetf` | シミュ linear 輝度 → sRGB 符号化値(露出アンカー) | シミュのみに適用.実測 PNG には適用しない | @@ -167,7 +167,7 @@ 実測値(CoV ≈ 0.0426,勾配 ≈ 6%)との一致を確認するための運用: -1. 現行 MiniTIAS の構成を `scene_baseline.yaml` に再現 +1. 現行 SmTIAS の構成を `scene_baseline.yaml` に再現 2. `sm-render → sm-evaluate` で指標を算出 3. 実測値と比較し,差分が大きい場合は次の順で疑う: - ① 光源の配光(Lambertian / cosine 分布の前提が妥当か) 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 3f0583c..f40b452 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" @@ -2,7 +2,7 @@ ## 概要 (Overview) -Step 8(基準設計のキャリブレーション)で対象とする MiniTIAS 実機の物理構成を定義する. +Step 8(基準設計のキャリブレーション)で対象とする SmTIAS 実機の物理構成を定義する. 本ドキュメントは実機写真([REFERENCE/](../../REFERENCE/))と Fusion 360 設計データから読み取った構成を、シミュレーション側でどう表現するかの **認識合わせ** を残すためのものである. 仕様確定前の暫定値(材料パラメータ・LED 強度等)はキャリブレーション反復で更新する. @@ -25,7 +25,7 @@ | 面 | 法線 | Z 座標 | 構造 | 役割 | | --- | --- | --- | --- | --- | | 表面(外側) | +Z 法線 | Z=-2.5〜+12.5(凹凸) | 楕円窓 + AR マーカー + カラーチャート | 撮影された画像で見える側.スマホで写真を撮るときに映る面 | -| **裏面(内側)** | **-Z 法線** | **Z=-4.5(平面)** | **平坦な取付面** | **照度均一性の評価対象面.LED 光がこの面に均一に届くことが MiniTIAS の設計目的** | +| **裏面(内側)** | **-Z 法線** | **Z=-4.5(平面)** | **平坦な取付面** | **照度均一性の評価対象面.LED 光がこの面に均一に届くことが SmTIAS の設計目的** | ### 評価対象面 @@ -184,7 +184,7 @@ 4. ... 5. **max_depth (16) 回反射まで** -MiniTIAS は **白い筐体内壁の多重反射で照明を均一化** する設計のため、多重反射の正確な計算が CoV 値の再現に必須. +SmTIAS は **白い筐体内壁の多重反射で照明を均一化** する設計のため、多重反射の正確な計算が CoV 値の再現に必須. ### 制限 @@ -243,7 +243,7 @@ 6. **【残差の主因候補・未対処】ISP レンズシェーディング補正**: 実測 PNG は実機 ISP の周辺減光電子補正込み、シミュは未補正.OETF 適用後も残る 1.6〜1.9 倍差の主因候補.LSC 順方向モデル(物理動機づけ低自由度形、overfitting 回避)で対処予定. 7. **【残差・不確実・未対処】スマホ独自トーンマップ**: ISP は sRGB OETF に加え独自トーンマッピング/コントラストを掛けうる.真のトーンカーブ未知.残差の一部.調整で消さず正直に残す方針. 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 桁レベルで一致を確認済み.評価ロジック起因の差はない. +9. ~~**評価 ROI の不一致**~~(**解消済み**): ROI を実機と物理対応させ(`configs/eval_baseline.yaml` = pixel (24,37,464,450))、`sm-evaluate` は実測 PNG に対し SmTIAS-Evaluation と小数点 14 桁レベルで一致を確認済み.評価ロジック起因の差はない. ## 参照(References) diff --git "a/docs/04_SPEC/SPEC_04_\350\251\225\344\276\241\344\273\225\346\247\230.md" "b/docs/04_SPEC/SPEC_04_\350\251\225\344\276\241\344\273\225\346\247\230.md" index 38d3b80..bf15bae 100644 --- "a/docs/04_SPEC/SPEC_04_\350\251\225\344\276\241\344\273\225\346\247\230.md" +++ "b/docs/04_SPEC/SPEC_04_\350\251\225\344\276\241\344\273\225\346\247\230.md" @@ -13,7 +13,7 @@ シミュレーション結果(`output//luminance.npy` または `render_uint8.png`)と実測 PNG (`reference_measurement/.../*.png`) を **同一の評価パイプライン**に通し,無次元の均一性指標(CoV,勾配 %,中心/周辺比 等)を算出する.シミュと実測を比較可能にする鍵は **OETF 順方向適用** で,シミュの linear ドメインを実機の sRGB 符号化ドメインに揃える操作である(後述). -設計目的は MiniTias-Evaluation との **数値整合性**(実測 PNG に対し小数点 14 桁レベルで一致確認済み,[TEST_01](../06_TEST/TEST_01_キャリブレーション検証履歴.md) 既知差分 #9)と,シミュ⇄実測の **公平な比較**. +設計目的は SmTIAS-Evaluation との **数値整合性**(実測 PNG に対し小数点 14 桁レベルで一致確認済み,[TEST_01](../06_TEST/TEST_01_キャリブレーション検証履歴.md) 既知差分 #9)と,シミュ⇄実測の **公平な比較**. ## 評価パイプライン (Evaluation Pipeline) @@ -128,7 +128,7 @@ ### luma vs luminance と演算順序の整合 -実測 MiniTias-Evaluation の「輝度値」は厳密には **Rec.709 luma Y'**(ガンマ済み成分への加重和 `Y' = 0.2126R' + 0.7152G' + 0.0722B'`,ガンマを戻さない).シミュ側は linear luminance に直接 OETF を当てている.OETF は非線形なので一般に `Σwᵢ·f(xᵢ) ≠ f(Σwᵢ·xᵢ)` だが,**矛盾しない**: +実測 SmTIAS-Evaluation の「輝度値」は厳密には **Rec.709 luma Y'**(ガンマ済み成分への加重和 `Y' = 0.2126R' + 0.7152G' + 0.0722B'`,ガンマを戻さない).シミュ側は linear luminance に直接 OETF を当てている.OETF は非線形なので一般に `Σwᵢ·f(xᵢ) ≠ f(Σwᵢ·xᵢ)` だが,**矛盾しない**: - Rec.709 重みは合計 1 (0.2126 + 0.7152 + 0.0722 = 1.0000). - **R=G=B=x の無彩色画素**では「チャネル別 OETF→加重和」`Σwᵢ·f(x) = f(x)` も「加重和→OETF」`f(x·Σwᵢ) = f(x)` も**厳密に一致**. @@ -244,7 +244,7 @@ | **動径 min/max 比** | `min(bins) / max(bins)`(空ビンは nan で除外) | 0〜1(1.0 で均一.小さいほどムラ大) | | **動径 min ビン距離** | 最小値ビンの正規化距離 | 0〜1(1.0 が最周辺ビン) | -`metrics.csv` に `radial_min_max_ratio` / `radial_min_distance` / `radial_min` / `radial_max` の 4 列を末尾に追加.既定 False(既存挙動互換).`metrics.radial_profile` の有無に関わらず内部で動径プロファイルを算出するため独立して有効化可能.実装: `evaluation/radial.py:calc_radial_min_max_ratio`(MiniTias-Evaluation の `src/analysis/spatial.py` からマージ). +`metrics.csv` に `radial_min_max_ratio` / `radial_min_distance` / `radial_min` / `radial_max` の 4 列を末尾に追加.既定 False(既存挙動互換).`metrics.radial_profile` の有無に関わらず内部で動径プロファイルを算出するため独立して有効化可能.実装: `evaluation/radial.py:calc_radial_min_max_ratio`(SmTIAS-Evaluation の `src/analysis/spatial.py` からマージ). ### 形状指標 (Shape Metrics — オプション、2026-06-03 導入) @@ -289,7 +289,7 @@ ## 可視化規約 (Figure Conventions) -`sm-evaluate` は `figures/` に以下 4 種を生成.MiniTias-Evaluation 互換スタイル. +`sm-evaluate` は `figures/` に以下 4 種を生成.SmTIAS-Evaluation 互換スタイル. | ファイル | 内容 | カラーマップ・スタイル | | --- | --- | --- | diff --git a/docs/05_TECH/README.md b/docs/05_TECH/README.md index 222ff3c..2b88b83 100644 --- a/docs/05_TECH/README.md +++ b/docs/05_TECH/README.md @@ -15,7 +15,7 @@ | 順序 | ファイル | 内容 | | --- | --- | --- | -| 1 | [TECH_07_LSC取り扱い方針.md](TECH_07_LSC取り扱い方針.md) | 3 プロジェクト (MiniTias / MiniTiasEval / SmTIAS-LightSim) での LSC 役割分担.シミュ側で LSC を扱わない物理的根拠.却下した代替案 3 つの理由 | +| 1 | [TECH_07_LSC取り扱い方針.md](TECH_07_LSC取り扱い方針.md) | 3 プロジェクト (SmTIAS / SmTIAS-Evaluation / SmTIAS-LightSim) での LSC 役割分担.シミュ側で LSC を扱わない物理的根拠.却下した代替案 3 つの理由 | | 2 | [TECH_08_実機変更とシミュ側対応.md](TECH_08_実機変更とシミュ側対応.md) | 実機側 8 項目変更に対するシミュ側 3 層 (シーン定義 / sm-render / sm-evaluate) の対応マッピング.タイプ I (本質構造同一) / タイプ II (許容している構造的差異) の分類 | | 3 | [TECH_09_LEDデータシート調査結果.md](TECH_09_LEDデータシート調査結果.md) | OEM 元 HONGLITRONIC データシート発見と判明事項.配光は Lambertian と数値一致.Step 8-10/8-11 試行の事後評価.SPEC_03 訂正事項 | | 4 | [TECH_10_残差主因候補の網羅整理.md](TECH_10_残差主因候補の網羅整理.md) | Step 8-13 で確定した残差 2.63× の主因候補を 5 カテゴリ 18 項目で網羅整理.**A1/A9/D1 の検証結果を反映**.形改善の最有力は B1 幾何精度に集約.数値改善は A8 反射率 R=0.89 | @@ -25,7 +25,7 @@ | 観点 | 結論 | | --- | --- | -| LSC 補正 | 実機側 (MiniTiasEval) で順方向適用.**シミュ側は扱わない** (orthographic で構造的に等価) | +| LSC 補正 | 実機側 (SmTIAS-Evaluation) で順方向適用.**シミュ側は扱わない** (orthographic で構造的に等価) | | ガンマ補正 | sm-evaluate で **OETF off** (実機 DNG が linear) | | 絶対値スケール調整 | mean アンカー正規化で target_mean=207.82 に揃え | | LED 配光モデル | **area light Lambertian (cos θ)** — データシート実測と数値一致 | @@ -34,13 +34,13 @@ ## 🔵 議論の経緯 — プロジェクト間ハンドオフ往復 (6 ファイル) -MiniTias 撮影アプリ + MiniTiasEval 解析ツールへの「要求 → 報告 → 回答 → 受領」のハンドオフ記録.**読まなくても現状方針 (TECH_07〜09) は理解できる**が,「なぜそういう判断になったか」を辿るときに参照する. +SmTIAS 撮影アプリ + SmTIAS-Evaluation 解析ツールへの「要求 → 報告 → 回答 → 受領」のハンドオフ記録.**読まなくても現状方針 (TECH_07〜09) は理解できる**が,「なぜそういう判断になったか」を辿るときに参照する. ### 経緯マップ ```text -[MiniTias 撮影アプリへの要求と回答] - TECH_01 (要求書) ────→ MiniTias 実装 +[SmTIAS 撮影アプリへの要求と回答] + TECH_01 (要求書) ────→ SmTIAS 実装 │ ↓ TECH_02 (引き継ぎ手順) TECH_03 (実装報告 + SHADING_MODE 相談) │ @@ -50,8 +50,8 @@ ↓ ★ 結論集約 → TECH_07 LSC 取り扱い方針 -[MiniTiasEval DNG 対応への要求と受領] - TECH_05 (要求書) ────→ MiniTiasEval 実装 +[SmTIAS-Evaluation DNG 対応への要求と受領] + TECH_05 (要求書) ────→ SmTIAS-Evaluation 実装 │ ↓ TECH_06 (引き継ぎ受領記録) @@ -65,12 +65,12 @@ | ファイル | 役割 | | --- | --- | -| [TECH_01_定量撮影モード要求仕様.md](TECH_01_定量撮影モード要求仕様.md) | SmTIAS-LightSim → MiniTias 撮影アプリ への要求書.Camera2 API 設定変更・DNG 化等 | -| [TECH_02_MiniTIAS引き継ぎ手順.md](TECH_02_MiniTIAS引き継ぎ手順.md) | TECH_01 を MiniTias 側 Claude セッションで作業着手する際の作業ガイド | -| [TECH_03_定量モード実装報告とSHADING_MODE相談.md](TECH_03_定量モード実装報告とSHADING_MODE相談.md) | MiniTias 側からの実装報告.SHADING_MODE の扱いを SmTIAS-LightSim 側に相談 | -| [TECH_04_MiniTIASへの回答.md](TECH_04_MiniTIASへの回答.md) | TECH_03 への回答.SHADING_MODE = HIGH_QUALITY 維持を判断.フェーズ A/B 分割方針 | -| [TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md](TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md) | SmTIAS-LightSim → MiniTiasEval 解析ツール への要求書.`apply_lsc_*` 関連は訂正済 | -| [TECH_06_MiniTias-Evaluation引き継ぎ受領.md](TECH_06_MiniTias-Evaluation引き継ぎ受領.md) | MiniTiasEval 側からの実装受領記録.重要な設計判断 (LSC は順方向適用) を集約 | +| [TECH_01_定量撮影モード要求仕様.md](TECH_01_定量撮影モード要求仕様.md) | SmTIAS-LightSim → SmTIAS 撮影アプリ への要求書.Camera2 API 設定変更・DNG 化等 | +| [TECH_02_SmTIAS引き継ぎ手順.md](TECH_02_SmTIAS引き継ぎ手順.md) | TECH_01 を SmTIAS 側 Claude セッションで作業着手する際の作業ガイド | +| [TECH_03_定量モード実装報告とSHADING_MODE相談.md](TECH_03_定量モード実装報告とSHADING_MODE相談.md) | SmTIAS 側からの実装報告.SHADING_MODE の扱いを SmTIAS-LightSim 側に相談 | +| [TECH_04_SmTIASへの回答.md](TECH_04_SmTIASへの回答.md) | TECH_03 への回答.SHADING_MODE = HIGH_QUALITY 維持を判断.フェーズ A/B 分割方針 | +| [TECH_05_SmTIAS-Evaluation_DNG対応要求仕様.md](TECH_05_SmTIAS-Evaluation_DNG対応要求仕様.md) | SmTIAS-LightSim → SmTIAS-Evaluation 解析ツール への要求書.`apply_lsc_*` 関連は訂正済 | +| [TECH_06_SmTIAS-Evaluation引き継ぎ受領.md](TECH_06_SmTIAS-Evaluation引き継ぎ受領.md) | SmTIAS-Evaluation 側からの実装受領記録.重要な設計判断 (LSC は順方向適用) を集約 | ## 関連ディレクトリ diff --git "a/docs/05_TECH/TECH_01_\345\256\232\351\207\217\346\222\256\345\275\261\343\203\242\343\203\274\343\203\211\350\246\201\346\261\202\344\273\225\346\247\230.md" "b/docs/05_TECH/TECH_01_\345\256\232\351\207\217\346\222\256\345\275\261\343\203\242\343\203\274\343\203\211\350\246\201\346\261\202\344\273\225\346\247\230.md" index d1950f3..948809f 100644 --- "a/docs/05_TECH/TECH_01_\345\256\232\351\207\217\346\222\256\345\275\261\343\203\242\343\203\274\343\203\211\350\246\201\346\261\202\344\273\225\346\247\230.md" +++ "b/docs/05_TECH/TECH_01_\345\256\232\351\207\217\346\222\256\345\275\261\343\203\242\343\203\274\343\203\211\350\246\201\346\261\202\344\273\225\346\247\230.md" @@ -1,10 +1,10 @@ # 定量撮影モード要求仕様 (Quantitative Capture Mode Specification) -本ドキュメントは SmTIAS-LightSim プロジェクトから MiniTIAS プロジェクトに対する **撮影モード拡張の要求仕様** である.SmTIAS-LightSim のキャリブレーション作業 (Step 8 系) で判明した「実機 PNG が定量データとして揺らぐ」問題を解消するための撮影アプリ側改修を依頼する. +本ドキュメントは SmTIAS-LightSim プロジェクトから SmTIAS プロジェクトに対する **撮影モード拡張の要求仕様** である.SmTIAS-LightSim のキャリブレーション作業 (Step 8 系) で判明した「実機 PNG が定量データとして揺らぐ」問題を解消するための撮影アプリ側改修を依頼する. ## 概要 (Overview) -MiniTIAS([MiniTias](https://github.com/rintoHasegawa/MiniTias) リポジトリ)の撮影アプリに,現状の通常撮影モードに加えて **「定量撮影モード (Quantitative Capture Mode)」** を追加することを要求する. +SmTIAS([SmTIAS](https://github.com/rintoHasegawa/SmTIAS-Capture) リポジトリ)の撮影アプリに,現状の通常撮影モードに加えて **「定量撮影モード (Quantitative Capture Mode)」** を追加することを要求する. 定量撮影モードでは: @@ -16,11 +16,11 @@ ## 背景 (Background) -### SmTIAS-LightSim と MiniTIAS の関係 +### SmTIAS-LightSim と SmTIAS の関係 -- **MiniTIAS**: スマートフォンアプリ.AQUOS sense3 で白板・舌模型を撮影し PNG として保存する. -- **MiniTias-Evaluation**: PC 側.MiniTIAS が保存した PNG を読み込み照明均一性 (CoV/勾配/C/P 等) を算出する. -- **SmTIAS-LightSim**: PC 側.Mitsuba 3 で同じ筐体・LED 配置を仮想撮影し,MiniTias-Evaluation と同じ指標を計算する. +- **SmTIAS**: スマートフォンアプリ.AQUOS sense3 で白板・舌模型を撮影し PNG として保存する. +- **SmTIAS-Evaluation**: PC 側.SmTIAS が保存した PNG を読み込み照明均一性 (CoV/勾配/C/P 等) を算出する. +- **SmTIAS-LightSim**: PC 側.Mitsuba 3 で同じ筐体・LED 配置を仮想撮影し,SmTIAS-Evaluation と同じ指標を計算する. → 3 つのプロジェクトで **同じ評価指標** を出すことで「シミュ vs 実機」を比較する. @@ -34,8 +34,8 @@ 「形を変える唯一の道」として **LSC (Lens Shading Correction) モデル化** が候補に挙がったが,さらに調査した結果,**より根本的な問題** が判明した: -- 既存 baseline 画像 (`MiniTIAS_20260408_144434`) は **MiniTIAS の通常撮影モード**で取得されており,**ISP がすべて自動制御**で動作している. -- 具体的には [MiniTIAS/docs/04_SPEC/SPEC_01](../../MiniTIAS/docs/04_SPEC/SPEC_01_画面機能仕様書.md) のとおり: +- 既存 baseline 画像 (`MiniTIAS_20260408_144434`) は **SmTIAS の通常撮影モード**で取得されており,**ISP がすべて自動制御**で動作している. +- 具体的には [SmTIAS/docs/04_SPEC/SPEC_01](https://github.com/rintoHasegawa/SmTIAS-Capture/blob/main/docs/04_SPEC/SPEC_01_画面機能仕様書.md) のとおり: - AE/AF 安定 1 秒待ち → STILL_CAPTURE → YUV_420_888 取得 → BT.601 で RGB → PNG 保存 - AE / AWB / NR / EDGE / TONEMAP / SHADING はすべて Camera2 API のデフォルト (オート/ON) のまま - これは「人間が見て自然な画像」用設定であり,**定量解析向けではない**. @@ -178,7 +178,7 @@ ### ディレクトリ構成提案 -MiniTIAS 既存構造に従い: +SmTIAS 既存構造に従い: ```text android/app/src/main/kotlin// @@ -210,9 +210,9 @@ - 通常撮影モードは現状仕様のまま維持(既存撮影ワークフローを壊さない) - 既存 baseline 画像 (`MiniTIAS_20260408_144434`) は **「通常モードで撮影された」** ことを SmTIAS-LightSim 側で明示記録([TEST_03](../06_TEST/TEST_03_輝度マップ形状追跡.md) に追記予定) - 新規定量モード撮影は別命名規則を推奨: - - 例: `MiniTIAS_QM_YYYYMMDD_HHmmss.png`(QM = Quantitative Mode) - - メタデータ: `MiniTIAS_QM_YYYYMMDD_HHmmss.meta.json` - - LSC マップ: `MiniTIAS_QM_YYYYMMDD_HHmmss.lsc.npz` + - 例: `SmTIAS_QM_YYYYMMDD_HHmmss.png`(QM = Quantitative Mode) + - メタデータ: `SmTIAS_QM_YYYYMMDD_HHmmss.meta.json` + - LSC マップ: `SmTIAS_QM_YYYYMMDD_HHmmss.lsc.npz` ## 検証方法 (Verification) @@ -244,7 +244,7 @@ ## 開放質問 (Open Questions) -実装着手時に確認が必要な事項.**Q1〜Q4 は MiniTIAS 側実装 (2026-05-31) で解決済**([TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md)).Q5〜Q7 は [TECH_04](TECH_04_MiniTIASへの回答.md) で方針確定. +実装着手時に確認が必要な事項.**Q1〜Q4 は SmTIAS 側実装 (2026-05-31) で解決済**([TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md)).Q5〜Q7 は [TECH_04](TECH_04_SmTIASへの回答.md) で方針確定. | ID | 質問 | 解決状況・確認結果 | | --- | --- | --- | @@ -252,9 +252,9 @@ | Q2 | SH-02M のフロントカメラで `REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING` がサポートされているか | **解決**: サポートあり.`MANUAL_SENSOR` / `MANUAL_POST_PROCESSING` / `RAW` / `READ_SENSOR_SETTINGS` / `BURST_CAPTURE` / `PRIVATE_REPROCESSING` / `YUV_REPROCESSING` | | Q3 | DNG (RAW_SENSOR) 出力は可能か | **解決**: 可能.3264×2448 / 10-bit / BGGR で取得.第 1 優先経路として採用 | | Q4 | LSC マップサイズはどの程度か | **解決**: 13 行 × 17 列(4ch × 13 × 17 のゲイン配列) | -| Q5 | 露光時間・ISO の最適値(固定値の決定) | **方針確定** ([TECH_04](TECH_04_MiniTIASへの回答.md)):10-bit のうち中央値 500 前後を目安.現状 1/60s + ISO 40 で実機 1 ショット確認.後段に半自動キャリブ追加の選択肢あり | -| Q6 | 既存 `MiniTIAS_20260408_144434` を定量モードで再撮影するか | **方針確定** ([TECH_02](TECH_02_MiniTIAS引き継ぎ手順.md)):定量モード以降は新規 baseline.既存は参考扱い | -| Q7 | 既存 PNG 保存形式 (BT.601 経由) を維持するか YUV/RAW 直接保存に変えるか | **解決**: DNG (RAW_SENSOR) を第 1 優先で採用.既存 PNG 経路は MiniTIAS 側で温存([TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md) Phase 3 注記参照) | +| Q5 | 露光時間・ISO の最適値(固定値の決定) | **方針確定** ([TECH_04](TECH_04_SmTIASへの回答.md)):10-bit のうち中央値 500 前後を目安.現状 1/60s + ISO 40 で実機 1 ショット確認.後段に半自動キャリブ追加の選択肢あり | +| Q6 | 既存 `MiniTIAS_20260408_144434` を定量モードで再撮影するか | **方針確定** ([TECH_02](TECH_02_SmTIAS引き継ぎ手順.md)):定量モード以降は新規 baseline.既存は参考扱い | +| Q7 | 既存 PNG 保存形式 (BT.601 経由) を維持するか YUV/RAW 直接保存に変えるか | **解決**: DNG (RAW_SENSOR) を第 1 優先で採用.既存 PNG 経路は SmTIAS 側で温存([TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md) Phase 3 注記参照) | ## 関連ドキュメント (Related Documents) @@ -262,6 +262,6 @@ - [TEST_03 輝度マップ形状追跡](../06_TEST/TEST_03_輝度マップ形状追跡.md) — 形のずれの定性的記録.LSC モデル化議論の出発点 - [SPEC_04 評価仕様](../04_SPEC/SPEC_04_評価仕様.md) — sm-evaluate の OETF 適用・mean アンカー処理 - [SPEC_03 基準設計の物理構成](../04_SPEC/SPEC_03_基準設計の物理構成.md) — シミュ側物理モデル -- [MiniTIAS/docs/04_SPEC/SPEC_01 画面機能仕様書](../../MiniTIAS/docs/04_SPEC/SPEC_01_画面機能仕様書.md) — 現状のカメラ制御仕様(変更前ベースライン) +- [SmTIAS/docs/04_SPEC/SPEC_01 画面機能仕様書](https://github.com/rintoHasegawa/SmTIAS-Capture/blob/main/docs/04_SPEC/SPEC_01_画面機能仕様書.md) — 現状のカメラ制御仕様(変更前ベースライン) - [Android Camera2 API LensShadingMap](https://developer.android.com/reference/android/hardware/camera2/params/LensShadingMap) - [Android Camera2 API CaptureRequest](https://developer.android.com/reference/android/hardware/camera2/CaptureRequest) diff --git "a/docs/05_TECH/TECH_02_MiniTIAS\345\274\225\343\201\215\347\266\231\343\201\216\346\211\213\351\240\206.md" "b/docs/05_TECH/TECH_02_MiniTIAS\345\274\225\343\201\215\347\266\231\343\201\216\346\211\213\351\240\206.md" deleted file mode 100644 index 025c7cd..0000000 --- "a/docs/05_TECH/TECH_02_MiniTIAS\345\274\225\343\201\215\347\266\231\343\201\216\346\211\213\351\240\206.md" +++ /dev/null @@ -1,271 +0,0 @@ -# MiniTIAS 引き継ぎ手順 (Hand-off Procedure to MiniTIAS) - -本ドキュメントは [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) を MiniTIAS リポジトリで実装する際の **作業着手ガイド** および **データ受け渡し仕様** である.SmTIAS-LightSim と MiniTias の両プロジェクトを Claude Code セッションで作業している前提に最適化している. - -## 想定読者 (Intended Reader) - -- **MiniTias 側 Claude セッション**: 本ドキュメントを最初に開き,次に TECH_01 を読んで実装着手する. -- **人間レビュー (rinto)**: 両セッションを行き来し,質問の橋渡しと完了確認を行う. - -## プロジェクト関係図 (Project Relationship) - -```text -┌─────────────────────────┐ ┌──────────────────────────┐ -│ MiniTias │ │ SmTIAS-LightSim │ -│ (Flutter / Android) │ │ (Python / Mitsuba 3) │ -│ │ │ │ -│ 撮影アプリ │ │ 光散乱シミュレータ │ -│ - インカメラ制御 │ │ - 仮想シーン構築 │ -│ - 撮影モード │ │ - 物理光線追跡 │ -│ - PNG / メタデータ保存 │ ──→ │ - sm-evaluate │ -└─────────────────────────┘ └──────────────────────────┘ - │ - │ 同じ評価指標 - ▼ - ┌──────────────────────────┐ - │ MiniTias-Evaluation │ - │ (Python) │ - │ │ - │ 実機 PNG → 均一性指標 │ - └──────────────────────────┘ -``` - -→ 3 プロジェクトで **同じ評価指標** を出し,シミュ vs 実機を比較する.本作業は MiniTias 側に **「定量撮影モード」** を追加し,定量比較可能な実機データを取得できるようにする. - -## 背景の要約 (Background Digest) - -詳細は SmTIAS-LightSim 側の [TEST_01](../06_TEST/TEST_01_キャリブレーション検証履歴.md) と [TEST_03](../06_TEST/TEST_03_輝度マップ形状追跡.md) を参照.要点のみ抜粋: - -- SmTIAS-LightSim 側で **Step 8-1〜8-12 のキャリブ作業** を実施し,残差 2.1× で頭打ち -- 「形のずれ」を解消するため LSC モデル化を検討していたが,さらに調査した結果,**実機 PNG 自体が定量データとして揺らいでいる**ことが判明 -- 既存 baseline `MiniTIAS_20260408_144434` は MiniTias の通常モード (AE/AWB/NR/EDGE/TONEMAP 全自動) で撮影されており,撮影ごとに値が変動する可能性 -- → **「定量撮影モード」** の追加が必要.詳細は [TECH_01](TECH_01_定量撮影モード要求仕様.md) - -## MiniTias 側 Claude セッションの最初のアクション (First Actions) - -セッション開始時に以下 3 ステップを順に実施することを推奨する. - -### Step A: 実機サポート状況の確認(最優先) - -[TECH_01 開放質問 Q1〜Q4](TECH_01_定量撮影モード要求仕様.md#開放質問-open-questions) は **実装着手前に実機で確認すべき** 項目.まず簡易デバッグビルドで以下を取得: - -```kotlin -// android/app/src/main/kotlin/.../CameraDiagnostics.kt として実装提案 -val characteristics = cameraManager.getCameraCharacteristics(frontCameraId) - -// Q1: ハードウェアレベル -val hwLevel = characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) - -// Q2: 能力フラグ -val caps = characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES) -val hasManualSensor = caps?.contains(REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR) -val hasManualPP = caps?.contains(REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING) -val hasRaw = caps?.contains(REQUEST_AVAILABLE_CAPABILITIES_RAW) - -// Q4: LSC マップサイズ -val mapSize = characteristics.get(CameraCharacteristics.LENS_INFO_SHADING_MAP_SIZE) - -// Q3: DNG 出力可否 -val streamMap = characteristics.get(SCALER_STREAM_CONFIGURATION_MAP) -val rawOutputSizes = streamMap?.getOutputSizes(ImageFormat.RAW_SENSOR) -``` - -これらを Logcat または UI に出力し,結果を MiniTias リポジトリの新規ファイル `docs/06_TEST/TEST_xx_実機サポート判定.md` 等に記録する. - -### Step B: 実装範囲の決定 - -Step A の結果から,**どの Phase まで実装できるか** を決定する: - -| ハードウェアレベル | 実装可能範囲 | 備考 | -| --- | --- | --- | -| `LEGACY` | 定量モード **不可** | ユーザーに警告表示のみ | -| `LIMITED` + `MANUAL_SENSOR` のみ | TECH_01 Phase 1(露光・ISO 固定)まで | NR/EDGE/TONEMAP 制御は ×.SHADING_MODE は個別確認 | -| `LIMITED` + `MANUAL_POST_PROCESSING` あり | TECH_01 Phase 1〜2(露光・WB・NR・EDGE 固定)まで | LSC マップ取得は STATISTICS_LENS_SHADING_MAP_MODE 個別確認 | -| `FULL` / `LEVEL_3` | TECH_01 Phase 1〜5 全実装可能 | DNG 出力も可能なら最高 | - -判定結果と「実装する Phase」を MiniTias 側 docs/ に記録.SmTIAS-LightSim 側にも反映できるよう,後述「結果の共有方法」に従う. - -### Step C: Phase 1 着手 - -[TECH_01 推奨実装方針](TECH_01_定量撮影モード要求仕様.md#推奨実装方針-recommended-implementation) の Phase 1〜5 を順に実装.`/implement` パイプラインで進めることを推奨: - -```text -/implement TECH_01 Phase 1: Camera2 詳細制御の MethodChannel 実装 -``` - -## データ受け渡し仕様 (Data Exchange Specification) - -定量撮影モードで取得したデータを SmTIAS-LightSim 側で使えるようにするための **ファイル配置・命名規則**. - -### ファイル命名規則 - -| 種別 | 命名 | -| --- | --- | -| 画像(PNG/YUV/DNG) | `MiniTIAS_QM_YYYYMMDD_HHmmss.` | -| 撮影メタデータ | `MiniTIAS_QM_YYYYMMDD_HHmmss.meta.json` | -| LSC ゲインマップ | `MiniTIAS_QM_YYYYMMDD_HHmmss.lsc.npz` | - -`QM` = Quantitative Mode.既存通常モードの `MiniTIAS_YYYYMMDD_HHmmss.png` と区別する. - -### 拡張子の選択 - -| 拡張子 | 採用条件 | -| --- | --- | -| `.png` | YUV_420_888 → BT.601 → RGB → PNG 経路(現状継承) | -| `.yuv` または `.yuv.npz` | YUV_420_888 を直接保存(中間処理排除) | -| `.dng` | RAW_SENSOR をサポートしている場合 | - -複数フォーマットを並列保存しても良い(例: 同一撮影で `.png` と `.dng` 両方を保存). - -### 端末から PC への転送 - -MiniTias アプリは端末ローカル `Pictures/MiniTIAS/` に保存する.**`adb pull` の使用を推奨**: - -```bash -adb pull /sdcard/Pictures/MiniTIAS/ -``` - -MTP 経由(Windows エクスプローラのドラッグ&ドロップ)は **非推奨**.DNG が 16MB 級でファイルサイズの不整合報告あり(MiniTIAS 側実装中に確認,[TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md) §MTP 経由ファイル転送の注意点). - -### SmTIAS-LightSim 側の配置先 - -PC 転送後の配置先は: - -```text -SmTIAS-LightSim/ -└── reference_measurement/ # .gitignore 配下(個人ローカル) - ├── MiniTIAS_20260408_144434/ # 既存 baseline(通常モード,参考扱い) - │ └── <画像 / 解析結果> - └── quantitative/ # ← 新規・定量モード用 - ├── MiniTIAS_QM_YYYYMMDD_HHmmss.dng # 解析の本体(10-bit BGGR Bayer) - ├── MiniTIAS_QM_YYYYMMDD_HHmmss.meta.json # 撮影設定 + 実適用値 + LSC マップ - ├── MiniTIAS_QM_YYYYMMDD_HHmmss.preview.jpg # アプリ内表示用(解析対象外,任意配置) - ├── MiniTIAS_QM_YYYYMMDD_HHmmss_burst{0..9}.dng # 連射時(V1 検証用) - └── ... -``` - -→ MiniTias 側で撮影 → `adb pull` で PC 転送 → `reference_measurement/quantitative/` に配置. - -### メタデータ JSON スキーマ - -[TECH_01 のメタデータ要求](TECH_01_定量撮影モード要求仕様.md#4-撮影メタデータの保存撮影パラメータの可視化) を参照.SmTIAS-LightSim 側の sm-evaluate で読み込み可能な形式とする. - -特に **必須フィールド**: - -- `capture_mode`: `"quantitative"` または `"normal"` -- `device_model`: `"SH-02M"` 等 -- `hardware_level`: Step A で取得した値 -- `settings`: Camera2 API の実適用値 -- `image_format`: `"YUV_420_888"` / `"RAW_SENSOR"` 等 - -これらが揃っていれば SmTIAS-LightSim 側で読み込みロジックを実装可能. - -### LSC マップ保存形式 - -MiniTIAS 側実装では LSC マップを **meta.json 内に格納**する形を採用([TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md) §保存ファイル仕様 参照).独立 NPZ ファイルは生成しない: - -```json -{ - "lscMap": [ - [r0_c0_R, r0_c0_Ge, r0_c0_Go, r0_c0_B, r0_c1_R, r0_c1_Ge, r0_c1_Go, r0_c1_B, ...], - [r1_c0_R, ..., ], - ... - ], - "lscMapRowCount": 13, - "lscMapColumnCount": 17 -} -``` - -- `lscMap[row]` は 1 行を `4 × M` 個の float(RGGB 並び)でフラット化 -- 行数・列数は別途 `lscMapRowCount` / `lscMapColumnCount` に格納 -- 値の意味: `corrected = raw × gain` (`gain ≥ 1.0`) -- AQUOS sense3 (SH-02M) では **13 × 17**.他端末では異なる可能性 - -SmTIAS-LightSim 側 sm-evaluate の LSC 読み込み I/F は meta.json のこの構造を直接読む形で実装する. - -## 既存 baseline 画像へのアクセス (Existing Baseline Access) - -`MiniTIAS_20260408_144434` は SmTIAS-LightSim 側の `reference_measurement/` 配下に存在(.gitignore 対象,個人ローカル).MiniTias 側からは直接参照できない. - -実装中に **「既存撮影時の条件と揃えたい」** という要請が出た場合は,rinto 経由で: - -1. SmTIAS-LightSim リポジトリで該当画像の Exif / メタデータを抽出 -2. 結果を MiniTias 側 docs/ または本リポジトリの本ファイルに追記して共有 - -ただし TECH_01 に書いたとおり,**既存 baseline 自体が「定量データとして揺らいでいる」のが本作業の出発点**なので,定量モード実装後は新規 baseline(定量モードで撮ったもの)に置き換える前提でよい. - -## 質問・調整事項の扱い (Open Issues Handling) - -両プロジェクト Claude セッションでの作業を前提とすると,質問・調整は **ファイルベース** で行うのが追跡性が高い. - -| 状況 | 対応 | -| --- | --- | -| MiniTias 側実装中に Q1〜Q7 の判断が必要になった | MiniTias 側 docs/ に `06_TEST/TEST_xx_実装判断ログ.md` 等で判断と理由を記録.rinto が SmTIAS-LightSim 側にも反映 | -| SmTIAS-LightSim 側仕様 (TECH_01) に追加要求が出た | rinto が SmTIAS-LightSim 側で TECH_01 を更新.MiniTias 側 Claude は `git pull` 相当で再読 | -| データ受け渡し仕様(ファイル命名・スキーマ)の変更要求 | rinto が SmTIAS-LightSim 側で本ファイル (TECH_02) を更新.両セッションで共有 | -| 実機 (AQUOS sense3) で予期せぬ動作 | MiniTias 側 docs/ に記録.必要なら本ファイルの「既知の制約」セクションに追記(後日反映) | - -## 完了判定の方法 (Completion Criteria) - -[TECH_01 検証方法 V1〜V4](TECH_01_定量撮影モード要求仕様.md#検証方法-verification) を実機で実施. - -### MiniTias 側で完了とする条件 - -- V1(再現性 10 連射 CoV < 1%),V2(LSC マップ取得検証),V3(SHADING_MODE 切替検証)の結果ログが MiniTias 側 docs/06_TEST/ 等に残っている -- 定量モードで白板を撮影したサンプルファイル(PNG + meta.json + LSC マップ)が 1 セット以上 PC 側 `reference_measurement/quantitative/` に存在する - -### SmTIAS-LightSim 側の受け入れトリガー - -`reference_measurement/quantitative/` 配下にサンプルファイルが配置された時点で,SmTIAS-LightSim 側 Claude セッションは以下の受け入れ作業に着手できる: - -- メタデータ JSON 読み込み I/F の実装(sm-evaluate 拡張) -- LSC マップ読み込み I/F の実装(sm-evaluate の LSC 順方向適用機能) -- 既存 baseline と新規定量モード baseline の **並列キャリブ**(両者の比較) -- TEST_01 に新規 Step(例: Step 8-13)として追加 - -### V4 の達成判定 - -V4(残差 2.1× → 1.5×)は両プロジェクトの連携でのみ達成可能: - -- MiniTias 側で V1〜V3 完了 -- SmTIAS-LightSim 側で sm-evaluate に定量モード対応実装完了 -- 新規 baseline でキャリブ実施 -- 結果を SmTIAS-LightSim 側 TEST_01 に追記 - -V4 達成は本ハンドオフのスコープ外(後続キャリブ作業の成果として位置付ける). - -## 後続作業 (Follow-up Work on SmTIAS-LightSim Side) - -MiniTias 側完了後,SmTIAS-LightSim 側で以下を実施予定(参考情報): - -1. **`sm-evaluate` に LSC 順方向適用機能を追加**: 新規 `evaluation/lsc.py` モジュール.LSC マップを画像に掛けて補正済み画像を再現 -2. **メタデータ JSON 読み込み機能**: `evaluation/metadata.py` で撮影パラメータを取得 -3. **新規 baseline 設定の追加**: `configs/eval_baseline_quantitative.yaml` 等.既存 baseline と並列保持 -4. **TEST_01 に Step 8-13 を追加**: 「定量モード baseline での再キャリブ」として記録 -5. **TEST_03 の比較パネル更新**: 新規 baseline を含む形で再生成 - -これらは MiniTias 側完了後に着手するため,TECH_01 の検証 V4 とともに「本ハンドオフのスコープ外」として位置付ける. - -## チェックリスト(MiniTias 側 Claude 用) (Checklist) - -セッション内で以下を順に確認すると進めやすい: - -- [ ] 本ファイル (TECH_02) を読了 -- [ ] TECH_01 を読了 -- [ ] [MiniTIAS/docs/04_SPEC/SPEC_01 画面機能仕様書](../../MiniTIAS/docs/04_SPEC/SPEC_01_画面機能仕様書.md) を読了(現状仕様) -- [ ] Step A: 実機サポート状況確認 → 結果記録 -- [ ] Step B: 実装範囲決定 → 記録 -- [ ] Step C: Phase 1 着手(`/implement` パイプライン) -- [ ] Phase 2 以降を順次実装 -- [ ] V1〜V3 実機検証 → 結果ログを docs/06_TEST/ に残す -- [ ] 定量モード撮影サンプルを `Pictures/MiniTIAS/` に作成 → rinto が PC 転送 - -## 関連ドキュメント (Related Documents) - -- [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) — 本作業の要求書(What/Why) -- [TEST_01 キャリブレーション検証履歴](../06_TEST/TEST_01_キャリブレーション検証履歴.md) — 「形のずれ」発見の経緯 -- [TEST_03 輝度マップ形状追跡](../06_TEST/TEST_03_輝度マップ形状追跡.md) — シミュ vs 実機の構造的差異 -- [SPEC_04 評価仕様](../04_SPEC/SPEC_04_評価仕様.md) — sm-evaluate の評価パイプライン -- [MiniTIAS/docs/04_SPEC/SPEC_01 画面機能仕様書](../../MiniTIAS/docs/04_SPEC/SPEC_01_画面機能仕様書.md) — 現状の MiniTias 撮影仕様(変更前ベースライン) -- [Android Camera2 API LensShadingMap](https://developer.android.com/reference/android/hardware/camera2/params/LensShadingMap) -- [Android Camera2 API CaptureRequest](https://developer.android.com/reference/android/hardware/camera2/CaptureRequest) diff --git "a/docs/05_TECH/TECH_02_SmTIAS\345\274\225\343\201\215\347\266\231\343\201\216\346\211\213\351\240\206.md" "b/docs/05_TECH/TECH_02_SmTIAS\345\274\225\343\201\215\347\266\231\343\201\216\346\211\213\351\240\206.md" new file mode 100644 index 0000000..4baf517 --- /dev/null +++ "b/docs/05_TECH/TECH_02_SmTIAS\345\274\225\343\201\215\347\266\231\343\201\216\346\211\213\351\240\206.md" @@ -0,0 +1,271 @@ +# SmTIAS 引き継ぎ手順 (Hand-off Procedure to SmTIAS) + +本ドキュメントは [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) を SmTIAS リポジトリで実装する際の **作業着手ガイド** および **データ受け渡し仕様** である.SmTIAS-LightSim と SmTIAS の両プロジェクトを Claude Code セッションで作業している前提に最適化している. + +## 想定読者 (Intended Reader) + +- **SmTIAS 側 Claude セッション**: 本ドキュメントを最初に開き,次に TECH_01 を読んで実装着手する. +- **人間レビュー (rinto)**: 両セッションを行き来し,質問の橋渡しと完了確認を行う. + +## プロジェクト関係図 (Project Relationship) + +```text +┌─────────────────────────┐ ┌──────────────────────────┐ +│ SmTIAS │ │ SmTIAS-LightSim │ +│ (Flutter / Android) │ │ (Python / Mitsuba 3) │ +│ │ │ │ +│ 撮影アプリ │ │ 光散乱シミュレータ │ +│ - インカメラ制御 │ │ - 仮想シーン構築 │ +│ - 撮影モード │ │ - 物理光線追跡 │ +│ - PNG / メタデータ保存 │ ──→ │ - sm-evaluate │ +└─────────────────────────┘ └──────────────────────────┘ + │ + │ 同じ評価指標 + ▼ + ┌──────────────────────────┐ + │ SmTIAS-Evaluation │ + │ (Python) │ + │ │ + │ 実機 PNG → 均一性指標 │ + └──────────────────────────┘ +``` + +→ 3 プロジェクトで **同じ評価指標** を出し,シミュ vs 実機を比較する.本作業は SmTIAS 側に **「定量撮影モード」** を追加し,定量比較可能な実機データを取得できるようにする. + +## 背景の要約 (Background Digest) + +詳細は SmTIAS-LightSim 側の [TEST_01](../06_TEST/TEST_01_キャリブレーション検証履歴.md) と [TEST_03](../06_TEST/TEST_03_輝度マップ形状追跡.md) を参照.要点のみ抜粋: + +- SmTIAS-LightSim 側で **Step 8-1〜8-12 のキャリブ作業** を実施し,残差 2.1× で頭打ち +- 「形のずれ」を解消するため LSC モデル化を検討していたが,さらに調査した結果,**実機 PNG 自体が定量データとして揺らいでいる**ことが判明 +- 既存 baseline `MiniTIAS_20260408_144434` は SmTIAS の通常モード (AE/AWB/NR/EDGE/TONEMAP 全自動) で撮影されており,撮影ごとに値が変動する可能性 +- → **「定量撮影モード」** の追加が必要.詳細は [TECH_01](TECH_01_定量撮影モード要求仕様.md) + +## SmTIAS 側 Claude セッションの最初のアクション (First Actions) + +セッション開始時に以下 3 ステップを順に実施することを推奨する. + +### Step A: 実機サポート状況の確認(最優先) + +[TECH_01 開放質問 Q1〜Q4](TECH_01_定量撮影モード要求仕様.md#開放質問-open-questions) は **実装着手前に実機で確認すべき** 項目.まず簡易デバッグビルドで以下を取得: + +```kotlin +// android/app/src/main/kotlin/.../CameraDiagnostics.kt として実装提案 +val characteristics = cameraManager.getCameraCharacteristics(frontCameraId) + +// Q1: ハードウェアレベル +val hwLevel = characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) + +// Q2: 能力フラグ +val caps = characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES) +val hasManualSensor = caps?.contains(REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR) +val hasManualPP = caps?.contains(REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING) +val hasRaw = caps?.contains(REQUEST_AVAILABLE_CAPABILITIES_RAW) + +// Q4: LSC マップサイズ +val mapSize = characteristics.get(CameraCharacteristics.LENS_INFO_SHADING_MAP_SIZE) + +// Q3: DNG 出力可否 +val streamMap = characteristics.get(SCALER_STREAM_CONFIGURATION_MAP) +val rawOutputSizes = streamMap?.getOutputSizes(ImageFormat.RAW_SENSOR) +``` + +これらを Logcat または UI に出力し,結果を SmTIAS リポジトリの新規ファイル `docs/06_TEST/TEST_xx_実機サポート判定.md` 等に記録する. + +### Step B: 実装範囲の決定 + +Step A の結果から,**どの Phase まで実装できるか** を決定する: + +| ハードウェアレベル | 実装可能範囲 | 備考 | +| --- | --- | --- | +| `LEGACY` | 定量モード **不可** | ユーザーに警告表示のみ | +| `LIMITED` + `MANUAL_SENSOR` のみ | TECH_01 Phase 1(露光・ISO 固定)まで | NR/EDGE/TONEMAP 制御は ×.SHADING_MODE は個別確認 | +| `LIMITED` + `MANUAL_POST_PROCESSING` あり | TECH_01 Phase 1〜2(露光・WB・NR・EDGE 固定)まで | LSC マップ取得は STATISTICS_LENS_SHADING_MAP_MODE 個別確認 | +| `FULL` / `LEVEL_3` | TECH_01 Phase 1〜5 全実装可能 | DNG 出力も可能なら最高 | + +判定結果と「実装する Phase」を SmTIAS 側 docs/ に記録.SmTIAS-LightSim 側にも反映できるよう,後述「結果の共有方法」に従う. + +### Step C: Phase 1 着手 + +[TECH_01 推奨実装方針](TECH_01_定量撮影モード要求仕様.md#推奨実装方針-recommended-implementation) の Phase 1〜5 を順に実装.`/implement` パイプラインで進めることを推奨: + +```text +/implement TECH_01 Phase 1: Camera2 詳細制御の MethodChannel 実装 +``` + +## データ受け渡し仕様 (Data Exchange Specification) + +定量撮影モードで取得したデータを SmTIAS-LightSim 側で使えるようにするための **ファイル配置・命名規則**. + +### ファイル命名規則 + +| 種別 | 命名 | +| --- | --- | +| 画像(PNG/YUV/DNG) | `SmTIAS_QM_YYYYMMDD_HHmmss.` | +| 撮影メタデータ | `SmTIAS_QM_YYYYMMDD_HHmmss.meta.json` | +| LSC ゲインマップ | `SmTIAS_QM_YYYYMMDD_HHmmss.lsc.npz` | + +`QM` = Quantitative Mode.既存通常モードの `SmTIAS_YYYYMMDD_HHmmss.png` と区別する. + +### 拡張子の選択 + +| 拡張子 | 採用条件 | +| --- | --- | +| `.png` | YUV_420_888 → BT.601 → RGB → PNG 経路(現状継承) | +| `.yuv` または `.yuv.npz` | YUV_420_888 を直接保存(中間処理排除) | +| `.dng` | RAW_SENSOR をサポートしている場合 | + +複数フォーマットを並列保存しても良い(例: 同一撮影で `.png` と `.dng` 両方を保存). + +### 端末から PC への転送 + +SmTIAS アプリは端末ローカル `Pictures/SmTIAS/` に保存する.**`adb pull` の使用を推奨**: + +```bash +adb pull /sdcard/Pictures/SmTIAS/ +``` + +MTP 経由(Windows エクスプローラのドラッグ&ドロップ)は **非推奨**.DNG が 16MB 級でファイルサイズの不整合報告あり(SmTIAS 側実装中に確認,[TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md) §MTP 経由ファイル転送の注意点). + +### SmTIAS-LightSim 側の配置先 + +PC 転送後の配置先は: + +```text +SmTIAS-LightSim/ +└── reference_measurement/ # .gitignore 配下(個人ローカル) + ├── MiniTIAS_20260408_144434/ # 既存 baseline(通常モード,参考扱い) + │ └── <画像 / 解析結果> + └── quantitative/ # ← 新規・定量モード用 + ├── SmTIAS_QM_YYYYMMDD_HHmmss.dng # 解析の本体(10-bit BGGR Bayer) + ├── SmTIAS_QM_YYYYMMDD_HHmmss.meta.json # 撮影設定 + 実適用値 + LSC マップ + ├── SmTIAS_QM_YYYYMMDD_HHmmss.preview.jpg # アプリ内表示用(解析対象外,任意配置) + ├── SmTIAS_QM_YYYYMMDD_HHmmss_burst{0..9}.dng # 連射時(V1 検証用) + └── ... +``` + +→ SmTIAS 側で撮影 → `adb pull` で PC 転送 → `reference_measurement/quantitative/` に配置. + +### メタデータ JSON スキーマ + +[TECH_01 のメタデータ要求](TECH_01_定量撮影モード要求仕様.md#4-撮影メタデータの保存撮影パラメータの可視化) を参照.SmTIAS-LightSim 側の sm-evaluate で読み込み可能な形式とする. + +特に **必須フィールド**: + +- `capture_mode`: `"quantitative"` または `"normal"` +- `device_model`: `"SH-02M"` 等 +- `hardware_level`: Step A で取得した値 +- `settings`: Camera2 API の実適用値 +- `image_format`: `"YUV_420_888"` / `"RAW_SENSOR"` 等 + +これらが揃っていれば SmTIAS-LightSim 側で読み込みロジックを実装可能. + +### LSC マップ保存形式 + +SmTIAS 側実装では LSC マップを **meta.json 内に格納**する形を採用([TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md) §保存ファイル仕様 参照).独立 NPZ ファイルは生成しない: + +```json +{ + "lscMap": [ + [r0_c0_R, r0_c0_Ge, r0_c0_Go, r0_c0_B, r0_c1_R, r0_c1_Ge, r0_c1_Go, r0_c1_B, ...], + [r1_c0_R, ..., ], + ... + ], + "lscMapRowCount": 13, + "lscMapColumnCount": 17 +} +``` + +- `lscMap[row]` は 1 行を `4 × M` 個の float(RGGB 並び)でフラット化 +- 行数・列数は別途 `lscMapRowCount` / `lscMapColumnCount` に格納 +- 値の意味: `corrected = raw × gain` (`gain ≥ 1.0`) +- AQUOS sense3 (SH-02M) では **13 × 17**.他端末では異なる可能性 + +SmTIAS-LightSim 側 sm-evaluate の LSC 読み込み I/F は meta.json のこの構造を直接読む形で実装する. + +## 既存 baseline 画像へのアクセス (Existing Baseline Access) + +`MiniTIAS_20260408_144434` は SmTIAS-LightSim 側の `reference_measurement/` 配下に存在(.gitignore 対象,個人ローカル).SmTIAS 側からは直接参照できない. + +実装中に **「既存撮影時の条件と揃えたい」** という要請が出た場合は,rinto 経由で: + +1. SmTIAS-LightSim リポジトリで該当画像の Exif / メタデータを抽出 +2. 結果を SmTIAS 側 docs/ または本リポジトリの本ファイルに追記して共有 + +ただし TECH_01 に書いたとおり,**既存 baseline 自体が「定量データとして揺らいでいる」のが本作業の出発点**なので,定量モード実装後は新規 baseline(定量モードで撮ったもの)に置き換える前提でよい. + +## 質問・調整事項の扱い (Open Issues Handling) + +両プロジェクト Claude セッションでの作業を前提とすると,質問・調整は **ファイルベース** で行うのが追跡性が高い. + +| 状況 | 対応 | +| --- | --- | +| SmTIAS 側実装中に Q1〜Q7 の判断が必要になった | SmTIAS 側 docs/ に `06_TEST/TEST_xx_実装判断ログ.md` 等で判断と理由を記録.rinto が SmTIAS-LightSim 側にも反映 | +| SmTIAS-LightSim 側仕様 (TECH_01) に追加要求が出た | rinto が SmTIAS-LightSim 側で TECH_01 を更新.SmTIAS 側 Claude は `git pull` 相当で再読 | +| データ受け渡し仕様(ファイル命名・スキーマ)の変更要求 | rinto が SmTIAS-LightSim 側で本ファイル (TECH_02) を更新.両セッションで共有 | +| 実機 (AQUOS sense3) で予期せぬ動作 | SmTIAS 側 docs/ に記録.必要なら本ファイルの「既知の制約」セクションに追記(後日反映) | + +## 完了判定の方法 (Completion Criteria) + +[TECH_01 検証方法 V1〜V4](TECH_01_定量撮影モード要求仕様.md#検証方法-verification) を実機で実施. + +### SmTIAS 側で完了とする条件 + +- V1(再現性 10 連射 CoV < 1%),V2(LSC マップ取得検証),V3(SHADING_MODE 切替検証)の結果ログが SmTIAS 側 docs/06_TEST/ 等に残っている +- 定量モードで白板を撮影したサンプルファイル(PNG + meta.json + LSC マップ)が 1 セット以上 PC 側 `reference_measurement/quantitative/` に存在する + +### SmTIAS-LightSim 側の受け入れトリガー + +`reference_measurement/quantitative/` 配下にサンプルファイルが配置された時点で,SmTIAS-LightSim 側 Claude セッションは以下の受け入れ作業に着手できる: + +- メタデータ JSON 読み込み I/F の実装(sm-evaluate 拡張) +- LSC マップ読み込み I/F の実装(sm-evaluate の LSC 順方向適用機能) +- 既存 baseline と新規定量モード baseline の **並列キャリブ**(両者の比較) +- TEST_01 に新規 Step(例: Step 8-13)として追加 + +### V4 の達成判定 + +V4(残差 2.1× → 1.5×)は両プロジェクトの連携でのみ達成可能: + +- SmTIAS 側で V1〜V3 完了 +- SmTIAS-LightSim 側で sm-evaluate に定量モード対応実装完了 +- 新規 baseline でキャリブ実施 +- 結果を SmTIAS-LightSim 側 TEST_01 に追記 + +V4 達成は本ハンドオフのスコープ外(後続キャリブ作業の成果として位置付ける). + +## 後続作業 (Follow-up Work on SmTIAS-LightSim Side) + +SmTIAS 側完了後,SmTIAS-LightSim 側で以下を実施予定(参考情報): + +1. **`sm-evaluate` に LSC 順方向適用機能を追加**: 新規 `evaluation/lsc.py` モジュール.LSC マップを画像に掛けて補正済み画像を再現 +2. **メタデータ JSON 読み込み機能**: `evaluation/metadata.py` で撮影パラメータを取得 +3. **新規 baseline 設定の追加**: `configs/eval_baseline_quantitative.yaml` 等.既存 baseline と並列保持 +4. **TEST_01 に Step 8-13 を追加**: 「定量モード baseline での再キャリブ」として記録 +5. **TEST_03 の比較パネル更新**: 新規 baseline を含む形で再生成 + +これらは SmTIAS 側完了後に着手するため,TECH_01 の検証 V4 とともに「本ハンドオフのスコープ外」として位置付ける. + +## チェックリスト(SmTIAS 側 Claude 用) (Checklist) + +セッション内で以下を順に確認すると進めやすい: + +- [ ] 本ファイル (TECH_02) を読了 +- [ ] TECH_01 を読了 +- [ ] [SmTIAS/docs/04_SPEC/SPEC_01 画面機能仕様書](https://github.com/rintoHasegawa/SmTIAS-Capture/blob/main/docs/04_SPEC/SPEC_01_画面機能仕様書.md) を読了(現状仕様) +- [ ] Step A: 実機サポート状況確認 → 結果記録 +- [ ] Step B: 実装範囲決定 → 記録 +- [ ] Step C: Phase 1 着手(`/implement` パイプライン) +- [ ] Phase 2 以降を順次実装 +- [ ] V1〜V3 実機検証 → 結果ログを docs/06_TEST/ に残す +- [ ] 定量モード撮影サンプルを `Pictures/SmTIAS/` に作成 → rinto が PC 転送 + +## 関連ドキュメント (Related Documents) + +- [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) — 本作業の要求書(What/Why) +- [TEST_01 キャリブレーション検証履歴](../06_TEST/TEST_01_キャリブレーション検証履歴.md) — 「形のずれ」発見の経緯 +- [TEST_03 輝度マップ形状追跡](../06_TEST/TEST_03_輝度マップ形状追跡.md) — シミュ vs 実機の構造的差異 +- [SPEC_04 評価仕様](../04_SPEC/SPEC_04_評価仕様.md) — sm-evaluate の評価パイプライン +- [SmTIAS/docs/04_SPEC/SPEC_01 画面機能仕様書](https://github.com/rintoHasegawa/SmTIAS-Capture/blob/main/docs/04_SPEC/SPEC_01_画面機能仕様書.md) — 現状の SmTIAS 撮影仕様(変更前ベースライン) +- [Android Camera2 API LensShadingMap](https://developer.android.com/reference/android/hardware/camera2/params/LensShadingMap) +- [Android Camera2 API CaptureRequest](https://developer.android.com/reference/android/hardware/camera2/CaptureRequest) diff --git "a/docs/05_TECH/TECH_03_\345\256\232\351\207\217\343\203\242\343\203\274\343\203\211\345\256\237\350\243\205\345\240\261\345\221\212\343\201\250SHADING_MODE\347\233\270\350\253\207.md" "b/docs/05_TECH/TECH_03_\345\256\232\351\207\217\343\203\242\343\203\274\343\203\211\345\256\237\350\243\205\345\240\261\345\221\212\343\201\250SHADING_MODE\347\233\270\350\253\207.md" index 23b9558..471abc4 100644 --- "a/docs/05_TECH/TECH_03_\345\256\232\351\207\217\343\203\242\343\203\274\343\203\211\345\256\237\350\243\205\345\240\261\345\221\212\343\201\250SHADING_MODE\347\233\270\350\253\207.md" +++ "b/docs/05_TECH/TECH_03_\345\256\232\351\207\217\343\203\242\343\203\274\343\203\211\345\256\237\350\243\205\345\240\261\345\221\212\343\201\250SHADING_MODE\347\233\270\350\253\207.md" @@ -1,20 +1,20 @@ # 定量モード実装報告と SHADING_MODE 相談 (Implementation Report & SHADING_MODE Consultation) -> **注**: 本ファイルは MiniTIAS リポジトリで作成された報告書のスナップショットを SmTIAS-LightSim 側にも保持したもの.本文中のリンク `../06_TEST/camera_diagnostics_*.json` / `../04_SPEC/SPEC_01_画面機能仕様書.md` / `../03_PLAN/PLAN_01_要件定義書.md` / `../PROGRESS.md` は **MiniTIAS リポジトリ起点**で,SmTIAS-LightSim 側からは到達しない(リンク切れは許容).SmTIAS-LightSim 側からの回答書は [TECH_04 MiniTIAS への回答](TECH_04_MiniTIASへの回答.md) 参照. +> **注**: 本ファイルは SmTIAS リポジトリで作成された報告書のスナップショットを SmTIAS-LightSim 側にも保持したもの.本文中のリンク `../06_TEST/camera_diagnostics_*.json` / `https://github.com/rintoHasegawa/SmTIAS-Capture/blob/main/docs/04_SPEC/SPEC_01_画面機能仕様書.md` / `../03_PLAN/PLAN_01_要件定義書.md` / `../PROGRESS.md` は **SmTIAS リポジトリ起点**で,SmTIAS-LightSim 側からは到達しない(リンク切れは許容).SmTIAS-LightSim 側からの回答書は [TECH_04 SmTIAS への回答](TECH_04_SmTIASへの回答.md) 参照. -本ドキュメントは [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) を MiniTIAS リポジトリで実装した結果の **MiniTIAS 側からの報告書** であり,併せて **SmTIAS-LightSim 側との方針確認・相談事項** をまとめたものである. +本ドキュメントは [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) を SmTIAS リポジトリで実装した結果の **SmTIAS 側からの報告書** であり,併せて **SmTIAS-LightSim 側との方針確認・相談事項** をまとめたものである. ## 想定読者 (Intended Reader) -- **SmTIAS-LightSim 側 Claude セッション**: 本ドキュメントを読んで MiniTIAS 側の実装状況を把握し,未確定事項に対する判断・指示を返す +- **SmTIAS-LightSim 側 Claude セッション**: 本ドキュメントを読んで SmTIAS 側の実装状況を把握し,未確定事項に対する判断・指示を返す - **人間レビュー (rinto)**: 両セッションを橋渡しし,研究方針に照らして判断する ## 概要 (Overview) -MiniTIAS 側で TECH_01 の要求仕様に基づいた **定量撮影モード(DNG 経路)** の実装が完了した([MiniTias リポジトリ master ブランチ](https://github.com/rintoHasegawa/MiniTIAS) に取り込み済み).本ドキュメントの目的は以下の 2 点: +SmTIAS 側で TECH_01 の要求仕様に基づいた **定量撮影モード(DNG 経路)** の実装が完了した([SmTIAS リポジトリ master ブランチ](https://github.com/rintoHasegawa/SmTIAS-Capture) に取り込み済み).本ドキュメントの目的は以下の 2 点: 1. **実装結果の報告**:TECH_01 の各 Phase に対して何を実装したか,AQUOS sense3 (SH-02M) で何が確認できたかを共有する -2. **SHADING_MODE の扱いの相談**:定量モードのキー設定である `SHADING_MODE` を MiniTIAS 側でどう選んだか,研究上どのような含意があるか,SmTIAS-LightSim 側の解析パイプラインとの整合を確認したい +2. **SHADING_MODE の扱いの相談**:定量モードのキー設定である `SHADING_MODE` を SmTIAS 側でどう選んだか,研究上どのような含意があるか,SmTIAS-LightSim 側の解析パイプラインとの整合を確認したい ## TECH_01 要求に対する実装状況 (Implementation Status) @@ -28,11 +28,11 @@ ### Phase 3 の変更点 -TECH_01 では「撮影モード切替トグル」で通常モードと定量モードを並存させる想定だったが,MiniTIAS 側の運用判断として **通常モード(PNG 経路)を temporarily に無効化し,シャッターは常に定量モードを呼ぶ**構成にした.既存の `captureFullResolutionPng` コードは温存している. +TECH_01 では「撮影モード切替トグル」で通常モードと定量モードを並存させる想定だったが,SmTIAS 側の運用判断として **通常モード(PNG 経路)を temporarily に無効化し,シャッターは常に定量モードを呼ぶ**構成にした.既存の `captureFullResolutionPng` コードは温存している. 理由: -- MiniTIAS の運用上の存在意義は SmTIAS-LightSim との定量比較のみ +- SmTIAS の運用上の存在意義は SmTIAS-LightSim との定量比較のみ - トグル UI を残すと「誤って通常モードで撮影してしまい後で気付く」事故が起きる - 研究フェーズ完了後にトグル追加 or 通常モード復活は容易 @@ -68,7 +68,7 @@ プレビュー停止(camera パッケージの CameraController.dispose) │ ▼ -baseName 生成(MiniTIAS_QM_YYYYMMDD_HHmmss.同秒重複時 _1, _2 ...) +baseName 生成(SmTIAS_QM_YYYYMMDD_HHmmss.同秒重複時 _1, _2 ...) │ ▼ Camera2 API でフロントカメラを開く @@ -105,7 +105,7 @@ ## AQUOS sense3 (SH-02M) 実機検証結果 (Device Verification) -TECH_01 の開放質問 Q1〜Q4 に対する実機での確認結果.診断機能(`getCameraDiagnostics`)の出力は MiniTIAS リポジトリの [`docs/06_TEST/camera_diagnostics_20260531_161734.json`](../06_TEST/camera_diagnostics_20260531_161734.json) に保存している. +TECH_01 の開放質問 Q1〜Q4 に対する実機での確認結果.診断機能(`getCameraDiagnostics`)の出力は SmTIAS リポジトリの [`docs/06_TEST/camera_diagnostics_20260531_161734.json`](../06_TEST/camera_diagnostics_20260531_161734.json) に保存している. ### 主要項目 @@ -141,9 +141,9 @@ | 種別 | ファイル名 | 概要 | | --- | --- | --- | -| RAW 画像 | `MiniTIAS_QM_YYYYMMDD_HHmmss.dng` | 解析の本体(約 16 MB) | -| メタデータ | `MiniTIAS_QM_YYYYMMDD_HHmmss.meta.json` | 撮影設定 + 実適用値 + LSC マップ + センサ特性(約 24 KB) | -| プレビュー | `MiniTIAS_QM_YYYYMMDD_HHmmss.preview.jpg` | アプリ内表示・確認用.解析対象外 | +| RAW 画像 | `SmTIAS_QM_YYYYMMDD_HHmmss.dng` | 解析の本体(約 16 MB) | +| メタデータ | `SmTIAS_QM_YYYYMMDD_HHmmss.meta.json` | 撮影設定 + 実適用値 + LSC マップ + センサ特性(約 24 KB) | +| プレビュー | `SmTIAS_QM_YYYYMMDD_HHmmss.preview.jpg` | アプリ内表示・確認用.解析対象外 | `QM` = Quantitative Mode.同秒重複時は `_1`, `_2` ... と連番を付与. @@ -155,7 +155,7 @@ ### meta.json の構造(実例抜粋) -[`MiniTIAS_QM_20260531_172612.meta.json`](https://github.com/rintoHasegawa/MiniTIAS) から抜粋(白板を SHADING_MODE = HIGH_QUALITY で撮影したもの): +[`MiniTIAS_QM_20260531_172612.meta.json`](https://github.com/rintoHasegawa/SmTIAS-Capture) から抜粋(白板を SHADING_MODE = HIGH_QUALITY で撮影したもの): ```json { @@ -241,7 +241,7 @@ ### 経緯 -実装初期は **TECH_01 の表に明記されていた `HIGH_QUALITY` を採用**した.しかし実装途中で MiniTIAS 側は以下を観察した: +実装初期は **TECH_01 の表に明記されていた `HIGH_QUALITY` を採用**した.しかし実装途中で SmTIAS 側は以下を観察した: 1. `SHADING_MODE = OFF` で撮影すると **LSC マップが全要素 `1.0`** になる(Android 仕様:「補正は適用しない + 単位マップを返す」) 2. `SHADING_MODE = HIGH_QUALITY` で撮影すると LSC が **画像に適用された状態**で DNG に保存される.LSC マップは ISP が適用したゲインの実値 @@ -259,27 +259,27 @@ ### 取りうる選択肢 -研究の整合のために考えられる方向性を以下に列挙する.**MiniTIAS 側からの判断はせず**,SmTIAS-LightSim 側で解析パイプラインを構築する立場からの選択肢として提示する: +研究の整合のために考えられる方向性を以下に列挙する.**SmTIAS 側からの判断はせず**,SmTIAS-LightSim 側で解析パイプラインを構築する立場からの選択肢として提示する: -| 選択肢 | MiniTIAS 側の対応 | SmTIAS-LightSim 側の対応 | データの性質 | +| 選択肢 | SmTIAS 側の対応 | SmTIAS-LightSim 側の対応 | データの性質 | | --- | --- | --- | --- | | (1) 現状維持(HQ) | 変更なし | `DNG ÷ LSC マップ` を計算して LSC 適用前相当に戻す処理を実装 | DNG は LSC 適用済み.逆適用で物理生 Bayer を再構成 | | (2) OFF に切替 | `SHADING_MODE = OFF` に変更 | そのまま Mitsuba 出力と比較 | DNG は物理生 Bayer.LSC マップは情報なし(全 1.0) | | (3) 両方撮影 | 1 シーンに対し HQ と OFF の 2 枚を連続撮影 | 比較・検証で使い分け | 情報量最大.ただし撮影時間と保存容量が 2 倍 | -#### MiniTIAS 側で対応する場合のコスト感 +#### SmTIAS 側で対応する場合のコスト感 - (1): コスト 0(現状).SmTIAS-LightSim 側で逆適用ロジックが必要 - (2): Kotlin 側 CaptureRequest を 1 行変更.連動して meta.json の `settings.shading_mode` も `"OFF"` に.約 30 分 - (3): キャプチャ処理を 2 連続化.ファイル名規則の拡張(例:`*_hq.dng` / `*_off.dng`).約 1 時間 -### MiniTIAS 側から確認したい事項 +### SmTIAS 側から確認したい事項 - SmTIAS-LightSim 側の解析パイプラインで「LSC マップを使った逆適用」は実装済み or 実装可能か? - 物理シミュレーション(Mitsuba)の出力は「LSC 適用前の生 Bayer 相当」で間違いないか? - 既存 baseline `MiniTIAS_20260408_144434`(通常モード PNG)との互換性をどう扱うか?(既に方針として「定量モード以降は新規 baseline」となっていれば問題なし) -選択肢 (1)〜(3) のうちどれを採用するか,または別案があるか,**SmTIAS-LightSim 側の判断を求めたい**.本相談への返答を受けて MiniTIAS 側で必要な実装変更を行う. +選択肢 (1)〜(3) のうちどれを採用するか,または別案があるか,**SmTIAS-LightSim 側の判断を求めたい**.本相談への返答を受けて SmTIAS 側で必要な実装変更を行う. ## その他の未確認事項 (Other Open Issues) @@ -290,7 +290,7 @@ - 白板:飽和しない範囲で最大露光(SN 比最大) - 舌模型:白板用設定だと暗すぎる可能性 -MiniTIAS 側で検討中の対応: +SmTIAS 側で検討中の対応: - (a) 半自動キャリブ機能(AE を 1 回走らせて値を読み,以降固定) - (b) 白板用・舌模型用の 2 プリセット @@ -302,24 +302,24 @@ TECH_01 検証 V1(10 連射 CoV < 1%)を実施するには: -- MiniTIAS 側:連射 UI(10 ショットを連続保存)の実装が必要 +- SmTIAS 側:連射 UI(10 ショットを連続保存)の実装が必要 - 解析:DNG を読み込んで mean / std / CoV を計算する Python スクリプトが必要 -連射機能は MiniTIAS 側で実装予定.解析スクリプトは MiniTIAS 内に `scripts/verify_repeatability.py` 等で置くか,SmTIAS-LightSim 側の sm-evaluate に統合するか方針を相談したい. +連射機能は SmTIAS 側で実装予定.解析スクリプトは SmTIAS 内に `scripts/verify_repeatability.py` 等で置くか,SmTIAS-LightSim 側の sm-evaluate に統合するか方針を相談したい. ### MTP 経由ファイル転送の注意点 DNG が 16 MB 級のため MTP コピー直後にファイルサイズが正しく見えないケースを実装中に確認した.**`adb pull` の使用を推奨**.SmTIAS-LightSim 側のデータ受け取り手順としてもこれを前提にすると安全. -## MiniTIAS 側で検討中の改善案 (Planned Improvements) +## SmTIAS 側で検討中の改善案 (Planned Improvements) -SmTIAS-LightSim 側との打ち合わせ事項と並行して,以下を MiniTIAS 側で進める予定.優先度は内部判断による: +SmTIAS-LightSim 側との打ち合わせ事項と並行して,以下を SmTIAS 側で進める予定.優先度は内部判断による: | 優先度 | 項目 | 概要 | | --- | --- | --- | | 高 | 画素統計を meta.json に追加 | 飽和・露光不足の自動判定用.`mean_per_channel`, `max_per_channel`, `p99`, `saturated_pixel_ratio` 等 | | 高 | Hot pixel map 取得 | `STATISTICS_HOT_PIXEL_MAP_MODE = ON` で常時光る画素一覧を meta に記録.PC 側でマスク可能に | -| 高 | 連射機能(V1 検証用) | 10 連射 UI.`MiniTIAS_QM_*_burst{N}.dng` 等で連番保存 | +| 高 | 連射機能(V1 検証用) | 10 連射 UI.`SmTIAS_QM_*_burst{N}.dng` 等で連番保存 | | 中 | 露光時間・ISO の半自動キャリブ機能 | 白板で AE 1 ショット → 値を読んで固定 | | 中 | レンズ・センサ校正値を meta に追加 | `LENS_INTRINSIC_CALIBRATION`, `LENS_DISTORTION`, `SENSOR_REFERENCE_ILLUMINANT1/2`, `SENSOR_COLOR_TRANSFORM1/2` 等 | | 低 | Dark frame / Flat field キャリブ機能 | `(対象 − Dark) / (Flat − Dark)` 補正のための基準フレーム撮影 | @@ -329,9 +329,9 @@ ## 関連ドキュメント (Related Documents) - [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) — 本実装の原始要求 -- [TECH_02 MiniTIAS 引き継ぎ手順](TECH_02_MiniTIAS引き継ぎ手順.md) — 引き継ぎ時の作業ガイド +- [TECH_02 SmTIAS 引き継ぎ手順](TECH_02_SmTIAS引き継ぎ手順.md) — 引き継ぎ時の作業ガイド - [`docs/06_TEST/camera_diagnostics_20260531_161734.json`](../06_TEST/camera_diagnostics_20260531_161734.json) — AQUOS sense3 (SH-02M) の能力診断結果(フル) -- [SPEC_01 画面機能仕様書](../04_SPEC/SPEC_01_画面機能仕様書.md) — MiniTIAS 側の撮影仕様(定量モード反映済み) +- [SPEC_01 画面機能仕様書](https://github.com/rintoHasegawa/SmTIAS-Capture/blob/main/docs/04_SPEC/SPEC_01_画面機能仕様書.md) — SmTIAS 側の撮影仕様(定量モード反映済み) - [PLAN_01 要件定義書](../03_PLAN/PLAN_01_要件定義書.md) — ファイル管理仕様 - [PROGRESS.md](../PROGRESS.md) — 実装の進捗ログと設計判断・失敗パターン - [Android Camera2 API SHADING_MODE](https://developer.android.com/reference/android/hardware/camera2/CaptureRequest#SHADING_MODE) diff --git "a/docs/05_TECH/TECH_04_MiniTIAS\343\201\270\343\201\256\345\233\236\347\255\224.md" "b/docs/05_TECH/TECH_04_MiniTIAS\343\201\270\343\201\256\345\233\236\347\255\224.md" deleted file mode 100644 index fdbfcdd..0000000 --- "a/docs/05_TECH/TECH_04_MiniTIAS\343\201\270\343\201\256\345\233\236\347\255\224.md" +++ /dev/null @@ -1,333 +0,0 @@ -# MiniTIAS への回答 (Response to MiniTIAS) - -本ドキュメントは [TECH_03 定量モード実装報告と SHADING_MODE 相談](TECH_03_定量モード実装報告とSHADING_MODE相談.md) に対する **SmTIAS-LightSim 側からの回答書** である.MiniTIAS 側の実装結果評価・SHADING_MODE 判断・物理解釈の修正・運用上の合意事項を明文化する. - -## 想定読者 (Intended Reader) - -- **MiniTIAS 側 Claude セッション**: 本ドキュメントを読んで,SmTIAS-LightSim 側の判断と次フェーズの依頼内容を把握する. -- **人間レビュー (rinto)**: 両セッションの判断整合を確認する. - -## サマリ (Summary) - -| 項目 | SmTIAS-LightSim 側の判断 | -| --- | --- | -| **SHADING_MODE** | **`HIGH_QUALITY` を本流で維持**.OFF への切替は条件付き将来オプション(後述).MiniTIAS 側の実装変更は **不要** | -| Mitsuba 出力の物理解釈 | 「LSC 適用前の生 Bayer 相当」ではなく **「ISP が完璧に LSC 補正できた場合の理想値」相当**.HIGH_QUALITY DNG と直接比較するのが物理的に整合 | -| LSC 逆適用機能 | SmTIAS-LightSim 側で **検証用ツール**として将来実装.本流の比較では使わない | -| 既存 baseline 互換性 | TECH_02 既決:**新規 baseline で再キャリブ**.既存 `MiniTIAS_20260408_144434` は参考扱い | -| 露光・ISO 目安 | **10-bit のうち中央値 500 前後**(飽和回避のため p99 < 900).現状 1/60s + ISO40 で適切か実機で要確認 | -| **作業フェーズ分け** | **フェーズ A(直近): 1 ショット撮影でシミュとの対応を先に検証** → **フェーズ B(後続): 対応が取れたら連射 UI 実装と V1 再現性検証** | -| V1 連射再現性検証 | **フェーズ B に後回し**.フェーズ A で対応の見通しが立ってから着手.解析は SmTIAS-LightSim 側 sm-evaluate に統合,MiniTIAS 側は連射 UI のみ実装(フェーズ B 時点) | -| データ転送 | **`adb pull` 推奨**.MTP 経由は禁止しないが大容量 DNG で不整合リスクあり | -| 改善案優先度 | フェーズ A 用: **画素統計・Hot pixel map** を高優先で同意.連射 UI は **フェーズ B に後回し**.他はキャリブ進捗を見て判断 | - -→ **フェーズ A** で MiniTIAS 側に追加で依頼するのは **画素統計・Hot pixel map** の 2 件と **白板 1 ショット試し撮り**のみ.連射機能はフェーズ B まで保留. - -## SHADING_MODE 判断の詳細 (SHADING_MODE Decision Rationale) - -### 結論 - -**選択肢 (1) `HIGH_QUALITY` を本流で維持**.MiniTIAS 側の現状実装をそのまま継続する. - -### 物理的整合性の説明 - -TECH_03 §SHADING_MODE 経緯では「Mitsuba 出力は LSC 適用前の生 Bayer 相当か?」という確認があったが,**実はそうではない**.Mitsuba 3 の orthographic sensor は次の特性を持つ: - -| データ | 物理的意味 | cos⁴ falloff | -| --- | --- | --- | -| Mitsuba orthographic 出力 | 各画素位置の **平行光線が交差した点からの放射輝度 L (W/m²/sr)** | **無し**(全画素平行光線のため) | -| 実機センサ生 (SHADING_OFF) | レンズ通過後のセンサ受光量 | **有り**(実物理 cos⁴ で周辺暗) | -| 実機 HIGH_QUALITY DNG | センサ生 × LSC マップ(≥1.0,周辺で大きい) | **理想的にはほぼ補正済み**(残差あり) | - -つまり: - -- **Mitsuba 出力 ≒ 「ISP が完璧に LSC 補正できた場合の理想値」相当** -- これと **HIGH_QUALITY DNG** を直接比較するのが **物理的に最も整合** -- 両者の残差 = 「実機 LSC 補正の不完全度 + シミュ物理モデルの誤差」となり,**これがまさに評価したい本質** - -逆に SHADING_OFF DNG と Mitsuba 出力を直接比較するには Mitsuba 側に物理 cos⁴ falloff を別途モデル化する必要があり,新たな自由度(絞り径・焦点距離・口径食モデル)が入る.**自由度が増えれば overfitting リスクも増える**.現状の方針(HIGH_QUALITY 維持)は overfitting 回避の観点でも妥当. - -### LSC マップの位置付け - -実装した LSC マップ取得機構 (`STATISTICS_LENS_SHADING_MAP_MODE = ON`) は本流の比較では直接使わないが,**以下の検証用途で価値が高い**: - -| 用途 | 説明 | -| --- | --- | -| 個体差検証 | 実機ごと・撮影ごとに LSC マップが変動するか確認.固定なら端末校正値,変動なら AWB 連動の動的計算 | -| 補正残差の可視化 | LSC マップが実画像のずれを完全に説明するか,残差がどの程度残るかを定量化 | -| 物理 cos⁴ との比較 | LSC マップ ≒ 物理 cos⁴ の逆数か検証.モデル化検討の物理動機として使える | -| SHADING_OFF へのフォールバック | 後述「フォールバック条件」発動時に,OFF データへの逆適用ロジックの正当性検証に使える | - -→ メタデータ JSON に LSC マップを保存し続ける現実装は **そのまま維持を依頼**. - -### 将来 SHADING_OFF 切替のフォールバック条件 - -「もし問題があったら OFF にした時の差を確認する」という運用方針を踏まえ,以下のいずれかが発生した時に SHADING_OFF 撮影の追加検証を依頼する: - -| 発動条件 | 検証目的 | -| --- | --- | -| **C1**: Mitsuba シミュ vs HIGH_QUALITY DNG の残差が **同じ条件で 10 回撮っても再現的に大きい**(CoV/勾配残差 1.5× 以上 + 形が物理的に説明できない) | LSC 補正残差が大きすぎる可能性.OFF と比較して「物理 cos⁴」と「ISP 補正残差」を切り分ける | -| **C2**: LSC マップが **撮影ごとに大きく変動**する(中央値の variation > 5% 等) | ISP が AWB と連動して動的計算している証拠.補正後 DNG の解析時にこの動的性を考慮する必要 | -| **C3**: シミュ側の Mitsuba モデル精度向上後も残差が物理的に説明できない | LSC 由来でない別要因の存在.OFF 比較で物理 cos⁴ の影響度を独立に評価 | - -これらの条件が発動した時は,MiniTIAS 側に「同一シーンを HIGH_QUALITY と OFF で 1 セット連続撮影するオプション」の追加実装を依頼する.コスト見積もり:Kotlin 側 1〜2 時間,ファイル命名規則拡張(`*_hq.dng` / `*_off.dng`). - -**現時点では発動条件未到達**.実装は不要. - -## Mitsuba 出力の物理解釈の補足 (Physical Interpretation Note) - -TECH_03 §SHADING_MODE 経緯で混乱の元になった「Mitsuba 出力 = 生 Bayer 相当か?」について,SmTIAS-LightSim 側の正式な物理モデルを整理する. - -### 現状の Mitsuba シーン構成 - -- **emitter**: LED 配置から 18 個の area emitter(位置は Fusion 360 設計 STL から抽出,[Step 8-9 参照](../06_TEST/TEST_01_キャリブレーション検証履歴.md)) -- **bsdf**: Lambertian(反射率 0.85,校正は [Step 8-6 参照](../06_TEST/TEST_01_キャリブレーション検証履歴.md)) -- **integrator**: `path` tracer(多重反射,max_depth=8) -- **sensor**: **orthographic**(平行投影,cos⁴ falloff なし) - -→ シミュ luminance.npy は「**評価板表面の物理放射輝度 L** を orthographic 平行光線でサンプリングした値」.これは「実カメラで perspective sensor + 完璧な LSC 補正が掛かった時の出力」に最も近い. - -### 厳密に言えば足りないもの - -物理的に Mitsuba 出力と HIGH_QUALITY DNG が完全一致しない理由: - -| 要因 | 影響度 | 現状の処理 | -| --- | --- | --- | -| **実機 LSC の補正残差** | 中(残差 1.6〜1.9× の主因候補) | 未モデル化.本回答で「測定して見る」方針 | -| **実機センサのキャリブレーション残差**(ホットピクセル,黒レベル変動) | 小 | TECH_03 改善案の Hot pixel map で対応予定 | -| **Mitsuba 側 Lambertian 近似の限界** | 中(実機内壁は完全 Lambertian ではない) | [Step 8-2 反射率スイープ](../06_TEST/TEST_01_キャリブレーション検証履歴.md) で限界確認済 | -| **LED 配光の Lambertian 近似** | 小〜中 | [Step 8-10/8-11 spot emitter 試行](../06_TEST/TEST_01_キャリブレーション検証履歴.md) でデータシート整合まで詰めた | -| **メッシュ離散化** | 小 | path bake 高サンプル化([TEST_04 Speed-2](../06_TEST/TEST_04_シミュレーション速度最適化履歴.md) )で評価可能だが現在は中断 | -| **sRGB OETF の有無** | 大(過去対応済) | sm-evaluate で順方向適用([Step 8-3](../06_TEST/TEST_01_キャリブレーション検証履歴.md)) | - -→ MiniTIAS 側 DNG (HIGH_QUALITY) は **10-bit linear** で sRGB OETF 未適用のはず.SmTIAS-LightSim 側で DNG 読み込み時に linear 域で評価し,比較時には Mitsuba 側も linear のまま使う(または両者に同じ OETF を適用する). - -## 作業フェーズ分け (Work Phase Strategy) - -本回答時点での研究上の優先順位として,**「シミュ vs 実機の対応がそもそも取れるか」を 1 ショットで先に確認してから連射に進む** 二段階方式を採用する. - -### 方針の根拠 - -- **連射再現性が確保できても,シミュとの対応自体が取れなければ意味が薄い** -- 1 ショット分析でフェーズ A の対応が取れない場合: - - 物理モデルの根本見直し(Mitsuba 側の物性・配光・反射特性) - - SHADING_MODE フォールバック条件 C1〜C3 の発動判断 - - シミュ側の自由度パラメータの再キャリブ -- これらは **どれも 1 ショット分析で判断できる** ことで,連射機能の有無に依らない -- 連射機能を先に実装すると「結局使わないかもしれない実装」のコストがかかるリスクがある - -### フェーズ A(直近・1 ショット対応検証) - -**目的**: 1 枚の定量モード DNG とシミュ Mitsuba 出力の対応そのものを評価する. - -**MiniTIAS 側の作業**: - -1. **白板で 1 ショット試し撮り**(現状実装で OK,追加実装なし) - - 1/60s + ISO 40 で mean が 10-bit 中央値 500 前後に収まるか確認 - - 範囲外なら露光時間 or ISO を 1〜2 通り試行 - - 確定した撮影条件と DNG + meta.json を SmTIAS-LightSim 側に共有 - -2. **画素統計を meta.json に追加**(高優先) - - mean_per_channel / max_per_channel / p99 / saturated_pixel_ratio - - 撮影直後に飽和判定したい.撮り直しの即時判定にも使える - -3. **Hot pixel map 取得**(高優先) - - `STATISTICS_HOT_PIXEL_MAP_MODE = ON` - - meta.json に座標リストを記録.SmTIAS-LightSim 側の解析でマスク - -**SmTIAS-LightSim 側の作業**: - -1. **DNG (RAW_SENSOR) 読み込み I/F の実装** (`evaluation/dng_loader.py` 想定) - - `rawpy` 等で 10-bit BGGR Bayer を展開 - - 黒レベル除去 + デモザイク - -2. **メタデータ JSON 読み込み I/F の実装** (`evaluation/metadata.py` 想定) - - `settings` / `actual` / `sensorCharacteristics` / `lscMap` の読み取り - - hot pixel マスク適用機能 - -3. **新規 baseline config の作成** (`configs/eval_baseline_quantitative.yaml`) - - 既存 baseline と並列保持 - -4. **1 ショット シミュ vs 実機 突合** - - sm-evaluate に DNG 入力経路を追加 - - 既存メトリクス(CoV / 勾配 / C/P / max-min)を 1 ショット定量モード DNG に適用 - - [TEST_01](../06_TEST/TEST_01_キャリブレーション検証履歴.md) に Step 8-13 として記録 - -**フェーズ A 完了の判定**: - -- 1 ショット定量モード DNG(10-bit linear,HIGH_QUALITY,hot pixel マスク済)と Mitsuba シミュ luminance.npy の評価指標を直接比較 -- 既存 baseline(通常モード PNG)での残差 2.1× が **どう変化するか** を観察 -- 結果次第で以下を判断: - - **残差が縮む(≤ 1.5×)**: 撮影モード変更が効いた.フェーズ B に進む - - **残差変わらず**: SHADING_MODE フォールバック条件 C1 の検討・物理モデル見直し - - **残差が増える**: 解析パイプラインの不整合(DNG 読み込み・黒レベル・デモザイク)を疑う - -### フェーズ B(後続・連射再現性検証) - -**フェーズ A で対応の見通しが立った場合のみ**着手.目的は TECH_01 検証 V1(10 連射 mean CoV < 1%)の達成. - -**MiniTIAS 側の作業**(フェーズ B 時点): - -- **連射 UI 実装**: ボタンタップ → 10 連射 → 全保存 - - ファイル命名: `MiniTIAS_QM_YYYYMMDD_HHmmss_burst{0..9}.dng` - - 連射間隔は端末性能依存.インターバル指定は不要 - - meta.json は撮影ごとに保存(10 個生成).プレビュー JPEG は 1 枚で十分 - -**SmTIAS-LightSim 側の作業**(フェーズ B 時点): - -- **再現性検証スクリプト** `scripts/verify_repeatability.py` - - 10 ショット間で mean / std / CoV / 形状指標を集計 - - V1 合格判定(mean CoV < 1%,形状指標 std < 0.005) - -役割分担の根拠:SmTIAS-LightSim 側に既存の解析基盤([`uniformity.py`](../../src/sm_tias_lightsim/uniformity.py), `evaluation/*.py`)があるので,再現性検証もそこに統合する方が将来のキャリブ作業との整合性が高い. - -### フェーズ B 着手の条件 - -- フェーズ A で「シミュ vs 実機」の対応が一定程度取れた(残差 ≤ 1.5× 程度) -- もしくはフェーズ A の結果から「連射で SN 比改善 / 平均値安定化が必要」と判断された -- いずれもフェーズ A 完了後に判断する - -## 露光時間・ISO 運用の目安 (Exposure & ISO Guideline) - -TECH_03 「露光時間 / ISO の運用」への回答: - -### 白板撮影の理想値 - -10-bit DNG (値域 0〜1023) で: - -| 指標 | 目安 | -| --- | --- | -| 黒レベル | 64(`SENSOR_BLACK_LEVEL_PATTERN`).差し引き後の値で評価 | -| **白板中央の mean**(黒レベル除去後) | **400〜600**(中央値約 500) | -| 飽和回避 | **p99 < 900**(黒レベル除去後 836) | -| SN 比 | 最大露光(飽和回避内)で改善.ただしホット画素も顕在化 | - -現状の **1/60s + ISO 40** が適切かは **実機で 1 度白板撮影して mean を確認**する必要がある.mean が 400 を下回るなら露光時間を倍にする(1/30s)または ISO を上げる.mean が 600 を超えるなら露光時間を半分(1/120s)に. - -### MiniTIAS 側の半自動キャリブ機能(TECH_03 「検討中の対応 (a)」)について - -提案された「AE を 1 回走らせて値を読み,以降固定」は **歓迎**.実装すれば以下の利点: - -- 環境光(部屋の明るさ)の影響を吸収して撮影条件を一定化 -- 白板用・舌模型用で個別校正値を保持できる -- meta.json の `settings.exposure_time_ns` / `settings.sensor_sensitivity_iso` に校正済み値を記録 - -ただし優先度は **中**(現状の手動ハードコードでも研究は進められる).連射 UI と画素統計が先. - -## 改善案優先度のフィードバック (Improvement Priority Feedback) - -TECH_03 「検討中の改善案」に対する SmTIAS-LightSim 側の優先度評価.本回答ではフェーズ A/B 分けにより **連射 UI を高優先 → フェーズ B(中優先)に降格**する点が当初提案からの修正. - -| MiniTIAS 側優先度 | 項目 | SmTIAS-LightSim 側評価 | フェーズ | 理由 | -| --- | --- | --- | --- | --- | -| 高 | 画素統計を meta.json に追加(mean/max/p99/saturated_ratio) | **同意,高** | **A** | 飽和判定がないと「定量データの有効性」が事後判断になる.撮影時に即判定したい.1 ショット分析でも必須 | -| 高 | Hot pixel map 取得 (`STATISTICS_HOT_PIXEL_MAP_MODE = ON`) | **同意,高** | **A** | 10-bit のホット画素は max/std 指標に大きく影響.マスク必須 | -| 高 | 連射機能(V1 検証用) | **降格.フェーズ A 結果次第で再評価** | **B(保留)** | 1 ショットで対応が取れることを先に確認すべき.対応が取れないなら連射しても無意味 | -| 中 | 露光時間・ISO の半自動キャリブ | **同意,中** | B 以降 | 手動ハードコードでも進められる.運用が定着した後でよい | -| 中 | レンズ・センサ校正値を meta に追加 | **同意,中** | B 以降 | DNG Exif に既に埋め込まれている分は重複.未埋め込み値のみ追加で十分 | -| 低 | Dark frame / Flat field キャリブ機能 | **同意,低** | C 以降 | 実物理 cos⁴ の独立測定として理想的だが,現状の HIGH_QUALITY 経路では LSC マップで代替可能 | - -→ **フェーズ A で MiniTIAS 側に依頼するのは「画素統計・Hot pixel map」の 2 件のみ**.連射 UI と他項目はフェーズ A 完了後に再評価. - -## データ受け渡し細部の追補 (Data Exchange Refinements) - -[TECH_02 データ受け渡し仕様](TECH_02_MiniTIAS引き継ぎ手順.md#データ受け渡し仕様-data-exchange-specification) を以下で補足する. - -### ファイル転送経路 - -- **推奨**: `adb pull /sdcard/Pictures/MiniTIAS/ ` -- **非推奨**: Windows エクスプローラ経由 MTP コピー(DNG サイズ 16MB で不整合報告あり) - -### 配置先(既存仕様の確認) - -```text -SmTIAS-LightSim/ -└── reference_measurement/ - └── quantitative/ - ├── MiniTIAS_QM_YYYYMMDD_HHmmss.dng - ├── MiniTIAS_QM_YYYYMMDD_HHmmss.meta.json - ├── MiniTIAS_QM_YYYYMMDD_HHmmss.preview.jpg # 解析対象外(任意配置) - └── MiniTIAS_QM_YYYYMMDD_HHmmss_burst{0..9}.dng # 連射時 -``` - -`reference_measurement/` は `.gitignore` 対象(個人ローカル).preview.jpg は解析不要なので配置任意. - -### 既存 baseline の参照 - -`MiniTIAS_20260408_144434.png`(通常モード)は SmTIAS-LightSim/`reference_measurement/MiniTIAS_20260408_144434/` 配下に保持.**新規定量モード baseline 取得後は参考扱い**で,本流キャリブから外す. - -## 次のフェーズの作業範囲 (Next Phase Scope) - -本回答に基づく次フェーズの作業を整理.**フェーズ A 完了後にフェーズ B への移行を判断**する. - -### フェーズ A(直近・1 ショット対応検証) - -#### MiniTIAS 側(実装依頼) - -1. **画素統計を meta.json に追加**(高優先・フェーズ A 必須) - - mean_per_channel / max_per_channel / p99 / saturated_pixel_ratio -2. **Hot pixel map 取得・meta.json に保存**(高優先・フェーズ A 必須) - - `STATISTICS_HOT_PIXEL_MAP_MODE = ON` -3. **白板で 1 ショット試し撮り → mean 確認**(露光/ISO の妥当性確認) - - mean が 400〜600(10-bit 黒レベル除去後)なら現状の 1/60s + ISO 40 で運用 - - 範囲外なら設定を調整 -4. 確定した撮影条件で **白板を 1 枚撮影** → `reference_measurement/quantitative/` へ adb pull 転送 - -> **連射 UI は不要**.本フェーズでは 1 ショット分析を優先. - -#### SmTIAS-LightSim 側(受け入れ実装) - -1. **DNG (RAW_SENSOR) 読み込み I/F の実装**(`evaluation/dng_loader.py` 新規想定) -2. **メタデータ JSON 読み込み I/F の実装**(`evaluation/metadata.py` 新規想定) -3. **LSC マップ読み込み I/F の実装**(検証用,本流では使わない) -4. **新規定量モード baseline 設定** `configs/eval_baseline_quantitative.yaml` の作成 -5. **1 ショット シミュ vs 実機の突合** - - 既存メトリクス(CoV / 勾配 / C/P / max-min)を 1 ショット DNG に適用 - - 既存通常モード baseline 残差 2.1× が定量モードで **どう変化するか** を観察 -6. [TEST_01](../06_TEST/TEST_01_キャリブレーション検証履歴.md) に **Step 8-13: 定量モード 1 ショット対応検証** として記録 - -### フェーズ A 完了判定とフェーズ B 移行条件 - -フェーズ A 完了後,1 ショット突合の結果から以下を判断: - -| 結果 | 判断 | 次の動き | -| --- | --- | --- | -| 残差が縮む(≤ 1.5×) | 撮影モード変更が効いた | フェーズ B(連射 V1 検証)に進む.連射 UI 実装依頼 | -| 残差変わらず(≈ 2.1×) | 撮影モード変更だけでは足りない | SHADING_MODE フォールバック条件 C1 検討.物理モデル見直し(LSC モデル化/反射特性/emitter 配光) | -| 残差が増える | 解析パイプラインに不整合 | DNG 読み込み・黒レベル・デモザイク・カラーマトリクスを疑う.デバッグ | - -### フェーズ B(後続・連射 V1 検証) - -**フェーズ A で対応の見通しが立った場合のみ**着手. - -#### MiniTIAS 側(フェーズ B 時点) - -- 10 連射 UI 実装(V1 検証前提) -- 連射機能で 10 ショット baseline 撮影 → `reference_measurement/quantitative/` へ転送 - -#### SmTIAS-LightSim 側(フェーズ B 時点) - -- **再現性検証スクリプト** `scripts/verify_repeatability.py` の実装 -- V1 検証実施 -- 必要に応じてキャリブ自由度(反射率・emitter 強度等)を再調整 - -## 未確定事項 (Pending Items) - -以下は本回答時点では判断保留.後続作業の進捗に応じて追加判断する: - -| ID | 内容 | 判断時期 | -| --- | --- | --- | -| P1 | DNG 内 Bayer データから RGB への展開方法(rawpy 等使用) | sm-evaluate DNG 読み込み実装時 | -| P2 | 黒レベル除去の有無(meta.json `sensorCharacteristics.black_level_pattern` で対応) | 同上 | -| P3 | デモザイク手法(最近傍 / バイリニア / AHD) | 同上.評価指標への影響を実測比較 | -| P4 | カラーマトリクス適用の有無 | 無彩色シーンでは影響軽微.本流は無適用で進める | -| P5 | 連射時の物理的振動・温度ドリフトの扱い | V1 結果次第.問題があれば連射間隔の延長等を検討 | - -## 関連ドキュメント (Related Documents) - -- [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) — MiniTIAS 側への原始要求 -- [TECH_02 MiniTIAS 引き継ぎ手順](TECH_02_MiniTIAS引き継ぎ手順.md) — 引き継ぎ作業ガイド -- [TECH_03 定量モード実装報告と SHADING_MODE 相談](TECH_03_定量モード実装報告とSHADING_MODE相談.md) — MiniTIAS 側からの実装報告(本回答の対象) -- [TEST_01 キャリブレーション検証履歴](../06_TEST/TEST_01_キャリブレーション検証履歴.md) — Step 8 系の経緯 -- [TEST_03 輝度マップ形状追跡](../06_TEST/TEST_03_輝度マップ形状追跡.md) — 形のずれ議論.LSC モデル化の物理動機 -- [SPEC_04 評価仕様](../04_SPEC/SPEC_04_評価仕様.md) — sm-evaluate パイプライン diff --git "a/docs/05_TECH/TECH_04_SmTIAS\343\201\270\343\201\256\345\233\236\347\255\224.md" "b/docs/05_TECH/TECH_04_SmTIAS\343\201\270\343\201\256\345\233\236\347\255\224.md" new file mode 100644 index 0000000..67beecd --- /dev/null +++ "b/docs/05_TECH/TECH_04_SmTIAS\343\201\270\343\201\256\345\233\236\347\255\224.md" @@ -0,0 +1,333 @@ +# SmTIAS への回答 (Response to SmTIAS) + +本ドキュメントは [TECH_03 定量モード実装報告と SHADING_MODE 相談](TECH_03_定量モード実装報告とSHADING_MODE相談.md) に対する **SmTIAS-LightSim 側からの回答書** である.SmTIAS 側の実装結果評価・SHADING_MODE 判断・物理解釈の修正・運用上の合意事項を明文化する. + +## 想定読者 (Intended Reader) + +- **SmTIAS 側 Claude セッション**: 本ドキュメントを読んで,SmTIAS-LightSim 側の判断と次フェーズの依頼内容を把握する. +- **人間レビュー (rinto)**: 両セッションの判断整合を確認する. + +## サマリ (Summary) + +| 項目 | SmTIAS-LightSim 側の判断 | +| --- | --- | +| **SHADING_MODE** | **`HIGH_QUALITY` を本流で維持**.OFF への切替は条件付き将来オプション(後述).SmTIAS 側の実装変更は **不要** | +| Mitsuba 出力の物理解釈 | 「LSC 適用前の生 Bayer 相当」ではなく **「ISP が完璧に LSC 補正できた場合の理想値」相当**.HIGH_QUALITY DNG と直接比較するのが物理的に整合 | +| LSC 逆適用機能 | SmTIAS-LightSim 側で **検証用ツール**として将来実装.本流の比較では使わない | +| 既存 baseline 互換性 | TECH_02 既決:**新規 baseline で再キャリブ**.既存 `MiniTIAS_20260408_144434` は参考扱い | +| 露光・ISO 目安 | **10-bit のうち中央値 500 前後**(飽和回避のため p99 < 900).現状 1/60s + ISO40 で適切か実機で要確認 | +| **作業フェーズ分け** | **フェーズ A(直近): 1 ショット撮影でシミュとの対応を先に検証** → **フェーズ B(後続): 対応が取れたら連射 UI 実装と V1 再現性検証** | +| V1 連射再現性検証 | **フェーズ B に後回し**.フェーズ A で対応の見通しが立ってから着手.解析は SmTIAS-LightSim 側 sm-evaluate に統合,SmTIAS 側は連射 UI のみ実装(フェーズ B 時点) | +| データ転送 | **`adb pull` 推奨**.MTP 経由は禁止しないが大容量 DNG で不整合リスクあり | +| 改善案優先度 | フェーズ A 用: **画素統計・Hot pixel map** を高優先で同意.連射 UI は **フェーズ B に後回し**.他はキャリブ進捗を見て判断 | + +→ **フェーズ A** で SmTIAS 側に追加で依頼するのは **画素統計・Hot pixel map** の 2 件と **白板 1 ショット試し撮り**のみ.連射機能はフェーズ B まで保留. + +## SHADING_MODE 判断の詳細 (SHADING_MODE Decision Rationale) + +### 結論 + +**選択肢 (1) `HIGH_QUALITY` を本流で維持**.SmTIAS 側の現状実装をそのまま継続する. + +### 物理的整合性の説明 + +TECH_03 §SHADING_MODE 経緯では「Mitsuba 出力は LSC 適用前の生 Bayer 相当か?」という確認があったが,**実はそうではない**.Mitsuba 3 の orthographic sensor は次の特性を持つ: + +| データ | 物理的意味 | cos⁴ falloff | +| --- | --- | --- | +| Mitsuba orthographic 出力 | 各画素位置の **平行光線が交差した点からの放射輝度 L (W/m²/sr)** | **無し**(全画素平行光線のため) | +| 実機センサ生 (SHADING_OFF) | レンズ通過後のセンサ受光量 | **有り**(実物理 cos⁴ で周辺暗) | +| 実機 HIGH_QUALITY DNG | センサ生 × LSC マップ(≥1.0,周辺で大きい) | **理想的にはほぼ補正済み**(残差あり) | + +つまり: + +- **Mitsuba 出力 ≒ 「ISP が完璧に LSC 補正できた場合の理想値」相当** +- これと **HIGH_QUALITY DNG** を直接比較するのが **物理的に最も整合** +- 両者の残差 = 「実機 LSC 補正の不完全度 + シミュ物理モデルの誤差」となり,**これがまさに評価したい本質** + +逆に SHADING_OFF DNG と Mitsuba 出力を直接比較するには Mitsuba 側に物理 cos⁴ falloff を別途モデル化する必要があり,新たな自由度(絞り径・焦点距離・口径食モデル)が入る.**自由度が増えれば overfitting リスクも増える**.現状の方針(HIGH_QUALITY 維持)は overfitting 回避の観点でも妥当. + +### LSC マップの位置付け + +実装した LSC マップ取得機構 (`STATISTICS_LENS_SHADING_MAP_MODE = ON`) は本流の比較では直接使わないが,**以下の検証用途で価値が高い**: + +| 用途 | 説明 | +| --- | --- | +| 個体差検証 | 実機ごと・撮影ごとに LSC マップが変動するか確認.固定なら端末校正値,変動なら AWB 連動の動的計算 | +| 補正残差の可視化 | LSC マップが実画像のずれを完全に説明するか,残差がどの程度残るかを定量化 | +| 物理 cos⁴ との比較 | LSC マップ ≒ 物理 cos⁴ の逆数か検証.モデル化検討の物理動機として使える | +| SHADING_OFF へのフォールバック | 後述「フォールバック条件」発動時に,OFF データへの逆適用ロジックの正当性検証に使える | + +→ メタデータ JSON に LSC マップを保存し続ける現実装は **そのまま維持を依頼**. + +### 将来 SHADING_OFF 切替のフォールバック条件 + +「もし問題があったら OFF にした時の差を確認する」という運用方針を踏まえ,以下のいずれかが発生した時に SHADING_OFF 撮影の追加検証を依頼する: + +| 発動条件 | 検証目的 | +| --- | --- | +| **C1**: Mitsuba シミュ vs HIGH_QUALITY DNG の残差が **同じ条件で 10 回撮っても再現的に大きい**(CoV/勾配残差 1.5× 以上 + 形が物理的に説明できない) | LSC 補正残差が大きすぎる可能性.OFF と比較して「物理 cos⁴」と「ISP 補正残差」を切り分ける | +| **C2**: LSC マップが **撮影ごとに大きく変動**する(中央値の variation > 5% 等) | ISP が AWB と連動して動的計算している証拠.補正後 DNG の解析時にこの動的性を考慮する必要 | +| **C3**: シミュ側の Mitsuba モデル精度向上後も残差が物理的に説明できない | LSC 由来でない別要因の存在.OFF 比較で物理 cos⁴ の影響度を独立に評価 | + +これらの条件が発動した時は,SmTIAS 側に「同一シーンを HIGH_QUALITY と OFF で 1 セット連続撮影するオプション」の追加実装を依頼する.コスト見積もり:Kotlin 側 1〜2 時間,ファイル命名規則拡張(`*_hq.dng` / `*_off.dng`). + +**現時点では発動条件未到達**.実装は不要. + +## Mitsuba 出力の物理解釈の補足 (Physical Interpretation Note) + +TECH_03 §SHADING_MODE 経緯で混乱の元になった「Mitsuba 出力 = 生 Bayer 相当か?」について,SmTIAS-LightSim 側の正式な物理モデルを整理する. + +### 現状の Mitsuba シーン構成 + +- **emitter**: LED 配置から 18 個の area emitter(位置は Fusion 360 設計 STL から抽出,[Step 8-9 参照](../06_TEST/TEST_01_キャリブレーション検証履歴.md)) +- **bsdf**: Lambertian(反射率 0.85,校正は [Step 8-6 参照](../06_TEST/TEST_01_キャリブレーション検証履歴.md)) +- **integrator**: `path` tracer(多重反射,max_depth=8) +- **sensor**: **orthographic**(平行投影,cos⁴ falloff なし) + +→ シミュ luminance.npy は「**評価板表面の物理放射輝度 L** を orthographic 平行光線でサンプリングした値」.これは「実カメラで perspective sensor + 完璧な LSC 補正が掛かった時の出力」に最も近い. + +### 厳密に言えば足りないもの + +物理的に Mitsuba 出力と HIGH_QUALITY DNG が完全一致しない理由: + +| 要因 | 影響度 | 現状の処理 | +| --- | --- | --- | +| **実機 LSC の補正残差** | 中(残差 1.6〜1.9× の主因候補) | 未モデル化.本回答で「測定して見る」方針 | +| **実機センサのキャリブレーション残差**(ホットピクセル,黒レベル変動) | 小 | TECH_03 改善案の Hot pixel map で対応予定 | +| **Mitsuba 側 Lambertian 近似の限界** | 中(実機内壁は完全 Lambertian ではない) | [Step 8-2 反射率スイープ](../06_TEST/TEST_01_キャリブレーション検証履歴.md) で限界確認済 | +| **LED 配光の Lambertian 近似** | 小〜中 | [Step 8-10/8-11 spot emitter 試行](../06_TEST/TEST_01_キャリブレーション検証履歴.md) でデータシート整合まで詰めた | +| **メッシュ離散化** | 小 | path bake 高サンプル化([TEST_04 Speed-2](../06_TEST/TEST_04_シミュレーション速度最適化履歴.md) )で評価可能だが現在は中断 | +| **sRGB OETF の有無** | 大(過去対応済) | sm-evaluate で順方向適用([Step 8-3](../06_TEST/TEST_01_キャリブレーション検証履歴.md)) | + +→ SmTIAS 側 DNG (HIGH_QUALITY) は **10-bit linear** で sRGB OETF 未適用のはず.SmTIAS-LightSim 側で DNG 読み込み時に linear 域で評価し,比較時には Mitsuba 側も linear のまま使う(または両者に同じ OETF を適用する). + +## 作業フェーズ分け (Work Phase Strategy) + +本回答時点での研究上の優先順位として,**「シミュ vs 実機の対応がそもそも取れるか」を 1 ショットで先に確認してから連射に進む** 二段階方式を採用する. + +### 方針の根拠 + +- **連射再現性が確保できても,シミュとの対応自体が取れなければ意味が薄い** +- 1 ショット分析でフェーズ A の対応が取れない場合: + - 物理モデルの根本見直し(Mitsuba 側の物性・配光・反射特性) + - SHADING_MODE フォールバック条件 C1〜C3 の発動判断 + - シミュ側の自由度パラメータの再キャリブ +- これらは **どれも 1 ショット分析で判断できる** ことで,連射機能の有無に依らない +- 連射機能を先に実装すると「結局使わないかもしれない実装」のコストがかかるリスクがある + +### フェーズ A(直近・1 ショット対応検証) + +**目的**: 1 枚の定量モード DNG とシミュ Mitsuba 出力の対応そのものを評価する. + +**SmTIAS 側の作業**: + +1. **白板で 1 ショット試し撮り**(現状実装で OK,追加実装なし) + - 1/60s + ISO 40 で mean が 10-bit 中央値 500 前後に収まるか確認 + - 範囲外なら露光時間 or ISO を 1〜2 通り試行 + - 確定した撮影条件と DNG + meta.json を SmTIAS-LightSim 側に共有 + +2. **画素統計を meta.json に追加**(高優先) + - mean_per_channel / max_per_channel / p99 / saturated_pixel_ratio + - 撮影直後に飽和判定したい.撮り直しの即時判定にも使える + +3. **Hot pixel map 取得**(高優先) + - `STATISTICS_HOT_PIXEL_MAP_MODE = ON` + - meta.json に座標リストを記録.SmTIAS-LightSim 側の解析でマスク + +**SmTIAS-LightSim 側の作業**: + +1. **DNG (RAW_SENSOR) 読み込み I/F の実装** (`evaluation/dng_loader.py` 想定) + - `rawpy` 等で 10-bit BGGR Bayer を展開 + - 黒レベル除去 + デモザイク + +2. **メタデータ JSON 読み込み I/F の実装** (`evaluation/metadata.py` 想定) + - `settings` / `actual` / `sensorCharacteristics` / `lscMap` の読み取り + - hot pixel マスク適用機能 + +3. **新規 baseline config の作成** (`configs/eval_baseline_quantitative.yaml`) + - 既存 baseline と並列保持 + +4. **1 ショット シミュ vs 実機 突合** + - sm-evaluate に DNG 入力経路を追加 + - 既存メトリクス(CoV / 勾配 / C/P / max-min)を 1 ショット定量モード DNG に適用 + - [TEST_01](../06_TEST/TEST_01_キャリブレーション検証履歴.md) に Step 8-13 として記録 + +**フェーズ A 完了の判定**: + +- 1 ショット定量モード DNG(10-bit linear,HIGH_QUALITY,hot pixel マスク済)と Mitsuba シミュ luminance.npy の評価指標を直接比較 +- 既存 baseline(通常モード PNG)での残差 2.1× が **どう変化するか** を観察 +- 結果次第で以下を判断: + - **残差が縮む(≤ 1.5×)**: 撮影モード変更が効いた.フェーズ B に進む + - **残差変わらず**: SHADING_MODE フォールバック条件 C1 の検討・物理モデル見直し + - **残差が増える**: 解析パイプラインの不整合(DNG 読み込み・黒レベル・デモザイク)を疑う + +### フェーズ B(後続・連射再現性検証) + +**フェーズ A で対応の見通しが立った場合のみ**着手.目的は TECH_01 検証 V1(10 連射 mean CoV < 1%)の達成. + +**SmTIAS 側の作業**(フェーズ B 時点): + +- **連射 UI 実装**: ボタンタップ → 10 連射 → 全保存 + - ファイル命名: `SmTIAS_QM_YYYYMMDD_HHmmss_burst{0..9}.dng` + - 連射間隔は端末性能依存.インターバル指定は不要 + - meta.json は撮影ごとに保存(10 個生成).プレビュー JPEG は 1 枚で十分 + +**SmTIAS-LightSim 側の作業**(フェーズ B 時点): + +- **再現性検証スクリプト** `scripts/verify_repeatability.py` + - 10 ショット間で mean / std / CoV / 形状指標を集計 + - V1 合格判定(mean CoV < 1%,形状指標 std < 0.005) + +役割分担の根拠:SmTIAS-LightSim 側に既存の解析基盤([`uniformity.py`](../../src/sm_tias_lightsim/uniformity.py), `evaluation/*.py`)があるので,再現性検証もそこに統合する方が将来のキャリブ作業との整合性が高い. + +### フェーズ B 着手の条件 + +- フェーズ A で「シミュ vs 実機」の対応が一定程度取れた(残差 ≤ 1.5× 程度) +- もしくはフェーズ A の結果から「連射で SN 比改善 / 平均値安定化が必要」と判断された +- いずれもフェーズ A 完了後に判断する + +## 露光時間・ISO 運用の目安 (Exposure & ISO Guideline) + +TECH_03 「露光時間 / ISO の運用」への回答: + +### 白板撮影の理想値 + +10-bit DNG (値域 0〜1023) で: + +| 指標 | 目安 | +| --- | --- | +| 黒レベル | 64(`SENSOR_BLACK_LEVEL_PATTERN`).差し引き後の値で評価 | +| **白板中央の mean**(黒レベル除去後) | **400〜600**(中央値約 500) | +| 飽和回避 | **p99 < 900**(黒レベル除去後 836) | +| SN 比 | 最大露光(飽和回避内)で改善.ただしホット画素も顕在化 | + +現状の **1/60s + ISO 40** が適切かは **実機で 1 度白板撮影して mean を確認**する必要がある.mean が 400 を下回るなら露光時間を倍にする(1/30s)または ISO を上げる.mean が 600 を超えるなら露光時間を半分(1/120s)に. + +### SmTIAS 側の半自動キャリブ機能(TECH_03 「検討中の対応 (a)」)について + +提案された「AE を 1 回走らせて値を読み,以降固定」は **歓迎**.実装すれば以下の利点: + +- 環境光(部屋の明るさ)の影響を吸収して撮影条件を一定化 +- 白板用・舌模型用で個別校正値を保持できる +- meta.json の `settings.exposure_time_ns` / `settings.sensor_sensitivity_iso` に校正済み値を記録 + +ただし優先度は **中**(現状の手動ハードコードでも研究は進められる).連射 UI と画素統計が先. + +## 改善案優先度のフィードバック (Improvement Priority Feedback) + +TECH_03 「検討中の改善案」に対する SmTIAS-LightSim 側の優先度評価.本回答ではフェーズ A/B 分けにより **連射 UI を高優先 → フェーズ B(中優先)に降格**する点が当初提案からの修正. + +| SmTIAS 側優先度 | 項目 | SmTIAS-LightSim 側評価 | フェーズ | 理由 | +| --- | --- | --- | --- | --- | +| 高 | 画素統計を meta.json に追加(mean/max/p99/saturated_ratio) | **同意,高** | **A** | 飽和判定がないと「定量データの有効性」が事後判断になる.撮影時に即判定したい.1 ショット分析でも必須 | +| 高 | Hot pixel map 取得 (`STATISTICS_HOT_PIXEL_MAP_MODE = ON`) | **同意,高** | **A** | 10-bit のホット画素は max/std 指標に大きく影響.マスク必須 | +| 高 | 連射機能(V1 検証用) | **降格.フェーズ A 結果次第で再評価** | **B(保留)** | 1 ショットで対応が取れることを先に確認すべき.対応が取れないなら連射しても無意味 | +| 中 | 露光時間・ISO の半自動キャリブ | **同意,中** | B 以降 | 手動ハードコードでも進められる.運用が定着した後でよい | +| 中 | レンズ・センサ校正値を meta に追加 | **同意,中** | B 以降 | DNG Exif に既に埋め込まれている分は重複.未埋め込み値のみ追加で十分 | +| 低 | Dark frame / Flat field キャリブ機能 | **同意,低** | C 以降 | 実物理 cos⁴ の独立測定として理想的だが,現状の HIGH_QUALITY 経路では LSC マップで代替可能 | + +→ **フェーズ A で SmTIAS 側に依頼するのは「画素統計・Hot pixel map」の 2 件のみ**.連射 UI と他項目はフェーズ A 完了後に再評価. + +## データ受け渡し細部の追補 (Data Exchange Refinements) + +[TECH_02 データ受け渡し仕様](TECH_02_SmTIAS引き継ぎ手順.md#データ受け渡し仕様-data-exchange-specification) を以下で補足する. + +### ファイル転送経路 + +- **推奨**: `adb pull /sdcard/Pictures/SmTIAS/ ` +- **非推奨**: Windows エクスプローラ経由 MTP コピー(DNG サイズ 16MB で不整合報告あり) + +### 配置先(既存仕様の確認) + +```text +SmTIAS-LightSim/ +└── reference_measurement/ + └── quantitative/ + ├── SmTIAS_QM_YYYYMMDD_HHmmss.dng + ├── SmTIAS_QM_YYYYMMDD_HHmmss.meta.json + ├── SmTIAS_QM_YYYYMMDD_HHmmss.preview.jpg # 解析対象外(任意配置) + └── SmTIAS_QM_YYYYMMDD_HHmmss_burst{0..9}.dng # 連射時 +``` + +`reference_measurement/` は `.gitignore` 対象(個人ローカル).preview.jpg は解析不要なので配置任意. + +### 既存 baseline の参照 + +`MiniTIAS_20260408_144434.png`(通常モード)は SmTIAS-LightSim/`reference_measurement/MiniTIAS_20260408_144434/` 配下に保持.**新規定量モード baseline 取得後は参考扱い**で,本流キャリブから外す. + +## 次のフェーズの作業範囲 (Next Phase Scope) + +本回答に基づく次フェーズの作業を整理.**フェーズ A 完了後にフェーズ B への移行を判断**する. + +### フェーズ A(直近・1 ショット対応検証) + +#### SmTIAS 側(実装依頼) + +1. **画素統計を meta.json に追加**(高優先・フェーズ A 必須) + - mean_per_channel / max_per_channel / p99 / saturated_pixel_ratio +2. **Hot pixel map 取得・meta.json に保存**(高優先・フェーズ A 必須) + - `STATISTICS_HOT_PIXEL_MAP_MODE = ON` +3. **白板で 1 ショット試し撮り → mean 確認**(露光/ISO の妥当性確認) + - mean が 400〜600(10-bit 黒レベル除去後)なら現状の 1/60s + ISO 40 で運用 + - 範囲外なら設定を調整 +4. 確定した撮影条件で **白板を 1 枚撮影** → `reference_measurement/quantitative/` へ adb pull 転送 + +> **連射 UI は不要**.本フェーズでは 1 ショット分析を優先. + +#### SmTIAS-LightSim 側(受け入れ実装) + +1. **DNG (RAW_SENSOR) 読み込み I/F の実装**(`evaluation/dng_loader.py` 新規想定) +2. **メタデータ JSON 読み込み I/F の実装**(`evaluation/metadata.py` 新規想定) +3. **LSC マップ読み込み I/F の実装**(検証用,本流では使わない) +4. **新規定量モード baseline 設定** `configs/eval_baseline_quantitative.yaml` の作成 +5. **1 ショット シミュ vs 実機の突合** + - 既存メトリクス(CoV / 勾配 / C/P / max-min)を 1 ショット DNG に適用 + - 既存通常モード baseline 残差 2.1× が定量モードで **どう変化するか** を観察 +6. [TEST_01](../06_TEST/TEST_01_キャリブレーション検証履歴.md) に **Step 8-13: 定量モード 1 ショット対応検証** として記録 + +### フェーズ A 完了判定とフェーズ B 移行条件 + +フェーズ A 完了後,1 ショット突合の結果から以下を判断: + +| 結果 | 判断 | 次の動き | +| --- | --- | --- | +| 残差が縮む(≤ 1.5×) | 撮影モード変更が効いた | フェーズ B(連射 V1 検証)に進む.連射 UI 実装依頼 | +| 残差変わらず(≈ 2.1×) | 撮影モード変更だけでは足りない | SHADING_MODE フォールバック条件 C1 検討.物理モデル見直し(LSC モデル化/反射特性/emitter 配光) | +| 残差が増える | 解析パイプラインに不整合 | DNG 読み込み・黒レベル・デモザイク・カラーマトリクスを疑う.デバッグ | + +### フェーズ B(後続・連射 V1 検証) + +**フェーズ A で対応の見通しが立った場合のみ**着手. + +#### SmTIAS 側(フェーズ B 時点) + +- 10 連射 UI 実装(V1 検証前提) +- 連射機能で 10 ショット baseline 撮影 → `reference_measurement/quantitative/` へ転送 + +#### SmTIAS-LightSim 側(フェーズ B 時点) + +- **再現性検証スクリプト** `scripts/verify_repeatability.py` の実装 +- V1 検証実施 +- 必要に応じてキャリブ自由度(反射率・emitter 強度等)を再調整 + +## 未確定事項 (Pending Items) + +以下は本回答時点では判断保留.後続作業の進捗に応じて追加判断する: + +| ID | 内容 | 判断時期 | +| --- | --- | --- | +| P1 | DNG 内 Bayer データから RGB への展開方法(rawpy 等使用) | sm-evaluate DNG 読み込み実装時 | +| P2 | 黒レベル除去の有無(meta.json `sensorCharacteristics.black_level_pattern` で対応) | 同上 | +| P3 | デモザイク手法(最近傍 / バイリニア / AHD) | 同上.評価指標への影響を実測比較 | +| P4 | カラーマトリクス適用の有無 | 無彩色シーンでは影響軽微.本流は無適用で進める | +| P5 | 連射時の物理的振動・温度ドリフトの扱い | V1 結果次第.問題があれば連射間隔の延長等を検討 | + +## 関連ドキュメント (Related Documents) + +- [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) — SmTIAS 側への原始要求 +- [TECH_02 SmTIAS 引き継ぎ手順](TECH_02_SmTIAS引き継ぎ手順.md) — 引き継ぎ作業ガイド +- [TECH_03 定量モード実装報告と SHADING_MODE 相談](TECH_03_定量モード実装報告とSHADING_MODE相談.md) — SmTIAS 側からの実装報告(本回答の対象) +- [TEST_01 キャリブレーション検証履歴](../06_TEST/TEST_01_キャリブレーション検証履歴.md) — Step 8 系の経緯 +- [TEST_03 輝度マップ形状追跡](../06_TEST/TEST_03_輝度マップ形状追跡.md) — 形のずれ議論.LSC モデル化の物理動機 +- [SPEC_04 評価仕様](../04_SPEC/SPEC_04_評価仕様.md) — sm-evaluate パイプライン 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" deleted file mode 100644 index 4b98a53..0000000 --- "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" +++ /dev/null @@ -1,449 +0,0 @@ -# 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) - -- **MiniTias-Evaluation 側 Claude セッション**: 本ドキュメントを最初に読んで作業着手する -- **人間レビュー (rinto)**: 両セッションを橋渡しする - -## 概要 (Overview) - -MiniTias-Evaluation([MiniTias-Evaluation](https://github.com/rintoHasegawa/MiniTias-Evaluation) リポジトリ)に以下の機能追加を要求する: - -1. **DNG 読み込み I/F** の新規実装(10-bit BGGR Bayer 展開) -2. **メタデータ JSON 読み込み I/F** の新規実装(撮影条件・LSC マップ・hot pixel リスト等) -3. **既存 PNG 経路と並列対応**(後方互換) -4. **既存評価指標との互換**(CoV / 勾配 / C/P / max-min 等が DNG 入力でも同じロジックで算出可能) - -これらの実装は **SmTIAS-LightSim 側にコピーされる前提**で,再利用性の高い設計とする. - -## 背景 (Background) - -### 三項プロジェクトの関係 - -```text -┌─────────────────────────┐ ┌──────────────────────────┐ -│ MiniTias │ │ MiniTias-Evaluation │ -│ (Flutter / Android) │ ──→ │ (Python) │ -│ 撮影アプリ │ │ 実機データ評価ツール │ -│ - PNG 保存(通常モード) │ │ - 評価指標算出 │ -│ - DNG 保存(定量モード) │ │ - 可視化 │ -└─────────────────────────┘ └──────────────────────────┘ - │ - │ コピー(uniformity.py 等) - ▼ - ┌──────────────────────────┐ - │ SmTIAS-LightSim │ - │ (Python / Mitsuba 3) │ - │ シミュ vs 実機比較 │ - └──────────────────────────┘ -``` - -### 経緯のまとめ - -- 2026-05-28: SmTIAS-LightSim 側 Step 8 キャリブで「実機 PNG 自体が定量データとして揺らぐ」を発見 ([TEST_01](../06_TEST/TEST_01_キャリブレーション検証履歴.md)) -- 2026-05-28: MiniTias 側に [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) を発行 -- 2026-06-01: MiniTias 側で実装完了.AQUOS sense3 (SH-02M) が LEVEL_3 で DNG 経路採用 ([TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md)) -- 2026-06-01: SHADING_MODE = HIGH_QUALITY を本流維持で合意 ([TECH_04](TECH_04_MiniTIASへの回答.md)) -- **本ドキュメント (2026-06-01)**: MiniTias-Evaluation 側にも DNG 対応を依頼 - -### MiniTias-Evaluation の現状 - -MiniTias-Evaluation の I/O は現状 PNG 専用: - -```python -# 既存 I/F (src/io/loader.py) -def load_image(path: str) -> numpy.ndarray: - """PNG 画像を読み込み RGB 配列として返す(H x W x 3, uint8).""" -``` - -→ DNG 経路の追加が必要. - -## 役割分担 (Role Distribution) - -DNG 読み込みの責務は **MiniTias-Evaluation を一次窓口**とする.既存パターン(`uniformity.py` が MiniTias-Evaluation から SmTIAS-LightSim にコピー)を踏襲する: - -| プロジェクト | 責務 | -| --- | --- | -| **MiniTias** | DNG + meta.json の保存(実装済) | -| **MiniTias-Evaluation(一次窓口)** | DNG/meta.json の読み込み I/F を正規実装.既存評価指標との並列対応 | -| **SmTIAS-LightSim(コピー側)** | MiniTias-Evaluation の DNG 読み込み I/F をコピー(`uniformity.py` パターン継承) | - -→ MiniTias-Evaluation の実装完了後,SmTIAS-LightSim 側 Claude セッションでコピー作業を実施する. - -## 要求仕様 (Requirements) - -### 1. DNG 読み込み I/F - -新規モジュール `src/io/dng_loader.py` を作成: - -```python -def load_image_dng( - path: str, - demosaic: str = "bilinear", - black_level: int | None = None, - output_format: str = "rgb_float32", -) -> numpy.ndarray: - """MiniTIAS 定量モード DNG を読み込み配列として返す. - - Args: - path: DNG ファイルのパス. - demosaic: デモザイクアルゴリズム.既定 "bilinear". - "nearest"(最近傍)/ "bilinear"(双線形)/ "ahd"(適応的)から選択. - black_level: 黒レベル.None なら meta.json から自動取得 or DNG Exif から取得. - 通常は 64(SH-02M). - output_format: 出力形式.既定 "rgb_float32". - "rgb_float32": (H, W, 3) float32, linear, 値域 [0.0, 1.0](飽和は 1.0 でクリップしない) - "luma_float32": (H, W) float32, linear, 値域 [0.0, 1.0](Rec.709 重み) - "rgb_uint8": (H, W, 3) uint8, sRGB OETF 適用後(既存 PNG 経路と互換) - - Returns: - numpy.ndarray. 形状・型は output_format に依存. - - Raises: - FileNotFoundError: ファイルが存在しない場合. - ValueError: rawpy が DNG を読み込めなかった場合. - """ -``` - -#### 実装方針 - -- `rawpy.imread()` で 10-bit BGGR Bayer を読み込み -- 黒レベル除去(meta.json `sensorCharacteristics.black_level_pattern` から取得,未提供時は DNG Exif) -- デモザイク(`postprocess(demosaic_algorithm=...)` で実装) -- カラーマトリクス適用(DNG Exif `ColorMatrix1` を参照.無彩色シーンでは影響軽微だが選択肢として用意) -- 出力形式の変換 - -#### `output_format` の使い分け - -- `rgb_float32` / `luma_float32`: SmTIAS-LightSim のシミュ vs 実機比較に推奨(linear ドメインで突合) -- `rgb_uint8`: 既存 MiniTias-Evaluation パイプラインとの互換用(既存 `analysis/uniformity.py` 等が uint8 前提の場合に有用) - -### 2. メタデータ JSON 読み込み I/F - -新規モジュール `src/io/metadata_loader.py` を作成: - -```python -def load_metadata(path: str) -> dict: - """MiniTIAS 定量モード meta.json を読み込み辞書として返す. - - Args: - path: meta.json のパス. - - Returns: - 辞書.キー: settings / actual / sensorCharacteristics / lscMap / lscMapRowCount / - lscMapColumnCount / hardwareLevel 等. - 構造は TECH_03 のスキーマ準拠. - - Raises: - FileNotFoundError: ファイルが存在しない場合. - json.JSONDecodeError: JSON 形式が不正な場合. - """ - - -def load_lsc_map(path: str) -> numpy.ndarray: - """meta.json から LSC マップを (4, M, N) 配列として抽出する. - - Args: - path: meta.json のパス. - - Returns: - numpy.ndarray of shape (4, M, N), dtype=float32. - 4 = [R, G_even, G_odd, B], M = lscMapRowCount, N = lscMapColumnCount. - 値域: ≥ 1.0(無補正). - - Raises: - FileNotFoundError / KeyError / ValueError: 仕様外の場合. - """ - - -def load_hot_pixel_list(path: str) -> list[tuple[int, int]]: - """meta.json からホット画素リストを (col, row) のタプルリストとして抽出する. - - Args: - path: meta.json のパス. - - Returns: - ホット画素座標のリスト.MiniTias 側で取得実装後に有効化.未提供時は空リスト. - """ -``` - -### 3. Hot pixel マスク機能 - -メタデータから取得したホット画素を画像上でマスクする機能: - -```python -def mask_hot_pixels( - image: numpy.ndarray, - hot_pixels: list[tuple[int, int]], - method: str = "neighbor_mean", -) -> numpy.ndarray: - """ホット画素位置を周辺平均で置換する. - - Args: - image: 入力画像 (H, W) or (H, W, 3). - hot_pixels: ホット画素座標 (col, row) のリスト. - method: 置換方法."neighbor_mean"(周辺 3x3 平均)/ "zero"(0 で置換). - - Returns: - マスク済み画像.形状・型は入力と同じ. - """ -``` - -### 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_forward( - image: numpy.ndarray, - lsc_map: numpy.ndarray, -) -> numpy.ndarray: - """LSC マップを画像に順方向適用する(レンズビネット除去). - - DNG (RAW_SENSOR) は LSC 未補正なので,meta.json の lscMap を - 順方向適用してレンズビネット(端ほど暗い)を除去する.残った成分が - 照明そのもののムラ. - - Args: - image: DNG 読み込み後の linear 画像 (H, W) or (H, W, 3).未補正. - lsc_map: LSC ゲインマップ (4, M, N).値域 ≥ 1.0(無補正). - - Returns: - 順適用後の画像.image_corrected = image * interpolate(lsc_map, image.shape). - 中央付近はほぼ不変,周辺は明るく増幅されてレンズビネットが除去される. - """ -``` - -- LSC マップ (13×17) を画像解像度 (例 3264×2448) にバイリニア補間 -- 画素ごとに乗算で順方向適用 -- 本流の照明均一性評価で使用(実機 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 経路との並列対応(後方互換) - -既存 `load_image` は **無修正**で温存.新規 DNG 関数を並列追加する形: - -```python -# 既存(無修正) -load_image(path) -> RGB uint8 - -# 新規追加 -load_image_dng(path, ...) -> 設定可能形式 -``` - -ユーザー側で拡張子を見て呼び分ける,もしくは統一インターフェースを別途用意する(後述). - -#### 統一インターフェースの選択肢 - -```python -def load_image_any(path: str, **kwargs) -> numpy.ndarray: - """拡張子から自動判定して読み込む. - - .png → load_image (uint8 RGB) - .dng → load_image_dng (kwargs で形式指定) - """ - ext = Path(path).suffix.lower() - if ext == ".png": - return load_image(path) - elif ext == ".dng": - return load_image_dng(path, **kwargs) - else: - raise ValueError(f"未対応のフォーマット: {ext}") -``` - -これは MiniTias-Evaluation 側の判断で実装するかは任意.推奨は実装. - -### 6. 評価指標との互換 - -既存 `src/analysis/uniformity.py` 等の評価関数は **無修正**で DNG 入力に対応できるよう,DNG 読み込み I/F の出力を既存関数の入力仕様に合わせる: - -| 既存関数の入力仕様 | DNG 経路での対応 | -| --- | --- | -| RGB uint8 (H, W, 3) | `output_format="rgb_uint8"` で uint8 にスケール(10-bit → 8-bit + sRGB OETF 適用) | -| Luma uint8 (H, W) | 上記後に Rec.709 重みでスカラー化 | -| Float32 linear (H, W, 3) | `output_format="rgb_float32"` で直接出力 | - -→ 既存解析パイプラインの修正コストを最小化する設計. - -## データフォーマット詳細 (Data Format Details) - -### DNG (RAW_SENSOR) の値域 - -- 10-bit raw: 整数値 0〜1023 -- 黒レベル: 64(`SENSOR_BLACK_LEVEL_PATTERN` から取得) -- 黒レベル除去後: 0〜959 -- 飽和判定: 値 > 900 を要警告(飽和の影響) -- DNG Exif にカラーマトリクス `ColorMatrix1/2` 等が埋め込み済み(rawpy が自動で参照) - -### sRGB OETF の扱い - -- 定量モード DNG は **linear ドメイン**(TONEMAP_MODE = CONTRAST_CURVE 線形のため sRGB OETF 未適用) -- 既存通常モード PNG は sRGB OETF 適用済(端末の TONEMAP デフォルト) -- 評価時の OETF の扱いは **解析対象次第**: - - 形状指標(CoV / 勾配等): linear ドメインで算出が物理的に整合 - - 既存実機との互換比較: sRGB ドメインで算出(既存 MiniTias-Evaluation の挙動と一致) - -→ `output_format` パラメータでユーザーが選択可能にする.既定は `rgb_float32`(linear)を推奨. - -### デモザイクアルゴリズム - -`rawpy.imread().postprocess(demosaic_algorithm=...)` のパラメータ: - -| 値 | 速度 | 品質 | 用途 | -| --- | --- | --- | --- | -| `rawpy.DemosaicAlgorithm.LINEAR` | 速 | 中 | バイリニア.**既定推奨** | -| `rawpy.DemosaicAlgorithm.AHD` | 中 | 高 | 適応的.カラー画像で有利だが照明均一性評価には過剰 | -| `rawpy.DemosaicAlgorithm.DHT` | 中 | 高 | 高品質.処理重め | - -→ 既定は `LINEAR` で運用.`demosaic` 引数でユーザーが切り替え可能. - -## 推奨実装方針 (Recommended Implementation) - -### ディレクトリ構造(提案) - -MiniTias-Evaluation 既存構造に従い: - -```text -src/io/ -├── __init__.py -├── loader.py # 既存 PNG 読み込み(無修正) -├── dng_loader.py # 新規: DNG 読み込み -├── metadata_loader.py # 新規: meta.json 読み込み -└── unified_loader.py # 新規(任意): 統一 I/F load_image_any -``` - -### 追加依存パッケージ - -`pyproject.toml` の dependencies に: - -```toml -[project] -dependencies = [ - "rawpy>=0.21.0", # DNG 読み込み - # 既存依存はそのまま -] -``` - -または `requirements.txt` に: - -```text -rawpy>=0.21.0 -``` - -### 段階的実装(Phase 分割) - -| Phase | 内容 | 推定工数 | -| --- | --- | --- | -| Phase 1 | DNG 読み込み I/F (`dng_loader.py`) と単体テスト | 1 日 | -| Phase 2 | メタデータ JSON 読み込み I/F (`metadata_loader.py`) と単体テスト | 半日 | -| Phase 3 | LSC マップ参照・hot pixel マスク機能の実装 | 半日 | -| Phase 4 | 既存解析パイプラインとの統合・動作確認 | 半日 | -| Phase 5 | 既存 PNG / 新規 DNG の並列対応検証(V1〜V3) | 半日 | -| Phase 6 | ドキュメント更新(SPEC_01/SPEC_02 等) | 半日 | - -合計: 約 3.5 日.`/implement` パイプラインで Phase ごとに進める. - -## SmTIAS-LightSim 側へのコピー手順 (Copy to SmTIAS-LightSim) - -MiniTias-Evaluation での実装完了後,SmTIAS-LightSim 側 Claude セッションで以下を実施: - -1. **コピー対象ファイル**: - - `MiniTias-Evaluation/src/io/dng_loader.py` → `SmTIAS-LightSim/src/sm_tias_lightsim/evaluation/dng_loader.py` - - `MiniTias-Evaluation/src/io/metadata_loader.py` → `SmTIAS-LightSim/src/sm_tias_lightsim/evaluation/metadata.py` -2. **既存パターンに従う** (`uniformity.py` と同じ流れ) -3. **ファイル先頭にコピー元を明記**: - ```python - """DNG 読み込みモジュール. - - MiniTias-Evaluation/src/io/dng_loader.py を SmTIAS-LightSim にコピーしたもの. - オリジナルは MiniTias-Evaluation 側で管理する.バグ修正・機能追加はそちらで行い, - 本プロジェクトに反映する形を取る. - """ - ``` -4. **既存 sm-evaluate との統合**: 既存 `cli/evaluate.py` に DNG 入力経路を追加 -5. **テストを SmTIAS-LightSim 側でも実装**(MiniTias-Evaluation 側のテストをコピー+プロジェクト固有部分を追加) - -## 検証方法 (Verification) - -実装完了後,以下を実施して受け入れ判定とする: - -### V1. PNG vs DNG 整合性 - -- 同一シーン(白板)を MiniTias で **通常モード PNG** + **定量モード DNG** で連続撮影 -- 両方を MiniTias-Evaluation で評価 -- 評価指標(CoV / 勾配 / C/P 等)の差を確認 - - **完全一致は期待しない**(定量モードは ISP 介入最小化のため差が出るのが正常) - - **DNG 経路でも妥当な値が出る**ことを確認(CoV > 0, 勾配 > 0 等の基本検証) - -### V2. 既存 PNG 経路の回帰 - -- 既存通常モード PNG での評価指標が **変化しない**こと -- 既存テストが全合格すること - -### V3. メタデータ JSON 読み込み - -- `load_metadata` で `settings.exposure_time_ns` 等が正しく取得できる -- `load_lsc_map` で (4, 13, 17) の配列が返る -- `load_hot_pixel_list` で空リスト or リスト(MiniTias 側実装次第)が返る - -### V4. SmTIAS-LightSim 側へのコピー後検証 - -- コピー後の SmTIAS-LightSim 側で同じ DNG を読み込んで **同じ評価指標**が出ること -- SmTIAS-LightSim の既存テストが全合格 - -## 開放質問 (Open Questions) - -実装着手時に確認が必要な事項: - -| ID | 質問 | 確認方法 | -| --- | --- | --- | -| Q1 | rawpy のバージョン互換性は問題ないか | 環境で `pip install rawpy` → 実 DNG で動作確認 | -| Q2 | デモザイク手法の既定値は `LINEAR` で OK か | 数枚の DNG で AHD と比較して照明均一性指標がほぼ同じか確認 | -| Q3 | カラーマトリクス適用は無彩色シーンで影響軽微か | 既定 OFF(rawpy デフォルト)か ON(DNG Exif 参照)かを実機で比較 | -| Q4 | 既存 `analysis/uniformity.py` は uint8 / float32 のどちらを受けるか | コードを確認.既存仕様に合わせて `output_format` の既定を決める | -| Q5 | 統一 I/F `load_image_any` を実装するか | MiniTias-Evaluation 側判断.SmTIAS-LightSim 側では便利だが任意 | -| Q6 | LSC 逆適用機能は Phase 3 で実装するか後回しか | フォールバック条件 C1〜C3 未発動なので Phase 3 では雛形のみで OK | -| Q7 | 既存ドキュメント (SPEC_01/SPEC_02) の更新範囲 | DNG 経路追加に伴う仕様変更を反映.Phase 6 で対応 | - -## 引き継ぎ手順 (Hand-off Procedure) - -MiniTias-Evaluation 側 Claude セッションでの作業着手手順.[TECH_02 MiniTIAS 引き継ぎ手順](TECH_02_MiniTIAS引き継ぎ手順.md) と同様の構造. - -### Step A: 環境準備 - -- rawpy パッケージを追加(`pip install rawpy` または `pyproject.toml` 更新 + `uv sync` 等) -- サンプル DNG を取得(MiniTias 側で撮影済の `reference_measurement/quantitative/` から 1 枚) - -### Step B: Phase 1(DNG 読み込み)から順次実装 - -- `/implement TECH_05 Phase 1: DNG 読み込み I/F` で起動 -- coder → tester → refactorer → doc 更新の標準パイプライン -- Phase 1 完了後に動作確認 → Phase 2 へ - -### Step C: 完了の伝達方法 - -- MiniTias-Evaluation 側で `/implement` 完了後,SmTIAS-LightSim 側で確認できる形にする: - - MiniTias-Evaluation `src/io/dng_loader.py` の最終形をリポジトリ master にマージ - - rinto が SmTIAS-LightSim 側 Claude セッションを開いて「コピーしてほしい」と指示 - - SmTIAS-LightSim 側 Claude が MiniTias-Evaluation のローカルリポジトリから読み込んでコピー - -## 既存ドキュメントとの整合 (Cross-References) - -- [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) — 撮影モード側の要求書 -- [TECH_02 MiniTIAS 引き継ぎ手順](TECH_02_MiniTIAS引き継ぎ手順.md) — 引き継ぎパターンの参考 -- [TECH_03 定量モード実装報告と SHADING_MODE 相談](TECH_03_定量モード実装報告とSHADING_MODE相談.md) — MiniTias 側実装報告(meta.json スキーマ等) -- [TECH_04 MiniTIAS への回答](TECH_04_MiniTIASへの回答.md) — SHADING_MODE 判断とフェーズ A/B 分割 -- [TEST_01 キャリブレーション検証履歴](../06_TEST/TEST_01_キャリブレーション検証履歴.md) — 経緯 -- [TEST_03 輝度マップ形状追跡](../06_TEST/TEST_03_輝度マップ形状追跡.md) — 形のずれ議論 -- [SPEC_04 評価仕様](../04_SPEC/SPEC_04_評価仕様.md) — sm-evaluate パイプライン -- [Android Camera2 API DNG](https://developer.android.com/reference/android/hardware/camera2/DngCreator) -- [rawpy ドキュメント](https://letmaik.github.io/rawpy/api/) diff --git "a/docs/05_TECH/TECH_05_SmTIAS-Evaluation_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_SmTIAS-Evaluation_DNG\345\257\276\345\277\234\350\246\201\346\261\202\344\273\225\346\247\230.md" new file mode 100644 index 0000000..bbe8fe5 --- /dev/null +++ "b/docs/05_TECH/TECH_05_SmTIAS-Evaluation_DNG\345\257\276\345\277\234\350\246\201\346\261\202\344\273\225\346\247\230.md" @@ -0,0 +1,449 @@ +# SmTIAS-Evaluation DNG 対応要求仕様 (DNG Support Specification for SmTIAS-Evaluation) + +> **★ 2026-06-01 訂正履歴**: 本ドキュメントの §4 LSC マップ関連機能は,当初「DNG は LSC 補正済み → 逆適用」の前提で書かれていたが,SmTIAS-Evaluation 側の実装で「**DNG は LSC 未補正 → 順方向適用が正しい**」ことが判明したため訂正した.関連する誤解釈(過去の Step 8 キャリブにおけるシミュ vs 実機の残差解釈)の見直しは [TEST_05](../06_TEST/TEST_05_PNG_DNG評価比較.md) と [TECH_06](TECH_06_SmTIAS-Evaluation引き継ぎ受領.md) を参照. + +本ドキュメントは SmTIAS-LightSim プロジェクトから **SmTIAS-Evaluation** プロジェクトに対する **DNG 対応要求仕様** である.SmTIAS 側で実装された定量撮影モード([TECH_01](TECH_01_定量撮影モード要求仕様.md) / [TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md))の出力フォーマットが PNG から DNG (RAW_SENSOR) に変更されたことに伴い,SmTIAS-Evaluation 側にも DNG 読み込み・解析機能の追加を依頼する. + +## 想定読者 (Intended Reader) + +- **SmTIAS-Evaluation 側 Claude セッション**: 本ドキュメントを最初に読んで作業着手する +- **人間レビュー (rinto)**: 両セッションを橋渡しする + +## 概要 (Overview) + +SmTIAS-Evaluation([SmTIAS-Evaluation](https://github.com/rintoHasegawa/SmTIAS-Evaluation) リポジトリ)に以下の機能追加を要求する: + +1. **DNG 読み込み I/F** の新規実装(10-bit BGGR Bayer 展開) +2. **メタデータ JSON 読み込み I/F** の新規実装(撮影条件・LSC マップ・hot pixel リスト等) +3. **既存 PNG 経路と並列対応**(後方互換) +4. **既存評価指標との互換**(CoV / 勾配 / C/P / max-min 等が DNG 入力でも同じロジックで算出可能) + +これらの実装は **SmTIAS-LightSim 側にコピーされる前提**で,再利用性の高い設計とする. + +## 背景 (Background) + +### 三項プロジェクトの関係 + +```text +┌─────────────────────────┐ ┌──────────────────────────┐ +│ SmTIAS │ │ SmTIAS-Evaluation │ +│ (Flutter / Android) │ ──→ │ (Python) │ +│ 撮影アプリ │ │ 実機データ評価ツール │ +│ - PNG 保存(通常モード) │ │ - 評価指標算出 │ +│ - DNG 保存(定量モード) │ │ - 可視化 │ +└─────────────────────────┘ └──────────────────────────┘ + │ + │ コピー(uniformity.py 等) + ▼ + ┌──────────────────────────┐ + │ SmTIAS-LightSim │ + │ (Python / Mitsuba 3) │ + │ シミュ vs 実機比較 │ + └──────────────────────────┘ +``` + +### 経緯のまとめ + +- 2026-05-28: SmTIAS-LightSim 側 Step 8 キャリブで「実機 PNG 自体が定量データとして揺らぐ」を発見 ([TEST_01](../06_TEST/TEST_01_キャリブレーション検証履歴.md)) +- 2026-05-28: SmTIAS 側に [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) を発行 +- 2026-06-01: SmTIAS 側で実装完了.AQUOS sense3 (SH-02M) が LEVEL_3 で DNG 経路採用 ([TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md)) +- 2026-06-01: SHADING_MODE = HIGH_QUALITY を本流維持で合意 ([TECH_04](TECH_04_SmTIASへの回答.md)) +- **本ドキュメント (2026-06-01)**: SmTIAS-Evaluation 側にも DNG 対応を依頼 + +### SmTIAS-Evaluation の現状 + +SmTIAS-Evaluation の I/O は現状 PNG 専用: + +```python +# 既存 I/F (src/io/loader.py) +def load_image(path: str) -> numpy.ndarray: + """PNG 画像を読み込み RGB 配列として返す(H x W x 3, uint8).""" +``` + +→ DNG 経路の追加が必要. + +## 役割分担 (Role Distribution) + +DNG 読み込みの責務は **SmTIAS-Evaluation を一次窓口**とする.既存パターン(`uniformity.py` が SmTIAS-Evaluation から SmTIAS-LightSim にコピー)を踏襲する: + +| プロジェクト | 責務 | +| --- | --- | +| **SmTIAS** | DNG + meta.json の保存(実装済) | +| **SmTIAS-Evaluation(一次窓口)** | DNG/meta.json の読み込み I/F を正規実装.既存評価指標との並列対応 | +| **SmTIAS-LightSim(コピー側)** | SmTIAS-Evaluation の DNG 読み込み I/F をコピー(`uniformity.py` パターン継承) | + +→ SmTIAS-Evaluation の実装完了後,SmTIAS-LightSim 側 Claude セッションでコピー作業を実施する. + +## 要求仕様 (Requirements) + +### 1. DNG 読み込み I/F + +新規モジュール `src/io/dng_loader.py` を作成: + +```python +def load_image_dng( + path: str, + demosaic: str = "bilinear", + black_level: int | None = None, + output_format: str = "rgb_float32", +) -> numpy.ndarray: + """SmTIAS 定量モード DNG を読み込み配列として返す. + + Args: + path: DNG ファイルのパス. + demosaic: デモザイクアルゴリズム.既定 "bilinear". + "nearest"(最近傍)/ "bilinear"(双線形)/ "ahd"(適応的)から選択. + black_level: 黒レベル.None なら meta.json から自動取得 or DNG Exif から取得. + 通常は 64(SH-02M). + output_format: 出力形式.既定 "rgb_float32". + "rgb_float32": (H, W, 3) float32, linear, 値域 [0.0, 1.0](飽和は 1.0 でクリップしない) + "luma_float32": (H, W) float32, linear, 値域 [0.0, 1.0](Rec.709 重み) + "rgb_uint8": (H, W, 3) uint8, sRGB OETF 適用後(既存 PNG 経路と互換) + + Returns: + numpy.ndarray. 形状・型は output_format に依存. + + Raises: + FileNotFoundError: ファイルが存在しない場合. + ValueError: rawpy が DNG を読み込めなかった場合. + """ +``` + +#### 実装方針 + +- `rawpy.imread()` で 10-bit BGGR Bayer を読み込み +- 黒レベル除去(meta.json `sensorCharacteristics.black_level_pattern` から取得,未提供時は DNG Exif) +- デモザイク(`postprocess(demosaic_algorithm=...)` で実装) +- カラーマトリクス適用(DNG Exif `ColorMatrix1` を参照.無彩色シーンでは影響軽微だが選択肢として用意) +- 出力形式の変換 + +#### `output_format` の使い分け + +- `rgb_float32` / `luma_float32`: SmTIAS-LightSim のシミュ vs 実機比較に推奨(linear ドメインで突合) +- `rgb_uint8`: 既存 SmTIAS-Evaluation パイプラインとの互換用(既存 `analysis/uniformity.py` 等が uint8 前提の場合に有用) + +### 2. メタデータ JSON 読み込み I/F + +新規モジュール `src/io/metadata_loader.py` を作成: + +```python +def load_metadata(path: str) -> dict: + """SmTIAS 定量モード meta.json を読み込み辞書として返す. + + Args: + path: meta.json のパス. + + Returns: + 辞書.キー: settings / actual / sensorCharacteristics / lscMap / lscMapRowCount / + lscMapColumnCount / hardwareLevel 等. + 構造は TECH_03 のスキーマ準拠. + + Raises: + FileNotFoundError: ファイルが存在しない場合. + json.JSONDecodeError: JSON 形式が不正な場合. + """ + + +def load_lsc_map(path: str) -> numpy.ndarray: + """meta.json から LSC マップを (4, M, N) 配列として抽出する. + + Args: + path: meta.json のパス. + + Returns: + numpy.ndarray of shape (4, M, N), dtype=float32. + 4 = [R, G_even, G_odd, B], M = lscMapRowCount, N = lscMapColumnCount. + 値域: ≥ 1.0(無補正). + + Raises: + FileNotFoundError / KeyError / ValueError: 仕様外の場合. + """ + + +def load_hot_pixel_list(path: str) -> list[tuple[int, int]]: + """meta.json からホット画素リストを (col, row) のタプルリストとして抽出する. + + Args: + path: meta.json のパス. + + Returns: + ホット画素座標のリスト.SmTIAS 側で取得実装後に有効化.未提供時は空リスト. + """ +``` + +### 3. Hot pixel マスク機能 + +メタデータから取得したホット画素を画像上でマスクする機能: + +```python +def mask_hot_pixels( + image: numpy.ndarray, + hot_pixels: list[tuple[int, int]], + method: str = "neighbor_mean", +) -> numpy.ndarray: + """ホット画素位置を周辺平均で置換する. + + Args: + image: 入力画像 (H, W) or (H, W, 3). + hot_pixels: ホット画素座標 (col, row) のリスト. + method: 置換方法."neighbor_mean"(周辺 3x3 平均)/ "zero"(0 で置換). + + Returns: + マスク済み画像.形状・型は入力と同じ. + """ +``` + +### 4. LSC マップ順方向適用機能(★ 必須・本流処理) + +> **★ 2026-06-01 訂正**: 本節は当初「LSC 逆適用機能 (`apply_lsc_inverse`)」として「DNG は LSC 補正済 → 逆適用で raw に戻す」前提で書かれていたが,SmTIAS-Evaluation 側の実装検証で **その前提が誤りであった**ことが判明した([TECH_06 §2.1](TECH_06_SmTIAS-Evaluation引き継ぎ受領.md#21--dng-は-lsc-未補正--apply_lsc_inverse-は誤り)).実態は逆で,**RAW_SENSOR DNG は LSC 未補正**(rawpy も LSC を自動適用しない).照明ムラを評価するには **lscMap を順方向に適用**してレンズビネット(cos⁴ 由来の周辺暗)を除去する必要がある.本訂正により本節は「本流処理」として位置付けが変わった. + +```python +def apply_lsc_forward( + image: numpy.ndarray, + lsc_map: numpy.ndarray, +) -> numpy.ndarray: + """LSC マップを画像に順方向適用する(レンズビネット除去). + + DNG (RAW_SENSOR) は LSC 未補正なので,meta.json の lscMap を + 順方向適用してレンズビネット(端ほど暗い)を除去する.残った成分が + 照明そのもののムラ. + + Args: + image: DNG 読み込み後の linear 画像 (H, W) or (H, W, 3).未補正. + lsc_map: LSC ゲインマップ (4, M, N).値域 ≥ 1.0(無補正). + + Returns: + 順適用後の画像.image_corrected = image * interpolate(lsc_map, image.shape). + 中央付近はほぼ不変,周辺は明るく増幅されてレンズビネットが除去される. + """ +``` + +- LSC マップ (13×17) を画像解像度 (例 3264×2448) にバイリニア補間 +- 画素ごとに乗算で順方向適用 +- 本流の照明均一性評価で使用(実機 DNG → linear → LSC 順適用 → ROI 抽出 → 指標算出) +- 補正前後の評価指標差は劇的([TEST_05 §2 結果比較](../06_TEST/TEST_05_PNG_DNG評価比較.md) 参照): CoV 0.1477 → 0.0689, 勾配 31.3% → 8.69% +- 既存実装の参考は SmTIAS-Evaluation の `scripts/run_uniformity_dng.py`(プロトタイプ実装) + +#### SHADING_MODE = OFF との関係(補足) + +将来のフォールバック条件 C1〜C3([TECH_04](TECH_04_SmTIASへの回答.md#将来-shading_off-切替のフォールバック条件))が発動して `SHADING_MODE = OFF` 撮影を試す場合,OFF 撮影は **そもそも LSC 未補正のセンサ生**を出す.現状の `SHADING_MODE = HIGH_QUALITY` 撮影でも DNG は LSC 未補正なので,両者の差は ISP の他の処理(noise reduction の有無等)が主で,LSC 補正残差の議論は本訂正により再構成が必要.LSC 補正は **後段の sm-evaluate 側で順方向適用する**ことに統一する. + +### 5. 既存 PNG 経路との並列対応(後方互換) + +既存 `load_image` は **無修正**で温存.新規 DNG 関数を並列追加する形: + +```python +# 既存(無修正) +load_image(path) -> RGB uint8 + +# 新規追加 +load_image_dng(path, ...) -> 設定可能形式 +``` + +ユーザー側で拡張子を見て呼び分ける,もしくは統一インターフェースを別途用意する(後述). + +#### 統一インターフェースの選択肢 + +```python +def load_image_any(path: str, **kwargs) -> numpy.ndarray: + """拡張子から自動判定して読み込む. + + .png → load_image (uint8 RGB) + .dng → load_image_dng (kwargs で形式指定) + """ + ext = Path(path).suffix.lower() + if ext == ".png": + return load_image(path) + elif ext == ".dng": + return load_image_dng(path, **kwargs) + else: + raise ValueError(f"未対応のフォーマット: {ext}") +``` + +これは SmTIAS-Evaluation 側の判断で実装するかは任意.推奨は実装. + +### 6. 評価指標との互換 + +既存 `src/analysis/uniformity.py` 等の評価関数は **無修正**で DNG 入力に対応できるよう,DNG 読み込み I/F の出力を既存関数の入力仕様に合わせる: + +| 既存関数の入力仕様 | DNG 経路での対応 | +| --- | --- | +| RGB uint8 (H, W, 3) | `output_format="rgb_uint8"` で uint8 にスケール(10-bit → 8-bit + sRGB OETF 適用) | +| Luma uint8 (H, W) | 上記後に Rec.709 重みでスカラー化 | +| Float32 linear (H, W, 3) | `output_format="rgb_float32"` で直接出力 | + +→ 既存解析パイプラインの修正コストを最小化する設計. + +## データフォーマット詳細 (Data Format Details) + +### DNG (RAW_SENSOR) の値域 + +- 10-bit raw: 整数値 0〜1023 +- 黒レベル: 64(`SENSOR_BLACK_LEVEL_PATTERN` から取得) +- 黒レベル除去後: 0〜959 +- 飽和判定: 値 > 900 を要警告(飽和の影響) +- DNG Exif にカラーマトリクス `ColorMatrix1/2` 等が埋め込み済み(rawpy が自動で参照) + +### sRGB OETF の扱い + +- 定量モード DNG は **linear ドメイン**(TONEMAP_MODE = CONTRAST_CURVE 線形のため sRGB OETF 未適用) +- 既存通常モード PNG は sRGB OETF 適用済(端末の TONEMAP デフォルト) +- 評価時の OETF の扱いは **解析対象次第**: + - 形状指標(CoV / 勾配等): linear ドメインで算出が物理的に整合 + - 既存実機との互換比較: sRGB ドメインで算出(既存 SmTIAS-Evaluation の挙動と一致) + +→ `output_format` パラメータでユーザーが選択可能にする.既定は `rgb_float32`(linear)を推奨. + +### デモザイクアルゴリズム + +`rawpy.imread().postprocess(demosaic_algorithm=...)` のパラメータ: + +| 値 | 速度 | 品質 | 用途 | +| --- | --- | --- | --- | +| `rawpy.DemosaicAlgorithm.LINEAR` | 速 | 中 | バイリニア.**既定推奨** | +| `rawpy.DemosaicAlgorithm.AHD` | 中 | 高 | 適応的.カラー画像で有利だが照明均一性評価には過剰 | +| `rawpy.DemosaicAlgorithm.DHT` | 中 | 高 | 高品質.処理重め | + +→ 既定は `LINEAR` で運用.`demosaic` 引数でユーザーが切り替え可能. + +## 推奨実装方針 (Recommended Implementation) + +### ディレクトリ構造(提案) + +SmTIAS-Evaluation 既存構造に従い: + +```text +src/io/ +├── __init__.py +├── loader.py # 既存 PNG 読み込み(無修正) +├── dng_loader.py # 新規: DNG 読み込み +├── metadata_loader.py # 新規: meta.json 読み込み +└── unified_loader.py # 新規(任意): 統一 I/F load_image_any +``` + +### 追加依存パッケージ + +`pyproject.toml` の dependencies に: + +```toml +[project] +dependencies = [ + "rawpy>=0.21.0", # DNG 読み込み + # 既存依存はそのまま +] +``` + +または `requirements.txt` に: + +```text +rawpy>=0.21.0 +``` + +### 段階的実装(Phase 分割) + +| Phase | 内容 | 推定工数 | +| --- | --- | --- | +| Phase 1 | DNG 読み込み I/F (`dng_loader.py`) と単体テスト | 1 日 | +| Phase 2 | メタデータ JSON 読み込み I/F (`metadata_loader.py`) と単体テスト | 半日 | +| Phase 3 | LSC マップ参照・hot pixel マスク機能の実装 | 半日 | +| Phase 4 | 既存解析パイプラインとの統合・動作確認 | 半日 | +| Phase 5 | 既存 PNG / 新規 DNG の並列対応検証(V1〜V3) | 半日 | +| Phase 6 | ドキュメント更新(SPEC_01/SPEC_02 等) | 半日 | + +合計: 約 3.5 日.`/implement` パイプラインで Phase ごとに進める. + +## SmTIAS-LightSim 側へのコピー手順 (Copy to SmTIAS-LightSim) + +SmTIAS-Evaluation での実装完了後,SmTIAS-LightSim 側 Claude セッションで以下を実施: + +1. **コピー対象ファイル**: + - `SmTIAS-Evaluation/src/io/dng_loader.py` → `SmTIAS-LightSim/src/sm_tias_lightsim/evaluation/dng_loader.py` + - `SmTIAS-Evaluation/src/io/metadata_loader.py` → `SmTIAS-LightSim/src/sm_tias_lightsim/evaluation/metadata.py` +2. **既存パターンに従う** (`uniformity.py` と同じ流れ) +3. **ファイル先頭にコピー元を明記**: + ```python + """DNG 読み込みモジュール. + + SmTIAS-Evaluation/src/io/dng_loader.py を SmTIAS-LightSim にコピーしたもの. + オリジナルは SmTIAS-Evaluation 側で管理する.バグ修正・機能追加はそちらで行い, + 本プロジェクトに反映する形を取る. + """ + ``` +4. **既存 sm-evaluate との統合**: 既存 `cli/evaluate.py` に DNG 入力経路を追加 +5. **テストを SmTIAS-LightSim 側でも実装**(SmTIAS-Evaluation 側のテストをコピー+プロジェクト固有部分を追加) + +## 検証方法 (Verification) + +実装完了後,以下を実施して受け入れ判定とする: + +### V1. PNG vs DNG 整合性 + +- 同一シーン(白板)を SmTIAS で **通常モード PNG** + **定量モード DNG** で連続撮影 +- 両方を SmTIAS-Evaluation で評価 +- 評価指標(CoV / 勾配 / C/P 等)の差を確認 + - **完全一致は期待しない**(定量モードは ISP 介入最小化のため差が出るのが正常) + - **DNG 経路でも妥当な値が出る**ことを確認(CoV > 0, 勾配 > 0 等の基本検証) + +### V2. 既存 PNG 経路の回帰 + +- 既存通常モード PNG での評価指標が **変化しない**こと +- 既存テストが全合格すること + +### V3. メタデータ JSON 読み込み + +- `load_metadata` で `settings.exposure_time_ns` 等が正しく取得できる +- `load_lsc_map` で (4, 13, 17) の配列が返る +- `load_hot_pixel_list` で空リスト or リスト(SmTIAS 側実装次第)が返る + +### V4. SmTIAS-LightSim 側へのコピー後検証 + +- コピー後の SmTIAS-LightSim 側で同じ DNG を読み込んで **同じ評価指標**が出ること +- SmTIAS-LightSim の既存テストが全合格 + +## 開放質問 (Open Questions) + +実装着手時に確認が必要な事項: + +| ID | 質問 | 確認方法 | +| --- | --- | --- | +| Q1 | rawpy のバージョン互換性は問題ないか | 環境で `pip install rawpy` → 実 DNG で動作確認 | +| Q2 | デモザイク手法の既定値は `LINEAR` で OK か | 数枚の DNG で AHD と比較して照明均一性指標がほぼ同じか確認 | +| Q3 | カラーマトリクス適用は無彩色シーンで影響軽微か | 既定 OFF(rawpy デフォルト)か ON(DNG Exif 参照)かを実機で比較 | +| Q4 | 既存 `analysis/uniformity.py` は uint8 / float32 のどちらを受けるか | コードを確認.既存仕様に合わせて `output_format` の既定を決める | +| Q5 | 統一 I/F `load_image_any` を実装するか | SmTIAS-Evaluation 側判断.SmTIAS-LightSim 側では便利だが任意 | +| Q6 | LSC 逆適用機能は Phase 3 で実装するか後回しか | フォールバック条件 C1〜C3 未発動なので Phase 3 では雛形のみで OK | +| Q7 | 既存ドキュメント (SPEC_01/SPEC_02) の更新範囲 | DNG 経路追加に伴う仕様変更を反映.Phase 6 で対応 | + +## 引き継ぎ手順 (Hand-off Procedure) + +SmTIAS-Evaluation 側 Claude セッションでの作業着手手順.[TECH_02 SmTIAS 引き継ぎ手順](TECH_02_SmTIAS引き継ぎ手順.md) と同様の構造. + +### Step A: 環境準備 + +- rawpy パッケージを追加(`pip install rawpy` または `pyproject.toml` 更新 + `uv sync` 等) +- サンプル DNG を取得(SmTIAS 側で撮影済の `reference_measurement/quantitative/` から 1 枚) + +### Step B: Phase 1(DNG 読み込み)から順次実装 + +- `/implement TECH_05 Phase 1: DNG 読み込み I/F` で起動 +- coder → tester → refactorer → doc 更新の標準パイプライン +- Phase 1 完了後に動作確認 → Phase 2 へ + +### Step C: 完了の伝達方法 + +- SmTIAS-Evaluation 側で `/implement` 完了後,SmTIAS-LightSim 側で確認できる形にする: + - SmTIAS-Evaluation `src/io/dng_loader.py` の最終形をリポジトリ master にマージ + - rinto が SmTIAS-LightSim 側 Claude セッションを開いて「コピーしてほしい」と指示 + - SmTIAS-LightSim 側 Claude が SmTIAS-Evaluation のローカルリポジトリから読み込んでコピー + +## 既存ドキュメントとの整合 (Cross-References) + +- [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) — 撮影モード側の要求書 +- [TECH_02 SmTIAS 引き継ぎ手順](TECH_02_SmTIAS引き継ぎ手順.md) — 引き継ぎパターンの参考 +- [TECH_03 定量モード実装報告と SHADING_MODE 相談](TECH_03_定量モード実装報告とSHADING_MODE相談.md) — SmTIAS 側実装報告(meta.json スキーマ等) +- [TECH_04 SmTIAS への回答](TECH_04_SmTIASへの回答.md) — SHADING_MODE 判断とフェーズ A/B 分割 +- [TEST_01 キャリブレーション検証履歴](../06_TEST/TEST_01_キャリブレーション検証履歴.md) — 経緯 +- [TEST_03 輝度マップ形状追跡](../06_TEST/TEST_03_輝度マップ形状追跡.md) — 形のずれ議論 +- [SPEC_04 評価仕様](../04_SPEC/SPEC_04_評価仕様.md) — sm-evaluate パイプライン +- [Android Camera2 API DNG](https://developer.android.com/reference/android/hardware/camera2/DngCreator) +- [rawpy ドキュメント](https://letmaik.github.io/rawpy/api/) 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" deleted file mode 100644 index 7afef99..0000000 --- "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" +++ /dev/null @@ -1,165 +0,0 @@ -# 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/05_TECH/TECH_06_SmTIAS-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_SmTIAS-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..f424af2 --- /dev/null +++ "b/docs/05_TECH/TECH_06_SmTIAS-Evaluation\345\274\225\343\201\215\347\266\231\343\201\216\345\217\227\351\240\230.md" @@ -0,0 +1,165 @@ +# SmTIAS-Evaluation 引き継ぎ受領 (Receiving Hand-off from SmTIAS-Evaluation) + +本ドキュメントは SmTIAS-Evaluation 側で [TECH_05 DNG 対応要求仕様](TECH_05_SmTIAS-Evaluation_DNG対応要求仕様.md) の Phase 1(DNG 読み込み I/F)が完了したことの受領記録であり,併せて SmTIAS-Evaluation 側から共有された **重要な設計判断・指摘事項** をまとめたものである. + +## 想定読者 (Intended Reader) + +- **SmTIAS-LightSim 側 Claude セッション**: 本ドキュメントを読んで取り込み作業を行う +- **人間レビュー (rinto)**: 受領内容と判断の妥当性を確認する + +## 受領元と日付 (Source) + +- **元プロジェクト**: SmTIAS-Evaluation(`C:\Users\user\source\SmTIAS-Evaluation\`) +- **受領日**: 2026-06-01 +- **元ハンドオフパッケージ**: `handoff_smtias_lightsim/`(一時アーティファクト,取り込み完了後に削除) + +## 1. 実装スコープ — 完了状況 (What is done / not done) + +[TECH_05](TECH_05_SmTIAS-Evaluation_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_SmTIAS-Evaluation_DNG対応要求仕様.md) の記述と食い違う点を含む**.取り込み時に必ず反映すること. + +### 2.1 ★★★ DNG は LSC 未補正 — `apply_lsc_inverse` は誤り + +| 項目 | TECH_05 当初の前提(誤り) | 実態(SmTIAS-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) + +| コピー元(SmTIAS-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_SmTIAS-Evaluation_DNG対応要求仕様.md#smtias-lightsim-側へのコピー手順-copy-to-smtias-lightsim) の指定通り: + +```python +"""DNG 読み込みモジュール. + +SmTIAS-Evaluation/src/io/dng_loader.py を SmTIAS-LightSim にコピーしたもの. +オリジナルは SmTIAS-Evaluation 側で管理する.バグ修正・機能追加はそちらで行い, +本プロジェクトに反映する形を取る. +""" +``` + +### `spatial.py` のマージ方針 + +SmTIAS-LightSim 側の既存均一性コード(`evaluation/zones.py` の `calc_zone_stats` 等)と競合する関数が含まれるため,**丸ごとコピーせず `calc_radial_min_max_ratio` のみマージ**する. + +## 4. 引き渡された評価結果(暗闇=SmTIAS のみ撮影) + +代表結果は **外乱光に汚染されていない「SmTIAS の照明のみ」の撮影**(`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_SmTIAS-Evaluation_DNG対応要求仕様.md) の `apply_lsc_inverse` を `apply_lsc_forward` に訂正 +- CLAUDE.md / TEST_01 / TEST_03 に方針更新を追記 + +### S2: コード取り込み(次セッション・`/implement`) + +- `src/sm_tias_lightsim/evaluation/dng_loader.py` 新規作成(SmTIAS-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 SmTIAS-Evaluation DNG 対応要求仕様](TECH_05_SmTIAS-Evaluation_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/05_TECH/TECH_07_LSC\345\217\226\343\202\212\346\211\261\343\201\204\346\226\271\351\207\235.md" "b/docs/05_TECH/TECH_07_LSC\345\217\226\343\202\212\346\211\261\343\201\204\346\226\271\351\207\235.md" index 5756624..5c0b990 100644 --- "a/docs/05_TECH/TECH_07_LSC\345\217\226\343\202\212\346\211\261\343\201\204\346\226\271\351\207\235.md" +++ "b/docs/05_TECH/TECH_07_LSC\345\217\226\343\202\212\346\211\261\343\201\204\346\226\271\351\207\235.md" @@ -1,6 +1,6 @@ # LSC 取り扱い方針 (Lens Shading Correction Handling Policy) -本ドキュメントは 3 プロジェクト(MiniTias / MiniTias-Evaluation / SmTIAS-LightSim)における **LSC (Lens Shading Correction) の取り扱い** に関する設計判断と物理的根拠を明文化したものである.過去 [TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md)〜[TECH_06](TECH_06_MiniTias-Evaluation引き継ぎ受領.md) / [TEST_05](../06_TEST/TEST_05_PNG_DNG評価比較.md) / [TEST_06](../06_TEST/TEST_06_外乱光影響評価.md) で散在していた議論の **結論をここに集約**し,将来の参照を容易にする. +本ドキュメントは 3 プロジェクト(SmTIAS / SmTIAS-Evaluation / SmTIAS-LightSim)における **LSC (Lens Shading Correction) の取り扱い** に関する設計判断と物理的根拠を明文化したものである.過去 [TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md)〜[TECH_06](TECH_06_SmTIAS-Evaluation引き継ぎ受領.md) / [TEST_05](../06_TEST/TEST_05_PNG_DNG評価比較.md) / [TEST_06](../06_TEST/TEST_06_外乱光影響評価.md) で散在していた議論の **結論をここに集約**し,将来の参照を容易にする. ## 結論(先に) (Conclusion First) @@ -8,8 +8,8 @@ | プロジェクト | LSC の扱い | 採用理由 | | --- | --- | --- | -| **MiniTias**(撮影アプリ) | `SHADING_MODE=HIGH_QUALITY` で撮影.`STATISTICS_LENS_SHADING_MAP_MODE=ON` で `lscMap` を meta.json に保存.DNG 自体は LSC 未補正 (RAW_SENSOR) | TECH_04 で本流維持と決定.SHADING_OFF はフォールバック候補として温存 | -| **MiniTias-Evaluation**(実機評価) | DNG 読み込み後に **lscMap を順方向適用** (`image × interp(lscMap)`) してレンズビネット除去.残った成分を照明ムラとして評価 | TEST_05 で「LSC 補正なし CoV=0.148 → あり CoV=0.069」と実証 | +| **SmTIAS**(撮影アプリ) | `SHADING_MODE=HIGH_QUALITY` で撮影.`STATISTICS_LENS_SHADING_MAP_MODE=ON` で `lscMap` を meta.json に保存.DNG 自体は LSC 未補正 (RAW_SENSOR) | TECH_04 で本流維持と決定.SHADING_OFF はフォールバック候補として温存 | +| **SmTIAS-Evaluation**(実機評価) | DNG 読み込み後に **lscMap を順方向適用** (`image × interp(lscMap)`) してレンズビネット除去.残った成分を照明ムラとして評価 | TEST_05 で「LSC 補正なし CoV=0.148 → あり CoV=0.069」と実証 | | **SmTIAS-LightSim**(シミュ) | **一切扱わない**.Mitsuba orthographic sensor が「LSC を完璧に補正できた場合の理想値」と本質的に等価のため | TECH_04 §SHADING_MODE 判断 / 本ドキュメント §物理的根拠 | ### 一言で言うと @@ -24,10 +24,10 @@ | --- | --- | --- | | Step 8-3 (2026-05) | sRGB OETF を sm-evaluate に追加 → 残差 4.3× → 2.1× | OETF が「見かけ差の 2/3」を占めていたと判明 | | Step 8-12 (2026-05) | Helmholtz 相反原理で「方向独立性」検証 | 形は方向独立.残差は方向では解消しない | -| TECH_03 (2026-06) | MiniTias 側で定量モード DNG 実装.SHADING_MODE 相談 | SHADING_MODE = HIGH_QUALITY を本流維持 (TECH_04) | +| TECH_03 (2026-06) | SmTIAS 側で定量モード DNG 実装.SHADING_MODE 相談 | SHADING_MODE = HIGH_QUALITY を本流維持 (TECH_04) | | TECH_04 (2026-06) | Mitsuba orthographic の物理的意味を整理 | orthographic ≒「LSC 完璧補正後相当」を確定 | -| TECH_05 (2026-06) | MiniTias-Evaluation 側に DNG 対応依頼 | `apply_lsc_inverse` (誤り) を仕様化 | -| TECH_06 (2026-06) | MiniTias-Evaluation 側で実装完了 | **DNG は LSC 未補正**と判明.TECH_05 を `apply_lsc_forward` に訂正 | +| TECH_05 (2026-06) | SmTIAS-Evaluation 側に DNG 対応依頼 | `apply_lsc_inverse` (誤り) を仕様化 | +| TECH_06 (2026-06) | SmTIAS-Evaluation 側で実装完了 | **DNG は LSC 未補正**と判明.TECH_05 を `apply_lsc_forward` に訂正 | | TEST_05 (2026-06) | PNG/DNG ドメイン比較 | LSC 補正なし CoV=0.148 → あり CoV=0.069.LSC の効果が数値で実証 | | **本ドキュメント (2026-06-02)** | **LSC 取り扱いの結論を一元化** | — | @@ -43,7 +43,7 @@ ↓ レンズ通過時に物理 cos⁴ falloff センサ raw (cos⁴ 残ったまま) ↓ DNG (RAW_SENSOR) として保存 - ↓ ★ MiniTias-Evaluation 側で lscMap を順方向適用 + ↓ ★ SmTIAS-Evaluation 側で lscMap を順方向適用 = 理論上「cos⁴ を打ち消した = 評価板表面の放射輝度 L 相当」 ↓ Rec.709 luma 抽出 + 白板 ROI 評価指標 (CoV / 勾配 / 中心/周辺 / 動径 min/max) @@ -77,7 +77,7 @@ **却下理由**: -- 実機側で LSC 順方向適用するアプローチが MiniTias-Evaluation で確立した(TEST_05)→ シミュ側にモデルを追加する必要が消失 +- 実機側で LSC 順方向適用するアプローチが SmTIAS-Evaluation で確立した(TEST_05)→ シミュ側にモデルを追加する必要が消失 - シミュ側に自由度パラメータ(cos^n の n や多項式係数)を追加すると **overfitting リスク**が増す - 過去 [TEST_03 finding 4](../06_TEST/TEST_03_輝度マップ形状追跡.md) の「形を変える唯一の道は LSC モデル化」は **当時の前提(実機側を改善しない)下での結論**であり,実機側改善で同じ目的を達成した今は無効 @@ -120,7 +120,7 @@ 実機 ISP の lscMap は「**メーカー出荷時にキャリブされた標準補正値**」であり,個体差・経時変化・撮影条件(色温度等)による補正残差が残る.これは: -- SHADING_OFF 撮影で生 raw を取得 → 物理 cos⁴ パターンと比較すれば定量化可能(**フォールバック条件 C1〜C3 で実施**,[TECH_04](TECH_04_MiniTIASへの回答.md)) +- SHADING_OFF 撮影で生 raw を取得 → 物理 cos⁴ パターンと比較すれば定量化可能(**フォールバック条件 C1〜C3 で実施**,[TECH_04](TECH_04_SmTIASへの回答.md)) - 現状(フォールバック未発動)では「補正残差は実機側に残るが小さい」と仮定して進めている ### 2. SmTIAS-LightSim 側の「実機との一致度」は別問題 @@ -143,7 +143,7 @@ ## フォールバック条件(再掲) (Fallback Conditions) -[TECH_04 §将来 SHADING_OFF 切替のフォールバック条件](TECH_04_MiniTIASへの回答.md) で定義した条件: +[TECH_04 §将来 SHADING_OFF 切替のフォールバック条件](TECH_04_SmTIASへの回答.md) で定義した条件: | ID | 発動条件 | 対応 | | --- | --- | --- | @@ -165,7 +165,7 @@ ### 中期(残差 2.63× の解消が必要なら) - **物理モデル精緻化**: 反射率 / LED 配光 / メッシュ幾何の各要素を 1 つずつ詰める -- **SHADING_OFF 撮影**: フォールバック条件 C1 発動として実施.MiniTias 側で 1 ショット撮影 → 物理 cos⁴ パターンと lscMap の合致度を独立検証 +- **SHADING_OFF 撮影**: フォールバック条件 C1 発動として実施.SmTIAS 側で 1 ショット撮影 → 物理 cos⁴ パターンと lscMap の合致度を独立検証 ### 中長期 @@ -176,12 +176,12 @@ ### TECH 系(設計判断) -- [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) — MiniTias への撮影モード要求 -- [TECH_02 MiniTIAS 引き継ぎ手順](TECH_02_MiniTIAS引き継ぎ手順.md) — 引き継ぎパッケージの構造 -- [TECH_03 定量モード実装報告と SHADING_MODE 相談](TECH_03_定量モード実装報告とSHADING_MODE相談.md) — MiniTias 側からの SHADING_MODE 相談 -- [TECH_04 MiniTIAS への回答](TECH_04_MiniTIASへの回答.md) — SHADING_MODE = HIGH_QUALITY 維持判断とフェーズ A/B 分割 -- [TECH_05 MiniTias-Evaluation DNG 対応要求仕様](TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md) — Evaluation 側への DNG 対応要求(§4 訂正済) -- [TECH_06 MiniTias-Evaluation 引き継ぎ受領](TECH_06_MiniTias-Evaluation引き継ぎ受領.md) — DNG ローダ受領.LSC 順方向適用が正しいと判明した経緯 +- [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) — SmTIAS への撮影モード要求 +- [TECH_02 SmTIAS 引き継ぎ手順](TECH_02_SmTIAS引き継ぎ手順.md) — 引き継ぎパッケージの構造 +- [TECH_03 定量モード実装報告と SHADING_MODE 相談](TECH_03_定量モード実装報告とSHADING_MODE相談.md) — SmTIAS 側からの SHADING_MODE 相談 +- [TECH_04 SmTIAS への回答](TECH_04_SmTIASへの回答.md) — SHADING_MODE = HIGH_QUALITY 維持判断とフェーズ A/B 分割 +- [TECH_05 SmTIAS-Evaluation DNG 対応要求仕様](TECH_05_SmTIAS-Evaluation_DNG対応要求仕様.md) — Evaluation 側への DNG 対応要求(§4 訂正済) +- [TECH_06 SmTIAS-Evaluation 引き継ぎ受領](TECH_06_SmTIAS-Evaluation引き継ぎ受領.md) — DNG ローダ受領.LSC 順方向適用が正しいと判明した経緯 ### TEST 系(試行検証) diff --git "a/docs/05_TECH/TECH_08_\345\256\237\346\251\237\345\244\211\346\233\264\343\201\250\343\202\267\343\203\237\343\203\245\345\201\264\345\257\276\345\277\234.md" "b/docs/05_TECH/TECH_08_\345\256\237\346\251\237\345\244\211\346\233\264\343\201\250\343\202\267\343\203\237\343\203\245\345\201\264\345\257\276\345\277\234.md" index c0d718c..951ef61 100644 --- "a/docs/05_TECH/TECH_08_\345\256\237\346\251\237\345\244\211\346\233\264\343\201\250\343\202\267\343\203\237\343\203\245\345\201\264\345\257\276\345\277\234.md" +++ "b/docs/05_TECH/TECH_08_\345\256\237\346\251\237\345\244\211\346\233\264\343\201\250\343\202\267\343\203\237\343\203\245\345\201\264\345\257\276\345\277\234.md" @@ -1,6 +1,6 @@ # 実機変更とシミュ側対応の整合マッピング (Device Setup Changes & Simulation-side Correspondence) -本ドキュメントは MiniTias 撮影アプリの定量モード導入に伴う **実機側撮影条件の変更**に対して,SmTIAS-LightSim 側で **どこを変える必要があったか/不要だったか** を網羅的にマッピングしたものである.Step 8-13 で残差 2.63× が判明した際に「シミュ側の対応漏れではないか」を切り分けるために整理した結果である. +本ドキュメントは SmTIAS 撮影アプリの定量モード導入に伴う **実機側撮影条件の変更**に対して,SmTIAS-LightSim 側で **どこを変える必要があったか/不要だったか** を網羅的にマッピングしたものである.Step 8-13 で残差 2.63× が判明した際に「シミュ側の対応漏れではないか」を切り分けるために整理した結果である. ## 結論(先に) (Conclusion First) @@ -21,16 +21,16 @@ | 段階 | 内容 | ドキュメント | | --- | --- | --- | -| 1 | MiniTias アプリに定量撮影モード追加(PNG → DNG,ISP オート → マニュアル制御) | [TECH_01](TECH_01_定量撮影モード要求仕様.md) | -| 2 | MiniTias 側で実装完了.AQUOS sense3 は LEVEL_3 で全機能サポート | [TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md) | -| 3 | SHADING_MODE = HIGH_QUALITY 維持を決定 | [TECH_04](TECH_04_MiniTIASへの回答.md) | -| 4 | MiniTias-Evaluation 側で DNG 読み込み + LSC 順方向適用を実装 | [TECH_05](TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md) / [TECH_06](TECH_06_MiniTias-Evaluation引き継ぎ受領.md) | +| 1 | SmTIAS アプリに定量撮影モード追加(PNG → DNG,ISP オート → マニュアル制御) | [TECH_01](TECH_01_定量撮影モード要求仕様.md) | +| 2 | SmTIAS 側で実装完了.AQUOS sense3 は LEVEL_3 で全機能サポート | [TECH_03](TECH_03_定量モード実装報告とSHADING_MODE相談.md) | +| 3 | SHADING_MODE = HIGH_QUALITY 維持を決定 | [TECH_04](TECH_04_SmTIASへの回答.md) | +| 4 | SmTIAS-Evaluation 側で DNG 読み込み + LSC 順方向適用を実装 | [TECH_05](TECH_05_SmTIAS-Evaluation_DNG対応要求仕様.md) / [TECH_06](TECH_06_SmTIAS-Evaluation引き継ぎ受領.md) | | 5 | LSC 取り扱いの設計判断を明文化 | [TECH_07](TECH_07_LSC取り扱い方針.md) | | **6** | **実機側変更全般に対するシミュ側対応の整合確認(本ドキュメント)** | TECH_08(本ファイル) | ## 実機側 8 項目の変更一覧 (Device-Side Changes) -MiniTias 定量撮影モードで実機側に施した設定変更: +SmTIAS 定量撮影モードで実機側に施した設定変更: | # | 設定 | 過去(通常モード) | 新規(定量モード) | 目的 | | --- | --- | --- | --- | --- | @@ -41,7 +41,7 @@ | 5 | **NR**(ノイズ削減) | デフォルト(多分 FAST) | OFF | アーティファクト排除 | | 6 | **EDGE**(エッジ強調) | デフォルト(多分 FAST) | OFF | 偽エッジ排除 | | 7 | **LSC**(レンズシェーディング補正) | デフォルト | HIGH_QUALITY 維持 + lscMap 取得 | 後段で順方向適用するため取得 | -| 8 | **LSC 順方向適用** | (ISP 内で完結) | MiniTias-Evaluation 側で適用 | レンズビネット除去 → 照明ムラのみ評価 | +| 8 | **LSC 順方向適用** | (ISP 内で完結) | SmTIAS-Evaluation 側で適用 | レンズビネット除去 → 照明ムラのみ評価 | → 撮影段階 (#1〜#7) + 評価段階 (#8) の合計 8 項目.詳細は各 TECH ドキュメント参照. @@ -61,7 +61,7 @@ | # | 実機側変更 | (α) シーン定義 | (β) sm-render | (γ) sm-evaluate | 状態 | | --- | --- | --- | --- | --- | --- | -| 1 | PNG → DNG(量子化) | 概念なし | float32 出力(量子化なし) | DNG 直接読みは MiniTias-Evaluation の責務 | **対応不要** | +| 1 | PNG → DNG(量子化) | 概念なし | float32 出力(量子化なし) | DNG 直接読みは SmTIAS-Evaluation の責務 | **対応不要** | | 2 | AWB OFF | per-channel 独立計算(AWB 概念なし) | — | — | **対応不要** | | 3 | AE OFF | 露光時間概念なし | — | **mean アンカーで実機 mean=207.82 にスケール調整**(既存 normalization 機能で対応) | **対応済 (γ)** | | 4 | **ガンマ補正なし** | linear radiance を計算 | linear のまま保存 | **OETF セクションを config に書かない**([Step C'](#step-c-での対応) で対応) | **対応済 (γ)** | @@ -80,7 +80,7 @@ **シミュ**: Mitsuba は float32 で放射輝度 L (W/m²/sr) を出力.量子化なし. **理由**: Mitsuba の物理計算は連続値.量子化はそもそも持ち込まないので「対応不要」. -> なお,DNG の直接読み込みは MiniTias-Evaluation の責務([TECH_07](TECH_07_LSC取り扱い方針.md) §役割分担 参照).sm-evaluate にも `dng_loader.py` をコピーで持っているが(S2 で実装),これは将来の検証用ツールであり,本流評価では使わない. +> なお,DNG の直接読み込みは SmTIAS-Evaluation の責務([TECH_07](TECH_07_LSC取り扱い方針.md) §役割分担 参照).sm-evaluate にも `dng_loader.py` をコピーで持っているが(S2 で実装),これは将来の検証用ツールであり,本流評価では使わない. ### #2 AWB OFF @@ -135,7 +135,7 @@ ### #8 LSC 順方向適用(実機側で実施) -**実機側 (MiniTias-Evaluation)**: DNG 読み込み後に lscMap を画像解像度にバイリニア補間して順方向乗算.レンズビネット除去. +**実機側 (SmTIAS-Evaluation)**: DNG 読み込み後に lscMap を画像解像度にバイリニア補間して順方向乗算.レンズビネット除去. **シミュ**: 上記 #7 の通り,シミュは cos⁴ falloff を持たないので適用不要. **理由**: 実機側で完結.「対応不要」. @@ -328,10 +328,10 @@ ### TECH 系(設計判断) - [TECH_01 定量撮影モード要求仕様](TECH_01_定量撮影モード要求仕様.md) — 実機側 8 項目変更の要求書 -- [TECH_03 定量モード実装報告と SHADING_MODE 相談](TECH_03_定量モード実装報告とSHADING_MODE相談.md) — MiniTias 側実装報告 -- [TECH_04 MiniTIAS への回答](TECH_04_MiniTIASへの回答.md) — SHADING_MODE 判断 -- [TECH_05 MiniTias-Evaluation DNG 対応要求仕様](TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md) — Evaluation 側 DNG 対応 -- [TECH_06 MiniTias-Evaluation 引き継ぎ受領](TECH_06_MiniTias-Evaluation引き継ぎ受領.md) — DNG ローダ受領.LSC 順方向適用判明 +- [TECH_03 定量モード実装報告と SHADING_MODE 相談](TECH_03_定量モード実装報告とSHADING_MODE相談.md) — SmTIAS 側実装報告 +- [TECH_04 SmTIAS への回答](TECH_04_SmTIASへの回答.md) — SHADING_MODE 判断 +- [TECH_05 SmTIAS-Evaluation DNG 対応要求仕様](TECH_05_SmTIAS-Evaluation_DNG対応要求仕様.md) — Evaluation 側 DNG 対応 +- [TECH_06 SmTIAS-Evaluation 引き継ぎ受領](TECH_06_SmTIAS-Evaluation引き継ぎ受領.md) — DNG ローダ受領.LSC 順方向適用判明 - [TECH_07 LSC 取り扱い方針](TECH_07_LSC取り扱い方針.md) — LSC の設計判断詳細 ### TEST 系(試行検証) diff --git "a/docs/05_TECH/TECH_11_\345\275\242\347\212\266\346\214\207\346\250\231\343\201\256\350\246\213\347\233\264\343\201\227\343\201\250\346\226\260\346\214\207\346\250\231\345\260\216\345\205\245.md" "b/docs/05_TECH/TECH_11_\345\275\242\347\212\266\346\214\207\346\250\231\343\201\256\350\246\213\347\233\264\343\201\227\343\201\250\346\226\260\346\214\207\346\250\231\345\260\216\345\205\245.md" index 7a1a803..c226e4c 100644 --- "a/docs/05_TECH/TECH_11_\345\275\242\347\212\266\346\214\207\346\250\231\343\201\256\350\246\213\347\233\264\343\201\227\343\201\250\346\226\260\346\214\207\346\250\231\345\260\216\345\205\245.md" +++ "b/docs/05_TECH/TECH_11_\345\275\242\347\212\266\346\214\207\346\250\231\343\201\256\350\246\213\347\233\264\343\201\227\343\201\250\346\226\260\346\214\207\346\250\231\345\260\216\345\205\245.md" @@ -186,7 +186,7 @@ TEST_03「Step 8-1〜8-7 で輝度マップの形は全く変わっていない」という発見と完全に整合する. -**結論**: 過去の「数値が実機方向に動いた」評価は「均一化フィルタが効いた」だけで,「形が実機に近づいた」わけではない.本評価の目的(MiniTIAS 均一性の構造的改善)のためには,形指標の追跡が必須である. +**結論**: 過去の「数値が実機方向に動いた」評価は「均一化フィルタが効いた」だけで,「形が実機に近づいた」わけではない.本評価の目的(SmTIAS 均一性の構造的改善)のためには,形指標の追跡が必須である. ## §今後の評価方針: 数値指標 4 + 新形指標 5 + 視覚比較の 3 軸評価 @@ -227,7 +227,7 @@ ``` 参照画像は ROI 抽出後の輝度マップ(`luminance.npy` と同じ ROI サイズの 2D float64 配列)を期待する. -実機 DNG からの輝度マップ生成は MiniTias-Evaluation で行い,`reference_measurement/quantitative/expected_results/` に配置する(gitignore 対象外として管理すること). +実機 DNG からの輝度マップ生成は SmTIAS-Evaluation で行い,`reference_measurement/quantitative/expected_results/` に配置する(gitignore 対象外として管理すること). ### 後方互換 diff --git a/docs/06_TEST/README.md b/docs/06_TEST/README.md index 714ebf8..b32ed3e 100644 --- a/docs/06_TEST/README.md +++ b/docs/06_TEST/README.md @@ -8,7 +8,7 @@ | --- | --- | --- | --- | | 🟡 | **キャリブ作業の中核(更新中)** | 永続的,新規 Step ごとに追記 | **「過去の試行と現状」を辿る主軸** | | 🔵 | **クローズ済みの試行履歴** | 履歴的,原則更新しない | 「中断・完了した別軸の試行」を参照する | -| 📋 | **外部スナップショット** | 取り込み済み,更新は元側で | 元プロジェクト ([MiniTias-Evaluation](https://github.com/rintoHasegawa/MiniTias-Evaluation)) を参照 | +| 📋 | **外部スナップショット** | 取り込み済み,更新は元側で | 元プロジェクト ([SmTIAS-Evaluation](https://github.com/rintoHasegawa/SmTIAS-Evaluation)) を参照 | ## 🟡 キャリブ作業の中核 — 3 ファイル @@ -40,7 +40,7 @@ ## 📋 外部スナップショット — 2 ファイル -[MiniTias-Evaluation](https://github.com/rintoHasegawa/MiniTias-Evaluation) で作成された報告書を SmTIAS-LightSim 側にも取り込んだもの.**原本は MiniTias-Evaluation 側**にあり,バグ修正・追記は元側で行う.本リポジトリは「スナップショット」として保持. +[SmTIAS-Evaluation](https://github.com/rintoHasegawa/SmTIAS-Evaluation) で作成された報告書を SmTIAS-LightSim 側にも取り込んだもの.**原本は SmTIAS-Evaluation 側**にあり,バグ修正・追記は元側で行う.本リポジトリは「スナップショット」として保持. | ファイル | 元側 | 内容 | | --- | --- | --- | @@ -49,7 +49,7 @@ ### 取り込みの位置付け -外部スナップショットの取り込み経緯は [TECH_06 MiniTias-Evaluation 引き継ぎ受領](../05_TECH/TECH_06_MiniTias-Evaluation引き継ぎ受領.md) に記載.原本リンクの一部は MiniTias-Evaluation リポジトリ起点で,SmTIAS-LightSim 側からは到達しない(リンク切れは許容と各ファイル冒頭に明記). +外部スナップショットの取り込み経緯は [TECH_06 SmTIAS-Evaluation 引き継ぎ受領](../05_TECH/TECH_06_SmTIAS-Evaluation引き継ぎ受領.md) に記載.原本リンクの一部は SmTIAS-Evaluation リポジトリ起点で,SmTIAS-LightSim 側からは到達しない(リンク切れは許容と各ファイル冒頭に明記). ## 関連ディレクトリ diff --git "a/docs/06_TEST/TEST_01_\343\202\255\343\203\243\343\203\252\343\203\226\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\346\244\234\350\250\274\345\261\245\346\255\264.md" "b/docs/06_TEST/TEST_01_\343\202\255\343\203\243\343\203\252\343\203\226\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\346\244\234\350\250\274\345\261\245\346\255\264.md" index abfad54..edb228b 100644 --- "a/docs/06_TEST/TEST_01_\343\202\255\343\203\243\343\203\252\343\203\226\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\346\244\234\350\250\274\345\261\245\346\255\264.md" +++ "b/docs/06_TEST/TEST_01_\343\202\255\343\203\243\343\203\252\343\203\226\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\346\244\234\350\250\274\345\261\245\346\255\264.md" @@ -2,7 +2,7 @@ > ⚠️ **BEFORE FIX(バグ込み・要再検証)**: 本ドキュメントの Step 8 系イテレーション(特に A1 BSDF・A8 反射率・A9 max_depth・ξ 配光スイープ)の**数値・図はすべて面光源スケール軸バグ(全 LED が幅3mm×高さ2mの巨大ストリップ化)が入った状態で取得**したもの.バグの発見・修正・影響は [TEST_08](TEST_08_面光源スケール軸バグの発見と修正.md),正しい面積での再検証は [TEST_09](TEST_09_照明分布の形不一致の原因切り分け.md) を参照.記録としては残すが,個々の数値・結論は**そのまま信用せず修正後に再検証すること**. -本ドキュメントは MiniTIAS 実機(baseline 1 枚 `MiniTIAS_20260408_144434`)に対するシミュレーション結果の **キャリブレーション** と **検証イテレーション** を時系列で記録する. +本ドキュメントは SmTIAS 実機(baseline 1 枚 `MiniTIAS_20260408_144434`)に対するシミュレーション結果の **キャリブレーション** と **検証イテレーション** を時系列で記録する. 目的: @@ -85,7 +85,7 @@ ### Step 8-2: 反射率スイープ (R=0.75〜0.92) - **日付**: 2026-05-18 -- **背景・問題意識**: 8-1 で「物理モデル要因」と確定.MiniTIAS は白筐体内壁の多重反射で照明を均一化する設計なので,**内壁反射率**が直接効くはず.暫定 0.85 が低めの可能性. +- **背景・問題意識**: 8-1 で「物理モデル要因」と確定.SmTIAS は白筐体内壁の多重反射で照明を均一化する設計なので,**内壁反射率**が直接効くはず.暫定 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 を見つける. @@ -439,7 +439,7 @@ - **仮説(物理動機)**: - Helmholtz 相反原理: BRDF は方向対称,光輸送方程式は時間反転対称.バックワード (path) とフォワード (ptracer) は同じ積分の異なるサンプリング順序.**収束先 (真値) は同じ**. - 違いは収束速度 (分散) と Mitsuba 実装の正規化の細かい差異だけ. - - MiniTIAS のような「センサ小・光源分散・拡散主体」シーンでは ptracer が極端に非効率 → spp が大きく必要. + - SmTIAS のような「センサ小・光源分散・拡散主体」シーンでは ptracer が極端に非効率 → spp が大きく必要. - **試した変更**: - `schema.py` の `RenderConfig.integrator` Literal に `ptracer` を追加(4 値: path/direct/volpath/ptracer) - `configs/scene_baseline_perspective_path.yaml` / `configs/scene_baseline_perspective_ptracer.yaml` を新規作成(同じシーン,sensor 切替: orthographic → perspective, fov=90°, scalar_rgb, spp=4096) @@ -462,9 +462,9 @@ - **絶対値の差**: mean が 1.99× 違う.これは **Mitsuba 3 の path/ptracer 出力 luminance の正規化差** によるもので,形には影響しない(線形ゲイン). - **ptracer のノイズ**: max スパイク 4919 が残る(光子集中の確率的事象).spp を上げれば収束するが,spp=4096 でも形は明確に見える. - **学び**: - - **光線追跡の方向は「形」を変えない**:これが MiniTIAS のような拡散主体シーンでは Mitsuba 上でも数値的に確認された. + - **光線追跡の方向は「形」を変えない**:これが SmTIAS のような拡散主体シーンでは Mitsuba 上でも数値的に確認された. - **絶対値スケールは integrator 実装の正規化差で違う**:物理的には等価でも,Mitsuba の出力単位定義が path/ptracer で違う.これは「形」の議論には影響しない. - - **orthographic + ptracer は Mitsuba 3 では実行不能**:これは MiniTIAS のシーン構成では path/ptracer を直接比較できない技術的制約.perspective sensor でのみ検証可能だった. + - **orthographic + ptracer は Mitsuba 3 では実行不能**:これは SmTIAS のシーン構成では path/ptracer を直接比較できない技術的制約.perspective sensor でのみ検証可能だった. - **方向変更で形を実機に近づける道は無い**ことが(部分的に)実証された.**LSC モデル化が唯一の道**との結論を強化. - **次のアクション**: - 本筋 LSC モデル化([Step 8-N](#step-8-n-候補-lsc-順方向モデル不採用--step-8-13-で方針確定))に進む @@ -474,7 +474,7 @@ - **日付**: 2026-06-02 - **コミット**: 本イテレーション完了時点(`feature/dng-loader-import` ブランチで S2→Step D→C'→TECH_07/08 を累積) -- **背景・問題意識**: TECH_06 で MiniTias-Evaluation 側に DNG 読み込み + LSC 順方向適用が実装され,新実機ターゲット (CoV=0.0695) が確定.過去 Step 8-1〜8-12 は **PNG sRGB ドメイン**で比較していたが,[TECH_07](../05_TECH/TECH_07_LSC取り扱い方針.md) / [TECH_08](../05_TECH/TECH_08_実機変更とシミュ側対応.md) で「実機側 linear + LSC 順方向適用」と「シミュ orthographic」が同じドメイン (「LSC 完璧補正後相当」) に揃うことが判明.本イテレーションで実際に同じ linear ドメインでシミュ vs 実機を計測する. +- **背景・問題意識**: TECH_06 で SmTIAS-Evaluation 側に DNG 読み込み + LSC 順方向適用が実装され,新実機ターゲット (CoV=0.0695) が確定.過去 Step 8-1〜8-12 は **PNG sRGB ドメイン**で比較していたが,[TECH_07](../05_TECH/TECH_07_LSC取り扱い方針.md) / [TECH_08](../05_TECH/TECH_08_実機変更とシミュ側対応.md) で「実機側 linear + LSC 順方向適用」と「シミュ orthographic」が同じドメイン (「LSC 完璧補正後相当」) に揃うことが判明.本イテレーションで実際に同じ linear ドメインでシミュ vs 実機を計測する. - **仮説(物理動機)**: 過去 Step 8-3 で OETF 順方向適用後の残差 2.1× だったが,これは PNG sRGB ガンマ圧縮による楽観値の可能性.真の linear 比較では残差はもっと大きい.[TEST_05](TEST_05_PNG_DNG評価比較.md) で「PNG sRGB CoV=0.0423 → PNG 擬似 linear CoV=0.0901」と数値実証されており,真の残差は約 **2.66×** と予想. - **試した変更**: - `configs/eval_baseline_dng_target.yaml` 新規作成 (S3 Step C') @@ -504,7 +504,7 @@ - 残差の主因候補: **シミュ物理モデル誤差**(反射率精度・LED 配光モデル・メッシュ幾何精度).[TECH_08](../05_TECH/TECH_08_実機変更とシミュ側対応.md) で実機側変更全 8 項目へのシミュ側対応漏れがないことを網羅確認済. - **学び**: - **ガンマ圧縮は CoV を約 2 倍縮める**.過去 PNG 評価は楽観的だった.真の精度評価には DNG linear が必須. - - **「形を変える唯一の道は LSC モデル化」(過去 [TEST_03](TEST_03_輝度マップ形状追跡.md) finding 4)の前提変更**: 実機側で LSC 順方向適用するアプローチが MiniTias-Evaluation で確立した今,シミュ側 LSC モデル化は不要.Step 8-N (LSC 順方向モデル) は **不採用** ([TECH_07 §検討した代替案](../05_TECH/TECH_07_LSC取り扱い方針.md)). + - **「形を変える唯一の道は LSC モデル化」(過去 [TEST_03](TEST_03_輝度マップ形状追跡.md) finding 4)の前提変更**: 実機側で LSC 順方向適用するアプローチが SmTIAS-Evaluation で確立した今,シミュ側 LSC モデル化は不要.Step 8-N (LSC 順方向モデル) は **不採用** ([TECH_07 §検討した代替案](../05_TECH/TECH_07_LSC取り扱い方針.md)). - **過去 Step 8-1〜8-12 の試行は無駄ではなかった**: 「形は変わらない」確定により,物理モデル誤差以外の方向(emitter 配光・反射率・センサ方向)が排除された.残るは物理モデル誤差(タイプ II 構造的差異も小寄与だが排除不能,[TECH_08 §許容している構造的差異](../05_TECH/TECH_08_実機変更とシミュ側対応.md)). - **「対応すべき項目」と「許容している構造的差異」の区別が明確化**: タイプ I (本質構造同一・対応概念なし) と タイプ II (構造的差異あり・白板で許容) に分けて整理. - **次のアクション**: @@ -514,7 +514,7 @@ - 反射率の実物理整合度の検証(過去 Step 8-2 で R=0.85→0.92 のスイープ実施済.より精密な物理整合チェック) - LED 配光モデルの詳細化(過去 Step 8-10/8-11 spot 試行済.より忠実な IES 取得が選択肢) - メッシュ幾何精度の評価(過去 Step 8-9 で Fusion STL 抽出済.残る微差を評価) - - [TECH_04](../05_TECH/TECH_04_MiniTIASへの回答.md) フォールバック条件 C1 候補(SHADING_OFF 撮影)も並行検討の余地あり. + - [TECH_04](../05_TECH/TECH_04_SmTIASへの回答.md) フォールバック条件 C1 候補(SHADING_OFF 撮影)も並行検討の余地あり. ### Step 8-14 候補 γ: D1 ROI 整合の再確認(事前確認・クリア) @@ -751,7 +751,7 @@ ## Step 8-N 候補: LSC 順方向モデル(不採用 — Step 8-13 で方針確定) -> **2026-06-02 注記**: 本セクションは当時「実機側を変更しない前提」で「シミュ側に LSC モデル化を追加して残差を埋める」案として立案されていた.[Step 8-13](#step-8-13-新方針-実機-dng--lsc-linear-でのシミュ突合) で **実機側に LSC 順方向適用** するアプローチが MiniTias-Evaluation で確立した結果,**本案は不採用**となった.以下は歴史的記録として残す.詳細な却下理由は [TECH_07 §検討した代替案](../05_TECH/TECH_07_LSC取り扱い方針.md) 参照. +> **2026-06-02 注記**: 本セクションは当時「実機側を変更しない前提」で「シミュ側に LSC モデル化を追加して残差を埋める」案として立案されていた.[Step 8-13](#step-8-13-新方針-実機-dng--lsc-linear-でのシミュ突合) で **実機側に LSC 順方向適用** するアプローチが SmTIAS-Evaluation で確立した結果,**本案は不採用**となった.以下は歴史的記録として残す.詳細な却下理由は [TECH_07 §検討した代替案](../05_TECH/TECH_07_LSC取り扱い方針.md) 参照. - **位置付け**: 8-3 OETF 適用後の残差 **1.6〜1.9×**(CoV 0.089 vs 実測 0.043,勾配 12.57 vs 6.10)の **主因候補**. - **仮説(物理動機)**: 実測 PNG は実機 ISP の **レンズシェーディング補正**(周辺光量低下の電子補正)が掛かっており,**周辺を持ち上げて中央を相対的に押し下げる**.これは残差の符号(シミュ側の方が勾配・C/P が大きい)と整合.シミュ側で同じ補正を順方向に適用すれば消える可能性が高い. 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" index 1368583..b13f2e3 100644 --- "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" @@ -1,10 +1,10 @@ # 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) を参照. +> **注**: 本ファイルは SmTIAS-Evaluation で作成された [REPORT_02 PNG/DNG 評価比較報告書](https://github.com/rintoHasegawa/SmTIAS-Evaluation) を SmTIAS-LightSim 側に取り込んだスナップショット.本文中で参照される他の SmTIAS-Evaluation 側ドキュメント (REPORT_01, PROGRESS.md 等) のリンクは **SmTIAS-Evaluation リポジトリ起点**で,SmTIAS-LightSim 側からは到達しない(リンク切れは許容).取り込みの位置付けは [TECH_06 SmTIAS-Evaluation 引き継ぎ受領](../05_TECH/TECH_06_SmTIAS-Evaluation引き継ぎ受領.md) を参照. ## 概要 (Overview) -MiniTIAS 撮影アプリの定量撮影モードの出力フォーマットが **PNG から DNG (RAW_SENSOR) に変更**された([TECH_01 (Evaluation 側) / TECH_05 (SmTIAS-LightSim 側)](../05_TECH/TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md))ことに伴い,照明均一性評価の結果が PNG 経路と DNG 経路でどのように変わるかを比較した. +SmTIAS 撮影アプリの定量撮影モードの出力フォーマットが **PNG から DNG (RAW_SENSOR) に変更**された([TECH_01 (Evaluation 側) / TECH_05 (SmTIAS-LightSim 側)](../05_TECH/TECH_05_SmTIAS-Evaluation_DNG対応要求仕様.md))ことに伴い,照明均一性評価の結果が PNG 経路と DNG 経路でどのように変わるかを比較した. 結論を先に述べると,**PNG→DNG は単なるファイル形式の変更ではなく,「何を測っているか」が変わる**.PNG は sRGB エンコード済み・端末 ISP でレンズシェーディング補正済みの「処理後」データであり,DNG は linear・補正前の「物理生信号」である.このため評価指標の数値は大きく変化する. @@ -123,10 +123,10 @@ ## 関連ドキュメント (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) +- [TECH_05 SmTIAS-Evaluation DNG 対応要求仕様](../05_TECH/TECH_05_SmTIAS-Evaluation_DNG対応要求仕様.md) +- [TECH_06 SmTIAS-Evaluation 引き継ぎ受領](../05_TECH/TECH_06_SmTIAS-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` +- 評価実装(SmTIAS-Evaluation 側): `src/io/dng_loader.py`, `src/analysis/spatial.py`, `scripts/run_uniformity_dng.py` +- 設計判断・経緯の詳細: SmTIAS-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" index 02ef862..2c5bc65 100644 --- "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" @@ -1,10 +1,10 @@ # 外乱光影響評価 (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) を参照. +> **注**: 本ファイルは SmTIAS-Evaluation で作成された [REPORT_03 外乱光影響評価報告書](https://github.com/rintoHasegawa/SmTIAS-Evaluation) を SmTIAS-LightSim 側に取り込んだスナップショット.本文中で参照される他の SmTIAS-Evaluation 側ドキュメントのリンクは **SmTIAS-Evaluation リポジトリ起点**で,SmTIAS-LightSim 側からは到達しない(リンク切れは許容).取り込みの位置付けは [TECH_06 SmTIAS-Evaluation 引き継ぎ受領](../05_TECH/TECH_06_SmTIAS-Evaluation引き継ぎ受領.md) を参照. ## 概要 (Overview) -MiniTIAS の照明均一性測定が,**外部の室内照明(外乱光)にどれだけ影響を受けるか**を評価した.SmTIAS 装置自前の照明のみで撮影した DNG と,それに室内灯(外乱光)を加えて撮影した DNG を,同一指標で比較する. +SmTIAS の照明均一性測定が,**外部の室内照明(外乱光)にどれだけ影響を受けるか**を評価した.SmTIAS 装置自前の照明のみで撮影した DNG と,それに室内灯(外乱光)を加えて撮影した DNG を,同一指標で比較する. 結論を先に述べると,**外乱光の有無で評価結果はほぼ変わらない(指標差 1% 未満)**.SmTIAS 自前照明が支配的で,測定は室内照明環境に対してロバストである. @@ -12,8 +12,8 @@ | 項目 | 内容 | | --- | --- | -| 条件 A(MiniTIAS のみ) | `MiniTIAS_QM_20260601_124500`(室内灯 OFF,2026-06-01 12:45 撮影) | -| 条件 B(MiniTIAS + 外光) | `MiniTIAS_QM_20260601_102753`(室内灯 ON,2026-06-01 10:27 撮影) | +| 条件 A(SmTIAS のみ) | `MiniTIAS_QM_20260601_124500`(室内灯 OFF,2026-06-01 12:45 撮影) | +| 条件 B(SmTIAS + 外光) | `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 補正あり・なし両方 | @@ -26,17 +26,17 @@ | 条件 | 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 | +| A: SmTIAS のみ | 441.2 | 89 | 983 | 161.0 | 355.9 / 537.4 / 333.6 | +| B: SmTIAS + 外光 | 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: SmTIAS のみ**(LSC 補正) | 207.82 | 0.0695 | 1.617 | 1.0911 | 8.35 | 0.8600 | +| **B: SmTIAS + 外光**(LSC 補正) | 208.77 | 0.0689 | 1.641 | 1.0952 | 8.69 | 0.8533 | +| A: SmTIAS のみ(LSC なし) | 170.58 | 0.1464 | — | 1.4511 | 31.09 | 0.5343 | +| B: SmTIAS + 外光(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 | 輝度マップ・ヒストグラムも両条件でほぼ重なり,空間パターン・分布形状に有意な違いは見られない. @@ -49,7 +49,7 @@ ### 2. 「外光を足したのに暗い」という矛盾 — 外乱光の寄与はばらつき以下 -外乱光は信号を**加える**しかできないため,物理的には B(MiniTIAS+外光)≧ A(MiniTIAS のみ)の明るさになるはずである.しかし実測では **A の方が明るい**(raw mean 441.2 vs 431.4,R/G/B 各チャンネルとも A が上). +外乱光は信号を**加える**しかできないため,物理的には B(SmTIAS+外光)≧ A(SmTIAS のみ)の明るさになるはずである.しかし実測では **A の方が明るい**(raw mean 441.2 vs 431.4,R/G/B 各チャンネルとも A が上). これは,外乱光の寄与が **セッション間のばらつき(≈2〜3%:撮影時刻 10:27 vs 12:45 の差,微小な位置ずれ,照明のドリフト等)に埋もれている**ことを意味する.すなわち **外乱光の影響 < セッション間ばらつき**であり,外乱光の純寄与はこのデータからは分離できないほど小さい. @@ -60,8 +60,8 @@ ## 結論 (Conclusion) 1. **外乱光(室内照明)の有無で,照明均一性の評価指標はほぼ変わらない(差 1% 未満)**.SmTIAS 自前照明が支配的. -2. 明るさの差(≈2〜3%)はむしろ「MiniTIAS のみ」の方が明るく,物理的に逆向き.→ **外乱光の寄与はセッション間ばらつき以下**で,測定には埋もれて見えない. -3. したがって **MiniTIAS の照明均一性測定は,通常の室内照明環境に対してロバスト**と判断できる. +2. 明るさの差(≈2〜3%)はむしろ「SmTIAS のみ」の方が明るく,物理的に逆向き.→ **外乱光の寄与はセッション間ばらつき以下**で,測定には埋もれて見えない. +3. したがって **SmTIAS の照明均一性測定は,通常の室内照明環境に対してロバスト**と判断できる. ## SmTIAS-LightSim 側への含意 (Implications for SmTIAS-LightSim) @@ -88,15 +88,15 @@ 本評価は別セッション撮影のため,外乱光の純寄与を 2〜3% のばらつきから分離できていない.外乱光の影響「だけ」を正確に測るには,以下の対照実験が必要: -- **位置・露出を完全固定**(三脚等)し,**室内灯のみを ON/OFF** した連続2枚を撮影する(A: MiniTIAS のみ / B: MiniTIAS + 外光). +- **位置・露出を完全固定**(三脚等)し,**室内灯のみを ON/OFF** した連続2枚を撮影する(A: SmTIAS のみ / B: SmTIAS + 外光). - 差分画像 **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) +- [TECH_05 SmTIAS-Evaluation DNG 対応要求仕様](../05_TECH/TECH_05_SmTIAS-Evaluation_DNG対応要求仕様.md) +- [TECH_06 SmTIAS-Evaluation 引き継ぎ受領](../05_TECH/TECH_06_SmTIAS-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 対象) +- 評価実装(SmTIAS-Evaluation 側): `scripts/run_uniformity_dng.py`(linear + LSC 補正経路) +- 対象データ: SmTIAS-Evaluation 側 `data/minitias/quantitative/`(gitignore 対象) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index c9670e3..7ea94fc 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -35,14 +35,14 @@ - **速度最適化ワーク開始**(キャリブ作業を一旦中断): [TEST_04 シミュレーション速度最適化履歴](06_TEST/TEST_04_シミュレーション速度最適化履歴.md) に試行を集約.**Speed-0 ベースライン計測完了**(`configs/scene_baseline.yaml`,3 回中央値): **B1 sm-render = 507.86 s(≈8.46 分)/ B2 sm-visualize path bake (samples=16) = 55.97 s**.**副次発見**: `DRJIT_LIBLLVM_PATH` 環境変数の消失で sm-render が ImportError でクラッシュしていたことを発見.`C:\Program Files\LLVM\bin\LLVM-C.dll` を発見し **User scope に永続化**して復旧.sm-visualize の direct bake は内部 scalar_rgb 固定のため過去ログでも警告は出ていたが完走していた.**方向修正**: Speed-1 当初の「JIT 有効化で高速化」は既に JIT 経路に乗っているため不成立 → 「LLVM-C.dll 自動検出と診断ログ」に再定義(再発防止).**本命の高速化レバーは Speed-2 path bake wavefront 化**(10× 以上見込み).GPU は Intel HD Graphics 520 のみで CUDA 不可,CPU 側完結方針.精度(spp/max_depth)は不変. - **Speed-1 完了**: `src/sm_tias_lightsim/runtime/llvm_init.py` に `ensure_drjit_libllvm_path()`(標準パス自動探索→ `os.environ` 設定)と `log_variant_status()`(llvm_/cuda_/scalar_ 経路を INFO 明示,要求 llvm_* で実 scalar_* なら WARNING 追加)を新規実装.`render/runner.py` で variant=llvm_* 時に自動検出を呼び、`ImportError` 時は原因明示ログ→ re-raise.`visualize/baker.py` でも `log_variant_status` 呼び出し追加+ Speed-2 wavefront 化用に LLVM 自動探索の分岐を先取り.`cli/render.py` で import 順を制御.`docs/02_ENV/ENV_02_環境構築手順.md` に LLVM インストール手順・DRJIT_LIBLLVM_PATH 説明・動作確認コマンドを追記.**速度は不変**(コード経路同等).数値同等性: SHA256 は MC 内部シードで異なるが平均相対誤差 7.23e-05 で統計同等性パス.これで「環境変数が消えて沈黙クラッシュ」する事故が再発しない土台が整備された. - **速度最適化ワーク一旦中断**(Speed-2 path bake wavefront 化は未着手): **実時間の改善は実質ゼロ**(B1=508s/B2=56s で不変).副次的成果として環境破綻問題の発見と恒久対処,JIT 診断ログ,ベンチ条件のドキュメント,テスト追加が得られた.中断理由: B2 は現状ボトルネックではなく,B1 は CPU 完結・精度据置の制約下で取れる打ち手が限定的.本筋のキャリブ作業(LSC モデル化)に戻ることがプロジェクト目的により近い.再開条件: path bake samples を増やすユースケース発生/NVIDIA GPU 利用可/クラウド計算活用判断/キャリブ反復回数増加でバッチ時間が研究進度を圧迫した場合.詳細・Speed-2 テンプレ保持は [TEST_04 中断記録](06_TEST/TEST_04_シミュレーション速度最適化履歴.md#中断記録-suspension-note--2026-05-28) 参照. -- **キャリブ方針の根本見直し(2026-05-28)**: 「シミュ vs 実機 PNG の比較」を再検討した結果,**実機 PNG 自体が定量データとして揺らいでいる**ことが判明.MiniTIAS の現行撮影は AE/AWB/NR/EDGE/TONEMAP/SHADING がすべて Camera2 API のオート/デフォルトで,撮影ごとに露光・WB・補正量が変動する.既存 baseline `MiniTIAS_20260408_144434` もこのモードで取得されており,シミュ側でいくらモデルを精緻化しても比較対象が不安定.**当初考えていた「LSC モデル化」より上位の問題**として「**定量撮影モード**」を MiniTIAS 側に追加することを優先する.Android Camera2 API には `STATISTICS_LENS_SHADING_CORRECTION_MAP`・`SHADING_MODE=OFF`・`MANUAL_SENSOR`/`MANUAL_POST_PROCESSING` 能力フラグが存在し,これらを活用すれば「ISP 介入を最小化した再現性ある撮影」が可能.要求仕様を [TECH_01](05_TECH/TECH_01_定量撮影モード要求仕様.md) に,ハンドオフ手順を [TECH_02](05_TECH/TECH_02_MiniTIAS引き継ぎ手順.md) に新規作成.データ受け渡しは `reference_measurement/quantitative/` 配下(gitignore 対象).SmTIAS-LightSim 側のキャリブ作業は本仕様書を MiniTIAS に渡した時点で一旦停止. -- **MiniTIAS 側で定量モード実装完了(2026-06-01)**: [TECH_03](05_TECH/TECH_03_定量モード実装報告とSHADING_MODE相談.md) と [TECH_04](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 種.**SHADING_MODE 判断**: HIGH_QUALITY を本流維持(Mitsuba orthographic 出力 ≒「ISP が完璧に補正できた場合の理想値」で HIGH_QUALITY DNG と直接比較が物理整合).OFF 切替は将来のフォールバック条件 C1-C3 発動時のみ.データ転送は **adb pull 推奨**.既存実機 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× が定量モードで変化するかを観察.[TEST_01](06_TEST/TEST_01_キャリブレーション検証履歴.md) に **Step 8-13** として記録. -- **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](05_TECH/TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md) に要求書を作成.既存 PNG 経路と並列対応(後方互換).依存追加: `rawpy>=0.21.0`. -- **MiniTias-Evaluation 側 Phase 1 完了とハンドオフ受領(2026-06-01)**: TECH_05 Phase 1 (DNG 読み込み I/F) と LSC 順適用プロトタイプ・新指標 (動径 min/max 比) が完成.受領記録は [TECH_06](05_TECH/TECH_06_MiniTias-Evaluation引き継ぎ受領.md),関連分析は [TEST_05](06_TEST/TEST_05_PNG_DNG評価比較.md) と [TEST_06](06_TEST/TEST_06_外乱光影響評価.md).**5 つの重要発見**: (1) **TECH_05 の `apply_lsc_inverse` は誤り**(DNG は LSC 未補正で逆ではなく順方向適用が正しい.TECH_05 §4 を訂正済).(2) **過去 Step 8 キャリブの残差 2.1× はドメイン不一致**:正しい 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`** を追加. +- **キャリブ方針の根本見直し(2026-05-28)**: 「シミュ vs 実機 PNG の比較」を再検討した結果,**実機 PNG 自体が定量データとして揺らいでいる**ことが判明.SmTIAS の現行撮影は AE/AWB/NR/EDGE/TONEMAP/SHADING がすべて Camera2 API のオート/デフォルトで,撮影ごとに露光・WB・補正量が変動する.既存 baseline `MiniTIAS_20260408_144434` もこのモードで取得されており,シミュ側でいくらモデルを精緻化しても比較対象が不安定.**当初考えていた「LSC モデル化」より上位の問題**として「**定量撮影モード**」を SmTIAS 側に追加することを優先する.Android Camera2 API には `STATISTICS_LENS_SHADING_CORRECTION_MAP`・`SHADING_MODE=OFF`・`MANUAL_SENSOR`/`MANUAL_POST_PROCESSING` 能力フラグが存在し,これらを活用すれば「ISP 介入を最小化した再現性ある撮影」が可能.要求仕様を [TECH_01](05_TECH/TECH_01_定量撮影モード要求仕様.md) に,ハンドオフ手順を [TECH_02](05_TECH/TECH_02_SmTIAS引き継ぎ手順.md) に新規作成.データ受け渡しは `reference_measurement/quantitative/` 配下(gitignore 対象).SmTIAS-LightSim 側のキャリブ作業は本仕様書を SmTIAS に渡した時点で一旦停止. +- **SmTIAS 側で定量モード実装完了(2026-06-01)**: [TECH_03](05_TECH/TECH_03_定量モード実装報告とSHADING_MODE相談.md) と [TECH_04](05_TECH/TECH_04_SmTIASへの回答.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.保存ファイルは `SmTIAS_QM_*.{dng, meta.json, preview.jpg}` 3 種.**SHADING_MODE 判断**: HIGH_QUALITY を本流維持(Mitsuba orthographic 出力 ≒「ISP が完璧に補正できた場合の理想値」で HIGH_QUALITY DNG と直接比較が物理整合).OFF 切替は将来のフォールバック条件 C1-C3 発動時のみ.データ転送は **adb pull 推奨**.既存実機 PNG の Y' 抽出は BT.601 係数(Rec.709 ではない)も判明. +- **作業フェーズを A/B に分割(2026-06-01)**: 「連射再現性が確保できてもシミュとの対応が取れなければ意味が薄い」という研究上の判断から,**フェーズ A: 1 ショット撮影でシミュ vs 実機対応を先に検証** → **フェーズ B: 対応が取れたら連射 V1 再現性検証**の二段階方式に変更.フェーズ A で SmTIAS 側に依頼するのは **画素統計・Hot pixel map(高優先 2 件)と白板 1 ショット試し撮りのみ**.**連射 UI は高優先→フェーズ B に降格**.SmTIAS-LightSim 側は DNG/meta.json/LSC マップ読み込み I/F・新規 baseline config を実装し,1 ショット突合で既存通常モード baseline 残差 2.1× が定量モードで変化するかを観察.[TEST_01](06_TEST/TEST_01_キャリブレーション検証履歴.md) に **Step 8-13** として記録. +- **DNG 対応を SmTIAS-Evaluation 側にも依頼(2026-06-01)**: PNG から DNG への撮影フォーマット変更に伴い,SmTIAS-Evaluation も実機データの一次窓口として DNG 読み込み I/F の追加が必要.既存パターン(`uniformity.py` を SmTIAS-Evaluation から SmTIAS-LightSim にコピー)を踏襲する役割分担を採用:**SmTIAS-Evaluation 側で正規実装 → SmTIAS-LightSim 側にコピー**.[TECH_05](05_TECH/TECH_05_SmTIAS-Evaluation_DNG対応要求仕様.md) に要求書を作成.既存 PNG 経路と並列対応(後方互換).依存追加: `rawpy>=0.21.0`. +- **SmTIAS-Evaluation 側 Phase 1 完了とハンドオフ受領(2026-06-01)**: TECH_05 Phase 1 (DNG 読み込み I/F) と LSC 順適用プロトタイプ・新指標 (動径 min/max 比) が完成.受領記録は [TECH_06](05_TECH/TECH_06_SmTIAS-Evaluation引き継ぎ受領.md),関連分析は [TEST_05](06_TEST/TEST_05_PNG_DNG評価比較.md) と [TEST_06](06_TEST/TEST_06_外乱光影響評価.md).**5 つの重要発見**: (1) **TECH_05 の `apply_lsc_inverse` は誤り**(DNG は LSC 未補正で逆ではなく順方向適用が正しい.TECH_05 §4 を訂正済).(2) **過去 Step 8 キャリブの残差 2.1× はドメイン不一致**:正しい 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`** を追加. - **S2 完了 (2026-06-01)**: `src/sm_tias_lightsim/evaluation/dng_loader.py` を `handoff_smtias_lightsim/src/dng_loader.py` の完全コピーで新規作成.`radial.py` に `calc_radial_min_max_ratio` をマージ追加 (nan ビン除外を移植時に補強).`pyproject.toml` に `rawpy>=0.21.0` 追加 (実 rawpy==0.27.0).**検証 V4 が完全一致**: 実 DNG を読み込んで LSC 順方向適用 + 白板 ROI で評価指標 6 件が相対誤差 < 1e-6 で期待値完全一致,空間指標 3 件も絶対誤差 < 0.003.Refactorer 判断: `dng_loader.py` 内部の `_apply_srgb_oetf` は既存 `oetf.py:apply_srgb_oetf` と実装重複だが「コピー方針優先」「用途が異なる」「違反基準未満」でそのまま放置. -- **S3 方針見直しと Step D 完了 (2026-06-01)**: ユーザー指摘により「sm-evaluate に DNG 入力経路を追加する」当初案は **不採用**(実機 DNG 評価は MiniTias-Evaluation の本業で完結,重複実装不要).S3 を **3 項目に絞り込み**: Step D (動径 min/max 比を sm-evaluate に統合)・Step C' (新規シミュ用 baseline config)・Step G (シミュ再評価 → Step 8-13 記録).**Step D 完了**: `MetricsConfig.radial_min_max` をスキーマ追加,`cli/evaluate.py` で `_run_radial_min_max` を追加して metrics.csv に 4 列追加,コンソールサマリに 2 行追加.`radial_profile` を再利用(重複算出回避).後方互換維持.SPEC_04 §動径 min/max 比 を追記. -- **Step C' 完了と Step G 計測 (2026-06-02)**: `configs/eval_baseline_dng_target.yaml` を新規作成(eval_baseline_linear.yaml ベース,target_mean=207.82,radial_min_max=true,OETF なし).Step 8-13 数値: シミュ CoV=0.1826, 勾配=24.65%, 中心/周辺=1.3271, 動径 min/max=0.6151.実機 DNG+LSC (CoV=0.0695, 勾配=8.35%, C/P=1.0911, 動径 min/max=0.860) と比較して **残差 2.63×**(TECH_06 予想「真の残差 2.66×」とほぼ一致).過去 Step 8-3 の「2.1×」は PNG sRGB ガンマ圧縮による楽観値.**LSC 取り扱いの結論を [TECH_07](05_TECH/TECH_07_LSC取り扱い方針.md) に一元化**: 3 プロジェクト役割分担 (MiniTias=HIGH_QUALITY 撮影 / MiniTias-Evaluation=lscMap 順方向適用 / SmTIAS-LightSim=一切扱わない),シミュ側で LSC を扱わない物理的根拠 (Mitsuba orthographic = LSC 完璧補正後相当),代替案 3 つ全却下,フォールバック条件 C1-C3,残差解釈 を明文化. +- **S3 方針見直しと Step D 完了 (2026-06-01)**: ユーザー指摘により「sm-evaluate に DNG 入力経路を追加する」当初案は **不採用**(実機 DNG 評価は SmTIAS-Evaluation の本業で完結,重複実装不要).S3 を **3 項目に絞り込み**: Step D (動径 min/max 比を sm-evaluate に統合)・Step C' (新規シミュ用 baseline config)・Step G (シミュ再評価 → Step 8-13 記録).**Step D 完了**: `MetricsConfig.radial_min_max` をスキーマ追加,`cli/evaluate.py` で `_run_radial_min_max` を追加して metrics.csv に 4 列追加,コンソールサマリに 2 行追加.`radial_profile` を再利用(重複算出回避).後方互換維持.SPEC_04 §動径 min/max 比 を追記. +- **Step C' 完了と Step G 計測 (2026-06-02)**: `configs/eval_baseline_dng_target.yaml` を新規作成(eval_baseline_linear.yaml ベース,target_mean=207.82,radial_min_max=true,OETF なし).Step 8-13 数値: シミュ CoV=0.1826, 勾配=24.65%, 中心/周辺=1.3271, 動径 min/max=0.6151.実機 DNG+LSC (CoV=0.0695, 勾配=8.35%, C/P=1.0911, 動径 min/max=0.860) と比較して **残差 2.63×**(TECH_06 予想「真の残差 2.66×」とほぼ一致).過去 Step 8-3 の「2.1×」は PNG sRGB ガンマ圧縮による楽観値.**LSC 取り扱いの結論を [TECH_07](05_TECH/TECH_07_LSC取り扱い方針.md) に一元化**: 3 プロジェクト役割分担 (SmTIAS=HIGH_QUALITY 撮影 / SmTIAS-Evaluation=lscMap 順方向適用 / SmTIAS-LightSim=一切扱わない),シミュ側で LSC を扱わない物理的根拠 (Mitsuba orthographic = LSC 完璧補正後相当),代替案 3 つ全却下,フォールバック条件 C1-C3,残差解釈 を明文化. - **実機変更とシミュ側対応の整合マッピングを明文化 (2026-06-02)**: [TECH_08](05_TECH/TECH_08_実機変更とシミュ側対応.md) として作成.実機側 8 項目変更に対するシミュ側 3 層 (Mitsuba シーン定義 α / sm-render β / sm-evaluate γ) の対応をマッピング.**結論: シミュ側で実際に対応が必要だったのは sm-evaluate の config レベルでの OETF 無効化 (#4) と mean アンカー調整 (#3) の 2 項目のみで,他はすべて対応不要 (Mitsuba は per-channel 独立計算で AWB/AE/NR/EDGE 概念なし,orthographic で LSC 自然対応)**.計 15 項目以上で網羅チェック.**残差 2.63× は ISP 関連の対応漏れではなく,シミュ物理モデル誤差 (反射率精度・LED 配光モデル・メッシュ幾何精度等) が主因**と推定. - 補足: **「対応不要」を 2 タイプに細分化** (TECH_08 §許容している構造的差異).**タイプ I (本質構造同一・対応概念なし)** = AWB/NR/EDGE/LSC 等,**タイプ II (構造的差異あり・白板で許容)** = AF (焦点モデル)/絞り口径食/ピクセル積分/センサノイズ/QE 波長依存/シャッター方式/温度依存.特に AF は実機 perspective+固定焦点 vs シミュ orthographic 無限遠相当という構造的違い.白板撮影では影響軽微で許容.舌模型評価時や残差精緻化フェーズで再評価対象. - **S3 全体完結 — TEST_01 に Step 8-13 正式記録 + handoff 整理 (2026-06-02)**: [TEST_01 §Step 8-13](06_TEST/TEST_01_キャリブレーション検証履歴.md) に新方針 (実機 DNG+LSC linear) でのシミュ突合を正式記録.俯瞰サマリ表に新ターゲット (CoV=0.0695) と Step 8-13 結果 (CoV=0.1826, 残差 2.63×) を追加.§Step 8-N 候補 (LSC 順方向モデル) を「不採用 — Step 8-13 で方針確定」に更新(歴史的記録として保持).`handoff_smtias_lightsim/` は整理: 参考スクリプト `run_uniformity_dng.py` のみ `reference_measurement/quantitative/reference_scripts/` に移動,他は取り込み済みのため削除. diff --git a/scripts/build_sim_vs_darkroom_panel.py b/scripts/build_sim_vs_darkroom_panel.py index ed1f090..1a729df 100644 --- a/scripts/build_sim_vs_darkroom_panel.py +++ b/scripts/build_sim_vs_darkroom_panel.py @@ -13,7 +13,7 @@ 変わるため,指標は **物理 ROI のまま** 算出して title に表示する (表示用配列だけを 0〜100 正規化する) -実機側 (暗室 DNG) の評価は MiniTias-Evaluation の正規手順を再現する: +実機側 (暗室 DNG) の評価は SmTIAS-Evaluation の正規手順を再現する: load_image_dng(rgb_float32, output_color=raw, linear) → meta.json lscMap を順方向適用 (レンズビネット除去) → Rec.709 luma × 255 → rot90(-1) で portrait 向き合わせ diff --git a/scripts/extract_led_positions_from_stl.py b/scripts/extract_led_positions_from_stl.py index 1595aeb..f5d8bb9 100644 --- a/scripts/extract_led_positions_from_stl.py +++ b/scripts/extract_led_positions_from_stl.py @@ -210,7 +210,7 @@ 判定基準: |Y| > |X| なら上下軸(Y 符号で bottom/top), そうでなければ左右軸(X 符号で left/right). - MiniTIAS の 3 基板配置 (下基板 Y<0, 右基板 X>0, 左基板 X<0) に対応. + SmTIAS の 3 基板配置 (下基板 Y<0, 右基板 X>0, 左基板 X<0) に対応. """ x, y, _ = cover_center if abs(y) > abs(x): diff --git a/src/sm_tias_lightsim/evaluation/dng_loader.py b/src/sm_tias_lightsim/evaluation/dng_loader.py index 5558155..d29ce92 100644 --- a/src/sm_tias_lightsim/evaluation/dng_loader.py +++ b/src/sm_tias_lightsim/evaluation/dng_loader.py @@ -1,13 +1,13 @@ """DNG 読み込みモジュール. -MiniTias-Evaluation/src/io/dng_loader.py を SmTIAS-LightSim にコピーしたもの. -オリジナルは MiniTias-Evaluation 側で管理する.バグ修正・機能追加はそちらで行い, +SmTIAS-Evaluation/src/io/dng_loader.py を SmTIAS-LightSim にコピーしたもの. +オリジナルは SmTIAS-Evaluation 側で管理する.バグ修正・機能追加はそちらで行い, 本プロジェクトに反映する形を取る. 主要 API: - load_image_dng(path, demosaic, black_level, output_format) -> numpy.ndarray -詳細: docs/05_TECH/TECH_06_MiniTias-Evaluation引き継ぎ受領.md +詳細: docs/05_TECH/TECH_06_SmTIAS-Evaluation引き継ぎ受領.md --- @@ -54,7 +54,7 @@ black_level: int | None = None, output_format: str = "rgb_float32", ) -> numpy.ndarray: - """MiniTIAS 定量モード DNG を読み込み配列として返す. + """SmTIAS 定量モード DNG を読み込み配列として返す. rawpy の postprocess() を linear パラメータで呼び出すことで, ISP(ガンマ・自動輝度・カメラ WB)の介入を最小化した linear raw 値を取り出す. diff --git a/src/sm_tias_lightsim/evaluation/radial.py b/src/sm_tias_lightsim/evaluation/radial.py index 7a73bd2..95fa851 100644 --- a/src/sm_tias_lightsim/evaluation/radial.py +++ b/src/sm_tias_lightsim/evaluation/radial.py @@ -4,8 +4,8 @@ 中心-周辺方向の輝度変化を連続的に把握するためのプロファイルを生成する. References: - [1] MiniTias-Evaluation SPEC_02 「放射状輝度プロファイル」節 - https://github.com/rintoHasegawa/MiniTias-Evaluation + [1] SmTIAS-Evaluation SPEC_02 「放射状輝度プロファイル」節 + https://github.com/rintoHasegawa/SmTIAS-Evaluation """ import numpy @@ -57,7 +57,7 @@ def calc_radial_min_max_ratio(radial_profile: numpy.ndarray) -> dict: """動径プロファイルの最小/最大輝度比を算出する. - MiniTias-Evaluation の ``src/analysis/spatial.py:calc_radial_min_max_ratio`` を + SmTIAS-Evaluation の ``src/analysis/spatial.py:calc_radial_min_max_ratio`` を SmTIAS-LightSim にマージしたもの. ``calc_radial_profile`` で得た N 点の輪帯平均輝度のうち,最小値を最大値で割った比 @@ -67,7 +67,7 @@ ``nan`` ビン(空ビン)は無視する. References: - MiniTias-Evaluation ``src/analysis/spatial.py:calc_radial_min_max_ratio`` + SmTIAS-Evaluation ``src/analysis/spatial.py:calc_radial_min_max_ratio`` [TEST_05](docs/06_TEST/TEST_05_PNG_DNG評価比較.md) — 新指標の物理的意味 Args: diff --git a/src/sm_tias_lightsim/evaluation/visualize.py b/src/sm_tias_lightsim/evaluation/visualize.py index aa43002..d0d1f8f 100644 --- a/src/sm_tias_lightsim/evaluation/visualize.py +++ b/src/sm_tias_lightsim/evaluation/visualize.py @@ -6,7 +6,7 @@ 各関数は figure を生成 → savefig → plt.close(fig) の形式で実装し, メモリリークを防ぐ. -カラーマップ・軸ラベル・全体のスタイルは MiniTias-Evaluation の出力と揃えている +カラーマップ・軸ラベル・全体のスタイルは SmTIAS-Evaluation の出力と揃えている (実測 PNG とシミュ PNG を並べて比較できるように). """ @@ -25,7 +25,7 @@ import matplotlib.pyplot as plt # noqa: E402 import numpy # noqa: E402 -# MiniTias-Evaluation の出力に合わせて hot カラーマップを統一使用する. +# SmTIAS-Evaluation の出力に合わせて hot カラーマップを統一使用する. _LUMINANCE_CMAP = "hot" # ゾーン境界の表示色(中心-中間,中間-周辺の 2 本) @@ -74,7 +74,7 @@ def save_histogram(luminance: numpy.ndarray, output_path: Path, bins: int = 50) -> None: """輝度ヒストグラムを PNG として保存する. - 横軸は uint8 全範囲(0〜255)に固定して MiniTias-Evaluation と比較しやすくする. + 横軸は uint8 全範囲(0〜255)に固定して SmTIAS-Evaluation と比較しやすくする. Args: luminance: 輝度画像(H x W, float). @@ -120,7 +120,7 @@ ) -> None: """ゾーンマップを PNG として保存する. - MiniTias-Evaluation 互換:背景に輝度マップ(hot)を表示し、 + SmTIAS-Evaluation 互換:背景に輝度マップ(hot)を表示し、 その上にゾーン境界(center-middle,middle-periphery)を線で重ねる. `luminance` が None の場合は zone_map のみを 3 色で塗り分けるフォールバック動作. diff --git a/src/sm_tias_lightsim/evaluation/zones.py b/src/sm_tias_lightsim/evaluation/zones.py index bb69855..14482e3 100644 --- a/src/sm_tias_lightsim/evaluation/zones.py +++ b/src/sm_tias_lightsim/evaluation/zones.py @@ -3,8 +3,8 @@ ROI を中心・中間・周辺の 3 同心楕円ゾーンに分割し,各ゾーンの輝度統計を算出する. References: - [1] MiniTias-Evaluation SPEC_02 「空間分析」節 - https://github.com/rintoHasegawa/MiniTias-Evaluation + [1] SmTIAS-Evaluation SPEC_02 「空間分析」節 + https://github.com/rintoHasegawa/SmTIAS-Evaluation """ import numpy diff --git a/src/sm_tias_lightsim/uniformity.py b/src/sm_tias_lightsim/uniformity.py index 9779ffa..e5be312 100644 --- a/src/sm_tias_lightsim/uniformity.py +++ b/src/sm_tias_lightsim/uniformity.py @@ -1,8 +1,8 @@ """輝度均一性評価モジュール. -出典: https://github.com/rintoHasegawa/MiniTias-Evaluation +出典: https://github.com/rintoHasegawa/SmTIAS-Evaluation 方針: PLAN_02 Step 1 の方針 (a) — コピーして独立運用 -ローカル参照ファイル: MiniTias-Evaluation/src/uniformity.py +ローカル参照ファイル: SmTIAS-Evaluation/src/uniformity.py """ import numpy diff --git a/src/sm_tias_lightsim/visualize/baker.py b/src/sm_tias_lightsim/visualize/baker.py index 189c625..0303166 100644 --- a/src/sm_tias_lightsim/visualize/baker.py +++ b/src/sm_tias_lightsim/visualize/baker.py @@ -206,7 +206,7 @@ - mode="path": コサイン重点サンプリング + Mitsuba path tracer による多重反射込み照度. 完全シーン(emitter + BSDF を含む)に対してパス積分を評価するため, - 内壁の多重反射で均一化された照度分布が得られる(MiniTIAS の設計目標と整合). + 内壁の多重反射で均一化された照度分布が得られる(SmTIAS の設計目標と整合). **評価板は直接照度ベイクでは真っ暗になるが,path ベイクでは多重反射で非ゼロになる.** scalar_rgb variant を使用(LLVM 不要・DRJIT_LIBLLVM_PATH 不要). 計算コストは face 数 × samples 倍(直接ベイクより大幅に重い). diff --git a/tests/evaluation/test_dng_loader.py b/tests/evaluation/test_dng_loader.py index 4fe8f31..fb6475a 100644 --- a/tests/evaluation/test_dng_loader.py +++ b/tests/evaluation/test_dng_loader.py @@ -1,8 +1,8 @@ """evaluation/dng_loader.py および evaluation/radial.py の仕様ベーステスト. 仕様出典: -- docs/05_TECH/TECH_06_MiniTias-Evaluation引き継ぎ受領.md -- docs/05_TECH/TECH_05_MiniTiasEvaluation_DNG対応要求仕様.md +- docs/05_TECH/TECH_06_SmTIAS-Evaluation引き継ぎ受領.md +- docs/05_TECH/TECH_05_SmTIAS-Evaluation_DNG対応要求仕様.md - .claude/rules/testing.md テスト対象: @@ -451,7 +451,7 @@ return luma_portrait[roi_y : roi_y + roi_h, roi_x : roi_x + roi_w] -# 白板 ROI 座標 (MiniTias-Evaluation/config/roi_config.json より) +# 白板 ROI 座標 (SmTIAS-Evaluation/config/roi_config.json より) # minitias.whiteboard: {x: 539, y: 1015, width: 1400, height: 1409} _WHITEBOARD_ROI = {"x": 539, "y": 1015, "width": 1400, "height": 1409} @@ -489,7 +489,7 @@ 評価条件: linear (output_color=raw) / portrait / LSC 補正あり / 白板 ROI - (TECH_06 §4: 「暗闇 = MiniTIAS のみ撮影」) + (TECH_06 §4: 「暗闇 = SmTIAS のみ撮影」) """ @pytest.fixture(scope="class") diff --git a/tests/evaluation/test_radial.py b/tests/evaluation/test_radial.py index 88ac990..5060363 100644 --- a/tests/evaluation/test_radial.py +++ b/tests/evaluation/test_radial.py @@ -1,6 +1,6 @@ """evaluation/radial.py の仕様ベーステスト. -仕様出典: MiniTias-Evaluation/SPEC_02_照明均一性評価アルゴリズム.md「放射状輝度プロファイル」節 +仕様出典: SmTIAS-Evaluation/SPEC_02_照明均一性評価アルゴリズム.md「放射状輝度プロファイル」節 """ import numpy diff --git a/tests/evaluation/test_zones.py b/tests/evaluation/test_zones.py index a2f7408..8facbc8 100644 --- a/tests/evaluation/test_zones.py +++ b/tests/evaluation/test_zones.py @@ -1,6 +1,6 @@ """evaluation/zones.py の仕様ベーステスト. -仕様出典: MiniTias-Evaluation/SPEC_02_照明均一性評価アルゴリズム.md「空間分析」節 +仕様出典: SmTIAS-Evaluation/SPEC_02_照明均一性評価アルゴリズム.md「空間分析」節 """ import numpy diff --git a/tests/test_uniformity.py b/tests/test_uniformity.py index 469140e..e35552d 100644 --- a/tests/test_uniformity.py +++ b/tests/test_uniformity.py @@ -1,6 +1,6 @@ """uniformity.py の仕様ベーステスト. -仕様出典: MiniTias-Evaluation/SPEC_02_照明均一性評価アルゴリズム.md +仕様出典: SmTIAS-Evaluation/SPEC_02_照明均一性評価アルゴリズム.md """ import numpy