未来を創る、テックコミュニティー

代表論文通信~Accelerating 3D Deep Learning with PyTorch3Dを訳す②

草場代表
2020/10/14

こんばんは。代表の草場です。

引き続き、Accelerating 3D Deep Learning with PyTorch3Dを翻訳していきます。

2 関連する仕事
3Dディープラーニングのライブラリ。
3Dディープラーニングのためのツールキットは数多く存在します。[Fast Graph Representation Learning with PyTorch Geometric]はグラフ学習に焦点を当てており,[Introducing TensorFlow Graphics: Computer Graphics Meets Deep Learning]は微分可能なグラフィックス演算子を提供しており,[Kaolin: A PyTorch Library for Accelerating 3D Deep Learning Research]は一般的に使用される3次元関数を収集しています.しかし、これらのツールキットは、3Dデータの異種バッチングをサポートしていません。
大規模な学習や、微分可能なレンダリングのためのモジュール性は、探索に欠かせません。PyTorch3Dは、サイズやトポロジーが異なる3Dデータのバッチをサポートするデータ構造を導入しています。この重要な抽象化により、レンダリングを含む 3D 演算子は、大規模な異種バッチでの操作が可能になります。

微分可能なレンダラー。
OpenDR NMR は,前方パスで従来のラスタライズを行い,後方パスで近似グラデーションを計算します.最近では,SoftRasDIB-Rが,各ピクセルの色が複数のメッシュ面に依存する確率的なプロセスとしてラスタライズを見ることで,微分可能なレンダラーを提案しています.Redner や Mitsuba2 のような微分可能なレイトレーシング手法は、計算量の増加を犠牲にしても、よりリアルな画像を提供します。
微分可能な点群レンダリングは,レイの終端確率を使用し,解像度を制限するボクセルグリッドに点を格納することで検討されています.DSSは各点をディスクとしてレンダリングします。
SynSinもまた,固定長のソフトZバッファから点ごとの球体をスプラットします.最近では,Pulsarがレンダリングに無制限のzバッファを使用していますが,最初の数点をグラデーション伝播に使用しています.
微分可能なレンダリングは活発な研究分野です。PyTorch3Dは、ラスタライズ中に計算された中間体を再設計して公開することで、[Soft Rasterizer: Differentiable Rendering for Unsupervised Single-View Mesh Reconstruction]に触発されたモジュラーレンダラを導入しています。他の微分可能なレンダラーとは異なり、ユーザーはPyTorchシェーダを使ってレンダリングパイプラインを簡単にカスタマイズすることができます。

3D形状予測。
セクション4では、PyTorch3Dのメッシュと点群のための微分可能なシルエットとテクスチャレンダラを使用して、教師なしの3D形状予測の実験を行います。3D形状予測には、2ビュー法やマルチビュー法、モデルベースのアプローチ、ボクセル、メッシュ、点群、暗黙関数を予測する最近の教師付きディープ法など、膨大な種類の研究があります。微分可能なレンダラーは、2D再投影損失を介した教師なしの形状再定義を可能にします。

 

3 PyTorch3D. 機能と性能
ここでは、PyTorch3Dのコア機能について説明します。3Dディープラーニングライブラリを効果的に使うためには 3D演算子は、複雑な3Dデータを扱う際に効率的である必要があります。我々は、速度と 主要な PyTorch3D 演算子のメモリ使用量、純粋な PyTorch や既存のオープンソースとの比較 を実装しています。PyTorch3Dが最大10倍の高速化を実現していることを示しています。

3Dデータ構造。
ディープラーニングでは、データのミニバッチを扱うことが重要です。最適化と計算効率を向上させることができます。しかし、3Dメッシュのバッチとポイント 雲は不均一性のために挑戦的です:メッシュは様々な数の頂点と面を持っているかもしれません。点群の数が異なる場合があります。この課題を克服するために、PyTorch3Dはメッシュと点群のバッチを管理するためのデータ構造を提供します。

実装の詳細。
ShapeNetCoreV1のメッシュを使用して、同種および異種のバッチを使用してベンチマークを行います。メッシュ表面から一様にサンプリングして点群を形成します。
すべての結果は、5つのランダムバッチと1バッチあたり10回の実行で平均化され、V100 GPU上で実行されます。

 

3.1 3次元演算子
人気のある3D演算子の代表的なセットであるChamfer損失 (面取り損失) 、グラフ畳み込みK 近傍探索の時間とメモリ使用量を報告します。PyTorch3D の他の 3D 演算子は同じようなトレンドに従います。PyTorchや最先端のオープンソースライブラリと比較します。
面取り損失は、点群PとQの間の一致度を定量化する一般的なメトリックです。

L cham(P, Q) = |P|^−1  * Σ(P,Q)∈ΛP,Q ||p-q ||^2 + |Q|^−1 * Σ(q,p)∈ΛQ,P ||q-p||^2     (1)

