2 本の調査(3D 化候補 / GPU 化次バッチ)の確定版。数値は調査時実測。 採用前検証済みの中核 finding に ★ を付す(それ以外は実装時に再実測すること)。
vol_frangi / vol_sato / vol_hessian_blobness / vol_distance_transform /
vol_label / vol_region_props / vol_gradient_magnitude / vol_local_maxima は
volops.py で実装済み・api.py で公開済みだが、ops3d._CATALOG は
vol_watershed と volume_downsample しか volops から登録していない。
→ 登録が第一手。ただし op→example 100% カバレッジ invariant(CI 強制)が
あるので、登録 = _CATALOG 行 + example + per-op docs ノート + Studio help の
4 点セット(「数十分」ではない)。
distance_transform_edt(return_indices=True) は
N-D OK。3D 側は距離「値」のみで最近傍インデックス op が皆無
(占有格子の ESDF 勾配・肉厚計測に直結)canny(実装済 canny3d 流儀で個別移植)/ LBP-3D・GLCM-13方向(需要大・工数大)/ bilateral 3D(27 タップ)/ Golay 3D(正準対応なし)/ cone-beam FDK(大)。
spacing=None 引数を標準装備(異方性ボクセル対応)_sep_conv(accel.py:56)/ _conv(:89)/
_unfold_reflect(:160)/ _std_filter(:233)が torch reflect
(端非複製)のまま。scipy 既定と一致する _pad_sym/_sep_conv_sym
(:66-86)は gaussian 系にしか適用されていない。
調査実測では sym 化で sobel/laplace/prewitt/unsharp/median/percentile/
std_filter が full-image 1e-7 級に。dog「faithful 不可」判定
(accel.py:493-495 / GPU_ACCEL_PLAN.md:37-39)は誤りで、sym 化で 6.7e-6parity()(accel.py:568)は a=0.5,b=0.4 の 1 点
_op_margin(accel_vol.py:204-210)方式を移植し
a∈{0,.25,.5,.75,1} スイープに| Batch | 内容 | 効果 |
|---|---|---|
| 0 | 上記バグ修正 | 既存 7 op が full-image 一致、dog 解禁 |
| 1 | HALCON 別名 33 op を ACCEL に追記(実装ほぼ 0。sobel_amp/gauss_filter/gray_*_rect 等が既存 kernel と 1e-7 一致) | 看板例 ["gauss_filter","sobel_amp","otsu"] が GPU 化へ前進 |
| 2 | otsu 一族 4 op(bit-exact 実測)+ canny + adaptive_gauss_thresh + local_max + dyn_threshold | otsu は 20 RECIPES 中 4 に登場する最頻未対応 op。image→region 関門が開き GPU 区間が融合(転送削減)。RECIPES カバレッジ 45%→推定 70%+ |
| 3 | morphological reconstruction primitive(測地膨張の不動点) | fill_up/fill_holes ほか recon 一族 ~14 op を 1 kernel で解錠。champion 32/38→34/38 |
| 4 | 終端 reduction: count_obj(ラベル伝播)/ intensity / entropy_gray / xcv2_lap_var | D2H が画像→スカラーに |
| 5 | arithmetic 9 + compass edges 6 + disk graymorph 4 + 拡散 5 | 数の面取り |
_seg_kind が真にならない → ops.py _DEFS へ登録が先MATCH_ACCEL 未登録(cv2 に 3D matchTemplate は
無い = 差別化点)幾何変換 wave2(scipy order=3 B-spline の IIR 前置フィルタは torch で bit 一致 不能、bilinear/bicubic とも 5e-3 不通過 — metric-faithful 例外扱いを検討)/ contour・XLD 83 op(ragged・逐次)/ regionprops(count/area 以外)/ EDT / skeleton 系 / backend ブラックボックス 368 op / color 3ch(_to_batch が (N,1,H,W) 前提)/ trimmed_mean(rank 規則不一致 4.8e-2、要調査)。
「手の動きをモーショントラッキングしている事例が結構見られる。指の動きとか、 見れるようになると Physical AI への応用が効きやすい」
fullseye ミッション(Physical AI / evis 視覚の統一 I/F)に直結。G1 歩行で実証済みの 「mocap → 模倣 RL」パイプラインの手版が本命: 動画 → 手ランドマーク → evis 手(相反 u + 共収縮 c の 34 次元)へリターゲット → 箸 pick-place の模倣。
候補 op(3 層):
hand_landmarks op — 21 キーポイント + 左右。
MediaPipe Hands(Apache-2.0、ライセンス適合)を optional backend
(pip install mediapipe)か ONNX 変換で。返り値 (N, 21, 3)。
身体版 pose_landmarks(33 点)も同一機構で追加可hand_retarget(21 点 → 関節角、evis 34 次元作動への写像)。
これは fullseye というより evis 側のブリッジ(所属は実装時に判断)実装順の提案: 2 → 3(2 が最小工数で最大効果。1 はデモ/教材価値)。
実現可能性の実測(2026-08-31): mediapipe 1.0.1 は py3.11 Windows に導入済み。
ただし 1.0 系は legacy solutions 廃止・モデル非同梱で、HandLandmarker には
hand_landmarker.task(storage.googleapis.com、~8MB、モデルも Apache-2.0)の
DL が 1 回必要 → 着手時にユーザー確認を取ってから。fail-closed(モデル不在なら
明示エラー+DL 手順提示)の optional extra として設計する。
domain(4op)/ boundary(2op)/ rle_region(5op)/ vol_tiled_map は実装済み。 2D 45 カテゴリ × 3D カタログ(58 カテゴリ 291 op)の概念突き合わせで残る欠け。 数値・用途の根拠は実利用ドメイン(CT/MRI/顕微鏡/産業検査)の定番度で採点。
vol_window_level: CT の HU windowing(放射線科の毎日の操作)。center/width
で [0,1] へ写像。実装 1 時間・依存なしvol_equalize / vol_gamma / vol_stretch: ヒスト平坦化・ガンマ・
コントラスト伸長の 3D 版vol_resize(ndimage.zoom、spacing 再計算を返す)/ vol_rotate(軸+角度)
/ vol_affine(4x4 行列)。位置合わせ後のリサンプリングに必須。
match3d 内部に affine 実装は既存(公開されていないだけ)vol_profile_line(2 点間の強度プロファイル、spacing 対応)+
vol_edge_probe(プロファイル上のエッジ対検出=肉厚・壁厚)。産業 CT 計測の核。
2D measure1d(5op)の縦持ち版vol_richardson_lucy(3D デコンボリューション、共焦点顕微鏡の
定番。skimage.restoration に 2D 実装あり、nD 対応)vol_fft_bandpass / vol_fft_lowpass(3D FFT フィルタ、
リング/縞アーチファクト除去)。complexops は 2D 専用§D の高優先はすべて実装済み(実装状態 4 段: 動作実証済み = 専用テスト+GT example +フルスイート 6,483 passed):
「足りない」でなく「あるのに接続されていない」が正診:
北極星: 「数学辞典に載る問題を全て扱えるくらいの op 量」+「岡潔の数学 (多変数複素関数論)まで」— 長期プログラムとして tier で積む。正直な整理: 岡の定理そのもの(連接性・Cousin 問題)は数値 op にならないが、計算可能な 切り口は豊富。台帳 = opsmath.py(OP_CATALOG に Math 節)。
complex カテゴリ)。輪郭を複素点列(新語彙 cpoints)として持つ設計に
倒し、cplx_contour_circle / cplx_poly_eval / cplx_contour_integral /
cplx_winding_number / cplx_cauchy_value / cplx_argument_principle /
cplx_laurent_coeffs(留数 = c₋₁)/ cplx_joukowski / cplx_mobius /
cplx_cr_residual。全 op が閉形式 GT テスト(∮dz/z=2πi の 2 次収束・
z³−1 の零点数・w=2cos t・1/k!・conj(z)→2)で固定、敵対検証で 3 バグ修正
(np.gradient 既定の 1 次端点で正則な z² が 2.5% 残差 / Laurent の r^-k
overflow が無言のゼロ / str が数値として黙って解釈)。未実装のまま残す:
Schwarz–Christoffel 数値写像、Padé 近似・収束半径推定、Poisson 積分・
調和共役(次の波の候補)RuntimeWarning を出し、「分点を倍にして安定するまで」
を正典として文書化した位置づけ: fullseye は産業ビジョン(検査ライン)と Physical AI(ロボット知覚)の
両方に足場がある。その手前にあるのが「どの焦点距離か / 絞りはどこか /
被写界深度は / 回折で潰れる最小欠陥は何 µm か / 偏光板でテカりは消えるか」という
閉形式の計算 — レンズより上、画素より下の層。台帳 = opsoptics.py、実体 =
optics.py(OP_CATALOG に Optics 節、docs/ops に optics 次元)。
thin_lens / abcd_matrix / abcd_trace / depth_of_field /
relative_illuminationairy_pattern / angular_spectrum_propagate / fraunhofer_pattern /
gaussian_beampsf_to_mtf / mtf_diffraction / wavefront_statsjones_element / jones_apply / stokes_from_jones /
mueller_element / mueller_apply / stokes_analyzereflect/refract/
snell_angle/fresnel_reflectance/normal_from_reflection)= match3d、
Zernike フィット = match3d.fit_zernike(wavefront_stats はその返り dict を
食い、match3d 自身の基底ビルダーを再利用)、PSF 復元 = volrestore/complexops、
FFT = complexops、位相シフト干渉法 = fringe(一般 N-step が既にあるので 4-step PSI は置かない)。jones(長さ 2 固定 complex)/ stokes(長さ 4 固定
実 + 偏光度 ≤ 1)。ABCD/Mueller は既存の matrix、Jones 行列は既存の cimage、
素子リストと計測値束は table、MTF 曲線は pairs を再利用。float("50") が
成功するため文字列が長さとして通っていた(thin_lens("50","200") が 66.667 mm
を返す) ②1e308 の PSF で FFT が溢れ MTF が無言 NaN ③diag(1e200) で
determinant が無言 inf ④共有 Zernike 基底が n=46 で |Z|≤1 を破り
(n=50 で 71.5、n=60 で 2.8e5)、60 次の「波面」が RMS 3032 波を返していた
⑤n_max=40 × 4096² が dict と int 2 個の呼び出しから 108 GB を確保しにいく
⑥動径求積が (n_max/radial)² で誤差を持ち、n=20 で 4.3% ずれた Strehl を
黙って返していた(RuntimeWarning 化)。