fullseye

言語 / Language: 日本語 · English

紙面の計測館 ―― 真値を自分で仕込んで、画像計測の「壊れる場所」を先に知る

PoC museum montage

↑ 展示の場面図を 12 枚並べたもの。どれも PoC スクリプト自身の出力で、記事のために描いた絵は 1 枚もありません。

図と op の使い方は docs サイト furuse.work と共通です。各展示の「使用 op」から op ノート(型契約・罠・図・Studio で走るプログラム)へ飛べます。AI に読ませるなら AI_RAG_GUIDE。

TL;DR

版の更新(新しい順)

2026-09-15 — Fullseye 0.1.11 を公開しました(pip install -U fullseye)。この展示館に関わる中身は 4 つです。

手元の全テストは 13,073 件が通っています(3.11、全 extras)。

展示室の案内

この館は記事を分けています。どの棟も単体で読めます —— 下の表から入ってください。番号(No.2026.037)は収蔵番号で、棟を移しても分けても変わりません。

記事 展示室 展示数
紙面の計測館 —— 何を測るかの棟(産業検査・寸法計測・医用生物・天文環境) 産業検査 / 寸法・形状計測 / 医用・生物 / 天文・環境 133
紙面の計測館 —— どう測るかの棟(撮像品質・時系列・幾何校正・色・法科学・3-D 形状) 撮像品質・復元 / 時系列を 3-D として測る / 幾何・校正 / 色・分離 / 法科学・文書 / 3-D 形状 98
紙面の計測館 —— 装置の棟(センサーと計測器を物理から再現する) 装置の棟 32
数学の絵は、きれいなので誰も確かめない ―― 定理を門にして描く PoC シリーズ 数学の絵 7
自動運転のデモは動くので、誰も正しさを測らない ―― 定理と第 2 実装で採点する PoC シリーズ 自動運転 13

用語(先に読むと楽)

展示館のテーゼ

PoC を 1 本ずつ書いていた段階では、分野ごとに別々の話をしているつもりでした。粉体の粒度分布と、ディスプレイ検査のモアレと、全天カメラの雲量に、共通点があるとは思っていません。ところが並べると、同じ形の罠が別々の物理から出てきます。

粒度分布では、触れ合った粒子が 1 個に融合する誤りは大きい側へ、視野の縁で切れる誤りは小さい側へ引きます。面積率を 1.9 % から 28.2 % まで振ると代表径 D50 の誤差は -4.9 % から +4.5 % へ単調に動き、途中の 13.8 % でほぼゼロ(+0.55 %)を通ります。そこは正確なのではなく、塊 140 個のうち融合 28 件と縁切れ 19 件が釣り合っているだけでした。モアレでは、ならしを強くするほどモアレの漏れ込み(過大)が減り本物のムラの減衰(過小)が増え、σ = 8 px で合計誤差 +0.9 % ―― 内訳は漏れ +8.3 % / 減衰 -7.4 %。雲量では、魚眼の幾何だけの誤差 -5.02 % と太陽まわりの偽陽性だけの誤差 +37.95 % が、素朴な数え方では +29.73 % に見えます。

同じ形は、海氷密接度(密接度 0.15 → 0.85 で偏りが -5.9 → +6.0 ポイントと符号を変え、0.49 付近でゼロを横切る)、太陽の縁(しきい値 0.26 付近でぼけの影響が消えるが、減光係数を変えると 0.38 へ動く)、細胞計数(過分割と過統合が釣り合う点で個数の偏り +0.3 個なのに分割誤りが 13.3 件残る)、除霞(全体 +4.04 dB の中身は近景 -1.49 dB の劣化)、タイムラプス(画素の面積で合体が早く見える分と、フレーム格子への丸めで遅く見える分が逆向き)にも出ました。

ここから引き出せる、書き手が消えても残る規則は 3 つです。失敗の種類ごとに数える(誤読と読み取り不能、過分割と過統合、曖昧な誤リンクと欠測による誤リンク ―― 畳んだ瞬間に「どちらを直すか」が決まらなくなる)。対照群を置く(原因を 1 つだけ止めた条件が無いと、打ち消しは「合っている」と区別できない)。打ち消し点を「最良の条件」と呼ばない(その点は条件を少し変えるだけで動く)。

最近の追加(新しい順)

自分の問題に当てはめるには

105 本のうち 99 本は合成データで閉じています。2026-09-08 に初めて実写を 6 本入れました(ステレオ対 / コイン / 深宇宙 / 免疫染色 / ブレ取り / テクスチャの回転)。合成の 99 本も、実データへの差し替え口を最初から決めて書いてあります。

1. EXTEND の印を探す。 各スクリプトの docstring に EXTEND: で始まる段落があり、「この関数の戻り値をこれに置き換える」と書いてあります。ほとんどの PoC は合成器 1 関数(make_scene / render / build_case など)だけを差し替えれば、ゼロ点・崖の掃引・表の印字はそのまま動きます。同時に「真値が消えるので測れなくなるもの」も書いてあります ―― 手ブレの PoC では実写真だと意味を保つのはリンギングと速度の章だけ、パノラマなら閉ループ誤差だけ、追跡なら往復不一致だけ。真値なしで測れる絶対量は少ないので、そこを先に読んでから撮り方を決めるのが早道です。

2. op は 2 段で呼べる。 1 行で済ませたいときは fs.apply(img, "op名", ...)、引数の規約まで握りたいときは fs.ledger.<op名>(...)。PoC の中で裸のモジュールを直接 import している箇所には「公開経路に出ていない」と注記してあります(それ自体が末尾の「穴」の一覧です)。

3. 図と使い方は docs サイトにある。 https://furuse.work/ に op ごとのノート(何をする op か、型契約、罠、関連 op、図)があります。各展示には、その PoC が呼んでいる op のノートへのリンクが付きます。Fullseye Studio を横に開いておくと、PoC が印字した中間結果(マスク、断面、スペクトル)を画像ウィンドウや 3-D 表示で確かめられます。

4. AI に読ませる。 pip install fullseye のあと fullseye-rag を 1 回叩くと、op のノート群が Claude Code のスキルとして登録されます。この状態で「この PoC を自分の顕微鏡画像に差し替えて」と頼むと、AI は EXTEND 段落と op ノートを読んで差し替え案を書きます。私が使っている運用はこれで、この展示の PoC 群も同じ経路で書き進めました。


正直な限界

測っていないもの。 105 本のうち 99 本は合成データです。実機の記録には、転がり滑り、複数の共振、紙の反り、焦点ブリージング、2 光源の混在といった、ここで仕込んでいない要因が乗ります。各 PoC が出す検出限界や崖の位置はそのモデル・その条件での上界であって現場の値ではなく、どの docstring にもそう書いてあります。バーコードとマトリクスコードは実在規格ではないので、読取率を規格準拠リーダの性能として引用してはいけません。改竄検出は防御側だけを扱い、うまく作る方法は含めていません。

PoC が見つけて直したもの。 CT のランプフィルタが DC ビンで各投影の平均を丸ごと引いていた(質量欠損 -3.34 % → -0.0099 %)。当初「検出器を増やすと改善する」と読んでいたのは取り違えで、363 bin と 511 bin が同じ値を返していたのは両方 FFT のパッド長 1024 に詰まるからでした。地形の天空率が 41.9 秒かかっていたのを、結果 bit 一致のまま 2.03 秒に。DIC で既存の piv_cross_correlate を検索が返さず「無い」と書きかけた件は、検索の側を直しました。mueller_apply が画像に効かなかった件は broadcast を通しました。

PoC が見つけたが、op 本体はまだ直していないもの。 カメラ校正・パノラマが公開経路(fs. / fs.ledger / op レジストリ)から届かない。h_maxima の h が正規化画像に対する比なので、大きい細胞が 1 つ入るだけで小さい細胞側の下限が 0.42 → 0.80 画素へ上がる。vol_label の既定 26 近傍が寛容側でニアミスを合体させる。gauss_image の σ が 0.3〜3.0 に固定、min_filter の窓が 3, 5, 7, 9 に固定、局所しきい値の窓が最大 4 px / 15 px でモジュール寸法に届かない。ncc_locate が相関マップを返さず突出度が計算できない。reprojection_error に歪み引数が無い。2-D 画像を任意倍率でリサイズする op、任意のホモグラフィで歪ませる op、大気散乱の族、統計ベースの光源推定 op、光弾性の族が無い。polarization_separate の拡散成分が R_p·E だけ系統的に大きい。PoC は道具の穴を出すためにある、というのがこの一覧の言い分です。


次回に続く

穴の一覧は、そのまま次の作業台帳です。公開経路に出ていない実装を出す、既定値が寛容側の op を締める、窓が固定の op を開ける ―― 1 つ直すたびに、この展示の PoC を走らせ直して数字がどう動くかを見られます。ゼロ点は動かないはずで、動いたら何かを壊した合図です。

もう 1 つ気になっていることがあります。通し主題の「逆向きの 2 つの失敗」は、7 つの PoC で別々の物理から出ました。では、実データに差し替えたとき ―― 合成には入っていなかった要因が乗ったとき ―― でも同じ形が出るのでしょうか。それとも合成だから綺麗に釣り合って見えただけなのでしょうか。2026-09-08 に最初の 2 歩を踏みました。出てきたのは合成では作れない型の躓きです —— 配布元が「欠測は NaN」と書いた真値の穴が実際は +inf で、nan 系の集計だけが 2.4 px ずれること。既定の探索範囲が実物の目盛りに届かず bad2 が 95 % になること。距離に落とす式に主点オフセットが無く、無視すると単一の係数では直せない反り(残差 958 mm RMS = レンジの 33 %)が出ること。そして、答えが合っていても余裕が 0.05 しかないこと。逆向きの 2 つの失敗が実データでも釣り合うのかは、まだ 2 本ぶんしか答えがありません。次もそこを歩きます。


作り手について

問いと方向は私が決め、実装・掃引・対照群の追加・予想の反証は Claude Code に回しました。docstring の「予想が外れた」は、その反証の記録です。

自分の分野の 1 本を走らせて、崖の位置が現場の感覚と違ったら、それがいちばん聞きたい話です。


この展示館は Claude Code と一緒に作りました。 問いと方向決めは私、実装・掃引・対照群・敵対レビューは Claude Code、という分業です。53 本の PoC を 2 日で走らせて図まで揃えられたのは、この運用のおかげです。試してみたい方は、こちらの招待リンクから 1 週間の無料トライアル が使えます: claude.ai/referral/0sqPw8E_lw

面白い展示が 1 つでもあったら、いいね・ストックをもらえると助かります。どのウィングを次に増やすかは反応を見て決めるつもりなので、「自分の分野のこれが欲しい」もコメントで教えてください。実データに差し替えて崖の位置が変わった話は、いちばん聞きたい話です。