ここで、ΛP,Q = {(p, arg minq ||p-q||) : p ∈P}は、q ∈Qが最も近いペア(p, q)の集合です。PyTorchでは、(均質に)バッチ処理の実装が簡単にできますが、次のような問題があります。B × |P| × |Q| の要素を持つペアワイズ距離行列を形成する必要があるため、非効率的です (ここで B はバッチサイズです)。PyTorch3D は、この非効率性を回避するために、私たちの 効率的なKNNを使って隣人を計算します.図1aでは、我々の方法と、 B = 32, |P| = 1000, |Q|のナイーブアプローチを比較しています。ナイーブアプローチは、|Q| > 10kでメモリを使い果たします。我々の手法は大規模な点群にも対応し,時間とメモリ使用量を12倍以上削減することができます.

3D メッシュの処理には,グラフ畳み込みが一般的に使用されています.与えられた特徴ベクトル fv を各頂点 v に対して計算し,新しい特徴量

f’v=W0fv+ Σu∈N(v) W1fu

ここで、N(v)は W0, W1 は学習された重み行列です。PyTorch3D は のための融合CUDAカーネルを介したグラフ畳み込み.図1bに示すように、この は,純粋なPyTorch実装と比較して,速度とメモリ使用量を最大30%向上させます.

D 次元点の K 近傍値は、面取り損失、正規推定、および 他の点群演算を利用しています。 我々は、ネイティブに異質なバッチを扱うカスタムされたCUDAを用いて、正確なKNNを実装します.我々の実装は,D ≤ 4 と K ≤ 32 のために調整されており、テンプレートメタプログラミングを用いて,各(D, K)ペアを個別に最適化しています.我々はFaissのものと比較します。Faissのものは、デザインスペースの異なる部分をターゲットとした KNN 用の高速 GPU ライブラリです.それは,高次元記述子(D≈128)に最適化されており,数十億点にスケールします.
図1cと1dは、3次元問題のバッチ処理でFaissを最大5倍上回ることを示しています。

図1: バッチサイズ32の3D演算子のベンチマーク. (a) Lcham(P, Q) の点群のLcham(P, Q)は、|P| = 1000で、|Q|を変化させた不均質な点群の場合。(b) 128次元特徴量を持つ不均質メッシュバッチのグラフ畳み込み。(c,d) 3次元点群PとQの均質なバッチ間のKNN vs Faiss [23]。(c)では K = 1, (d)では |P| = |Q| = 50k; どちらも我々の
メモリ使用量が一致する[23]。(a)と(b)は前方と後方、(c)と(d)は前方のみ

3.2 微分可能なメッシュレンダラー
レンダラーはシーン情報(カメラ、ジオメトリ、マテリアル、ライト、テクスチャ)を入力して 画像を使用することができます。微分可能なレンダラーは、レンダリングされた画像から後方にグラデーションを伝搬して シーン情報を利用して、ディープラーニングパイプラインにレンダリングを組み込むことができます。
PyTorch3D には、三角形のメッシュの異種バッチで動作する微分可能なレンダラーが含まれています。当社のレンダラーは、3 つのコアとなる設計原則に従っています。
微分可能性:すべての入力に対してグラデーションをかけることができます。
効率性:高速に動作し、大きなメッシュと画像までスケールアップできることを意味します。
モジュール性:ユーザーがレンダラーのコンポーネントを簡単に交換して、その機能をユースケースに合わせてカスタマイズし、別の定式化を実験することができます。
図2aに示すように、当社のレンダラーには2つの主要なコンポーネントがあります:ラスタライザは各ピクセルに影響を与える面を選択し、シェーダはピクセルの色を計算します。これらのコンポーネントを慎重に設計することで 我々は、先行する微分可能なレンダラーと比較して、効率性とモジュール性を向上させます。

