【Nerf】動画から高品質3Dモデルを作成

また投稿まで時間がかかってしまいました。

最近AI関連の話題がすごくて、私も追いつかれないように必死にしがみついています。

前から画像から3Dモデルを再現する3次元復元に興味があって、SfMでよく聞くCOLMAPとかも調べてたんですが、これだけだといまいちポリゴン感が抜けなくて、もっときれいに復元できたらいいのになと思っておりました。

そんな中Nerfという機械学習を取り入れた3次元復元の技術を知りました。GoogleMapでも東京タワーとかをこのマウスでホバーするとNerfをつかったイマーシブビューってやつを確認できます。初めてこれを見たとき今までの3次元復元とリアルさが全然違ってすごってなりました。

自分でもこれやりたいなと思って色々やってみたので、その備忘録みたいなものです。

instant-ngp

Nerfを体験しようと思ったとき最初に出てきたのが、この「instant-ngp」ってやつです。僕みたいな一般市民は高性能なグラボを持っているわけでもなく、お金もないため、できるだけ安価でNerfをやってみたいと思っていましたが、このinstant-ngpは学習時間を短縮させたNerfらしいです。

ただ簡単にできるわけでもなく、セットアップやらビルドやら結構大変でした。こちらとかこちらとか色々参考にさせていただきました。こういうの初めにやられる人は本当にすごいですね。

でサンプルをやってみようと思いました。成功すると以下のようなきれいな3Dモデルができるみたいです。

しかし自分でできたのは、以下のようなもやもやしたもので、思うような結果が得られませんでした。

頑張ってやってみた結果

自分のPCのスペック不足か、使い方が間違っているのかわかりませんが、 Githubの質問欄?に拙い英語で質問しても、返信がなくげんなりしていました。

nerfstudio

そこで見つけたのは、「nerfstudio」といういろんなNerfのモデルが手軽に実施できるソフトでした。

こちらはインストールなども難しくなく、いろんなモデルも試せるということでこちらで遊んでみることにしました。

はじめはインストールが簡単なDockerを使ったインストール方法でやっていたのですが、GPUの制限?のせいなのか、あまり重たい計算ができなかったので、途中で自分のconda環境にインストールする方法に切り替えました。

Dockerのインストールではこちらのサイトが役に立ちました。

nerfstudioではいろんなモデルを試すことができました。ここではnerfstudioの基本的なモデルであるnerfactoを基準として、G-shockの時計動画で撮影し、それを処理した結果を載せておきます。

  • 撮影機器:iPad Pro 2022年モデル
  • 使用した画像枚数(1分47秒の動画から抽出):3208枚
  • 使用GPU:RTX3060Ti
  • 使用OS:Windows11

iterationを変えた例

計算回数を変えたときの変化です。3万回ではまだ荒く、10万回では色が鮮明でない(G-SHOCKのロゴが白い(本当は水色))ようだったので、20万回、30万回くらい計算しないといい感じにはなりませんでした。計算時間は測っていないのですが、30万回で半日ほどだったと思います。

train-num-rays-per-batchを変えてみる

多分高画質になるはず!

Nerfacto-bigにしてみる

”nerfacto-big”はnerfactoの高品質版みたいです。さらに上位のnerfacto-hugeは僕のパソコンではGPUのメモリ不足で実行不可能でした。

結果はあまり変わらなかった記憶があります。そもそもnerfactoとbigで設定が違う可能性があり、比較できていないかも。

Nerfbusters

Nerfbustersはnerfで作成時にできる”もやもや”を除去することができるモデルみたいです。 もともとnerfactoでも”もやもや”が少なかったから、あまり意味はなかったかも。

導入時に苦労したので、僕なりの導入方法を載せておきます。

Nerfbusters導入手順

  1. CUDA11.7.1をインストール(こちらあたりを参照)
  2. conda環境をセットアップする
    conda create --name nerfbusters -y python=3.8
    conda activate nerfbusters
    python -m pip install --upgrade pip
  3. Nerfstudio と依存関係をインストール(nerfbusters-changesをクローン)
    git clone -b nerfbusters-changes https://github.com/nerfstudio-project/nerfstudio.git
    cd nerfstudio
    pip install --upgrade pip setuptools
    pip install -e .
    pip install torch==1.13.1 torchvision functorch --extra-index-url https://download.pytorch.org/whl/cu117
    pip install ninja git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch
    conda install -c "nvidia/label/cuda-11.7.1" cuda-toolkit
  4. nerfbustersをインストール
    cd ../
    git clone https://github.com/ethanweber/nerfbusters
    cd nerfbusters
    pip install -e .
  5. ns-train nerfbusters –helpが表示出来たら成功
    ns-train nerfbusters --help

Nerfbustersの実行手順

Nerfbustersの実行にあったっての手順メモ

  1. nerfactoを実行する(nerfbustersディレクトリ内)
    #COLMAP実行
    ns-process-data video --data data/v-01/v-01.mp4 --output-dir data/v-01-output --num-frames-target 3000

    #nerfトレーニング実行
    ns-train nerfacto --data data/v-01-output --max-num-iterations 20000
  2. 重みのダウンロード
    python nerfbusters/download_nerfbusters_dataset.py diffusion-cube-weights
  3. nerfbustersの実行(日時のディレクトリと.ckptのファイル名は適宜さきほどトレーニングした結果に変更する)
    ns-train nerfbusters --data data/v-01-output --pipeline.nerf-checkpoint-path outputs/v-01-output/nerfacto/2023-08-02_133854/nerfstudio_models/step-000029999.ckpt nerfstudio-data --eval-mode train-split-fraction
  4. レンダリング (日時のディレクトリは適宜変更、カメラパスはnerfstudioのviewerで作成する)
    ns-render --load-config outputs/v-01-output/nerfbusters/2023-08-02_140153/config.yml --traj filename --camera-path-filename data/v-01-output/camera_paths/2023-08-02_133854.json --output-path renders/2023-08-02_140153.mp4

まとめ

Nerfを実際やってみたけどやっぱりすごいですね!面白いと思います。今後どんどん発展してく分野な気がします。

もっと色々試してみたいと思います。

その他メモコマンド

  • GPU使用率確認(コマンドプロンプト)
    nvidia-smi
  • GPUのメモリ解放(コマンドプロンプト)
    taskkill /im cmd.exe /f
  • conda 仮想環境の削除(Anaconda Prompt root環境)
    conda remove -n myenv --all

参考サイト

コメント

タイトルとURLをコピーしました