動画から3Dシーンを生成するAI「3D Gaussian Splatting」を試してみた

2024.03.06
動画(複数の視点からの画像)から三次元シーンを生成するAI、3D Gaussian Splatting(以下3DGS)が面白そうだったので試してみました。
手元にGPUを持っていないのでGoogle Colabを利用しました。

3D Gaussian Splattingとは

3D Gaussian Splatting(以下3DGS)とは、複数の視点から撮影した画像から、3Dシーンを作成する手法です。以下は公式が用意したサンプル動画です。生成した3Dデータをレンダーすると、ドローンで撮影したかのような映像も作れます。
2023年8月に発表された新しい手法で、従来の手法に比べて高品質でリアルタイムなレンダリングができることから注目されています。 スマホで撮影した通常の動画から三次元モデルの作成などが行えます。利用例として、ゲームやVR、映像制作などに使えそうです。 論文やソースコードが公開されており、誰でも自由に使うことができます。

自分でやった結果

自分がgoogle Colabで試した結果を載せます。 一応できたので面白かったのですが、いまいち良い結果は得られませんでした。他の方が試した動画を見るともう少し綺麗です。学習の実行時間には1時間程度かかりました。 精度がいまいちだったのは

  • 学習に使用した写真の枚数が少ない
  • スペック不足
  • カメラ位置の推定(colmap)の設定が上手く出来てなかったかも?
  • 写真の画質が低い

とかなのかなと思います。 あとgoogle colabの無料枠を使った感想ですが、今回の用途だとスペック不足なのもあり、あまり向いてなかったかもと思いました。あと、colabからGoogleドライブのインポートをしていれば上手くできたのかもしれませんが、インスタンスはセッションが切れると90分経過で消えます。学習の実行時間が長かったり、環境構築がうまくいかず調べながらなので、一旦疲れたし寝よって思うとインスタンスが消えてデータがリセットされました。colabは無料で手軽ですが、GCEやEC2でインスタンスを立てた方が今回は良かったと思いました。

Luma AI

今回は環境構築から自分で試しましたが、Luma AIという企業がすでに3DGSを自社アプリで機能として提供しています。 手軽に試したい人はおすすめです。iOS16以降に対応しており無料で使えます。Androidには非対応です。Web版は一回の利用に1ドルかかります。

やり方

ここからは実行手順を書いていきます。3DGSの動作要件は以下です。

ハードウェア要件

  • Compute Capability 7.0以上の CUDA 対応 GPU
  • 24 GB VRAM (推奨)

ソフトウェア要件

  • Conda (推奨)
  • PyTorch拡張用のC++コンパイラ
  • PyTorch拡張用のCUDA SDK 11
  • C++ コンパイラ

データセットを作成(ローカル環境)

iPhoneで動画を撮ります。その動画をMacに送ってffmpegを使って、複数枚の画像を取り出します。

ffmpeg -ss 0 -i video.mp4 -t 30 -r 4 -q:v 1 -f image2 %06d.jpg
ffmpeg -ss [開始時間] -i [入力ファイル] -t [切り出す時間範囲] -r [1秒間から切り出す枚数] -q:v [出力画像の品質(1が高画質)] -f image2 %06d.jpg

次に、colmapという複数の写真からカメラ位置や向きを推定してくれるツールを使って、データセットを作成します。
colmapもcolab上で動かしたかったのですが、自分のやり方が悪かったのかソースコードからビルド、実行すると何故か著しく精度が低くなりました。そこでMacで実行可能なappファイルが配布されていたので、そちらを使ってローカル環境でデータセットを作成しました。
自分はCOLMAP-3.5-mac-no-cuda.zipを利用しました。それ以上のバージョンだとうまく動作しなかったです。

ローカルで動かした場合は、このエラーが出て、カメラのモデルをSIMPLE_PINHOLEに変更する必要がありました。 自分はFILE > Export model as text でテキスト形式で出力したファイルを編集して、SIMPLE_PINHOLEに変更して再度インポートすることで解決しました。

環境構築(Colab)

Colab上でGPUを選択します。
ランタイム > ランタイムのタイプを変更 > T4 GPU

スペック確認

一応スペック確認をする場合は、以下のコマンドでColabで割り当てられたGPUのスペックやcudaのバージョンを確認できます。
Colabでは先頭にビックリマークをつけるとLinuxコマンドとして実行されます。

!nvidia-smi
!nvcc -V

NVIDIA Tesla T4 16GB GDDR6メモリ
Compute Capability 7.5
Cuda v12.2

colabのGPUだと、VRAMが24GBまで足りず16GBしかありませんでした。ですがVRAMが少なくても3DGSを動かすことは出来ます。もしメモリ不足で不具合が発生する場合は、READMEに対処法が書いてあり、メモリの使用量を抑える設定ができます。

インストール

3DGS本体と、サブモジュールのインストールを行います。

%cd /content
!git clone --recursive https://github.com/camenduru/gaussian-splatting
!pip install -q plyfile
%cd /content/gaussian-splatting
!pip install -q /content/gaussian-splatting/submodules/diff-gaussian-rasterization
!pip install -q /content/gaussian-splatting/submodules/simple-knn

学習

colmapで作成したデータセットをColabに転送したあと、3DGSの学習を行います。

!python train.py -s /content/colmap_ws

GUIビューワー

学習した結果出力されたデータを閲覧できるビューワー(SIBR_viewers)がありますが、colabだとディスプレイを認識しない関係でエラーが出てインストールできませんでした。そこで3DGSから出力されたデータを一度ローカルに落として、こちらのリポジトリにあるcolab上で動かせるビューワーを使いました。ブラウザにplyファイルをドラッグするとファイルを閲覧できます。

感想

3DGSのgithubのREADMEを読むと、サンプルのcolabのテンプレートが紹介されていました。それを見てcolabで手軽にできるならと始めましたが、環境構築の時 colmapやビューワーのインストールで詰まってたり、うまく動いてくれないとかで難しかったです。windowsであれば他のブログでもやっている人を見かけたり、windows向けのビューワーのビルド済みファイル配布されていたりで簡単そうでした。
写真かと思うほどリアルな三次元データがカメラで撮影するだけで誰でも作れる、というのはすごく面白い技術だと思いました。取り壊し予定の建物を三次元データ化して思い出として残しておく、などの使い方も良さそうですね。