見出し画像

深層学習による3D復元入門


はじめに

ギリアで機械学習エンジニアをしている王と申します。
最近では、NeRFや3DGSなど「写真から周囲の環境を3D復元・再構築できる技術」が注目を浴びています。今回はこれらの手法について解説していきたいと思います。

Neural Volumes Rendering

2019年、Facebook Reality Labが、コンピュータグラフィックスのトップ学会であるSIGGRAPHにおいてNeural Volumes *1 という論文を発表しました。この論文が凄いのは、ニューラルレンダリングにおいて初めてボリュームレンダリング *2 を応用したところです。後ほど世に現れるNeRFも、この論文から多大な影響を受けただろうと言われています。

著者のLombardi教授は、動的な対象を表現する学習ベースの手法を提案しました。この手法は、Encoder‐Decoder構造 *3 のニューラルネットワークを利用し、入力画像を3Dのボリューム表現 *4 に変換します。

具体的に言うと、$${K}$$枚の画像をEncoderに入力し、$${256}$$次元の潜在ベクトル表現$${z}$$にエンコーディングします。次に、$${z}$$をDecoderに入力し、$${4 \times D \times D \times D}$$の立方体が出力されます。ここの、$${4}$$はRGB値と不透明度(opacity)で、$${D}$$は立方体の辺の長さです。RGB値と不透明度はボリュームレンダリングの構成要素であるため、Neural Volumes Renderingと呼ばれるわけです。

Neural Volumes *5 から抜粋

Neural Volumesは、レイマーチング *6 というテクニックを利用して、ボリュームレンダリングで実際の画像をレンダリングします。まず、カメラから、画像のとあるピクセルを通すようRayを発射して、立方体を通過させます。次に、通過した線分上に座標を一定数サンプリングし、Decoderが出力した立方体上の該当座標のRGB値と不透明度を積分して、画像上のピクセル値を計算します。そして、訓練時は、計算したピクセル値と教師画像上のピクセル値が同じになるよう学習すれば良いわけです。

Neural Volumes *5 から抜粋

しかし、ここで問題点が1つあります。Decoderが出力した立方体は、計算パフォーマンスなどの影響で解像度が低くなります。また、3D空間は疎で、何もない空白が多く存在するため、率直に立方体として表現するとデータのストレージ効率が非常に悪くなります。そこで、Neural VolumesはWarping Fieldsという概念を利用して間接的に3D空間を表現しようとしています。

Neural Volumes: Learning Dynamic Renderable Volumes from Images *1 から抜粋

具体的には、Neural VolumesのDecoderは直接3D空間を表す立方体ではなく、代わりにワープ空間$${W^{-1}}$$とテンプレート空間$${T}$$の2つの特徴マップ *7 を出力します。実際の空間上の座標をサンプリングする際には、以下の流れで処理を実施します。

3D空間上の座標$${x}$$を下記式でワーピングし、$${y}$$に変換します。$${y}$$はテンプレート空間$${T}$$上の座標・インデックスになります。

Neural Volumes: Learning Dynamic Renderable Volumes from Images *1 から抜粋

$${y}$$をインデックスに、$${T}$$からRGB値と不透明度を取得します。

Neural Volumes: Learning Dynamic Renderable Volumes from Images *1 から抜粋

テンプレート空間$${T}$$は、ただRGB値と不透明度を格納する行列であるということが上掲の式から理解できると思いますが、ワープ空間$${W^{-1}}$$はどう定義するでしょうか? もっとも素直な方法は、回転行列、拡大縮小行列と平行移動行列 *8 を格納する特徴マップとして定義する方法です。具体的には、潜在ベクトル表現$${z}$$をさらに変換して、それぞれの行列を出力させます。この変換をニューラルネットワークとして定義すれば、学習可能な形式になります。

しかし、著者らの意見 *1 によると、この定義方法は柔軟すぎて過学習 *9 に陥ってしまい、汎化能力 *10 が低下してしまいます。この問題を解決するために、著者らはaffine mixture *1 を提出しました。affine mixtureの流れは以下の式となります。

Neural Volumes: Learning Dynamic Renderable Volumes from Images *1 から抜粋

