fullseye

Fullseye 統一インターフェース — 要件定義書 (v0.1, 2026-08-18)

2026-08-17〜18 のディレクションを踏まえた要件定義。方針正本 = raptor memory project_fullseye_mission_unified_vision_2026_08_18、gap 分析 = EVIS_VISION_OSS_GAP.md。 本書は 何を・なぜ(要件)を定める。どう作るか(実装)は本書合意後の設計/spike で。

1. 背景・目的

Fullseye = あらゆる画像処理/視覚アルゴリズムを『スキル』として保持し、即使える包括的ライブラリ (=専用 HALCON)。目標は HALCON 級網羅(実測 979/2313 = 42.3%(2026-09-06)、HALCON_COVERAGE.md を伸ばす)。 現状、アルゴリズムは 3 つの別インターフェースに分裂しており、使う側(人間・Studio・evis 視覚・エージェント)から 一貫して呼べない。本件の目的は 使う際のインターフェースを統一し、どのアルゴリズムも同じ自然な作法で 発見・呼び出し・introspection・Studio 露出できるようにすること。

2. 対象ユーザーと利用シーン

ユーザー シーン 含意
本人(人間) REPL / スクリプトで手書き、仕事で使う サンプルコードが人間から見て自然であること(最優先)
Fullseye Studio GUI から op を把握・試験・パラメータ調整 同じ op を GUI からも一貫操作(introspection/メタが要る)
evis 視覚パイプライン stereo→cloud→6D pose→(MoveIt2)→筋実現 知覚 op を統一 I/F で組める
エージェント/自動化 プログラム的に op を列挙・実行 発見可能(registry)・型/メタが機械可読

3. スコープ

In: 画像処理 op(現 registry 654)+ 視覚/知覚 op(現 facade 116)を統一 I/F に載せる。 自作 numpy 実装も OSS アダプタも同一 I/F。Studio 露出。introspection/メタ/honest gate の統一。 Out: 汎用 CS(algo-c: sort/CRC/Huffman/回文 = 39 op。画像/視覚の知見でない=対象外・凍結)。 OSS 内部の再実装(PCL/grid_map/OpenCV/MoveIt2 は薄いアダプタで裏に、再発明しない)。

4. 現状と課題(実測 2026-08-18)

3 層・3 規約に分裂:

現 呼び出し 自然さ
画像 registry 654 apply(image, "gaussian", a=0.5, b=0.5) = 文字列名 + 汎用 2 ノブ a/b ✗ 最も不自然(進化用エンコード)
algo(対象外) 39 run_algo("name", seq) = 文字列 dispatch ✗(だが off-mission)
知覚 facade 116 fs.disparity_sgm(left, right, max_disp=16, ...) = 名前付き引数 △ 比較的自然だが registry/introspection 無し

5. 機能要件

6. 非機能要件

7. API 設計方針(Qt 風・人間が書いて自然)

悪例(現状): apply(image, "gaussian", a=0.5, b=0.5) / run_algo("name", seq) = 機械向け string-dispatch。

目指す自然さ(案・§9 で要ユーザー判断):

import fullseye as fs
# core オブジェクトのチェーン(画像 op):文のように読める
edges = fs.Image.load("scene.png").to_gray().gaussian(sigma=1.4).sobel()
# 名前空間モジュール + 設定オブジェクト + 動詞メソッド(知覚 op):Qt ウィジェット風
depth = fs.stereo.SGM(max_disp=128, window=5).compute(left, right)
cloud = fs.camera.Pinhole(K).backproject(depth)
plane = fs.pcseg.PlaneRANSAC(thresh=0.01).fit(cloud)

Qt から借りる: 名前空間モジュール(fs.stereo/fs.camera = QtWidgets 風)・設定オブジェクト+動詞メソッド (.compute()/.fit()/.apply())・core オブジェクトのチェーン(Image)・sensible defaultsdiscoverable。文字列名/生 registry/進化用 a/b は裏に隠す

8. 制約・前提

9. 要ユーザー判断(実装前に確定したい)

  1. 画像 op の作法: fs.Image(...).sobel()チェーンか、知覚と同じ設定オブジェクト方式に統一か。
  2. 実行モデル: eager(即計算・REPL/Studio 向き)か lazy パイプライン(.run() で確定)か。
  3. 命名: HALCON 語彙寄せ(dyn_threshold 等)か、一般語彙(adaptive_threshold)か。
  4. Studio 露出: 最初の spike に含めるか、Python API 先行か。

10. 受け入れ基準(統一 I/F の “done”)

11. 段階計画(案)

  1. 本要件定義の合意(§9 の 4 判断)。
  2. 設計 + 小 spike: Image チェーン + 知覚 1 モジュール(例 fs.stereo)を既存実装の薄いラッパで。additive・回帰 0。
  3. メタ/registry 統一(F2/F3)→ 既存 op を段階的に載せる。
  4. Studio 露出(F6)。
  5. OSS アダプタ契約(F4)を 1 領域で実証(stereo=image_pipeline / pcseg=PCL)。
  6. 網羅を伸ばす(N4、HALCON/ROS2 地図の抜けを honest gate 付きで補完)。

12. 決定ログ

3DGS(3D Gaussian Splatting)対応 — 前半(データ取得)完了 2026-08-19

問い: Fullseye/sim-source で 3DGS は出来るか。

実測環境: RTX 5090 (32GB) あり / torch=2.11.0+cpu(CPU ビルド)/ CUDA toolkit・gsplat・nerfstudio 未導入。→ 学習(GPU)は現状不可、要スタック整備。

sim-source の優位: 3DGS 最大の前段=多視点画像のカメラ姿勢推定(COLMAP)が、sim では ground-truth 姿勢が直接得られるため不要

実装(GPU 不要・CPU で検証済): sim_source.MuJoCo

残(GPU 半分・要判断): 学習スタック整備。Windows は gsplat の CUDA ビルド摩擦あり(VS build tools+CUDA toolkit)。候補=(A) 専用 venv に torch cu128+gsplat / (B) WSL2 経由 / (C) exporter のみ維持し外部 trainer(ns-train splatfacto)に transforms.json を渡す。共有 py -3.11 env への影響回避のため専用環境推奨。

後半(GPU 学習)実測 2026-08-19 — 純 torch 3DGS で end-to-end 成功

gsplat ネイティブ判定: torch 2.11.0+cu128 で GPU 実働(RTX 5090 / capability(12,0)=sm_120)。gsplat 1.5.3 は import 可だが CUDA kernel は初回 JIT ビルドで “No CUDA toolkit found. gsplat will be disabled”。nvcc/cl 不在、cu128 のプリビルド Windows wheel も無し(pt2.7/2.8/2.9/2.11 全滅)。→ gsplat ネイティブは CUDA Toolkit 12.8+VS Build Tools 必須(未導入)。

回避=純 PyTorch 3DGS(gsplat_torch.py): コンパイラ不要の参照 splatter(quat→R / 3D共分散→2D Jacobian投影 / 大域深度ソート alpha 合成)。OpenGL c2w を F=diag(1,-1,-1) で CV カメラへ。

: gsplat 高速 backend 化(CUDA Toolkit+VS Build Tools 導入 or WSL2)/ densify・prune / SH 色 / SSIM 損失。純 torch は PoC 用(非 tiled で大規模は遅い)。

3DGS 実用化バッチ 2026-08-19 — トレーナ/実シーン/CLI/Studio/記事