fullseye

fullseye 3D ビジョン・ツールキット(Physical AI 向け、HALCON/OpenCV 差別化)

3D の対象マッチングを 「入力データ構造」×「2D で確立した手法」 の格子で体系化し、両者を繋ぐ データ変換(splat / 投影 / FFT / 勾配場 / 距離場 / PCA 正準化)で網羅的に増やす。核心思想: 多くの 3D 手法は「3D データを、既知の 2D 手法が効く表現へ変換する」ことで作れる。 マッチングを核に、変換グラフ・モルフォロジー・幾何メトロロジー・曲面近似・曲座標・光学・射影/ レンダリングまでを 1 スタックに統合(2D→3D 次元リフト + 発散→収束で構築)。

差別化(Physical AI 向け vision library):

手法列(2D で確立 → 3D へ持ち上げる)。★=TRIZ 原理17(多次元化)/ 線→面リフト

| 手法 | 2D の出自 | 3D 化の要点 | 変換 | |—|—|—|—| | NCC / template | 正規化相互相関 | conv3d + box3d 正規化 | (直接) | | shape-based / 勾配方向 | Steger / HALCON | 3D 勾配の方向相関(3 成分 conv3d) | sobel3d | | phase correlation | Reddy & Chatterji | 3D FFT の相互パワースペクトル(平行移動) | FFT | | Fourier-Mellin / log-polar | Reddy & Chatterji | z 投影の |FFT|→log-polar→位相相関(回転+スケール) | FFT→log-polar | | chamfer / 距離場 | Barrow 1977 | エッジの EDT で chamfer スコア(全 GPU=JFA) | 距離変換(GPU-JFA) | | moment / PCA 軸 | 主軸整列 | 慣性テンソル固有ベクトルで姿勢 | PCA 正準化 | | generalized Hough | Ballard | 3D R-table 投票(向きビン相関の総和) | 勾配→投票 | | projection(次元削減) | — | 直交 MIP/シルエットで 2D 手法を適用 | 3D→2D 投影 | | ★曲率 / shape index | 輪郭の曲率(スカラー1) | 主曲率 κ1,κ2(2個=曲面固有)Koenderink shape index | Hessian(2次) | | ★球面調和記述子 | Fourier 記述子(輪郭の1D FFT) | 曲面 SH の帯域エネルギー=回転不変(Kazhdan) | SH(球面 FFT) | | パラメトリック Hough | Hough 直線/円 | 平面/球を parameter 空間へ投票(テンプレ不要=RANSAC 系) | 勾配→param 投票 | | feature descriptor(TODO) | Harris/SIFT | 3D corner + 記述子(spin image/FPFH/SHOT) | 局所形状 | | 反復精緻化(進行中) | LK / ICP / GN | 粗推定を Newton/Gauss-Newton/ICP で高精度収束 | Jacobian/Hessian |

データ構造行(入力形式)× 変換グラフ

「3D データを手法が効く表現へ変換する」がマトリクスの核。形式は多様 → 変換で相互に繋ぐ

構造/形式 説明 主な変換(実装)
voxel grid(dense) 密な格子 中心表現
point cloud 点集合 points_to_voxel(splat) / estimate_point_normals(法線=PCA)
3DGS(異方性ガウス) means+scale+opacity gaussians_to_voxel(splat)
mesh(頂点+面) 三角メッシュ mesh_to_voxel(占有) / mesh_to_points(面サンプル)
depth / range(2.5D) 深度マップ depth_to_points(逆投影) / tsdf_from_depth(TSDF)
SDF / TSDF 符号付き距離場 signed_distance_field(voxel→SDF) / sdf_to_occupancy
occupancy / binary 占有 0/1 閾値 ↔ voxel ↔ SDF
normals(点/面法線) 向き estimate_point_normals(FPFH/ICP-p2plane 用)

変換グラフ(→=実装済): points ⇄ voxel(splat / marching cubes)、voxel → mesh(voxel_to_mesh=marching cubes)、 mesh → points(mesh_to_points)、voxel ⇄ SDF ⇄ occupancy、depth → {points, TSDF}、3DGS → voxel、points → normals。 任意の入力形式を共通 voxel/point/SDF へ寄せれば全手法が使える(= 行 × 列の全セルが変換で接続)。