この式は、$${i}$$個の学習可能な回転行列$${R_i}$$、拡大縮小行列$${s_i}$$と平行移動行列$${t_i}$$を定義します。続いて、Attention機構 *11 を組み込むことで、$${i}$$個の変換を混合させ集約します。アフィン変換 *12 の混合ということで、affine mixtureと名付けたわけです。

Neural Volume Rendering手法の素晴らしいところは、勾配情報を空間上の様々なところに分散させて学習を行ったため、幾何構造を与えなくてもある程度自動探索でき、物体の表面情報を正確に分からなくても、見た目上綺麗にレンダリングできるところです。

NeRF

近年、NeRF *13という技術が非常に脚光を浴びています。NeRFはNeural Radiance Fieldsの略で、名前の通り、ニューラルネットワークでラジアンス(放射輝度 *14)の場をモデリングする手法で、Neural Volume Renderingの1種です。

ラジアンスはコンピュータグラフィックス *15 でよく使われる物理概念です。CG分野における光の強さの指標の一種です。そして、カメラ方向のラジアンスは、人の目で見たときの明るさ・色で解釈しても大丈夫です。このカメラ方向のラジアンスは、入射光ベクトルと物体表面の法線ベクトルのなす角の角度、物体表面がどれぐらいエネルギーを吸収・反射するのかを表すアルベド *16 と反射光の角度分布を表すBRDF *1 などから構成されます。ラジアンスを計算する方程式は、レンダリング方程式 *18 と呼びます。そして、ボリュームレンダリングは、このレンダリング方程式のある種の近似という見方もできます。

NeRFは下記のように、ボリュームレンダリングの構成要素であるRGB値と密度(不透明度)$${\sigma}$$を計算します。ここの$${x, y, z}$$は3D空間上のある点の座標です。$${\phi}$$と$${\theta}$$は点とカメラがなす角の角度で、3次元のため3方向が必要ですが、自由度2のため2方向で完全に表せます。$${x, y, z, \phi, \theta}$$を$${F_{\Theta}}$$に入力すると、RGB値と密度$${\sigma}$$が出力されます。

NeRF *19 から抜粋

そして、この$${F_{\Theta}}$$は導出が不可能なため、NeRFは学習ベースのニューラルネットワークを使ってモデリングしました。これがNeural Radiance Fieldsの基本です。

NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis *13 から抜粋

NeRFをうまく訓練するためには、いくつかのテクニックが必要です。まず、ニューラルネットワークは低周波関数をうまく学習できますが、高周波関数が不得意です。しかし、NeRFは性質上高周波関数です。その理由は、カメラの向きを少し変えるだけで、明暗の変化が激しいからです。そのため、$${x, y, z, \phi, \theta}$$からRGB値と密度$${\sigma}$$の学習をそのままさせると、画像をレンダリングするとぼやけて見えます。

NeRFの著者らはこの問題に気付き、ある手法を導入しました。それは、Positional Encoding(位置符号化 *20 )です。Positional Encodingの計算は以下の式となります。様々な周期の$${\sin, \cos}$$三角関数で、ニューラルネットワークが高周波関数の学習をしやすくなるよう入力を高次元化します。

NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis *13 から抜粋

また、NeRFはボリュームレンダリングの仕組みで、カメラからの線分上の座標をサンプリングしますが、空間の幾何構造に対しての事前知識がないため、効率的なサンプリングができません。例えば、等間隔にサンプリングすると、何もない空白のスペースや物体の背後にあるスペースもサンプリングされるため、非常に非効率的です。

Neural Radiance Fields *21 から抜粋

この問題に対して、著者らはHierarchical volume samplingというテクニックを取り入れました。この仕組みは1つのモデルを訓練するのではなく、 coarseモデルとfineモデルの2つのモデルを同時に学習します。coarseモデルは等間隔に線分上の座標をサンプリングして学習しますが、fineモデルはcoarseモデルが出力した不透明性の分布に対して座標を再度サンプリングする重点サンプリング法(Importance Sampling *22 )で学習します。

