0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Colmapと360カメラで始める簡単&高速 3D Gaussian Splatting

0
Last updated at Posted at 2026-09-19

概要

本ワークフローは全天球画像:Equirectangular(正距円筒図法)画像を使って、ロバストかつ比較的高速にカメラアラインメント(SfM)を行い、3D Gaussian Splatting(3DGS)の学習を行うワークフロー例を示します

本ワークフローは簡単&高速 360°全天球カメラとMetashapeで高品質3D Gaussian Splatting制作のMetashapeによるカメラアラインメント(SfM)をColmap利用に書き換えたものになります。併せて一読下さい。

参考

※下記作例はMetashapeを利用したものですが、Colmapでも近いものを制作可能です。

DJI AVATA360での作例

DJI OSMO360での作例

必要な物

動画撮影する(e.g. OSMO360)

カメラを自撮り棒に付けて、キャプチャしたい範囲をゆっくりと歩きます
動画設定はD-Log M, 30fps以上の撮影がお勧めです

動画を現像する

DJI Studioに撮影データを取り込み、現像処理(色復元)をします

  • 下記画像の赤枠の設定を実施。
  • (高度な設定)Extract Sharpest Frame V1.0.0から実装されたシームマスクを利用する場合、RockSteadyをoffにします。RockSteadyは電子手振れ補正、水平維持をする機能ですが、ステッチラインが変化します。Insta360の場合もそれに相当する機能はオフにします。
    • (補足)シームマスクは前後の魚眼カメラのステッチラインのズレにマスクをして、後述のカメラアラインメントおよび3DGS学習から当該部分を除外することが可能です。

動画を書き出す

  • 全天球動画としてMP4ファイルで動画を書き出します。設定例を下図に示します
    • ノイズリダクションはオンにして、品質優先を選択します
    • 10-Bit Colorはオフにします
  • 複数クリップの場合は"複数クリップ"で現像してもOKです。後述するExtract Sharpest Frameは複数動画をバッチ処理できます。

動画から静止画を切り出す

  • 動画から静止画を切り出す方法は様々あります。お好きな方法を調査、選択してください
    ここでは私が公開しているツールをご紹介します
    Extract Sharpest Frameは指定フレーム間隔で一番シャープな画像を切り出すツールです
  • 新機能はBOOTH版を優先的にupdateしております
主要項目 説明
Video file 全天球動画を選択。複数動画を選択し一括処理可能です。
注)マルチバイト文字を含むファイルパスは未サポート
Output folder 静止画とマスクを切り出す先のフォルダを指定。このフォルダ以下にframesとmasksフォルダが作られます。複数動画から切り出した画像を一つのフォルダにまとめるかを選択可能です
注)マルチバイト文字を含むファイルパスは未サポート
Scale width 全動画フレームの画像のシャープさを計算する時の画サイズです。大きくした方が緻密に計算されます。注)切り出し画像は常にオリジナル動画と同じ画サイズで切り出されます
Chunk size 静止画を切り出す間隔を指定。30fps動画で30を指定すると1秒間隔で切り出されます。まずは1秒間間隔がお勧めです
Workers 抽出処理の同時実行数を指定。CPUのコア数に応じて増やしてください
Start(HH:MM:SS) 切り出しを開始する時間を指定します。形式はHH:MM:SSです
空の場合は動画の先頭から開始します
End(HH:MM:SS) 切り出しを終了する時間を指定します。形式はHH:MM:SSです
空の場合は動画の末尾まで処理します
Remove similar frames 類似フレームを除外します。ReviewをONにすると実行時に閾値調整して切り出し枚数を調整可能です
pHash threshold 類似フレームの判定閾値を指定します。値が大きいほど画像を間引きます。撮影時の移動速度が不規則な場合に有効な機能です
Mask Generation 人や自動車等のマスク画像を生成します。後段のSfMの精度が上がります
SAM3 Dual Mask 最新版はSAM3マスク対応済みです。任意の短いセンテンスでマスク可能です。Preview/Editボタンでマスク結果を確認できます。https://x.com/kotohibi_3d/status/2061044432837972367
(高度な設定)SAM3は二通りのマスクを設定することが可能です。カメラアラインメントと3DGS学習用のマスクを分けることが可能です。詳細は次のGoogle Slideを参照してください
https://t.co/X0uRH959RV (Metashapeの例ですがColmapも同様の考え方です)
YOLO Mask [YOLO Class IDs]
検出したいクラスIDを指定します。 0: person, 1: bicycle, 2: car, etc.カンマ区切りで複数ID指定可能です。https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/coco.yaml
[YOLO Confidence]
閾値を上げると誤検知を減らせます。下げるとより多くを検出しますが誤検知は増えます
[YOLO Model]
yolo11nからyolo11x方向にモデルサイズが大きくなり高性能になりますが処理負荷は大きくなります
Seam Mask 2つの魚眼画像を繋げたステッチラインのズレにマスクをかける機能です。ステッチライン位置を固定するため、DJI Studio or Insta360 Studio等の水平維持機能をオフにして現像して本機能をご利用ください
Custom Mask 固定のマスク画像を指定します。上記マスクと併用する場合は融合されます。カメラリグ等が常に映り込む部分をマスクするのに有効です。
注)動画と同じ解像度のPNG画像を指定してください
Analysis only 画像のシャープさの計算のみ行います。出力フォルダに計算結果(メタ情報)が保存されます。次回から出力フォルダにメタ情報があると、解析フェーズをスキップして画像切り出しができます。Chunk sizeを調整した場合に有効です。
Save config 上記の設定を設定ファイルとして保存します
Load config 保存した設定ファイルを読み込みます
Run 処理実行