3D モルフォロジー(2D の 3D リフト。グレー & バイナリ)

accel_vol.py: グレー erode/dilate/median/gaussian + バイナリ region(ball/cross、opening)。 match3d.py 追加(前処理/特徴抽出):morph_gradient3d(dilation−erosion=境界抽出、sobel 代替)/ morph_tophat3d(小明構造抽出、keypoint 前処理)/ morph_blackhat3d(暗構造)/ morph_dilate3d/morph_erode3d。GPU(max_pool3d)。

幾何プリミティブ / メトロロジー(2点→線・3点→面/角度、2D/3D 共通)

検出/マッチを「計測」に変える層(HALCON 2D/3D metrology 相当)。全て閉形式・厳密検証済:

疎特徴登録(keypoint + 記述子 + RANSAC)= 初期推定なしの大回転+部分重なり

密マッチ(NCC/Hough)が扱えない領域。Workflow で 4 手法を並行探索・統合後に一次検証(実測 rot_err): | 手法 | モジュール | 実測(60° 回転+70% 重なり) | |—|—|—| | Harris3D keypoint(mineig) | feat_harris.harris3d_keypoints | repeatability 85%(2D の k=0.04 は 3D で 0 検出 → mineig 採用) | | Spin Image + RANSAC | feat_spin.register_spin | rot_err 1.84°、MC 100% 成功 | | FPFH + RANSAC | feat_fpfh.register_fpfh | rot_err 0.83° | | SHOT + RANSAC + ICP | feat_shot.register_shot | rot_err 0.00°(ICP 精緻化込み) |

honest 限界: overlap <60% で急劣化(誤 basin ロック)、無特徴形状(球単体)不可、法線符号依存。→ 出力を ICP の coarse init に。

異種構造の統合(TRIZ 統合/複合: 全5構造を組み合わせる)= fuse3d

マトリクスの「行」を掛け合わせる。どの構造も共通表現(点群/voxel)へ変換して寄せれば相互に扱える:

曲面近似 z=f(x,y)(2変数→1変数、情報圧縮)

fit_poly_surface/eval_poly_surface(多項式最小二乗)/ surface_form_error(平面度/球面度=理想曲面残差)/ background_flatten(照明ムラ=低次曲面を減算=シェーディング補正)。画像処理でも計測でも多用。

曲座標系への展開(デカルトに限らない)

polar_unwrap(円環/円板→θ×r、リング/ラベル検査)/ cylinder_unwrap(円筒面→height×θ×r、配管検査)/ fit_zernike(円板の直交基底=極座標曲面近似、光学/波面計測。tilt/defocus/astigmatism が (n,m) に対応)。

光学プリミティブ(鏡面/透明体、全て厳密検証)

reflect(鏡面反射)/ refract(Snell 屈折、透明体+屈折率、TIR 処理)/ fresnel_reflectance(反射/透過比、垂直入射 0.04)/ normal_from_reflection(deflectometry=反射で鏡面法線を測る)/ snell_angle。ガラス/レンズ/鏡面の検査・計測に。

射影 / レンダリング(3D → 2D 合成、ループを閉じる)

変換(2D→3D)の逆向き = 観測合成・外観検査サンプル生成・3D 計測サンプル空間生成(Physical AI/シミュレーション直結): project_points(ピンホール投影)/ render_point_depth(点群→深度、z-buffer)/ render_volume_projection(任意視点 xray=DRR / mip)/ render_shaded(法線+光源→Lambertian、光学と接続)。

データ形式の変換グラフ(構造間を繋ぐ)= 追加分

signed_distance_field(voxel→SDF)/ sdf_to_occupancy / estimate_point_normals(点群→法線=PCA)/ mesh_to_points / voxel_to_mesh(marching cubes)/ tsdf_from_depth(RGB-D→TSDF)。任意形式を共通表現へ寄せて全手法適用

マトリクス(手法モード別 × データ構造)