発表されて4年近く経ったオリジナルNeRFは、考え方は非常に素晴らしかったですが、今にして思えば、様々な問題点が存在していました。例えば、学習時間が長いこと、動的シーンのモデリングができないことや、撮影方法に厳しいことなどが挙げられます。NeRFの「後継者」たちは、これらの問題点に対してそれぞれ答えを出してくれています。例えば、$${L}$$スケールの解像度に対応する固定長のハッシュテーブルを事前に用意し、そこから学習可能なパラメータを取り出し線形補完して実際の空間座標の入力ベクトルを作成することで、本体のモデルサイズを極限まで抑えられ学習速度が爆上がりするInstantNGP *23 や、時間次元を含め、K次元まで拡張可能で動的シーンに対応できるK-Planes *24 などがあります。なお、現在もNeRF関連の様々な研究が行われています。

awesome-NeRF-papers *25 から抜粋

3D Gaussian Splatting

NeRF手法の大きな欠点はレンダリング速度です。画像をレンダリングする際、NeRFはまずそれぞれのピクセルを通すようにRayを発射します。次に、Ray上の座標をサンプリングし、ニューラルネットワークに座標を入力して、推論させます。それぞれの座標のRGBとOpacityを得たら、積分してピクセルの色を形成します。ニューラルネットワークの推論処理は1フレームあたりに大量に発生するため、非常に計算コストがかかります。tiny-cuda-nn *26 のようなGPUに最適化されたMLPを使用することである程度の高速化が可能ですが、現代のリアルタイムレンダリングで採用されているポリゴンによるラスタライゼーションに到底敵いません。

2023年に、3D Gaussian Splatting *27 という手法が発表されました。3D Gaussian Splattingは3次元のガウシアンを利用して3Dシーンを表現します。3次元のガウシアンの構成要素は以下の通りです。

  • 平均$${\mu}$$

  • 共分散行列(回転と拡大・縮小)

  • Opacity不透明度

  • 色RGB(または球面調和関数 *30 の展開係数)

3D Gaussian Splattingの処理フローは下図です。

3D Gaussian Splatting for Real-Time Radiance Field Rendering *27 から抜粋

3D Gaussian Splattingの処理の第一歩はSfm Pointsの生成です。Sfm *28 は、Structure from motionの略で、写真測量法 *29 でピクセルの3D座標、深度やカメラのパラメータを計算・推定する手法です。 Sfmは、カメラパラメータの推定に用いられ、NeRFの訓練時にも活用されることがありますが、ほとんどのNeRFモデルはSfmで推定された復元対象物の3D座標を利用しません。Sfmで推定されたピクセルの3D空間座標は点群形式となり、3D Gaussian Splattingは、点群のそれぞれの点を3次元のガウシアンの初期平均値として利用します。

theia-sfm.org *31 から抜粋

次に、3次元ガウシアンを画像にレンダリングします。まずは、3次元ガウシアンをカメラに2D投影し、深度でソートします。続いて、レンダリングする画面の全てのピクセルに対して、3次元ガウシアンを前から後ろへとブレンドした色を付与します。これで、画像がレンダリングされます。この一連の処理をDifferentiable Gaussian Rasterizationといいます。名前にあるように、この一連の処理は微分可能な処理で、レンダリング画像と教師画像の差を用いた勾配降下法を用いて3次元ガウシアンのパラメータを更新できます。ただし、3次元ガウシアンの数をうまく調整しないと最適な結果にならないため、ここでは、Adaptive Density Controlの処理が行われます。Adaptive Density Controlは、勾配の大きい3次元ガウシアンをコピーまたは分割する処理で、ガウシアン自体のサイズが大きい場合は分割、小さい場合はコピーします。

最適化済み3次元ガウシアンは、非常に高速で綺麗な画像をレンダリングできます。

Introduction to 3D Gaussian Splatting *32 から抜粋

最後に

今回は、Neural Volumes RenderingからNeRF、そして3D Gaussian Splattingまで、歴史順に3D復元の手法を解説しました。この分野は日々新しい手法が開発され、様々な分野で活用されています。例えば、DrivingGaussian *33 は車載のサラウンドカメラやLiDARで取得したデータから、動的物体と静的物体を分けながら3D復元を行うことができます。自動運転のデータアノテーションにこれを活用することで、3D Occupancyを簡単に作成でき、自動運転技術の研究開発を大幅に加速できます。その他に、例えば写真から顔を3D合成する手法は、VR・AR分野ですでに実用化されています。次の機会には、このような発展的手法について詳しく紹介できればと思います。

