目的を検索すると、候補は現在の入力に使えるもの、前処理が必要なもの、その他に分かれます。候補は処理列へ追加せず一度だけ試せます。実行に失敗したときはProblems欄に原因・場所・次の操作が表示され、入力の選び直し、前後比較、詳細ログ、つまみ編集、候補段の検索へ進めます。
重い処理は画面を止めずに実行されます。下部には実行中の段と進捗が表示され、停止要求は現在の段が終わった境界で受理されます。実行中に設定を変えた場合は、表示結果の世代と現在設定の違いを示し、完了した旧設定の結果を見るか、現在設定で実行し直すかを選べます。
Fullseye Studio は、HDevelop 風のビジュアル・パイプライン・ワークベンチです。オペレータを検索して並べ、2 つのつまみをスライダーで回し、途中結果をズーム/パンで見ながら 1 段ずつ実行し、組み上がったパイプラインを --ops 文字列 / Python / JSON として書き出せます。実体は fullseye API の薄い GUI フロントで、パイプラインのロジック(PipelineModel)・Inspector(inspect_result)・サンプル集(recipes)はいずれも Qt 非依存で単体テストされています。
このガイドは studio.py(build_window)を実コードに突き合わせて機能を列挙したものです。UX/デザインの意図は STUDIO_UX.md に、v14 の知覚パネルの背景は V14.md / PERCEPTION.md にあります。
GUI extras(PySide6)が必要です(pip install -e ".[gui]")。
py -3.11 studio.py # リポジトリ直下から直接
fullseye-studio # pip install -e . 済みなら、コンソールスクリプトで
起動すると 1320×860 のメインウィンドウが開きます(タイトル: Fullseye Studio)。assets/fullseye.ico があればウィンドウ/タスクバーアイコンとして付きます。初期状態では合成デモ画像(demo_image、エッジ・ブロブ・グラデーションを含む 256×256)が読み込まれています。
上部に メニューバー(File / Edit / View / Run / Help)とブランドツールバー、下部に ステータスバー(ホバー時の座標+画素値、flash() の一時メッセージ)。中央は左右分割の 3 パネルです。
| パネル | セクション(QGroupBox) | 役割 |
|---|---|---|
| 左 | SAMPLE PIPELINES / OPERATORS | サンプル読み込みとオペレータ・ブラウザ |
| 中央 | PIPELINE / SELECTED STAGE · KNOBS / EXPORT & I/O | パイプライン構築・つまみ調整・書き出し |
| 右 | IMAGE / DISPLAY & PERCEPTION (v14) / ANALYSIS | 結果表示・カラーマップ/知覚・ヒストグラム/Inspector |
初期の分割幅は 340 / 360 / 640 px で、右パネルが伸縮します。
ドロップダウンから 25 個の既製レシピ(recipes.py)を選ぶと、パイプラインがそのレシピに置き換わります。例: 「Edge — Sobel + Otsu」「Denoise — bilateral + unsharp」「Segment — blob / coin」「Count — blobs」「Texture — Gabor」など。まず動かして中身を見る出発点に便利です。「FA — 」で始まる 5 個は外観検査用で、それぞれ対になるサンプル画像(下記)で欠陥を拾えることをテストで確かめてあります。
name [in_sort → out_sort] を表示。ダブルクリックで挿入。ホバーすると tooltip で「名前 / HALCON エイリアス / カテゴリ / sort 変換 / つまみ a,b の説明」が出ます。挿入位置は「選択中の段の直後」。段を選んでいなければ末尾に追加されます。
各行は N. op (a=…, b=…) -> 結果の要約 の形で、その段まで実行した結果の状態(image/region/feature など)が右側に出ます。
段を選ぶと、その段までの途中結果が右の IMAGE パネルに描画され、下の ANALYSIS(ヒストグラム / Inspector)も同期します。これが「ステップスルー・デバッガ」に相当します。
選択中の段の詳細(op_detail: 名前・in → out sort・カテゴリ・HALCON エイリアス)を表示し、2 本のスライダー a / b(0.00〜1.00) で調整します。値を動かすと即座に結果が再計算されます。段を選んでいないときはスライダーは無効化されます(意味のないつまみは死んだ状態にしない設計)。
つまみの意味はオペレータごとに異なります(半径 / しきい値 / σ / 方向など)。何を調整しているかは段の詳細ラベルと tooltip で確認できます。
--ops "…" 文字列と、単体で動く Python 関数の両方としてダイアログに出力(コピー用)。{"fullseye_pipeline": 1, "stages": [...]})。この JSON が FullseyeEngine.load / imgevolve.py run の入力になります。x, y, value(カラーなら RGB)を表示。gray / shaded relief / height (color) / 各カラーマップ(jet, viridis, turbo, magma, plasma, inferno …)。QtDataVisualization があるときのみ/best-effort)。高さ/深度マップの確認に。optical flow — 2 フレーム間の密なオプティカルフローを色相で可視化。motion overlay — 動いている領域を元画像に重畳。stereo depth — ステレオ視差から深度を推定して着色。stereo terrain — ステレオ→点群→地形ハイトマップを着色。フレーム B が無い/サイズ不一致のときはステータスバーにエラーを出して安全に中断します。
detect.feature_table)も併記します。Ctrl+P で、任意のアクションや任意のオペレータを名前で実行できるファジー検索ダイアログが開きます。先頭一致 > 単語先頭一致 > 部分一致の順にランク付け(palette_filter、Qt 非依存で単体テスト済み)。アクション(▸ Open image など)が先、続いて全オペレータ(op: gaussian など)が並び、Enter で実行します。キーボードだけでオペレータ挿入まで完結します。
アプリ内では Help ▸ Keyboard shortcuts(F1) で全一覧が表で出ます(自己文書化)。主なもの(studio.py の act_* 定義より):
| 操作 | ショートカット | 操作 | ショートカット |
|---|---|---|---|
| Open image | Ctrl+O |
Remove stage | Del |
| Synthetic demo | Ctrl+D |
Move stage up / down | Ctrl+↑ / Ctrl+↓ |
| Save result | Ctrl+S |
Clear pipeline | Ctrl+Shift+Backspace |
| Open pipeline | Ctrl+Shift+O |
Zoom in / out | Ctrl+= / Ctrl+- |
| Save pipeline | Ctrl+Shift+S |
Fit / Actual size (1:1) | Ctrl+0 / Ctrl+1 |
| Export | Ctrl+E |
3D surface | Ctrl+3 |
| Quit | Ctrl+Q |
Reset to start | Home |
| Command palette | Ctrl+P |
Step forward | Ctrl+→ |
| Keyboard shortcuts | F1 |
Run all | Ctrl+Enter |
| Image Viewer | Ctrl+Shift+I |
Run a ledger op | Ctrl+Shift+L |
| Pipeline as code → editor | Ctrl+Shift+E |
各アクションはメニュー・ツールバー・ボタンのいずれからも同じハンドラで呼ばれます(1 動作・複数入口)。
dev_* 描画制御ディレクティブHDevelop と同様に、描画の挙動をプログラムから制御できます。Program ウィンドウの
スクリプトに dev_* 行を書くと、画像ステージではなく表示ディレクティブとして解釈され、
Apply 時に適用されます(docs/HDEVELOP_DEV_OPS.md に全 43 dev_* の網羅把握)。
| ディレクティブ | 効果 | 対応 UI |
|---|---|---|
dev_update_window ('off'|'on') |
グラフィクス窓の自動更新を切替 | View ▸ Display updates ▸ Graphics window |
dev_update_var ('off'|'on') |
変数窓の自動更新を切替 | 〃 Variable window |
dev_update_pc ('off'|'on') |
実行カーソルの更新を切替 | 〃 Program counter |
dev_update_time ('off'|'on') |
行ごとの処理時間表示を切替 | 〃 Operator timings |
dev_update_off () / dev_update_on () |
上記すべてを一括で off / on | ツールバー Auto-update トグル |
dev_set_part (Row1, Col1, Row2, Col2) |
表示範囲(ズーム/パン)を設定・負値=全体 | マウスホイール/Fit と併用 |
dev_set_lut ('gray'|'jet'|'viridis'…) |
カラーマップ(LUT)を切替 | View ▸ Display mode |
dev_clear_window () |
カレント窓をクリア | — |
set_system ('thread_num', N) |
OpenCV ワーカースレッド数(0=既定/全)を設定 | Tools ▸ System settings |
set_system ('operator_timeout', ms) |
ソフト operator タイムアウト(遅い段を Run status で警告) | 〃 |
dev_set_draw ('fill'|'margin') |
region overlay の塗り(fill)/ 輪郭(margin)切替 | View ▸ Display mode = region overlay |
dev_set_color ('red'|'green'…) |
region overlay の色 | 〃 |
dev_set_line_width (N) |
margin の輪郭幅(px) | 〃 |
dev_disp_text ('label', Row, Col) |
結果の上にテキスト注釈(次の描画/dev_clear_window で消える) |
— |
dev_open_window (Row, Col, W, H) |
グラフィクス窓を開いて配置しカレント化(再 Apply は同じ窓を再配置=増殖しない) | Ctrl+G / Window ▸ Graphics |
dev_set_window (Handle) |
カレント窓をハンドルで切替 | 窓クリック |
dev_set_window_extents (Row, Col, W, H) |
カレント窓の位置・サイズ(-1=現状維持) | 窓ドラッグ |
dev_close_window () |
カレント窓を閉じる(常駐の主窓は保護) | 窓の × |
set_system ('max_graphics_windows', N) |
窓数の上限(既定 256・全経路 fail-closed) | Tools ▸ System settings ▸ Windows |
用途: dev_update_off () を先頭に置くと、重い処理や多数の編集を描画コストなしで行え、
dev_update_on () で現状態へ一括更新できます(HDevelop の性能テクニックと同じ)。更新が
off の間はステータスバー右に updates off: … が出るため、凍結状態が「壊れて見える」ことは
ありません。ツールバーの Auto-update トグルでも同じ切替ができます。
注意(honest): dev_* はパイプライン段と違い if/for に従わず無条件に適用されます
(分岐内に置いても発火)。トップレベルに書いてください。未対応の dev_* はエラーになります。
動かして見る: File ▸ dev_* visualization demo で、coins 画像 + 上記 dev_* を実際に使う
HDevelop プログラム(区分→領域を cyan の輪郭 + ラベルで表示)が読み込まれ適用されます。作業用の
サンプル画像は File ▸ Sample images(16 枚・provenance は studio_assets/sample_images/manifest.json。
合成 = own work / coins・camera 等 = skimage.data の BSD/public-domain。tools/gen_sample_images.py
で再生成)。うち 5 枚は外観検査(FA)用で、写真ではなく照明と反射の物理計算(illumdesign)と
PoC の撮像モデルで作ったもの: ヘアライン金属の傷・樹脂の打痕と異物・刻印ロット番号・バックライトの穴あき
プレート・溶接の X 線気孔。欠陥の真値マスク(<名前>.truth.png)と「何が写っているか」を manifest に
記録してあり、tools/gen_fa_samples.py で再生成できる。
UI の言語は Tools ▸ Language / 言語 / 语言 で切替(記憶されます)。対訳は
studio_assets/i18n.json に一元化されたテーブルで、コード変更なしで追加できます:
languages — 言語一覧(追加すればメニューに自動で並ぶ。英語が常にベース)tooltips — ツールチップ対訳(英語原文がキー)strings — メニュー・ボタン・ダイアログのラベル対訳(英語原文がキー。2026-08-30
追加。日本語 40+ 項目を同梱、未訳の文字列は英語のまま=graceful fallback)guide — クイックガイド本文(Shift+F2)op ヘルプは op_help/<name>.<lang>.html があれば言語別に出ます。honest 開示:
実行中に変化するステータス文言(running… / PASS 等)と op ノート本文は現状
翻訳対象外です(op ノートの英語化は docstring 二言語化とセットの将来課題)。
Studio は「パイプラインからしかコードを呼べない」段階を越えて、Python 開発環境としても使えます。
import fullseye がそのまま動く。未保存バッファは scratch コピーで走り Save を
強制しない)。Samples ▾ から全 worked example を新規タブで開ける(path 無しで開くため
出荷サンプルの誤上書きは不可)。実行インタプリタは System settings ▸ Editor で変更可。v.mean() / np.percentile(v, 99) / (v > 0.5).sum()
など。v=選択変数、np=numpy、img=入力)を登録すると、選択変更・パイプライン変更のたびに
自動再評価。失敗した式はその行に ⚠ 表示(パネルは落ちない)。変数の右クリック ▸
Inspect in popup… で、型別インスペクション+percentile+値プレビューが即座に出る。
既知の制限(honest): ウォッチ式は GUI スレッドで同期評価されるため、非常に重い式
(巨大配列の全走査など)はその間 UI が待たされる。重い集計は式を軽くするか
Python Editor 側で実行を。ファイルやフォルダをメイン画面に落とすと、種類に合う窓が開きます(複数まとめて落とせば複数の窓)。 全種類の一覧は Help ▸ 開けるファイル(ドラッグ・アンド・ドロップ)… にあります。その表は Studio が 実際に使う拡張子の定数から作るので、この節より新しいことがあります。
| 落とすもの | 開く先 | 補足 |
|---|---|---|
| 画像(png / jpg / tif / webp / pgm / pfm / jp2 …)・フォルダ | 画像ビューア | 一覧・拡大・画素値・ヒストグラム・「パイプラインの入力にする」。フォルダは直下の画像 |
.py |
Python エディタ(1 ファイル 1 タブ) | |
.json |
パイプライン | |
| 点群・メッシュ(PLY / STL / PCD / OBJ / OFF / XYZ) | 3-D ビューア | ASCII とバイナリの両方(PLY はリトル・ビッグエンディアンとも、PCD は binary_compressed も) |
3DGS(.ply / .splat) |
3-D ビューア | 色は球面調和の DC 項、不透明度 0.05 未満は隠す |
| 医用ボリューム(NIfTI / NRRD / MHA / DICOM) | 3-D ビューア | SimpleITK などが要る |
glTF(.glb / .gltf)・LiDAR(.las / .laz) |
3-D ビューア | pygltflib / laspy が要る |
| ロボット(MJCF / URDF) | 3-D ビューア | .xml は根の要素が <mujoco> か <robot> の時だけ。mujoco が要る |
モーションキャプチャ(.bvh)・神経細胞の形(.swc) |
3-D ビューア | BVH は関節の軌跡を時刻で色分け |
| 動画・アニメーション GIF・HDF5 | 動画の立方体 | |
| イベントカメラの (x, y, t, p)(txt / csv / npy / npz) | 動画の立方体 | 中身で見分けて極性つきのコマに |
.npy |
形で振り分け | 2-D → 入力画像、(N, 3 / 6) → 点群、3-D → ボリューム |
| Markdown・SVG | 文書ビューア | |
| 音声(wav / mp3 / flac / ogg …) | 音声の窓 | 波形・スペクトログラム・再生。WAV 以外は soundfile |
ロボットのモデル + qpos の .npy (T, nq) を一緒に |
ロボットの再生 | スライダと再生ボタン |
型つき台帳の op(PIV・数学・運転・3-D など ~1,700 本)を、引数の型に合った入力欄で走らせる窓です。 左の検索欄に名前か言葉(和文も可)を入れて op を選ぶと、右に引数のフォームが出ます。
ode_vector_field_grid で流れの場を作り、piv_quiver の入力を「直前の結果」にすると矢印図)。
型の合わない入力(flow2d の欄に「いまの画像」など)は、走らせずに理由を出します。None と書けば None、列は 1, 2, 3。行列や辞書の見本は <sample> という印で持ちます。
読めない値は黙って既定値に戻さず、どの引数がなぜ読めないかを出します。result = … の連なりになる)。fs.ledger. や fs. の後に打つと名前の候補が出ます(Ctrl+Space でいつでも)。
台帳の op を選ぶと dem_slope(dem, cell_size=) のようにデータ引数と必須引数を並べた形が入り、カーソルが最初の空欄に来ます。
op 名の上で右クリックか Ctrl+Shift+L で、その op の実行窓が開きます。ledger: 名前 で、台帳のどの op の実行窓も 3 手(Ctrl+P → 名前 → Enter)で開きます。見本で走らない op もあります(op ごとの見本の作り方の限界で、2026-10-03 の実測では 60 本中 27 本が見本のまま走る)。 窓の側が失敗を増やしていないことは、「見本を直接 op に渡した結果と一致する」門で確かめています。
型付き入力が table の op は、既存の台帳ランナーで CSV ファイル… を選べる。各役割は自由入力ではなく実在する列から選び、
ゲージ R&R では part / 部品 ID、operator / 測定者、value / 測定値 を割り当てる。行数、キーの種類数、欠測、反復数を確認し、
反復数が不均衡なら該当する組を名前つきで実行前に拒否する。自動補修はしない。割り当ては op とヘッダー署名(ソート済み列名と列数)
ごとに保存するため、同じ形式だけで再利用する。CSV 自体は変更も改名もしない。
画素にならない結果も、形に合わせて見せます(右パネルと上の窓で共通)。
| 結果 | 見せ方 |
|---|---|
flow2d (2, h, w) |
色相 = 向き・明るさ = 速さの色相図の上に矢印図(最長の矢印 = 間隔の 0.9 倍) |
| 1-D の数列 | 折れ線(MATLAB の plot(y)) |
| 表(dict) | 同じ長さの数値の欄を重ねて折れ線。横軸は t / x / freq … の欄があればそれ |
(h, w, 4) / (h, w, 1) / 複素数 |
白地に合成した RGB / 濃淡 / 絶対値 |z| |
| 空の配列・4 次元以上 | 形と値域を文字で(先頭の 1 値を「スカラー」と見せない) |
⟳ calc、キャッシュから出した段は ↺ cache と出ます。画像を替える・段を並べ替える・段を消すと、影響する段から先が捨てられます。キャッシュは 1 段につき最新の 1 件だけで、つまみを何度動かしても増えません。⚠ が付き、ツールチップと Problems に理由が出ます(エラーの ✕ とは別の行)。結果が converged / valid / ok などの欄を持つ表なら、その申告を写します。妥当性の情報が無い結果は「妥当性未判定」で、OK とは表示しません。Run all の後、ステータスバーに「実行: 完了 / 結果: 要確認 (理由)」または「実行: 完了 / 結果: 妥当性未判定」が出ます。Studio は報告するだけで、op の数値の問題を直したり値を書き換えたりはしません。input に残します。開くとき、ファイルがあって sha256 が一致すれば黙って読み直します。ファイルはあるが内容が変わっていれば、読み込んだうえで Problems に「input file changed since save」と出します。見つからなければ今の画像を保ち、「input not found: パス」と出します(このとき .json と同じフォルダにある同名ファイルがあれば、それを探し直して使います)。input の無い古い JSON はこれまでどおり読めます。true として書かれ(オフのときは何も書かないので、使わないファイルは以前と同じバイト列です)、キャッシュの鍵に入るので、切り替えるとその段から先だけ計算し直します。Python の書き出しには # bypassed: op名 の行だけが残り、書き出したスクリプトの結果は画面と一致します。Program の文ではバイパスの段は # bypassed: op (a, b) の行になり、「Apply」で取り込み直しても印は保たれます。pinned に処理列・入力・表示・メモだけを書き(配列は書きません)、開くときに配列を計算し直します。計算し直せなければ、固定は残したまま Problems に「A を再計算できません」と出ます。pinned の無い古いファイルはこれまでどおり読めます。Run ▸ この処理をフォルダに適用… では、入力フォルダと対象パターンを選び、先頭・中央・末尾または任意の1枚で結果を確認してから全件を実行できます。実行開始時に入力と処理列を一度だけ固定するため、途中でつまみを変更しても同じバッチの条件は変わりません。
同名ファイルは「上書きしない」「上書き」「連番を付ける」から選び、サブフォルダを対象にした場合は出力側にも同じ階層を作ります。summary.csv にはファイル名、状態、処理時間、数値出力、エラー理由が入ります。1枚の読込や処理に失敗しても残りは続行し、終了後に失敗したファイルと理由を一覧で確認できます。停止要求は現在の1枚が終わる境界で受理され、実際に止まるまでは「停止済み」と表示しません。
上部の「処理を組む」「結果を比べる」「数値を調べる」「コードにする」を選ぶと、その作業に必要なパネルが大きく表示され、ほかは畳まれます。Ctrl+1~4でも切り替えられます。入力、処理手順、計算済みの結果は変わらず、各モードで手動調整したパネル配置も保たれます。F11の「画像だけ大きく」は一時表示で、Escを押すと直前の配置へ正確に戻ります。「パネルを探す…」では、日本語名や英語の別名から隠れたパネルを呼び出せます。
「各画像で自動」は画像ごと、「比較画像で共通」は A/B 全体、「手動」は入力した上下限を、値域を使う表示モードに適用します。値域を使わない「region overlay」では、その旨をラベルに表示します。「表示処理のみ」の注記どおり元データは変わりません。NaN と Inf はマゼンタ、範囲外は端の色で表示して画素数を警告します。保存時は「元の数値」「現在の表示画像」「両方」から選び、既定は元の数値です。
Studio で組んだパイプラインは 3 つの形で持ち出せます。
| 形式 | 出し方 | 使いどころ |
|---|---|---|
--ops 文字列 |
Export(Ctrl+E) | CLI の imgevolve.py pipeline --ops "…" / run "…" に貼る |
| Python 関数 | Export(Ctrl+E) | 自分のコードに fullseye.run_pipeline(...) として埋め込む |
| JSON | Save pipeline(Ctrl+Shift+S) | FullseyeEngine.load(...) / imgevolve.py run pipeline.json で実行 |
設計は Studio、実行はコード/CLI という HDevelop→HDevEngine 相当の流れは、JSON を介して行います。JSON を受け取って実行する側は ENGINE.md を参照してください。