舌撮影デバイスの基準「最大を 1 としたときの最小 ≥ 0.9」に対し,実機を作る前にシミュレーションが 参考になるかを確かめるため,実機 DNG(全灯 1 枚・単灯 3 枚)とシミュを同じノイズ処理で 突き合わせた(2026-09-14〜15).評価の決め手は集約指標(min 等)ではなく輝度マップの形 (全灯 + 単灯 3 灯)とした(ユーザー方針).結論: 同心円方向(お椀)は材質で合うが,単灯で 明部が点灯基板の反対側へ寄る量がシミュは実機の半分以下.これは壁の光沢(ω・α)では 形全体を崩さずに合わせられず,LED の配光を狭める(spot,半値全幅 45〜60°) ことで説明できる. 全構成に共通する「左上が暗い」傾き成分はどちらでも半分しか出ず,基板の位置・向きか ISP の LSC 残差が残る課題である.
関連:
| 構成 | ファイル | 備考 |
|---|---|---|
| 全灯 18 灯 | reference_measurement/quantitative/MiniTIAS_QM_20260601_124500.dng | 定量モード・ISO 40・8.3 ms・LSC マップ付き |
| 下 / 左 / 右 単灯 | lightsim/raw/SmTIAS_QM_20260615_{141420,150300,170948}.dng | 同一セッション・露出固定 |
読み込みは TEST_14 と同じ経路(load_image_dng → lscMap 順適用 → Rec.709 → rot90(−1) → 白板 ROI
1400×1409 px).ROI はシミュ ROI(464×450 px)へリサイズしてから同じ処理を掛ける(平滑化 σ を
画素で揃えるため.約 3×3 画素の平均でセンサノイズも落ちるが,ノイズ補正はリサイズ後の残差から
推定するので整合する).
基準シーン scene_baseline.yaml(実機と同じ筐体・18 灯)から,単灯は led_bottom_* /
led_left_* / led_right_* の 6 灯だけを残して作る.材質は次の 2 つを主に使った.
full_base_fix /
singles_fix,spp 1024)output/real_vs_sim/sim_*rho081*)レンダは研究室サーバ Newton GPU 0(cuda_ad_rgb・mitsuba 3.7.1).
evaluation/fullimage.py).参考に補正なし・
輪帯平均・画素.output/real_vs_sim/real_vs_sim_{legacy,rho081}.png.
| 指標 | 実機 | ρ=0.81 純 diffuse(spp 4096) | 採用材質 ρ=0.85 ω=0.05 α=0.1 |
|---|---|---|---|
| min(画像全体・補正) | 0.727 | 0.787(+0.060) | 0.803(+0.075) |
| min(輪帯平均) | 0.873 | 0.874(+0.001) | 0.901(+0.028) |
| 構造 CoV | 0.067 | 0.046 | 0.039 |
| 20 分割プロファイル RMSE / 最大差 | — | 0.0055 / 0.011 | 0.012 / — |
| 正規化マップ RMS 差 / 最大差 | — | 0.038 / 0.103 | 0.046 / — |
| SSIM / NCC | — | 0.996 / 0.858 | — / 0.858 |
| 方位 m=1 a1 / b1 | +3.8% / +7.1% | −0.3% / +4.0% | −0.2% / +3.6% |
output/real_vs_sim/bsdf_grid_vs_real.csv).ρ を下げると
お椀が深くなりすぎて放射プロファイルが崩れるだけ.output/real_vs_sim/shapes_{legacy,rho081}.png(上 = 実機・中 = シミュ・下 = 差分).
採用材質(ρ=0.85・ω=0.05・α=0.1):
| 構成 | 差分 RMS | SSIM | NCC | 傾き 実機 / シミュ | お椀 実機 / シミュ | ピーク位置 実機 / シミュ |
|---|---|---|---|---|---|---|
| 全灯 | 0.040 | 0.92 | 0.86 | 9.6% / 4.1% | −8.2% / −6.5% | (+0.41, −0.38) / (+0.03, −0.13) |
| 下 単灯 | 0.039 | 0.90 | 0.84 | 8.1% / 3.4% | −10.2% / −6.7% | (+0.14, −0.43) / (−0.07, −0.22) |
| 左 単灯 | 0.045 | 0.90 | 0.92 | 11.9% / 5.3% | −9.4% / −6.2% | (+0.65, −0.52) / (+0.25, −0.31) |
| 右 単灯 | 0.022 | 0.91 | 0.94 | 6.6% / 4.8%(方位一致) | −7.9% / −6.5% | (−1.00, −0.32) / (−0.28, −0.20) |
scripts/sweep_wall_bsdf_spot.py フェーズ A.ρ ∈ {0.85, 0.81} × ω ∈ {0, 0.05, 0.15, 0.30, 0.50, 0.70}
× α ∈ {0.02, 0.05, 0.1, 0.3, 0.6}(ω=0 は純 diffuse)× 4 構成 = 208 レンダ(spp 2048).
output/wall_bsdf_spot/wall_bsdf_heatmap.png・shape_fit_a.csv.
| ρ=0.85・α=0.1 | ω=0 | 0.05 | 0.15 | 0.30 | 0.50 |
|---|---|---|---|---|---|
| 左単灯 ピーク x(実機 +0.65) | +0.22 | +0.30 | +0.61 | +0.72 | +0.80 |
| 右単灯 ピーク x(実機 −1.00) | −0.19 | −0.24 | −0.62 | −0.75 | −0.85 |
| 全灯 お椀(実機 −8.2%) | −7.1% | −6.4% | −5.2% | −3.6% | −2.0% |
| 全灯 傾き(実機 9.6%) | 4.2% | 4.0% | 3.4% | 1.9% | 2.3% |
| 4 構成の差分 RMS 平均 | 0.039 | 0.036 | 0.038 | 0.049 | 0.073 |
同スクリプト フェーズ B.採用材質のまま LED を Mitsuba の spot(面光源と同じ位置・向き・全光束)
にし,半値全幅 FWHM ∈ {30, 45, 60, 90, 120}°(cutoff = 2/3 FWHM,beam = 1/3 FWHM)× 4 構成
= 20 レンダ(spp 4096).output/wall_bsdf_spot/spot_fwhm.png・shape_fit_b.csv.
| FWHM | 30° | 45° | 60° | 90° | 120° | 面光源(ランバート) |
|---|---|---|---|---|---|---|
| 左単灯 ピーク x(実機 +0.65) | +0.68 | +0.60 | +0.51 | +0.38 | +0.29 | +0.30 |
| 右単灯 ピーク x(実機 −1.00) | −0.72 | −0.64 | −0.52 | −0.41 | −0.34 | −0.24 |
| 右単灯 傾き(実機 6.6%) | 8.3% | 7.4% | 6.2% | 5.0% | 4.7% | 4.8% |
| 左単灯 傾き(実機 11.9%) | 8.2% | 7.4% | 6.6% | 5.6% | 5.3% | 5.3% |
| 4 構成の差分 RMS 平均 | 0.035 | 0.034 | 0.034 | 0.036 | 0.037 | 0.036 |
--only scripts だけだと新しい src モジュールが無くて落ちる(TEST_19 と同じ).
configs/_tmp_* は push 対象外なので,スイープ用 YAML はサーバ上で生成する設計にした.# 全灯: min・放射プロファイル・形(ρ=0.81 は事前にサーバでレンダ)
uv run python scripts/compare_real_vs_sim_metrics.py --sim output/real_vs_sim/sim_rho081_spp4096/luminance.npy \
--label "ρ=0.81 純 diffuse・spp4096" --tag rho081
# 形の一致(全灯 + 単灯 3 灯)
uv run python scripts/compare_real_vs_sim_shapes.py --sim-set legacy
uv run python scripts/compare_real_vs_sim_shapes.py --sim-set rho081
# 壁反射特性・spot スイープ(サーバ.YAML はサーバ上で生成)
uv run sm-remote push --only scripts
uv run sm-remote run --name wall --gpu 0 --threads 16 -- python scripts/sweep_wall_bsdf_spot.py --phase all --workers 2
uv run sm-remote pull wall_bsdf_spot
uv run python scripts/build_shape_fit_comparison.py
出力: output/real_vs_sim/(real_vs_sim_*.png/csv・shapes_*.png/csv・bsdf_grid_vs_real.csv・
ρ=0.81 のレンダ 4 本),output/wall_bsdf_spot/(228 レンダ + shape_fit_a.csv / shape_fit_b.csv +
wall_bsdf_heatmap.png / spot_fwhm.png).