【4DGaussians】わずか20分で通常動画を3D動画に変換できるAI
みなさんは、写真から動画を生成してくれるAIツール「4D Gaussians」をご存知ですか?
4D Gaussiansはただ、パラパラ漫画の間を埋めるだけではありません。映画「マトリックス」の弾除けシーンのようなカメラ側が動く写真でも、70FPSのなめらかな動画にできちゃうんです!
しかも動画のレンダリングは、たったの20分で完了します。
今回はそんな4D Gaussiansの概要や使い方、実際に使ってみた感想をお伝えします。個人でムービーを撮っている方は必読ですので、ぜひ最後までご覧ください!
4D Gaussiansの概要
4D Gaussiansは複数の写真から1つの動画を生成するAIツールです。
定点カメラで撮った「静的シーン」のみならず、視点が動く「動的シーン」にも対応しています。なんと写真同士の間にある別視点を補完して、スムースな動画を作ってくれるのです。
4D Gaussiansのすごいところ
この4D Gaussiansの開発にあたって、写真をデータに落とし込む処理を工夫しました。その結果D-NeRFなど、従来の動画生成AIよりも処理速度が格段に向上しています。そのアピールポイントは以下の4つです。
3Dガウススプラッティング:画像中の色の位置から大まかに動きを予想しています。物体の動きを個別に追いかける従来の手法よりも、処理を軽くできるのが特徴です。
動的シーンの生成:4D(4次元)の名に違わず、縦軸・横軸・時間軸に加え奥行きの軸まで処理ができます。したがって動的シーンでも遠近感が崩れません。
高効率:たったの20分でレンダリングが完了します。開発者らはゲーミング用のグラフィックボード・RTX 3090 GPUで、高画質(800×800)かつスムース(70FPS)な動画を生成していました。
高品質:従来の動画生成AIと比べてPSNRが高い、つまり画質の劣化が抑えられています。さらに動画のなめらかさを示すフレームレート(FPS)の値も格段に向上しています。
ちなみに従来の動画生成AIとの性能比較は、下図の右側になります。
そして3Dガウススプラッティングでの世界の視え方は、以下のとおりです。
このように4D Gaussiansは、手足の動きを大まかにとらえたあと解像度を高めます。従来のように手先・足先・各関節の動きを都度追っていく必要はありません。
結果として速さの異なる物体であっても、高効率な学習が実現できているのです。
4D Gaussiansの実力
4D Gaussiansは複数枚の画像からスムースな動画が生成できます。
まずはTレックスの骨格のCG画像を200枚、4D Gaussiansに与えてみましょう。その結果は……
このようにTレックスが、ヌルヌル動きます!
もちろん人工の画像だけでなく、写真でも動画生成が可能です。900枚ほど写真を与えてみると……
多少動きがカクつきますが、まな板の木目まで再現できていますね。
さらに4D Gaussiansは同じ写真について、固定撮影と移動撮影の2形式で動画をレンダリングできます。固定撮影の動画の仕上がりは……
以下のとおり、視点を移動させてもハイクオリティです!
次からは実際に4D Gaussiansを使ってみて、動画生成の効率やクオリティを確かめていきます。まずは次の見出しで4D Gaussiansの使い方をご覧ください。
参考記事:4D Gaussian Splatting for Real-Time Dynamic Scene Rendering
4D Gaussiansの使い方
4D Gaussiansのリポジトリは、GitHubの公式ページから無料でクローンが作れます。ちなみにPyTorchの環境については、1.13.1+cu116が推奨です。
なお今回有志がGoogle Colabにアップロードしたコードを実行しました。まずはColab上で、4D Gaussiansのクローンを作るためのコードを以下に示します。
%cd /content
!git clone https://github.com/hustvl/4DGaussians
%cd 4DGaussians
!git submodule update --init --recursive
!pip install -r requirements.txt
!pip install -e submodules/depth-diff-gaussian-rasterization
!pip install -e submodules/simple-knn
ここから実際に4D Gaussiansを使うには、データセットを学習させる必要があります。まずは次の項目で、4D Gaussians用のデータセットを用意していきましょう。
データセットの準備
CG画像・写真ともに、有志によってデータセットが公開されています。したがってダウンロードしたファイルを以下のようにまとめるだけで、データセットの準備は完了です。
#学習データのファイルパス一例
├── data
│ | dnerf
│ ├── mutant
│ ├── standup
│ ├── ...
│ | hypernerf
│ ├── interp
│ ├── misc
│ ├── virg
│ | dynerf
│ ├── cook_spinach
│ ├── cam00
│ ├── images
│ ├── 0000.png
│ ├── 0001.png
│ ├── 0002.png
│ ├── ...
│ ├── cam01
│ ├── images
│ ├── 0000.png
│ ├── 0001.png
│ ├── ...
│ ├── cut_roasted_beef
| ├── ...
ちなみに4D GaussiansのGitHub公式ページでは、以下3つのデータセットが紹介されています。
D-NeRFのデータセット(CG):data.zip
Hypernerfのデータセット(写真・移動撮影):Hypernerf Dataset
DyNeRFのデータセット(写真・移動撮影):3D Video Asset
ただGoogle Colabで公開されているコードには、データセットも付属していました。以下のコードで、データセットが取り込めます。
!mkdir /content/test
%cd /content/test
!wget https://huggingface.co/camenduru/4DGaussians/resolve/main/data/data.zip
!unzip data.zip
これなら自分でデータセットを作る手間がかかりませんね。
4D Gaussiansの操作方法
4D Gaussiansを使う前にまず、データセットを学習させていきます。以下の例のように、データセットのパスを指定して「train.py」を実行すれば学習が始まります。
#D-NeRFのデータセット「bouncingballs」を学習
%cd /content/4DGaussians
python train.py -s data/dnerf/bouncingballs --port 6017 --expname "dnerf/bouncingballs" --configs arguments/dnerf/bouncingballs.py
学習が完了したら、いよいよお待ちかねの動画生成です。こちらは下記のとおり、「render.py」を実行してください。
#D-NeRF「bouncingballs」を動画としてレンダリング
%cd /content/4DGaussians
python render.py --model_path "output/dnerf/bouncingballs/" --skip_train --configs arguments/dnerf/bouncingballs.py &
動画の生成が完了したら、あとはmp4形式のファイルとして出力させます。そのコードは以下のとおりです。
from IPython.display import HTML
from base64 import b64encode
def display_video(video_path):
mp4 = open(video_path,'rb').read()
data_url = "data:video/mp4;base64," + b64encode(mp4).decode()
return HTML("""
<video width=1000 controls>
<source src="%s" type="video/mp4">
</video>
""" % data_url)
ちなみにColab上で動画を表示させたい場合は、追加で下記を実行する必要があります。
save_dir = '/content/4DGaussians/output/dnerf/bouncingballs/video/ours_20000/video_rgb.mp4'
import os
import glob
# video_path = glob.glob(os.path.join(save_dir, "*-test.mp4"))[0]
display_video(save_dir)
次の見出しからは実際に、4D Gaussiansを使っていきます。4D Gaussiansの実力をご覧あれ。
なお、テキストから3D画像を生成できるモデルについて知りたい方はこちらをご覧ください。
→【MVDream】TikTok、ByteDanceのテキストから高精度の3D画像を生成するAIモデルを使ってみた
4D Gaussiansを実際に使ってみた
ここからは実際に、Google Colab上で4D Gaussiansを動かしていきます。今回はランタイムからT4 GPUを選んで、先ほどのコードを実行しました。以下、その過程をみていきましょう!
GitHubからリポジトリのクローンを作成する
まずはGitHubからリポジトリのクローンを作成しました。Colabに公開されているコードを実行すると……
このように4D Gaussiansの構成部品が、Colabのcontentフォルダに取り込まれていきます。
学習用データのダウンロード
新たにtestフォルダを作成して、そこに学習用のデータをダウンロードします。以下のようにコードを実行すると……
TレックスなどのCG画像がダウンロードされます。
学習本番
モデルとデータが取り込めたら、さっそく4D Gaussisansに画像を学習させていきます。今回は人がジャンプする画像「jumpingjacks」を257枚、学習に使用しました。コードを実行してみると……
このように20000回の学習が、たったの24分18秒で終わってしまいます。冒頭で紹介したとおり、4D Gaussiansは高効率なんですね。
動画生成
先ほどの学習内容を、動画として出力させます。まずは以下のように、render.pyを実行しました。
するとたったの36秒で、動画を出力してくれます。あとはmp4形式の動画にして、Colab上で表示させると……
このように見事、動画が生成されています!その動画は以下をご覧ください。
手足の先端にブレが生じていますが、それでも十分に躍動感のある動画になっていますね。
4D Gaussiansの推しポイントである高効率・高品質な動画生成は本当なのか?
今回は4D Gaussiansにおける動画生成の効率と品質をテストするために、写真を100枚程度学習させてみました。使用した写真は以下のとおりです。
- 視点を変えながら適当なタイミングで撮った写真147枚
- 動画から1秒間隔で切り出した写真87枚
これらについてそれぞれ、学習を試みたのですが、4D Gaussiansは認識すらしてくれませんでした。
まず適当なタイミングで撮った写真については、以下のエラーが生じます。
次に動画から等間隔で切り出した写真についても……
このように同様のエラーが生じてしまいました。
なお、3Dガウススプラッティングを使った実験の成功例について詳しく知りたい方は、下記の記事を合わせてご確認ください。
→【DreamGaussian】必要なのは1枚の画像、1分で3D画像を作る画像生成AI
まとめ
当記事では複数の写真から躍動感ある動画が生成できる、4D Gaussiansについて紹介しました。もういちど4D Gaussiansのすごいところを以下にまとめます。
- 3Dガウススプラッティング:動きを捉える際の効率が良い
- 動的シーンの生成:縦軸・横軸・時間軸+奥行きの軸が処理できる
- 高効率:ゲーミング用のGPUでも、たったの20分で動画が生成できる
- 高品質:画質の劣化が少なく、スムースな動画が生成できる
以上の強みをもつ4D Gaussiansなら、映画「マトリックス」の弾を避けるシーンのようなダイナミックな動画が作れるかもしれません。動画制作のお供として、活躍してくれそうですね。