実行結果

  • このように静止画が切り出されます。次StepのSfMが失敗する場合は静止画切り出し間隔を小さくしてみてください
  • マスクも自動で生成されます(SAM3 + Seam mask適用例)

カメラアラインメント(SfM)をする

  • colmap-x64-windows-cuda.zipを任意のフォルダに解凍し、COLMAP.batを実行します

データベースの作成と画像ファイルを指定する

  • COLMAP.bat実行後GUIが起動します
  • [File] -> [New Project]を選択すると、以下のダイアログが表示されます
    項目 説明
    Database [New]ボタンを押下して新規データベースファイルを任意の場所に作成します。このファイルに処理途中のデータが格納されます
    Images 動画から切り出した静止画フォルダを指定します
    Save 最後に[Save]ボタンを押下してダイアログを閉じます

画像から特徴点を抽出する

  • メインウィンドウから[Processing]->[Feature extraction]を選択すると、以下のダイアログが表示されます
    項目 説明
    Camera model EQUIRECTANGULARを選択します
    Shared for all images ONにします
    mask_path 生成したカメラアラインメント用マスクを指定します
    use_gpu ONにします
    sift.max_num_features 初期値の8192でもOKですが、増やした方が3DGS学習時の初期点群が増え学習が安定します。ハイスペックPC利用の場合は、2~3倍(もしくはそれ以上)に増やしてみてください
    Extract 特徴点抽出を開始します

特徴点マッチングを実行する

  • メインウィンドウから[Processing]->[Feature matching]を選択すると、以下のダイアログが表示されます
    項目 説明
    Type 今回は最も基礎的なSIFT_BRUTEFORCEを選択します。Colmapは様々な特徴点マッチングアルゴリズムが選択可能です。また別の記事で取り上げたいと思います
    max_num_matches 初期値の32768でもOKですが、増やした方が3DGS学習時の初期点群が増え学習が安定します。ハイスペックPC利用の場合は、2~3倍(もしくはそれ以上)に増やしてみてください
    Run 特徴点マッチングを開始します

カメラアラインメントを実行する

  • メインウィンドウから[Reconstruction]->[Start reconstruction]を選択してカメラアラインメントを開始します

カメラアラインメント結果を確認する

  • 処理が正常に完了すると下記のような結果になります。カメラ位置(球体マーク)が期待通りか確認します

カメラアラインメント結果のエクスポート

  • メインウィンドウから[File]->[Export model as text]を選択してカメラアラインメント情報をテキスト形式で出力します
  • 出力フォルダには以下のようなファイルが出力されます

Cubemapに変換する

  • Colmapのカメラアラインメント結果から6方向画像のCubemapに展開します

    ここでは私が公開しているツール360 CCConverterをご紹介します

設定 1

