3DGS作成ガイド
https://qiita.com/kazuyattu/items/a050491ee450670b34ef
pythonのコードはこちら
https://github.com/kazuyattu-stack/3DGS
pythonコード説明
https://qiita.com/kazuyattu/items/6efc5d2ace09d6bc06ac
colmap説明
https://qiita.com/kazuyattu/items/c6226f3dcc6f7abb5016
はじめに
スマホで撮った動画から3D Gaussian Splatting(3DGS)を作ろうとすると、ほぼ必ず登場するのが COLMAP です。
ただ、「とりあえず automatic_reconstructor を叩けば動く」ので、中で何が起きているのかは意外と知られていません。
この記事では、COLMAPが何を解いているツールなのか、どのコマンドが何をしているのか、そして3DGSのパイプラインでなぜ必須なのかを整理します。
COLMAPとは
COLMAPは、複数枚の写真(または動画から切り出したフレーム)を入力として、次の2つを同時に復元するオープンソースのソフトウェアです。
- カメラがどこから・どの向きで撮影したか(カメラ姿勢)
- 被写体の3D形状(点群)
フォトグラメトリやNeRF・3DGS系のワークフローで、事実上の標準ツールとして使われています。
開発元とライセンス
ETH Zurich(スイス連邦工科大学チューリッヒ校)のJohannes Schönberger氏を中心に開発された、研究発のソフトウェアです。
BSDライセンスなので、商用・非商用を問わず無料で使えます。
- 公式サイト: https://colmap.github.io/
- GitHub: https://github.com/colmap/colmap
- 論文
- Schönberger and Frahm, "Structure-from-Motion Revisited", CVPR 2016
- Schönberger et al., "Pixelwise View Selection for Unstructured Multi-View Stereo", ECCV 2016
COLMAPが解く2つの問題
① Structure-from-Motion(SfM):カメラ姿勢と疎な点群
画像だけを手がかりに、「各カメラが3D空間のどこにあり、どちらを向いていたか」と「特徴点が3D空間のどこにあったか」を同時に推定します。
- 特徴点抽出:各画像からSIFT特徴点を検出する
- 特徴点マッチング:画像同士で対応する特徴点を探す
- Incremental SfM:2枚の画像から復元を始め、1枚ずつ画像を追加しながら、カメラの位置・向き・内部パラメータ(焦点距離など)と3D点をバンドル調整で最適化していく
出力される点群は数万点程度とスカスカで、細かい形状までは分かりません。
それでも 正確なカメラパラメータが得られること がSfMの最大の価値です。
② Multi-View Stereo(MVS):密な3D形状
SfMで得たカメラパラメータを使って画素単位で奥行きを推定し、数十万〜数百万点規模の密な点群を作ります。GPU(CUDA)が必要です。
-
image_undistorter:レンズ歪みを補正した画像を作る -
patch_match_stereo:近傍視点との対応から、画像ごとに画素単位の深度マップを推定する -
stereo_fusion:複数視点の深度マップを統合し、1つの密な点群にまとめる
SfMは「どこから撮ったか」、MVSは「どんな形か」を詳しく求める工程、と覚えておくと整理しやすいです。
主なコマンド
| コマンド | 役割 |
|---|---|
automatic_reconstructor |
特徴点抽出からSfM、必要ならMVSまでを一括実行する"おまかせ"コマンド |
feature_extractor |
画像からSIFT特徴点を抽出する |
sequential_matcher / exhaustive_matcher
|
特徴点マッチング。動画の連番フレームなら、近傍フレームだけを照合する sequential が高速 |
mapper |
Incremental SfM本体。カメラ姿勢とスパース点群を推定する |
image_undistorter |
歪み補正済みの画像とカメラパラメータを出力する |
patch_match_stereo |
CUDAで密な深度マップを推定する |
stereo_fusion |
深度マップを統合して密点群(fused.ply)を作る |
model_converter |
出力をBIN / TXT / PLY の間で変換する |
gui |
結果を可視化・編集するGUIビューア |
一番手軽なのは automatic_reconstructor です。例えば動画から切り出したフレームなら、次のように実行します。
colmap automatic_reconstructor \
--workspace_path ./workspace \
--image_path ./workspace/images \
--data_type video \
--quality high \
--single_camera 1 \
--sparse 1 --dense 1
| オプション | 意味 |
|---|---|
--data_type video |
連番フレーム向けに sequential matcher を使う |
--quality |
low / medium / high / extreme |
--single_camera 1 |
全画像が同じカメラなので内部パラメータを共有する |
--sparse / --dense
|
SfM(疎)/ MVS(密)をそれぞれ実行するかどうか |
入力と出力
| 区分 | 内容 |
|---|---|
| 入力 | 画像ファイル群(JPEG / PNG など)。動画は直接読めないので、事前にフレーム抽出が必要 |
| 出力(SfM) | カメラの内部・外部パラメータとスパース点群(cameras.bin, images.bin, points3D.bin) |
| 出力(MVS、任意) | 歪み補正済み画像と密点群(fused.ply) |
COLMAPに動画を直接渡せない点は、初見でつまずきやすいポイントです。OpenCVやffmpegで数フレームおきに静止画へ切り出してから渡しましょう。
なぜ3DGSにCOLMAPが必要なのか
COLMAP自体は、3Dスキャン、測量、文化財のデジタルアーカイブ、VR/ARコンテンツ制作など幅広く使われています。近年特に重要になっているのが、NeRFや3DGSの前処理 としての役割です。
NeRFや3DGSは写真から3Dシーンを学習しますが、学習には「各写真がどのカメラ位置・向きで撮られたか」という情報が欠かせません。
COLMAPのSfMはこの情報を得るためのデファクトスタンダードで、3DGSの公式実装もCOLMAP形式のデータセットをそのまま読み込めるように作られています。
つまりCOLMAPは、動画という「見た目の情報」を、3DGSが学習できる「カメラ位置つきの構造化データ」に変換する 工程を担っています。
実際のパイプラインでの使い方
筆者のワークフローでは、動画から切り出したフレームに対してCOLMAPを2段階で使っています。
| 段階 | 目的 | 3DGSに必要か |
|---|---|---|
| SfM | カメラ姿勢とスパース点群を推定 | 必須 |
| MVS | 密な点群を生成 | 点群自体は不要。ただし途中で作られる歪み補正済みデータセットを学習に使う |
パイプライン全体(フレーム抽出〜3DGS学習〜.splat変換)は、別記事「スマホ動画から3D Gaussian Splattingを作る:Windows + WSL2でCOLMAP→3DGS→.splatまで自動化する」で紹介しています。
まとめ
- COLMAPは、写真群からカメラ姿勢と3D形状を復元するオープンソースのSfM/MVSツール
- SfMでカメラ姿勢とスパース点群を、MVSで密な点群を求める
- 迷ったら
automatic_reconstructorで一括実行できる - 3DGS/NeRFの学習に必要なカメラ情報を作る前処理として、事実上の標準になっている
参考リンク
- COLMAP 公式サイト: https://colmap.github.io/
- COLMAP GitHub: https://github.com/colmap/colmap
- チュートリアル: https://colmap.github.io/tutorial.html
- 3D Gaussian Splatting 公式実装: https://github.com/graphdeco-inria/gaussian-splatting
