[Plenoxels] AIで写真から自由視点の写真を生成する [NeRF]

2022年1月7日金曜日

Artificial Intelligence

本記事では、Plenoxelsを使って、写真から360度様々な角度から見る事のできる写真を生成する方法を紹介します。

アイキャッチ

技術概要

Plenoxelsとは

Plenoxelsは、NeRFからニューラルネットワークを除き最適化の精度を維持しつつ、最適化速度を改善した機械学習手法です。

NeRFとは

NeRFとは、様々な角度から撮影した画像を入力に、自由な視点から観測できる画像を生成する技術です。

言葉だけではなかなか分かりにくいと思いますので下記の動画をご覧ください。

動画を見ていただくと、楽器のドラムや、船の模型などが回転している映像があると思います。

この映像こそNeRFが実現している画像なのです。NeRFは、視点の移動に合わせてその視点から見たオブジェクトの画像を連続的に生成するため、あたかも、3D映像を見ているかの如く立体感のある映像を作り出しています。

なお、以下の記事では、有料にはなりますが、詳細な技術解説、Google Colaboratoryを用いた自由視点画像の生成方法をご紹介しています。

Plenoxels、NeRFの歴史

歴史をさかのぼると、NeRF以前の従来技術CNN(Convolutional Neural Network)を使用していました。
そしてNeRFは、そこからCNNを除きニューラルネットワークであるMLP(Multilayer perceptron)を使用し、且つ従来技術を上回る忠実度を実現しました。
そして今回紹介するPlenoxelsは、さらにMLPすらも除き同等の忠実度を実現しています。

このようにネットワークの改良が重ねられ、精度や実行速度の改善が進められています。

Plenoxelsの導入手順

セットアップ①: conda環境構築

それでは早速、開発環境にPlenoxelsをセットアップしていきます。
動作確認は下記の環境で行っています。

OS: Ubuntu 18.04.3 LTS
GPU: GeForce GTX 1080

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

それでは、Plenoxelsをインストールしていきます。他の機械学習環境に影響を与えないためにMinicondaの仮想環境上に構築していきます。Minicondaのインストール手順は公式ドキュメントをご参照ください。

# GitHubからcodeをclone
$ git clone https://github.com/sxyu/svox2.git

# Proxy配下の場合は事前に下記を設定
$ export http_proxy="http://"username":"password"@proxy:port"
$ export https_proxy="http://"username":"password"@proxy:port"

# ymlファイルを使ってconda環境作成
$ cd svox2
$ conda env create -f environment.yml

# 作成したconda環境を作成
$ cd ..
$ conda activate plenoxel
$ cd plenoxel

# torchの動作確認
$ python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.device_count());"
1.9.0
True
2

# 先ほどcloneしたコードをconda環境のディレクトリに移動
$ mv ../svox2/ ./
$ cd svox2

# cudaバージョンを確認
$ ls /usr/local | grep cuda
cuda-10.2

# cudaバージョンが11より低い場合は下記実行
$ conda install -c bottler nvidiacub

# ライブラリをインストール
$ pip3 install ninja
$ pip3 install .

以上でconda環境の構築は完了です。
以下に、環境作成時に発生し得るエラーとその対処法を記載しています。
エラーが発生した場合にご参照ください。

Please make sure to use the same CUDA versions.

The detected CUDA version (10.2) mismatches the version that was used to compile PyTorch (11.3). Please make sure to use the same CUDA versions.

environment.yml内でconda環境にインストールされたpytorch、cudatoolkitとPCにインストールされているCUDAドライバとのバージョン不一致が原因です。
このため一度conda環境からpytorchをアンインストールしてCUDAドライバーのバージョンと合致するライブラリをインストールしてください。

# cudaドライバのバージョンを確認
$ ls /usr/local | grep cuda
cuda-10.2

# pytorchのアンインストール
$ conda uninstall pytorch
# https://pytorch.org/get-started/previous-versions/ からcudaドライババージョンが一致するものをインストール
$ conda install pytorch==1.9.0 torchvision==0.10.0 torchaudio==0.9.0 cudatoolkit=10.2 -c pytorch

セットアップ②: 学習済みモデルのダウンロード

続いて、学習済みモデルをダウンロードしていきます。
なお、GoogleDriveにて共有されている学習済みモデルをコマンドプロンプトからダウンロードするためにgdownを使用します。

# カレントディレクトリ確認
$ pwd
envs/plenoxel/svox2

# gdownをインストール
$ pip3 install gdown

# 学習済みモデル用ディレクトリ作成
$ mkdir ckpt
$ cd ckpt

# ckpt_lego_real.tar.gz(3.19GB)
# https://drive.google.com/file/d/1nthehQmZ7M-ZcxCXrf_7XxvaY4sguVRg/view?usp=sharing
$ gdown --id 1nthehQmZ7M-ZcxCXrf_7XxvaY4sguVRg -O ./

# ckpt_llff.tar.gz(16.1GB)
# https://drive.google.com/file/d/1y4AMnKKo7XWcyHGdL8onvS-yt-Wzm0lA/view?usp=sharing
$ gdown --id 1y4AMnKKo7XWcyHGdL8onvS-yt-Wzm0lA -O ./

# ckpt_syn.tar.gz(3.75GB)
# https://drive.google.com/file/d/1Sboe-opSE-eyafOPYJtWFeKoE3FbC6ge/view?usp=sharing
$ gdown --id 1Sboe-opSE-eyafOPYJtWFeKoE3FbC6ge -O ./
$ tar -xvf ckpt_syn.tar.gz

