Deep Neural Networkによる3次元形状表現

DNN(Deep Neural Network)の陰関数表現に個人的な興味があったので,どうせ勉強するならせっかくなので覚書兼アウトプットとしてブログにまとめてみようと思います.

さて,タイトルにもある通り3次元空間上の物体の形状をDNNで表現しようという試みなのですが,文字だけではなんのこっちゃと分からないと思う方もいるかもしれないのでまず下の3Dモデル群をご覧ください.

f:id:yayaya7639:20210509141154p:plain:w500
[1]より引用

3Dモデルといえば今日までblenderなどのソフトを使って人手で作られている訳ですが,上の3Dモデルは深層学習によって自動生成されたものになります.これらは比較的単純なものなのでそんなに感動はないかもしれません.そこでさらに以下の3Dモデルをご覧ください.

f:id:yayaya7639:20210509142542p:plain:w500
[2]より引用

さすがにこんな複雑な3Dモデルを作るのは中々骨が折れますよね.これも深層学習によって自動生成された3Dモデルで,さらにもっと複雑な3Dモデルも自動生成できることができます.

さて,深層学習と一口に言っても3次元形状を生成する手法は今日まで数多く提案されており,3次元形状を「何によって」表現するかで主に以下の4つのカテゴリーが存在します.

  • 点群
    物体の表面と内部を3次元空間上の点の集合で表すことで物体を表現する方法.(下図左)

  • ボクセル
    ピクセルを3次元に一般化したもので,物体を立方体の集合で表現する方法.各ボクセルのサイズによって解像度が決まるのでボクセルを細かくすると3乗のオーダーでメモリが増えてしまい一般的には低解像度で使われることが多い.(下図中央)

  • メッシュ
    物体の表面を頂点と辺からなる面(n角形)で表現する方法.リアルな質感が表現しやすいが,点群やボクセルよりデータ構造が複雑で製作コストが高い.(下図右) f:id:yayaya7639:20210509144743p:plain

  • 陰関数
    陰関数で物体の表面を表現する方法.任意の解像度でサンプリングできるが,形状はマーチングキューブ法などによって抽出する必要がある.(下図)詳しくは後述.

    f:id:yayaya7639:20210510140147p:plain:w200
    [2]より引用

前提知識として3次元形状と陰関数の関連について少し説明していこうと思います.

陰関数による3次元形状表現

陰関数とは一言で述べると,2変数関数については f(x,y)=0とかける関数のことです.今回扱うのは3次元図形なので,これは3変数の陰関数 f(x,y,z)=0で表すことができ,具体例としては単位球はx^{2}+y^{2}+z^{2}=1という陰関数です(図1).もちろんより複雑な3次元図形も陰関数で表すことができます(図2).

f:id:yayaya7639:20210514234709p:plain:w250:h250f:id:yayaya7639:20210514234730p:plain:w300:h250
左:図1,右:図2

さらにもっと複雑な3Dモデル(下はunity-chan)なんかも陰関数で表現できることになります.しかし,このように複雑な3Dモデルになるほど陰関数は途方もないほど複雑になってしまうことは容易に想像できます.そこで深層学習の出番になります.任意の複雑な関数を表現できるDNNであれば,任意の3次元モデルを表現できるはずです.すなわち,3次元形状自体をDNNで表現できるということです.

f:id:yayaya7639:20210515001329p:plain:w500:h350
引用https://unity-chan.com

DNNによる3次元形状表現手法

コンピュータビジョン分野におけるトップカンファレンスの1つであるCVPRでは2019年にDNNで3次元形状を構築する手法としてIM-NET,Occupancy Network,DeepSDFという3つの手法が発表されており,今回は特にIM-NETとDeepSDFについて解説していきます.

IM-NET

IM-NETは3次元物体の表面(陰関数)の内側か外側かを表す2値 [0,1]として定義されるOccupancy(占有率)を用いてDNNを学習します.そして入力を座標 (x,y,z),出力を物体の内側か外側かである2値分類タスクを学習することで分類境界を獲得することができ,これが3次元物体の表面になっているわけです.

しかし,これではDNNは1回の学習につき1つの3次元形状しか学習することができず,他の形状を表すことができません.そのためCodeという潜在変数を導入し入力変数に加えることで,VAEやGANのように潜在変数を操作することによって様々な形状を表現することができるようになります.下にネットワーク構造を示します.

f:id:yayaya7639:20210515214719p:plain
IM-NETのネットワーク構造

このネットワークでは128次元のCodeと3次元座標が入力されOccupancyが出力されるスキップコネクション有りの全結合ネットワークになっていますが,Codeには何を用いるのが良いのでしょうか.IM-NETはCodeから3次元形状を復号化するDecoderと考えることができるので,適当なEncoder-DecoderモデルのDecoderをIM-NETに変更することでEncoderから3次元形状に関するCode特徴量を得ることができます.アプリケーションに応じてEncoderは自由に構築することができ,例えば提案された論文内では3D-CNNをEncoderにしてOccupancyを学習することによって3次元形状を生成すると,元の3D-CNNのAE(AutoEncoder)モデルより学習の精度が上がることが報告されています.

また,損失関数は以下のような重み付き二乗和誤差関数となっており,点 pにおけるOccupancyの推定値 f_{\theta}(p)と真値 F(p)の誤差に物体表面に近くなるほど大きくなる重み w_{p}をかけています.

f:id:yayaya7639:20210515231949p:plain:w400:h100
IM-NETの損失関数

評価