全 5 構造(voxel / point cloud / 3DGS / mesh / depth 2.5D)は共通 voxel/point 表現へ変換 Tで載るので、 下の各手法はどの構造にも適用できる(= 5 構造 × 手法数のセル)。手法は「何を出すか(モード)」で整理:

① 定位(scene 内でテンプレ位置を出す) | 手法 | 特徴 | GPU | |—|—|—| | NCC | 正規化相互相関、pyramid/sub-voxel | 46×(pyramid 244×) | | shape-based | 勾配方向、コントラスト不変 | 68-89× | | chamfer | 距離場、遮蔽頑健、全 GPU(JFA) | N≥96 で scipy 超え | | gen. Hough | 投票、複数インスタンス・遮蔽頑健 | 8× | | ★曲率 | shape index、強度でなく曲面形状で一致 | 6× | | MIP→2D | 直交投影で 2D 手法に落とす(安 coarse) | 1.3× |

② 姿勢(回転/スケール/並進の変換パラメータを出す) | 手法 | 出力 | 特徴 | |—|—|—| | phase-corr | 並進 | テンプレ不要、FFT、18-28× | | PCA/moment | 回転+並進 | 対応あり、残差0、0.2ms | | Fourier-Mellin | 回転+スケール | 対応なし、30×、coarse(±45/90°別名) |

⑤ 反復精緻化(粗推定 → 高精度収束)。手段を1つに絞らず発散(Workflow で6手法を並行検証・全PASS、統合後に一次再検証済) | 手法 | 収束精度(実測) | 反復/時間 | baseline 比 | |—|—|—|—| | Newton サブボクセルピーク refine_peak_newton | 0.011 voxel(全 Hessian で交差曲率) | 7 / 1.5ms | 放物線比 ~9× | | Gauss-Newton 並進(逆合成 LK)refine_translation_lk | 0.008-0.023 voxel | 6 / 1.2ms | NCC-COM 比 ~60× | | Levenberg-Marquardt 並進+スケール refine_lm | 並進 0.007 voxel + スケール回復 | 4 / 6ms | COM 比 ~40-70×(スケールは新規) | | Gauss-Newton z 回転 refine_rotation_z | 0.002-0.017° | 4 / 12ms | Fourier-Mellin ±3° を ~5000× | | ICP 点-点(Kabsch)icp_point2point_3d | RMSE 1e-14、Trimmed で部分重なり | 6 / 2.5ms | 粗 ±0.5vox を機械精度へ | | ICP 点-面(GN)icp_point2plane | RMSE 1e-10、表面に高速収束 | 4-16 / 8ms | 点-点より少反復(Low 2004) |

③ 検出(テンプレ不要で原始形状を出す) | 手法 | 出力 | 特徴 | |—|—|—| | パラメトリック Hough | 平面 (n,d) / 球 (c,r) | RANSAC 系、法線exact・inlier93%、4.9×/2× |

④ 記述(回転不変な大域シグネチャで照合/検索) | 手法 | 出力 | 特徴 | |—|—|—| | ★球面調和記述子 | (半径×周波数)帯域エネルギー | 3D 回転で不変(sim 0.999)、形状識別 |

★ 現在 11 手法(定位6 / 姿勢3 / 検出1 / 記述1)+ 精緻化6手法 × 5 構造。★=線→面リフト(曲率・SH)。 mesh→voxel の平行移動を phase-corr で完全復元、depth 逆投影も検証済。粗推定→精緻化のパイプラインが成立 (例: Fourier-Mellin で回転 ±3° → refine_rotation_z で 0.01° / Hough で球中心整数 → refine_peak_newton でサブボクセル)。

実装(match3d.py / accel_match / accel_vol):

pyramid / sub-voxel 重心は全 NCC 系に横断適用。回転は shape-based(不変)+ PCA(対応あり明示復元)+ Fourier-Mellin(対応なし回転+スケール)の 3 系統で対応。

処理時間(実測 N=64³、CPU=py3.11 torch cpu / GPU=RTX5090 torch cu128、median ms)

発散した手法群を計測して使い分けの土台にする。★=GPU が明確に有利、▲=CPU の方が速い/同等(小問題は転送・起動overhead が勝つ)。