ラスタライザ。
ラスタライザは,まずカメラを使用してメッシュをワールド座標からビュー座標に変換します.
カメラはPythonオブジェクトで、autogradを介してグラデーションを計算します。用意されているオルソグラフィックカメラとパースペクティブカメラ以外の新しいカメラモデルを簡単に実装することができます。
次に、コアラスタライズアルゴリズムは、各ピクセルと交差する三角形を見つけます。従来のラスタライズでは、各ピクセルは、z軸に沿って最も近い面によってのみ影響を受けます。図2bに示すように、面がz軸に沿って(オクルージョンのために)移動する際に、ピクセルの色が段階的に変化する可能性があります。xy平面(面の境界による)。[Soft Rasterizer: Differentiable Rendering for Unsupervised Single-View Mesh Reconstruction]に従って,これらの非微分性を 画素ごとに複数の面の影響力を計算し,面の影響力をその境界に向かって減衰させていきます.
我々のラスタライザは、効率性とモジュール性を向上させるために、[Soft Rasterizer: Differentiable Rendering for Unsupervised Single-View Mesh Reconstruction]とは3つの点で異なるものです。
まず,[Soft Rasterizer: Differentiable Rendering for Unsupervised Single-View Mesh Reconstruction]では ピクセルはxy平面で交差するすべての面の影響を受けます。一方、我々の手法では,ピクセル単位の優先度キューを用いて計算された,z軸に沿って最も近いK個の面のみの影響を受けます.
従来の z バッファリングと同様に、これにより、各ピクセルに対して多くの面を素早く破棄することができ、改善が行われます。この変更が下流のタスクの性能に影響を与えないことをセクション4で示します。
第二に,[Soft Rasterizer: Differentiable Rendering for Unsupervised Single-View Mesh Reconstruction]では,各画素と各面をナイーブに比較しています.我々は [High-performance software rasterization on GPUs]と同様の2パスアプローチで、ピクセルに移動する前に、最初に画像タイルで作業して面を除去します。
第三に、[Soft Rasterizer: Differentiable Rendering for Unsupervised Single-View Mesh Reconstruction]では、ラスタライズとシェーディングをモノリシックなCUDAカーネルに融合させています。これらをデカップリングし 図 2a に示すように,ラスタライザは各ピクセルに最も近い K 個の面についてのフラグメントデータを返します.
面ID、面の中のピクセルの重心座標、z軸とxy平面に沿った(符号付きの)ピクセルと面の距離です。これにより、シェーダをラスタライザとは別に実装することができます。モジュール性を大幅に向上させました。この変更により、キャッシュされたフラグメントデータの を使用することで、後進パスでの面画素の交点の再計算にコストがかかることを回避することができます。

図 2: (a) PyTorch3D のモジュラーレンダリングパイプラインと、(b) 従来のラスタライゼーションにおける z と xy の不連続性と、微分可能性を可能にするソフト定式化 。

 

シェーダは、ラスタライザによって生成されたフラグメントデータを消費して、 レンダリングされた画像のピクセル値を計算します。一般的には2つの段階があります:最初にピクセルのK値を計算します(1つは Fragment データで識別された各面) 、それらをブレンドして最終的なピクセル値を与えます。
シェーダーはPythonオブジェクトで、FragmentデータはPyTorchテンソルに格納されます。シェーダーは、このように 標準的なPyTorch演算子を使用してFラグメントデータを取得し、autogradを使用してグラデーションを計算します。このデザインは ユーザーはレンダラーをカスタマイズするために新しいシェーダーを簡単に実装できるため、モジュール性が高いです。
たとえば、アルゴリズム 1 では、[Soft Rasterizer: Differentiable Rendering for Unsupervised Single-View Mesh Reconstruction]からの二つのラインのシェーダを使ってシルエット レンダラーを実装しています: distsは形状のテンソル B × H × W × K で,各ピクセルから K 個の最も近い面(フラグメントデータの一部)までの xy 平面上の符号付き距離を与え,シグマは をハイパーパラメータとしています。
これは,シルエットレンダリングがモノリシックな CUDA カーネルが1方向で、グラデーションは手動で計算されている[Soft Rasterizer: Differentiable Rendering for Unsupervised Single-View Mesh Reconstruction]より、シンプルです。 Similarly, Algorithm 2 implements the softmax
blending algorithm from [31] for textured rendering.同様に、アルゴリズム2では、テキスト化されたレンダリングのために、[Soft Rasterizer: Differentiable Rendering for Unsupervised Single-View Mesh Reconstruction]からのsoftmax blending algorithmが実装されています。

softmax dists, zbuf は Fragment データの一部です.
そして top_k_colors_per_pixel はシェーダからの出力です.ユーザーが定義したハイパーパラメータを使用します。
シェーダーは、ラスタライザからのフラグメントデータを使用して複雑なエフェクトを実装することができます。面のIDは、以下のようにすることができます。法線や色、テクスチャ座標などの面ごとのデータを取得するために使用されます。面の上でデータを補間するために使用されます.
重要なのは、すべてのテクスチャリング、ライティング、ブレンディングロジックはPyTorchを使用して記述できることです。演算子を使用し、autogradを使用して微分しています。シルエットを実装した様々なシェーダを提供しています。レンダリング、フラット、Gouraud、およびPhongシェーディングは、頂点あたりの色またはテクスチャ座標を使用しています。と、ハードアサイン([Neural 3D Mesh Renderer (CVPR 2018)]と同様)またはソフトマックスブレンド([Soft Rasterizer: Differentiable Rendering for Unsupervised Single-View Mesh Reconstruction]のような)を使って色をブレンドするものです。

 

Algorithm 1: Silhouette blending
prob = (– dists / sigma).sigmoid()
alpha = 1 – (1 – prob).prod(dim=–1)

Algorithm 2: Softmax blending
prob = (– dists / sigma).sigmoid()
zinv = (zfar – zbuf) / (zfar – znear)
zinv_max = torch.max(zinv, dim=–1).values
weights = prob * ((zinv – zinv_max) / gamma)).exp()
weights = weights / weights.sum(dim=–1)
image = (weights * top_k_colors_per_pixel).sum(dim=–2)

 

 

 

 

この記事を書いた人
草場代表
エディター