DrivingGaussian: Composite Gaussian Splatting for Surrounding Dynamic Autonomous Driving Scenes *33 から抜粋

引用元:
*1 Neural Volumes: Learning Dynamic Renderable Volumes from Images
https://arxiv.org/pdf/1906.07751.pdf
*2 ボリュームレンダリング
https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0
*3 Encoder-Decoder ネットワーク
https://cvml-expertguide.net/terms/dl/encoder-decoder/
*4 ボクセル
https://ja.wikipedia.org/wiki/%E3%83%9C%E3%82%AF%E3%82%BB%E3%83%AB
*5 Neural Volumes
https://stephenlombardi.github.io/projects/neuralvolumes/
*6 Ray Marching
https://en.wikipedia.org/wiki/Ray_marching
*7 What is a feature map
https://www.educative.io/answers/what-is-a-feature-map
*8 回転行列、拡大縮小行列、平行移動行列(三次元座標の場合)
https://imagingsolution.net/math/rotation-scaling-translation-3d-matrix/
*9 過学習
https://www.nri.com/jp/knowledge/glossary/lst/ka/overfitting#:~:text=%E9%81%8E%E5%AD%A6%E7%BF%92%E3%81%A8%E3%81%AF,%E9%9B%A3%E3%81%97%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%84%E3%81%BE%E3%81%99%E3%80%82
*10 汎化能力
https://zero2one.jp/ai-word/generalization-ability/
*11 アテンション (機械学習)
https://arxiv.org/pdf/1706.03762
*12 アフィン変換(平行移動、拡大縮小、回転、スキュー行列)
https://imagingsolution.net/imaging/affine-transformation/
*13 NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
https://arxiv.org/pdf/2003.08934.pdf
*14 放射輝度 (Radiance)
https://rayspace.xyz/CG/contents/radiance/
*15 コンピュータグラフィックス
https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9
*16 アルベド
https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AB%E3%83%99%E3%83%89
*17 BRDF
https://www.oceanphotonics.com/application/tec_brdf.html#:~:text=BRDF(Bidirectional%20Reflectance%20Distribution%20Function,%E5%88%86%E5%B8%83%E7%89%B9%E6%80%A7%E3%82%92%E8%A1%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82
*18 Rendering equation
https://en.wikipedia.org/wiki/Rendering_equation
*19 NeRF
https://www.matthewtancik.com/nerf
*20 位置符号化 (Positional Encoding) [Transformerの部品]
https://cvml-expertguide.net/terms/dl/seq2seq-translation/transformer/positional-encoding/
*21 Neural Radiance Fields
https://skannai.medium.com/neural-radiance-fields-a3d4206832e5
*22 Importance Sampling
https://en.wikipedia.org/wiki/Importance_sampling
*23 Instant Neural Graphics Primitives with a Multiresolution Hash Encoding
https://nvlabs.github.io/instant-ngp/assets/mueller2022instant.pdf
*24 K-Planes: Explicit Radiance Fields in Space, Time, and Appearance
https://arxiv.org/pdf/2301.10241.pdf
*25 awesome-NeRF-papers
https://github.com/lif314/awesome-NeRF-papers
*26 tiny-cuda-nn
https://github.com/NVlabs/tiny-cuda-nn
*27 3D Gaussian Splatting for Real-Time Radiance Field Rendering
https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_high.pdf
*28 Structure from motion
https://en.wikipedia.org/wiki/Structure_from_motion
*29 写真測量法
https://ja.wikipedia.org/wiki/%E5%86%99%E7%9C%9F%E6%B8%AC%E9%87%8F%E6%B3%95
*30 球面調和関数
https://ja.wikipedia.org/wiki/%E7%90%83%E9%9D%A2%E8%AA%BF%E5%92%8C%E9%96%A2%E6%95%B0
*31 theia-sfm.org
http://theia-sfm.org/sfm.html#incremental-sfm-pipeline
*32 Introduction to 3D Gaussian Splatting
https://huggingface.co/blog/gaussian-splatting
*33 DrivingGaussian: Composite Gaussian Splatting for Surrounding Dynamic Autonomous Driving Scenes
https://arxiv.org/pdf/2312.07920


いいなと思ったら応援しよう!