# ckpt_tnt.tar.gz(12.7GB)
# https://drive.google.com/file/d/1v9xb5Sd3ulofwNUynC71I_fdwnSLnFhS/view?usp=sharing
$ gdown --id 1v9xb5Sd3ulofwNUynC71I_fdwnSLnFhS -O ./

ファイルサイズが大きいのでネットワークにもよりますが約15分ほどダウンロードに時間を要しました。
とりあえず動かしてみたいだけであれば最も基本的なckpt_syn.tar.gzだけでも構いません。

(オプション)セットアップ③: 学習データのダウンロード

こちらは、モデルのトレーニングを試してみたい方のみご参照ください。

トレーニングに必要なデータセットを用意します。

# カレントディレクトリ確認
$ pwd
envs/plenoxel/svox2

# データセット用ディレクトリ作成
$ mkdir datasets
$ cd datasets

# データセットのダウンロード

# nerf_synthetic.zip(1.68GB)
# https://drive.google.com/file/d/18JxhpWD-4ZmuFKLzKlAw-w5PpzZxXOcG/view?usp=sharing
$ gdown --id 18JxhpWD-4ZmuFKLzKlAw-w5PpzZxXOcG -O ./

# nerf_llff_data.zip(1.79GB)
# https://drive.google.com/file/d/16VnMcF1KJYxN9QId6TClMsZRahHNMW5g/view?usp=sharing
$ gdown --id 16VnMcF1KJYxN9QId6TClMsZRahHNMW5g -O ./

# TanksAndTempleBG.tar.gz(1.11GB)
# https://drive.google.com/file/d/1PD4oTP4F8jTtpjd_AQjCsL4h8iYFCyvO/view?usp=sharing
$ gdown --id 1PD4oTP4F8jTtpjd_AQjCsL4h8iYFCyvO -O ./

# lego_real_night_radial.tar.gz(587MB)
# https://drive.google.com/file/d/1PG-KllCv4vSRPO7n5lpBjyTjlUyT8Nag/view?usp=sharing
$ gdown --id 1PG-KllCv4vSRPO7n5lpBjyTjlUyT8Nag -O ./

全てのダウンロードに約10分ほど要しました。

データセットは以下のような様々な角度から撮影した写真とカメラアングルを定義したファイルなどが格納されています。

データセットサンプル
# nerf_synthetic/hotdog/transforms_train.json

{
    "camera_angle_x": 0.6911112070083618,
    "frames": [
        {
            "file_path": "./train/r_0",
            "rotation": 0.012566370614359171,
            "transform_matrix": [
                [
                    -0.9938939213752747,
                    -0.10829982906579971,
                    0.021122142672538757,
                    0.08514608442783356
                ],
                [
                    0.11034037917852402,
                    -0.9755136370658875,
                    0.19025827944278717,
                    0.7669557332992554
                ],
                [
                    0.0,
                    0.19142703711986542,
                    0.9815067052841187,
                    3.956580400466919
                ],
                [
                    0.0,
                    0.0,
                    0.0,
                    1.0
                ]
            ]
        },

(オプション)モデルのトレーニング

こちらは、既に学習済みモデルが提供されているため、
モデルのトレーニングを試してみたい方のみご参照ください。

# カレントディレクトリ確認
$ pwd
envs/plenoxel/svox2

$ cd opt

# NeRF-synthetic scenesの学習
# ./launch.sh <exp_name> <GPU_id> <data_dir> -c <config>
$ ./launch.sh NeRF-synthetic 0,1 ../datasets/nerf_synthetic/hotdog/ -c ./configs/syn.json

上記コマンドでトレーニングが実行されます。

自由視点写真の生成

いよいよ本題の、自由視点写真の生成を行います。
始めに、様々な角度から見た画像を生成してみます。

# カレントディレクトリ確認
$ pwd
envs/plenoxel/svox2

$ cd opt

# render images
# ckpt.npz配下のディレクトリに結果が出力される
# python render_imgs.py <CHECKPOINT.npz> <data_dir>
$ python render_imgs.py ../ckpt/256_to_512_fasttv/hotdog/ckpt.npz ../datasets/nerf_synthetic/hotdog/

上記を実行すると様々な角度から見たhotdogの画像と、それらをまとめた動画が出力されます。
画像、動画ともに左側がテスト画像で、右側が生成された画像です。

出力結果画像
出力結果動画

エッジも滑らかでほとんどテスト画像と遜色ない画像が出力されています。

自由視点写真の生成(回転視点)

続いて、視点を前方から回転させた場合の動画を出力してみます。

# カレントディレクトリ確認
$ pwd
envs/plenoxel/svox2

$ cd opt

# render images
# ckpt.npz配下のディレクトリに結果が出力される
# python render_imgs_circle.py <CHECKPOINT.npz> <data_dir>
$ python render_imgs_circle.py ../ckpt/256_to_512_fasttv/hotdog/ckpt.npz ../datasets/nerf_synthetic/hotdog/

上記コマンドを実行すると下記の動画が生成されます。

回転動画出力結果

まとめ

本記事では、Plenoxelsを使って、画像がら自由視点の画像を生成する方法をご紹介しました。
今回紹介した技術のように視覚的に出力結果が明確に見えるものは知的好奇心をくすぐりますね。

深く見ていけば非常に複雑で難解な機械学習ですが、まずは「楽しいそう」、「面白そう」といった興味があるものから勉強してみると継続するかもしれません。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1.  論文 - Plenoxels: Radiance Fields without Neural Networks

2. GitHub - sxyu/svox2

3. Plenoxels Radiance Fields without Neural Networks

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology