第9章 — SfMバックエンド


Camera Alignment のピッカーはInspectorの「Cameras & Capture」セクションにあり、Segmented Controlではなくプルダウンメニューだ(バックエンド名がセグメントには長すぎ、幅の狭いInspectorカラムに収まらない)。 項目数はビルドによって異なる:App Store版はちょうど2つ—Apple Photogrammetry(デフォルト)とNative—を表示する。COLMAPはそこではバックエンドとして 完全に存在せず、開発者版・DMGビルドでのみ3番目の項目として現れる(Q2参照)。ネイティブの項目は単に「Native」と表記され、 以前の「(experimental)」や「(Beta)」という付記は削除されている—Native はもはや試験的な経路ではなく、品質重視の経路だ。地上近くでのオービット撮影や写真撮影シーンには強いが、現時点では 空撮・ドローンマッピング(点群が薄すぎる)では弱い。Apple Photogrammetryは 引き続き安全な既定選択肢だ。撮影タイプとして順序のない写真セットが選ばれている場合、アプリは 常にNativeで位置合わせを行う。ピッカーの表示内容にかかわらずだ—ピッカーの下にある注意書きが このことを明示しており、ピッカー自体は操作可能なままだ。値が使用不可になっているのではなく、単に上書きされているだけだからだ。Metashape、COLMAP、その他の 写真測量ソフトからの外部SfM結果は、File メニューから追加でインポートできる(Q3のCOLMAPテキスト形式、 Q6のWorkspaceインポート)—ピッカーは切り替わらないが、インポートされたポーズがSfM結果を 置き換える。このインポートはCOLMAPバックエンドの問題とは無関係で、どのビルドでも動作する。
SfMはStructure from Motionの略だ。重なり合う多数の写真から、 ソフトウェアは各画像についてカメラの位置と向きを共通の3D座標系内で再構成する。 その過程で粗い3D点群が生成され、これがGaussian Splattingによる トレーニングの初期化に使われる。SfMの結果はトレーニング本体への入力であり、 その後の画質を大きく左右する。
RadianceKitは5つのSfM経路を提供する:アプリに組み込まれた2つのバックエンド (Q1 Apple Photogrammetry、Q4/Q5 Native)、外部ツールからの2つのインポート経路 (Q3 COLMAPテキスト形式、Q6 バイナリWorkspaceインポート)、そしてApp Store外の 開発者ビルドでのみ利用可能なQ2 COLMAPバイナリだ。どれが適切かはシーンの種類 (物体を囲むオービット、室内、ドローン飛行)と、外部ソフトウェアがすでに 再構成結果を提供しているかどうかによって決まる。
Q1 — Apple Photogrammetry
場所
Expert View → Inspector → 「Cameras & Capture」セクション → Camera Alignmentピッカー、「Apple Photogrammetry」の項目。すべてのビルドでの 既定設定。
技術詳細
元々Object Capture向けに開発された、Appleの組み込み Photogrammetryフレームワークをラップしている。Appleは内部で独自の パイプラインによってフィーチャーを抽出し(各ステップは公開文書化されていない)、 マルチビューマッチングでそれらを検証し、Apple SiliconのNeural Engine + GPU上で バンドル調整を解く。このバックエンドは完全にApp Store準拠(外部バイナリなし、 Sandbox=true、オンデバイス)だが、カメラポーズと粗い点群のみを返す— トラック長や再投影誤差といった診断メトリクスはない。Appleの推奨によれば 数百枚の画像まではスケールする。直線的なドローン飛行や大規模な屋外シーンで ~500フレームを超えると、再現性のあるクラッシュや、一部カメラの静かな破棄が 観測されている。
Q3 — COLMAPテキスト形式(Metashape / ETH3D)
場所
「File → Import COLMAP / Metashape Workspace…」メニュー (Cmd+⇧+I)、またはsparse/0/cameras.txtを含むフォルダのドラッグ&ドロップ。
技術詳細
標準化されたCOLMAPテキストエクスポート—sparse/0/ サブフォルダ内の3つのテキストファイルcameras.txt、images.txt、 points3D.txt—を読み込み、内部のSfM結果モデルに変換する。COLMAPの バイナリエクスポートと同じフォーマット定義だが、バイナリではなくASCIIだ。 Agisoft Metashape、RealityCapture、PolyCam、ETH3Dベンチマークがこの レイアウトでちょうど出力する。このパーサーはカメラモデル認識を バイナリパーサーと共有しており、COLMAPの11個の標準カメラモデル— SIMPLE_PINHOLEやPINHOLEから、SIMPLE_RADIAL(COLMAP自身の既定値)、 OPENCV、さらに魚眼バリエーションまで—をすべて把握している。コメント行や 空行にも堅牢だ。テストでは~1400台のカメラ(ETH3D Tunnel)まで 問題なくスケールする。
Q4 — Native SfM(インクリメンタル)
場所
Expert View → Inspector → 「Cameras & Capture」セクション → Camera Alignmentピッカー、「Native」の項目(以前あった 「(experimental)」の付記なし)。インクリメンタルはこのバックエンドの デフォルトモードで、Nativeに関してはMapperの選択肢はない。その下の 「Mapper」行はCOLMAP専用のものだ:開発者ビルドではNativeが選ばれている間、 表示はされるがグレーアウトされ、App Store版では完全に表示されない。真にネイティブの 行—「FOV Override」、「High-Quality」、「Native SfM Recipe」—は 他のバックエンドを選んでも姿を消すことはなく、グレーアウトされたまま残り、 その下の行で再び有効化するために何を変更すべきかを示す。インクリメンタル法と グローバル法の間を自分で切り替えることはできない:インクリメンタルが固定の 既定であり、グローバル法にはアプリが自動的に切り替える場合のみ移行する (Q5参照)。
技術詳細
SfMパイプライン全体の独自GPUアクセラレーション実装:FAST+BRIEF特徴量、 または(「High-Quality」スイッチでオンになる、順序のない写真セットでは そもそもオンになる)CoreML経由のSuperPoint+LightGlueに続いて、 HammingベースのKNNマッチング、RANSACによる基礎行列推定、トラック構築、 初期ペア選択、2視点ブートストラップ(F→EおよびDLT)、PnP登録と マルチビュー三角測量を伴うグリーディなインクリメンタルMapper、そしてSchur補元 Levenberg-Marquardt法(Huber損失と、Cholesky分解による解析的ヤコビアン)による 最終バンドル調整。完全にApp Store準拠:外部バイナリなし、Sandbox=true。 組み込みのCollapse検出器付き:入力フレームの60%未満しか登録されなかった場合、 カメラあたりのポイント数が13を下回った場合、または点群がほぼ平坦な場合に、 結果を退化したものと判定する。その直後にすぐ手法を切り替えるわけではない— アプリはまずインクリメンタル実行を繰り返し(最初の異常のない結果を採用し、 なければ試行の中で最良のものを採用する)、その最良の試行でも退化したままの 場合にのみグローバルMapper(Q5)に切り替える。オービット/ターンテーブル シーンでは経験的にきれいに動作するが、より一般的な動き(ドローン飛行、 複雑な形状の室内)では成功率が低くなる—ただしこの検出器がそうしたケースを 拾い上げる。~200台のカメラまでは信頼性を持ってスケールし、それ以上でも 処理時間が大幅に伸びるが動作する。
Q5 — Native SfM(グローバル)
場所
インクリメンタルMapper(Q4)がCollapse検出器を 発動させたとき(入力フレームの60%未満しか登録されなかった、カメラあたりの ポイント数が13を下回った、または点群がほぼ平坦)に自動的に呼び出される— ただしそれは、インクリメンタル実行が繰り返され、最良の試行でも退化したままだった 場合に限られる。手動で要求することはできない:Inspectorにはそのための ピッカーはなく、他に切り替えスイッチもない—いつ切り替えるかはアプリ自身が 決定する。
技術詳細
ネイティブパイプラインのグローバル版。まずQ4と同様の 特徴抽出とマッチングを行い、次にすべての検証済みペアについて相対ポーズ推定を行い、 続いて回転平均化(すべてのカメラの回転をワールド座標系内で同期させる)と 並進平均化(大規模なカメラ集合での整数オーバーフローを避けるため、 行列フリーの疎行列定式化に基づくLSQR方式)を行う。原理上は~5000台の カメラまでスケールするが、実際には数百台を超えると品質が目に見えて低下する。 「フォールバック層」として扱われる:インクリメンタルMapperが繰り返し後も 退化したままの場合に使用され、それ自体が再度Collapse検出器にかけられることは ない—その結果が薄いままであれば、代わりにパイプライン全体の品質警告が 表示される。
Q6 — Metashape / COLMAPテキストWorkspaceインポート
場所
Fileメニュー → 「Import COLMAP / Metashape Workspace…」 (Cmd+⇧+I)。sparse/0/cameras.{bin,txt}とimages/を含むフォルダの ドラッグ&ドロップ。
技術詳細
ドラッグ&ドロップまたはOpenパネルで選択されたフォルダが、 3つのCOLMAP Workspaceレイアウト(sparse/0/、sparse/、またはルート)の いずれかに一致するか、また再構成データがバイナリ(cameras.bin)か テキスト(cameras.txt)かを自動的に判定する。バイナリ経路はCOLMAP バイナリパーサーを使用し、テキスト経路はETH3Dローダーを使用する—どちらも 同じSfM結果モデルを生成し、パイプラインの残り(画像インポート、 MCMCトレーニング開始)はソースに対して不可知だ。画像はアプリの サンドボックスのブックマークシステムを通じてセキュリティスコープ付きで 開かれるため、App Store版でもインポートは機能する。特に「Metashapeの エクスポートを再構成し直さずに使う」ケース向けに考えられている。Fileメニュー 項目に記載された検出処理は、選択されたフォルダが認識可能なWorkspaceでない 場合、アプリのログに警告を出す。
Q7 — Nativeレシピ(Standard / Professional / E3 High-Accuracy)
場所
Expert View → Inspector → 「Cameras & Capture」セクション → 「Native SfM Recipe」行。この行が操作可能なのは、Camera Alignmentとして 「Native」が選ばれ、かつ撮影タイプとして順序のない写真セットが設定されている 場合のみだ—それ以外はグレーアウトされ、下に何を変更すべきかが示される (利用可能条件の詳細は第2章を参照)。
技術詳細
同一のネイティブバックエンドの3段階。アルゴリズム 自体を変えるのではなく、どれだけ入念に処理するかを変える:
Standard — 追加ステージなしの基本レシピ。
Professional — さらに2つのことを追加する:検出された AprilTagマーカーが剛体としてMappingとバンドル調整に組み込まれ、 完成したポーズに対して密な再三角測量が行われる(より密な初期点群)。 撮影にマーカーが含まれていない場合、検出器は何も見つけられず、 密な再三角測量のみが有効になる。
E3 High-Accuracy — Professionalの上に、さらに HQフロントエンド(3×3のSuperPointタイル分割、4096キーポイントの LightGlue、Covisibilityペア)と、全カメラにまたがる共同焦点距離 リファインメントを追加する。これにより最も鮮明なカメラポーズが得られるが、 マッチングの処理時間は最長になる。
どのバックエンドをいつ使うか?
| シナリオ | 推奨バックエンド |
|---|---|
| 深く考えずにまず結果が欲しいとき | Q1 Apple Photogrammetry (初期設定) |
| オブジェクトのスキャン、50〜200枚の写真 | Q1 Apple Photogrammetry |
| 同じシーンで最高品質を求めるとき | プリセット「Maximum Quality (Native)」 — Q4 Native + Q7レシピ E3 |
| 印刷したAprilTagマーカーを使った撮影 | Q4 Native + Q7レシピ Professional |
| 大規模な屋外撮影/ドローン/>500枚の画像 | Q6 Workspaceインポート( Metashapeまたは COLMAPで計算してから読み込む) |
| Metashape/RealityCaptureのエクスポートがすでにある場合 | Q6 インポート( SfM不要) |
| ETH3D/学術用 COLMAPテキストセット | Q3 COLMAPテキストインポート |
| Q4 が破綻する場合 | Q5 Native global(自動的に切り替わる) |
クイック比較
| Backend | App-Store | Sandbox | 外部 バイナリ | 最適な用途 | 最大~カメラ数 |
|---|---|---|---|---|---|
| Q1 Apple PG | ✅ | ✅ | — | 周回オブジェクト | ~300 |
| Q2 COLMAP Binary | ❌(Developer-Buildのみ) | — | colmap/glomap | 屋外・大規模 | ~5 000 |
| Q3 COLMAP-Text-Import | ✅ | ✅ | — | ベンチリグ | ~1 500 |
| Q4 Native incremental | ✅ | ✅ | — | 周回オブジェクト | ~200 |
| Q5 Native global | ✅ | ✅ | — | Q4-フォールバック | ~5 000 |
| Q6 Workspace-Import | ✅ | ✅ | — | Metashape再利用 | ソース ごと |