動画から3dモデルを作る【ガウシアンススプレッティング】

Gaussian Splattingを用いて、動画から3dモデルを作成しよう

Dockerとスマートフォン1台で、現実の空間や物体を高品質な3Dモデルに変換する「Gaussian Splatting」を試してみました。

今回は、環境を汚さないためにNerfstudioをDockerコンテナで動かし、実際にプレビューを確認してデータとして書き出すまでの工程を、備忘録を兼ねて解説します。

1. Docker環境

Gaussian Splatting(3DGS)やNeRFの環境構築は、PyTorchやCUDA、そして各種依存ライブラリのバージョン整合性が非常にシビアです。特にConda環境では、既存のPython環境との衝突が起きやすく、ビルドで躓くことが多々あります。

Dockerを利用することで、GPUドライバさえ入っていれば、「一発で動く環境」をどこでも再現できるようになります。

NVIDIAドライバのチェック

簡易チェックとしてnvidia-smiでGPUやcudaが入っているか確認します。

nvidia-smi

Dockerの起動コマンド

以下のコマンドで、NVIDIA GPUを認識させた状態でコンテナを立ち上げます。

docker run --gpus all \
  -it \
  --shm-size=12gb \
  -v $(pwd):/workspace \
  -p 7007:7007 \
  --name nerfstudio \
  ghcr.io/nerfstudio-project/nerfstudio:latest
  • --shm-size=12gb: 学習中の共有メモリ不足を防ぐために大きめに設定します。
  • -v $(pwd):/workspace: カレントディレクトリをマウントし、ホスト側とデータを共有します。
  • -p 7007:7007: Webビューワーを表示するためのポート開放です。

2. データ変換(ns-process-data)

サンプルコードでは ++対象物++としていますが、自身の環境の動画ファイルなりの名前に置き換えてください。
今回はサンプルとして、手元にあった名刺サイズのプラスチックケースを動画として撮影し3dモデル化してみることにします。

3dモデルに変更するための対象物となる、名刺ケースサイズの箱

画像 対象物(名刺サイズのプラケース)

スマートフォンで撮影した動画(++対象物++.mp4)から、学習に必要な「静止画フレーム」と「カメラの位置情報(ポーズ)」を抽出します。

# 基本的な実行コマンド
ns-process-data video --data ++対象物++.mp4 --output-dir data/++対象物++ --num-frames-target 300
colmapのマッピング作業中のターミナルの様子

画像数が多すぎるととても時間がかかる

成功すると、以下のような表示になり、マッチ度合は大体85~%程度あれば成功といえると思います。

画像 COLMAPの結果 99.39 % matched

Tips:特徴点マッチングの失敗を防ぐ

実際に試したところ、デフォルト設定ではフレームの切り出し間隔が長すぎて、特徴点のマッチングに失敗する(全体の1%程度しか認識されない)現象が発生しました。

今回の撮影環境(30fps動画)では、全体の1/3程度は使うように調整することで解決しました。ちょっとやりすぎ感はあるので、もう少し落として、処理速度を上げてもいいかもしれません。動画が短い場合は、フレーム数を多めに指定するのがコツです。

内部で行われていること: 内部では COLMAP というツールが動き、画像間の特徴点をマッチングさせて、カメラがどの位置・角度から撮っていたかを逆算しています。これを「Structure from Motion (SfM)」と呼びます。

3. 学習の実行(ns-train splatfacto)

データの準備ができたら、Gaussian Splattingの学習を開始します。Nerfstudioでは splatfacto という最適化されたアルゴリズムを使用します。

ns-train splatfacto --data data/++対象物++
  • 何が行われるか: 3次元空間に「ガウス球(Splat)」をばらまき、撮影した画像と一致するようにその形、色、不透明度、異方性を最適化していきます。
  • Viewerの起動: 実行すると、ターミナルに http://localhost:7007 のようなURLが表示されます。

4. ブラウザでリアルタイムに確認

ホストPCのブラウザから上記のURLにアクセスすると、Webビューワーが立ち上がります。

  • プロセスの可視化: 学習が進むにつれて、スカスカの点群状態から、徐々に++対象物++のディテールがヌルヌルと浮かび上がってくる様子がリアルタイムで確認できます。
  • 操作: マウス操作で自由な視点から「まだ撮り切れていない角度」などを確認でき、必要であれば追加撮影の判断材料にもなります。
マッチング中の ns-trainのビューア画像

5. 学習結果

マッチング中の ns-trainの学習結果

学習後少しクリーニングした後のモデル

学習が完了すると上記のようにきれいに3d空間にマッピングすることができました。1分程度の動画を用い、COLMAPなどの処理含めて全体で15分かからなかったと思います。この速度でこのクォリティを出せるのは驚きでした。

出力

「いい感じ」にモデルが組み上がったら、他の3Dソフトやエンジニアリングツールで利用できる形式(.ply)で書き出します。

ns-export gaussian-splat \
  --load-config outputs/++対象物++/splatfacto/<タイムスタンプ>/config.yml \
  --output-dir exports/

これにより、exports/ ディレクトリに、汎用的なGaussian Splatting形式のデータが出力されます。


まとめ

今回は「とりあえず動かして3Dモデルを見る」ところまでを最速で行いました。 ここまではあくまで「鑑賞用」に近い状態ですが、データのクリーニングなどを行えば、3dでのサンプルモデルとして、その後ポリゴン化するなどすればゲームエンジンに取り込んだりもできるので、いろいろ使い道が広がりそうです。

Dockerを使えば、これらの高度な処理も「環境を汚さず」に試行錯誤できるのが最大の強みですね。

plyモデルのクリーニングをする:(記事は現在利用できません: ID 6830)

ここまで読んでいただきありがとうございます。

では、次の記事で。 lumenHero

関連記事

docker環境を整える(WSL2):【2026年版】WSL2にDocker Engineをインストールする最短手順(Docker Desktop不要)
docker compose (ubuntu) :2026年版:UbuntuへのDocker & Docker Compose 推奨インストール手順