NeRF : 複数の視点の画像から3Dモデルを生成してレンダリングする機械学習モデル
ailia SDKで使用できる機械学習モデルである「NeRF」のご紹介です。エッジ向け推論フレームワークであるailia SDKとailia MODELSに公開されている機械学習モデルを使用することで、簡単にAIの機能をアプリケーションに実装することができます。
NeRFの概要
NeRF(Neural Radiance Fields)は2020年3月に公開された技術です。NerFでは、複数の視点の画像から3Dモデルを生成して、任意の視点の映像をレンダリングすることが可能です。NeRFでは、ポリゴンを使用せずに、機械学習モデルとして3Dモデルを表現します。
NeRFのアーキテクチャ
NeRFで生成された3Dモデルは機械学習モデルのパラメータとして表現されます。3Dモデル一つにつき、一つの機械学習モデルが生成されます。3Dモデルを関数表現するという考え方になります。
学習では、複数の視点の画像と、各画像のカメラパラメータを入力として、機械学習モデルを学習します。
推論では、生成したい空間上の座標(x,y,z)と、視線方向(θ,φ)を与えることで、(R,G,B,σ)を出力します。σは密度です。レイトレーシングのように、1画素1画素、RGB値を計算していきます。
モデルアーキテクチャは、(x,y,z)と(θ,φ)をPositionEmbeddingによって高次元空間に射影した90要素の1次元入力ベクトルに対して、Linear演算を重ねていく形となります。
学習用のデータはLLFFフォーマットで入力します。LLFFフォーマットには、画像ファイルと、カメラ位置を示すnumpyファイルが含まれます。
ビデオから3Dモデルを構築しようとした場合、ビデオにカメラ位置のアノテーションを追加する必要があります。自動的にカメラ位置を検出する方法としては、SfM技術をベースとしたCOLMAPを使用可能です。COLMAPはドローンの映像からカメラ位置を推定する用途などで使用されています。対象物体が静止していて、その周りを回るような映像に対するカメラ位置推定を得意としています。
NERFは従来方式よりもディテールの細かい映像を出力することが可能です。
NERFの使用方法
ailia SDKでは変換済みの3DモデルをONNXとして入力し、実際に推論して画像を生成することが可能です。
下記のコマンドで1フレームのレンダリングを行います。
python3 nerf.py -s output.png
angleオプションでレンダリングする視点を変更することができます。
python3 nerf.py --angle 100
render_factorオプションでレンダリング解像度を上げることができます。デフォルトでは1/4解像度でレンダリングします。下記の設定では1/2解像度でレンダリングします。
python3 nerf.py --render_factor 2
関連情報
COLMAPとNeRFを使った3次元復元
NeRFをボリュームテクスチャに変換してUnityでレンダリングする
Back to your idea of caching the 4d volume. I have a unity project and video that realize this. It is very fast (>100FPS) in the video, but the image quality is definitely lower than if you do the “correct” inference. I didn’t write python code to evaluate it, but in my opinion it might result in 5~6 points difference in PSNR.
ax株式会社はAIを実用化する会社として、クロスプラットフォームでGPUを使用した高速な推論を行うことができるailia SDKを開発しています。ax株式会社ではコンサルティングからモデル作成、SDKの提供、AIを利用したアプリ・システム開発、サポートまで、 AIに関するトータルソリューションを提供していますのでお気軽にお問い合わせください。