言語 / Language: 日本語 · English
紙面の計測館 ―― 真値を自分で仕込んで、画像計測の「壊れる場所」を先に知る
↑ 展示の場面図を 12 枚並べたもの。どれも PoC スクリプト自身の出力で、記事のために描いた絵は 1 枚もありません。
図と op の使い方は docs サイト furuse.work と共通です。各展示の「使用 op」から op ノート(型契約・罠・図・Studio で走るプログラム)へ飛べます。AI に読ませるなら AI_RAG_GUIDE。
TL;DR
- 画像で「測る」仕事(ひび割れ幅、歯車の偏心、細胞の個数、星の明るさ、河川の水位…)を、答えを自分で仕込んだ合成データ(と、2026-09-08 に加わった実写 6 本)で採点する実行可能なスクリプト群を、画像処理ライブラリ Fullseye の
examples/poc_*.pyとして公開しました。1 本ずつpy -3.11 examples/poc_<名前>.pyで走り、数字は全部その場で印字されます。 - どの 1 本にも同じ 3 つが入っています: 真値(自分で仕込んだ正解)、ゼロ点(いちばん素朴なやり方の成績)、どこで壊れるかの崖。「できました」ではなく「ここまでは信じてよく、ここから先は嘘になる」を数字で置く形です。
- 通して見えた 1 つの型 ―― 向きの逆な 2 つの失敗は打ち消し合い、まとめた 1 つの数字はそのときいちばん良く見える。粒度分布・モアレ・雲量・海氷・細胞計数・除霞・タイムラプスで、別々の物理から同じ形が出ました。
- 展示は 9 つのウィング(産業検査 / 寸法・形状 / 医用・生物 / 天文・環境 / 撮像品質・復元 / 時系列を 3-D として測る / 幾何・校正 / 色・分離 / 法科学・文書)。自分の分野だけ拾ってもらえば足ります。
- 各スクリプトには実写へ差し替える口(
EXTENDの印)があり、合成器 1 関数を差し替えれば採点の枠組みはそのまま自分のデータで動きます。使っている op はすべて docs サイトのノートに図つきで載っています。 - PoC を書くことでライブラリ側の穴(公開経路に出ていない実装、既定値が寛容側の op、窓が固定の op)も多数見つかりました。直したもの・直していないものを分けて末尾に書きます。
版の更新(新しい順)
2026-09-15 — Fullseye 0.1.11 を公開しました(pip install -U fullseye)。この展示館に関わる中身は 4 つです。
- この版から Zenodo に書庫があり、DOI で引けます。 version DOI 10.5281/zenodo.22761196、concept DOI 10.5281/zenodo.22761195(常に最新版へ解決)。展示の数字を報告や論文に引くときは、走らせた版とこの DOI を添えてください。0.1.10 以前は git のタグと PyPI にしかありません。
-
数を数える op の食い違いを直しました。
connectionが numpy 側で 4 連結、OpenCV 側で 8 連結になっていて、8×8 の市松が 32 個と 1 個に分かれていました(契約は 8 連結)。同じ仕様を Rust でもう一度実装して初めて見つかった欠陥で、単一実装のテストでは原理的に捕まりません。ほかにframe_alignの網点状の繰り返しでの誤整列、normals_from_depthが画素ピッチを 1 と決め打ちしていた件、polar_unwrap/cylinder_unwrapが環が視野外のとき黙って通していた件、voxel_to_meshの面の向きとmesh_volumeの符号、そしてこの展示館の門そのものが合否を計算した直後に捨てていた件を直しました。詳細は CHANGELOG の 0.1.11。 -
LLM から直接使える入口(MCP サーバ)が付きました。 Claude Code なら
claude mcp add fullseye -- py -3.11 -m fullseye.mcpで登録でき、op の検索・ノートの閲覧・画像の読み込み・パイプラインの実行までを AI 側から呼べます。返り値は必ず数値統計 + 判定(空 / 定数 / 非有限 / 範囲外 / 飽和)+ 劣化台帳で、判定が ok でないときだけ入出力を並べた 96 px の小図が付きます —— この展示館が繰り返してきた「走った ≠ 意味のある出力が出た」を、機械の側が言う仕組みです。今は checkout 限定で、pip 版からは理由つきで止まります(docs/MCP.md)。 -
他の言語からの入口。 5 op だけの C ABI(
fullseye_abi.h)と Rust の参照実装を置き、C / C# / LuaJIT / Python(ctypes)の見本が同じ 1 本の .dll を叩いて同じ 5 行を印字します。918 op のライブラリを別言語に移したものではなく、上の連結数の食い違いを見つけた「第 2 実装」がその正体です。
手元の全テストは 13,073 件が通っています(3.11、全 extras)。
展示室の案内
この館は記事を分けています。どの棟も単体で読めます —— 下の表から入ってください。番号(No.2026.037)は収蔵番号で、棟を移しても分けても変わりません。
| 記事 | 展示室 | 展示数 |
|---|---|---|
| 紙面の計測館 —— 何を測るかの棟(産業検査・寸法計測・医用生物・天文環境) | 産業検査 / 寸法・形状計測 / 医用・生物 / 天文・環境 | 149 |
| 紙面の計測館 —— どう測るかの棟(撮像品質・時系列・幾何校正・色・法科学・3-D 形状) | 撮像品質・復元 / 時系列を 3-D として測る / 幾何・校正 / 色・分離 / 法科学・文書 / 3-D 形状 | 106 |
| 数学の絵は、きれいなので誰も確かめない ―― 定理を門にして描く PoC シリーズ | 数学の絵 | 7 |
| 自動運転のデモは動くので、誰も正しさを測らない ―― 定理と第 2 実装で採点する PoC シリーズ | 自動運転 | 13 |
用語(先に読むと楽)
- PoC(proof of concept、概念実証) —— 「この考え方で本当に測れるのか」を最小の実装で確かめる短いプログラム。ここでは 1 本 = 1 つの計測課題。
- 真値(ground truth) —— 採点に使う正解。この展示の PoC はほとんどが真値を自分で作る(既知の形・既知の変形・既知の雑音から画像を合成する)ので、推定値との差を丸め誤差の桁まで言えます。実写を使う 6 本は、真値の出どころを 3 通りに分けています —— 配布元が真値を付けているもの(ステレオ)、独立な 3 経路の一致で決めるもの(コイン)、背景だけ本物にして対象は自分で仕込むもの(深宇宙・免疫染色)。
- ゼロ点(null baseline) —— 「いちばん素朴なやり方」の成績。二値化して数える、1 枚目で較正して使い回す、何もしない、など。ゼロ点に勝てない手法は、勝てないと書くのが約束です。
- 閉形式(closed form) —— 数値計算ではなく式で書ける答え。球冠の立体角、インボリュート歯形、円板圧縮の応力場、1 次元熱伝導の解。真値を閉形式で持てると、合成器そのものを検算できます。
- 打ち消し(cancellation) —— 逆向きの 2 つの誤差が足し合わさって小さく見える現象。この展示の通し主題。**「合っている」のではなく「釣り合っているだけ」**を見分けるのが目的です。
- 対照群(control) —— 原因を分けるために「その要因だけ止めた条件」を並べること。検出を止めて幾何だけの誤差を測る、ぼけをゼロにして減光だけの偏りを測る、など。
展示館のテーゼ
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 つだけ止めた条件が無いと、打ち消しは「合っている」と区別できない)。打ち消し点を「最良の条件」と呼ばない(その点は条件を少し変えるだけで動く)。
最近の追加(新しい順)
- 2026-10-21 — No.2026.275 全天球の検査撮影と立体表示を一つの測定工程として確かめる
- 2026-10-20 — No.2026.267 設計の関係を「解」で持つ ―― 絞りを変えても焦点と F ナンバーが追従する二重ガウス型、afocal 望遠鏡、曲面の像面、奇数次の非球面
- 2026-10-20 — No.2026.270 公開 .zmx 処方を独立計算で照合し、検査レンズとして採点する
- 2026-10-20 — No.2026.268 水が検査画像にどう写るか ―― プールの底のコースティクス・瓶の側面像・濡れた板・船体の水中画像を、閉形式と第 2 の方法で採点
- 2026-10-20 — No.2026.269 処方どおりのレンズ越しに 3 次元の場面を撮る ―― 被写界深度・猫の目のボケ・隅の光量・色収差・ゴーストを、閉形式と既存の op と独立の追跡で採点
- 2026-10-20 — No.2026.271 レンズの製造公差を、MTF・歩留まり・補償ストロークまで一枚の予算にする
- 2026-10-20 — No.2026.272 処方から撮るプレノプティックカメラ
- 2026-10-20 — No.2026.273 同じ粒子を走査像と透過像で測る ―― 52 nm と 48 nm のどちらが正しいか
自分の問題に当てはめるには
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 つでもあったら、いいね・ストックをもらえると助かります。どのウィングを次に増やすかは反応を見て決めるつもりなので、「自分の分野のこれが欲しい」もコメントで教えてください。実データに差し替えて崖の位置が変わった話は、いちばん聞きたい話です。