3D-CNN Auto-EncoderのDecoderとIM-NETの精度比較を以下の4つの評価指標で行っています.(評価する時,IM-NETの出力自体は3次元モデルになっていないためマーチングキューブ法などによって f_{\theta}=0である等値面(物体の表面)を抽出しメッシュ化しています)

f:id:yayaya7639:20210516025420p:plain
評価結果

  • MSE(Mean Squared Error)
    単純な平均二乗誤差です.3D-CNNのDecoderが完勝しています.

  • IoU(intersection over union)
    3次元形状の予測結果と真の形状の重なっている部分がどれくらいの割合かを計算して2つの一致具合を表します.これも3D-CNNのDecoderが完勝です.

  • CD(chamfer distance)
    予測点群と真の点群の距離(近さ)を測る指標です.近いほど(スコアが小さいほど)性能が良いとされています.これもほとんど3D-CNNのDecoderの方が良いです.

  • LFD(Light Field Descriptor)
    3次元物体を様々なアングルから2D画像へレンダリングしその複数の画像から特徴量を計算することで物体間の相違度を評価する手法です.これはかろうじてIM-NETが優っています.

    f:id:yayaya7639:20210516033411p:plain
    見た目の比較
    上の画像は見た目による比較です.陰関数によって形状を表現するIM-NETは任意の解像度でレンダリングできるので解像度が高い(IM-AE256)と見た目は最も良くなっているように思えます.

IM-NETを用いることにより敵対的生成モデル(GAN)から生成される3次元形状の品質を向上させることができます.下は各手法の潜在変数(Code特徴量)を線形補完することにより2つの物体間の補完の様子を表した図です.

f:id:yayaya7639:20210516100553p:plain
補完による中間表現の比較
他の手法よりIM-NETの方が滑らかに補完できていることが分かります.陰関数はパラメータを連続的に変化させた場合に滑らかに形状が変化するのでそれを上手くDNNでも学習できているようです.

DeepSDF

DeepSDFは2値のOccupancyを学習するのではなくスカラー場であるSDF(Signed Distance Fields)を学習します.SDFは物体の表面からどれだけ離れているかを符号付き距離(signed distance)で表し,そのスカラー値が場(field)の各点に与えられています.例としてStanford Bunnyを用いてSDFを説明した図が以下になります.

f:id:yayaya7639:20210516173525p:plain:w400
SDF
SDFでは物体の内側にはその表面から負の距離が,外側には正の距離が各点に与えられており,学習ではIM-NETと同様に分類境界,すなわち距離がゼロの等値面である物体の表面をDNNで表現します.DeepSDFでもIM-NETと同じく,様々な形状を表現するために座標以外に潜在変数であるCodeを入力に用いてSDFを学習します.(下図)
f:id:yayaya7639:20210516174638p:plain:w300
DeepSDFのネットワーク構造
IM-NETではアプリケーションに応じたencoderを採用し潜在ベクトルであるCodeを得ていたのですが,DeepSDFではEncoderは使用せずDecoderのみでCodeを得る枠組みであるAuto-Decoderを提案し,論文内ではこれをEncoder-less Learningと呼んでいます.

Auto-Decoder

先ほども述べたように,DeepSDFの学習は入力をCodeと3次元座標,出力をその座標における符号付き距離とする以下のネットワーク構造を持つAuto-Decoderで行います.

f:id:yayaya7639:20210519204437p:plain:w300
Auto-Decoder
具体的には三次元形状ごとにCodeにランダムな初期値を設定し,以下の損失関数を最小とするCodeをバックプロパゲーションで最適化します.
f:id:yayaya7639:20210519212025p:plain:w500
損失関数
 L(•)は標準的なL2損失関数です.この損失関数を最小化することは, zの事後分布を以下のように尤度関数と標準ガウス事前分布の積で記述されることを考えた時にこの事後確率を最大化することに相当します.
f:id:yayaya7639:20210519212955p:plain:w500
zの事後分布

DeepSDFの応用例としてはCodeを推定することによる三次元形状の生成が挙げられます.先程の損失関数による学習後,ネットワークパラメータ \mathbf{\theta}を固定して以下の式からデータにもっともフィットする \mathbf{z}を推定することで三次元形状を生成することができます.

f:id:yayaya7639:20210519214007p:plain:w500
Codeの推論
下の図はノイズの入った点群データからCode推定を行うことで3次元形状を生成しています.
f:id:yayaya7639:20210519215532p:plain:w500

まとめ

今回は3次元形状をDNNによる陰関数表示で表現する手法を紹介しました.深層学習は解きたいタスクの入力と出力の関係をある種の関数としてみることで,その関数をDNNという万能関数近似器で表現しているわけですが,今回のは陰関数という関数自体をDNNで近似するというところが個人的にはとても美しいと思いました(厳密には陰関数は関数の定義を満たしていないので関数ではないけれど).今回紹介したIM-NETとDeepSDFは物体の内側と外側に完全に分離できる(閉じている)と仮定しているため,扱うデータは形状が閉じているものしか扱うことができません.しかし,実際には内側と外側を完全に分離できるデータだけではありません(スマホなどの手軽なスキャナーで取得した点群データなどは平面に集まっていることが多く閉じていないことが多い印象).そのようなデータを扱うための手法が2020年のCVPRにacceptされているので次回はそれを紹介したいと思います.

参考文献

[1]Learning Implicit Fields for Generative Shape Modeling
[2]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
[3]A Deep Learning Method for 3D Object Classification Using the Wave Kernel Signature and A Center Point of the 3D-Triangle Mesh
ニューラルネットワークによる三次元表現手法
https://www.slideshare.net/takmin/20190706cvpr20193dshaperepresentation-153989245