手法 CPU ms GPU ms GPU/CPU 備考
phase_3d ★ 37.7 0.49 77× FFT、最速の姿勢(並進)
logpolar_z ★ 96.2 2.84 34× FFT、回転+スケール
hough_plane ★ 16.8 3.62 4.6× 平面検出
refine_rot_z ★ 33.2 3.87 8.6× 回転精緻化
NCC(locate) ★ 189 9.07 21× 定位の基準
shape_3d ★ 69.7 9.23 7.6× コントラスト不変定位
curvature ★ 58 10.4 5.6× 形状定位
hough_sphere ★ 21.5 10.2 2.1× 球検出
chamfer(scipy) 36.1 16.7 2.2× 遮蔽頑健(EDT は CPU)
scene_flow_lk ★ 65.2 17.5 3.7× 運動場
chamfer(jfa) 89.5 23.3 3.8× 全 GPU 距離場(大 N で有利)
edt_jfa 64.7 27.8 2.3× N≥96 で scipy 超え
hough_3d(vote) ★ 527 63.0 8.4× 複数インスタンス、重い
mip_2d ▲ 50.6 46.6 1.1× 転送律速、GPU 恩恵薄
sh_descriptor ▲ 27.5 60.3 0.5× per-radius ループ、CPU 優位
refine_newton ▲ 1.3 6.5 0.2× 小問題、CPU で十分
refine_lk ▲ 1.02 2.2 0.5× 小問題、CPU で十分
refine_lm ▲ 3.86 10.3 0.4× autograd、CPU 優位
pca(点群) ▲ 0.21 numpy eigh、CPU 完結
icp_p2p(点群) ▲ 15.3 scipy cKDTree、CPU
icp_p2plane(点群) ▲ 19.0 torch/CPU

使い分け(計算資源): FFT系(phase/logpolar)・NCC・voting・flow・curvature は GPU。小さな反復精緻化(newton/lk/lm)・点群系(pca/icp)・SH は CPU の方が速い(GPU 起動/転送 overhead が問題規模を上回る)。

使い分け(状況 → 手法)。発散した手法を収束させる決定ガイド

| 状況・要件 | 推す手法 | 理由 | |—|—|—| | 平行移動のみ、テンプレ有 | NCC or phase_3d | phase はテンプレ不要・最速(0.5ms) | | コントラスト/照明が変わる | shape_3d(勾配方向) | 強度不変 | | 局所の形が違う同強度物体を区別 | curvature(shape index) | 曲面型で照合 | | 遮蔽・部分が入る | chamfer or gen. Hough | 欠損はピークを下げるだけ | | 複数インスタンス | gen. Hough(NMS ピーク) | 投票 accumulator | | z 回転+スケール、対応なし | logpolar_z(粗)→ refine_rot_z(精) | FMT で当て GN で締める | | 任意回転、対応あり点群 | PCA(粗)→ ICP(精) | 主軸整列 → 点-面 ICP | | 任意回転、対応なし点群・部分重なり | feature descriptor(FPFH/SHOT、進行中)→ RANSAC → ICP | 初期推定なし大域登録 | | 原始形状検出(地面/壁/ボール) | パラメトリック Hough(平面/球) | テンプレ不要 | | 回転不変な検索/照合 | SH 記述子 | 帯域エネルギー不変 | | 運動・変形の推定 | scene_flow_lk | 密運動場 | | 粗推定を高精度化 | Newton/LK/LM/ICP(パラメータ別) | 下表 |

粗 → 精のパイプライン(coarse を fine で締める対応)

| 粗推定(出力) | 精緻化 | 到達精度 | |—|—|—| | NCC/shape/Hough の整数ピーク | refine_peak_newton | 0.01 voxel | | 整数並進 | refine_translation_lk / refine_lm(+スケール) | 0.008 voxel | | Fourier-Mellin 回転 ±3° | refine_rotation_z | 0.01° | | PCA / 記述子 RANSAC の粗姿勢 | icp_point2point_3d / icp_point2plane | RMSE 1e-10 |

次に埋めるセル(TODO)。方針=手段を1つに絞らず発散(ノウハウは幅に蓄積)

進捗ログ