主要項目 説明
Equirectangular Images Folder 切り出した全天球画像フォルダを指定
注)マルチバイト文字を含むファイルパスは未サポート
COLMAP Model Folder Colmapのカメラアラインメント出力フォルダを指定
注)マルチバイト文字を含むファイルパスは未サポート
Output Folder Cubemap展開先のフォルダを指定
注)マルチバイト文字を含むファイルパスは未サポート
Crop Size 6方向に切り出す画サイズ、OSMO360の8K動画の場合は1920でOK
FoV 6方向に切り出す視野角、90°でOK
Max Images 全天球画像の処理枚数上限、動作テストする際に小さい値を指定してください
Image Range 処理対象の全天球画像を範囲指定可能、部分的に処理する際に指定ください
Workers 処理のプロセス数、お使いのCPUのコア数に応じて増減させてください
Yaw Offset CubemapのYaw角度にバリエーションを持たせることが可能。Cubemap毎に指定角度が加算されます。5~30°の範囲がお勧めです
Save Config 上記設定値を設定ファイルとして保存可能
Run Conversion Cubemap変換処理を開始

設定 2 マスク処理

  • Cubemap展開した画像に人物や自動車等のマスクを生成することが可能です。
  • Extract Sharpest Frameで生成したSAM3マスクは後述のカスタムマスクに指定してください。YOLOマスクと併用可能です。
主要項目 説明
Mask Pass Mode Singleは全天球画像でオブジェクト認識します。高速ですが精度は低いです。Dualは全天球画像とCubemap画像両方でオブジェクト認識します。処理量は多いですが、認識精度が高いです
Merge Mode Dualモード時にマスクを結合させるモードです。unionは双方の単純結合、refineはCubemapのマスクをベースに全天球マスクが統合されます。refineがお勧めです
YOLO Class IDs 検出したいクラスIDを指定します。 0: person, 1: bicycle, 2: car, etc. カンマ区切りで複数ID指定可能です。https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/coco.yaml
YOLO Confidence 閾値を下げると認識率は上がりますが、ノイズも増えます
Enable overexposure mask 白飛び画素は3DGS学習時にノイズ成分になる場合があります、除去したい場合に有効にしてください

設定 3(高度な設定)カスタムマスク

  • Extract Sharpest Frameで生成したSAM3 Dual Mask(3DGS学習用)または任意のマスクをロード可能です。マスク画像は静止画と同じ枚数、同じ解像度のPNG画像、同じファイル名で指定してください。
    参考:Google Slide -> https://t.co/X0uRH959RV (Metashapeの例ですがColmapも同様の考え方です)

設定 4(高度な設定)Cubemap削減

  • 3DGSの品質低下を最小限に抑え、Cubemapを削減する機能です。3DGS学習時間の短縮、VRAM使用量の削減を期待できます
  • BOOTHからダウンロードしたzipに詳細な操作説明書(PDF)が含まれています。それを参照してください
  • 参考:https://x.com/kotohibi_3d/status/2078671971639009313

実行

  • 処理実行後、正常に完了すると出力フォルダに以下のようなフォルダとファイルが生成されます

(LichtFeld Studio編)3D Gaussian Splattingの学習

ここではLichtFeld Studio(LFS) V0.5.3を使って説明します

Cubemapの取り込み

  • [File]-> [Import Dataset]を選択して、CCConverterのOutput Folderを指定します

  • 正しくデータが見つかると下記のようなダイアログが出ます。内容を確認して[Load]ボタンを押して次に進みます
  • データが正しくロードされると下記のような画面が出ます

3DGS学習開始

  • Mask設定
    • [Training Parameters]->[Mask Mode]->[Ignore]を選択します
    • [Alpha Mask]はオフにします
  • 学習パラメータ
    • 私が良く使う設定を下図に示します
    • [Strategy]->[MRNF]をお勧めします(※この記事執筆時点)
    • Max Gaussiansをシーンの大きさに応じて変更します(3,000,000~12,000,000)
    • SH Degreeを調整します(1~3), VRAMが少ない環境は1を推奨します
    • IterationsとSteps Scalerは画像枚数に応じて自動計算されます
    • MRNFの場合、その他のパラメータの変更はあまり必要ありません
    • LFSはパラメーターが多いため、Webで調べてシーンに最適な設定を探してください
    • ※最近はBilateral Gridはオフにする場合が多いです。(PPISPで十分な場合が多い)
  • [Start Training]を押して3DGSの学習を開始します。

3DGS学習結果

  • 学習が進むと、3DGSが見えてくると思います!

最後に

3DGSの手法は様々で、本記事は一例に過ぎません。最新の情報は私のXで発信していきます
是非ご自身でも調査してより良い手法を開発してください。Enjoy 3DGS :)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?