fullseye

実物の画像から物理モデルの係数を合わせる(sim-to-real 較正)

できること

周辺減光の強さ・ボケの幅・膜の厚さ・カメラの利得のような物理の係数を、実物の画像との差が雑音の大きさになるまで自動で 合わせます(simcal、10 op)。模型は fullseye の op の連鎖(例 thin_film_reflectance → 画像 → 利得と黒レベル)で、各段の 引数を単位・範囲・線形 / 対数つきの「つまみ」にします。当てはめは雑音の分散で重みをつけた最小二乗(重みは予測で更新)。

この層の要点は数を出さないことです。

What it does

Ten ops (simcal / simcalcheck) fit the physical coefficients of a forward model built from fullseye ops (knobs with units, ranges and linear/log scales) to real images by noise-weighted least squares, and refuse to give a number for a coefficient the images do not determine: confounded knobs (illumination x gain, n x d at one wavelength) are reported as the determined combination, knobs without influence or pinned to a range end are refused, a profile likelihood that closes on one side only withdraws the estimate. Over-fitting gates on held-out images reject an 8th-order vignetting polynomial, and residual PCA against the Tracy-Widom edge of white noise detects a model discrepancy (a decentred lens).

向くところ / 向かないところ

推奨パイプライン

simcal_model → simcal_observe → simcal_fit → simcal_identifiability → simcal_report

simcal_model で連鎖・つまみ・雑音モデルを組み → simcal_observe で実物の画像(images)を付け → simcal_fit で拒否つきの当てはめ → simcal_identifiability で下界とプロファイル(片側しか閉じないつまみは取り下げ)→ simcal_report で表 1 枚。

代替

撮る前に simcal_screen(効くか・交絡か・出力の次元)。区間が要るなら simcal_uncertainty(Laplace / ブートストラップ)、 取り置いた画像があれば simcal_validate(過適合の門・LOCKED は 1 回)、模型の不足を疑うなら simcal_discrepancy。 感度だけなら sens_morris / mv_confounding、残差の構造だけなら mv_residual_pca。

限界

雑音モデルが物差しで、これを見誤ると下界も区間も見誤ります。位置合わせは整数画素。谷がいくつもある問題(干渉の次数)では method="multistart" を使い、fit.warnings を読むこと。モデルの食い違いがあれば不確かさは楽観側です。

実寸校正

係数はつまみの単位で返ります。画素ピッチと倍率は積でしか効かないので、両方をつまみにすると拒否されます —— mm/px を 1 つの つまみにするか、片方を固定してください。

最初の 1 本

import fullseye as fs

m = fs.ledger.simcal_model()                 # 例の模型(チャート → cos^4 の周辺減光 → 利得と黒レベル、合成の観測つき)
r = fs.ledger.simcal_fit(m)
r = fs.ledger.simcal_identifiability(r)
print(fs.ledger.simcal_report(r)["text"])
# demo: chart -> cos^4 vignetting -> gain/offset — status: accepted
#   f            = 22.0876 px  [21.8461, 22.334]
#   gain         = 899.054 DN  [893.726, 904.382]
#   offset       = 63.5621 DN  [61.2762, 65.8468]

裏づけ