3Dコンピュータービジョンライブラリ『PyTorch3D』

ついにFacebook Research公式から3Dディープラーニング用のPyTorchベースのライブラリが登場した。
ライセンスはBSD-3-Clauseライセンス。

PyTorch3D



PyTorch3Dは、PyTorchを使用した3Dコンピュータービジョン研究のための効率的で再利用可能なコンポーネントを提供します。

主要な機能は以下の通りです:

  • 三角形Meshを保存・操作するためのデータ構造
  • 三角形Mesh上での効率的な操作(射影変換、グラフ畳み込み、サンプリング、損失関数)
  • 微分可能なMeshレンダラー

PyTorch3Dは3Dデータを予測・操作するためにディープラーニング手法とスムーズに統合できるよう設計されています。そのため、PyTorch3Dでの操作は全て以下に対応しています:

  • PyTorchのtensorを使用した実装
  • 異種データのミニバッチ処理
  • 微分可能
  • GPUによる処理の高速化

Facebook Research内では、PyTorch3DをMesh R-CNNなどの研究プロジェクトで使用しています。

ソースコードはGitHubにあり、ドキュメントはこちら
INSTALL.mdを読むと、まだWindowsには対応していないみたいですね。



追記:Facebookの公式ブログの記事も公開された↓
https://ai.facebook.com/blog/-introducing-pytorch3d-an-open-source-library-for-3d-deep-learning/



言及されているMesh R-CNNもソースコードが公開されている↓
https://github.com/facebookresearch/meshrcnn
https://ai.facebook.com/blog/pushing-state-of-the-art-in-3d-content-understanding/


スポンサーリンク


個人的に興味があるのはDifferentiable Rendering周りのAPI↓

アーキテクチャの概要

レンダラーは、モジュール式で拡張可能に設計されており、全ての入力に対してバッチ処理、勾配(微分)をサポートしています。以下の図はレンダリングパイプラインの全てのコンポーネントを示しています。



Fragments
rasterizerは4つの出力tensorを以下のような名前付きtupleで返します。


スポンサーリンク
  • pix_to_face(N, image_size, image_size, faces_per_pixel)形状のlong型tensor。画像の各ピクセルに重なるfaceのインデックスを(packed faceで)指定します。
  • zbuf(N, image_size, image_size, faces_per_pixel)形状のfloat型tensor。各ピクセルで最も近いfaceのworld座標系でのz座標をz値の昇順で提供します。
  • bary_coords(N, image_size, image_size, faces_per_pixel, 3)形状のfloat型tensor。各ピクセルで最も近いfaceの重心座標をNDC単位でz値の昇順で提供します。
  • pix_dists(N, image_size, image_size, faces_per_pixel)形状のflaot型tensor。ピクセルに最も近い各点のx/y平面での符号付きユークリッド距離(NDC単位)を提供します。

パイプラインの各コンポーネントの詳細については、レンダラーAPIリファレンスを参照してください。

注意:differentiable renderer APIは試験的なものであり、仕様は今後変更される可能性があります。

座標変換の規則

レンダリングでは、座標空間を異なる座標空間へ変換する処理を何度か行う必要があります:world空間、view/camera空間、NDC空間、screen空間があります。これら各座標空間でカメラがどこに位置しているか、x, y, z軸がどのような配置関係でどのような範囲の値を取るのかを知ることが重要です。以下の図は、PyTorch3dが使用する規則を示しています。



注意:PyTorch3d vs OpenGL
PyTorch3dはOpenGLに似せるようにしていますが、OpenGLの左手系のNDC座標系と違い、PyTorch3dのNDC座標系は右手系となっています。(射影行列によって利き手が切り替わります)
OpenGLでは、camera空間の原点にあるカメラが奥行きをz軸マイナス方向に捉えるのに対し、PyTorch3dではNDC空間のz軸プラス方向に奥行きを捉えます。


シンプルなレンダラー

PyTorch3dのレンダラーはrasterizershaderで構成されています。レンダラーを作成するには以下のように記述します。

# Imports
from pytorch3d.renderer import (
    OpenGLPerspectiveCameras, look_at_view_transform,
    RasterizationSettings, BlendParams,
    MeshRenderer, MeshRasterizer, PhongShader
)

# Initialize an OpenGL perspective camera.
R, T = look_at_view_transform(2.7, 10, 20)
cameras = OpenGLPerspectiveCameras(device=device, R=R, T=T)

# Define the settings for rasterization and shading. Here we set the output image to be of size
# 512x512. As we are rendering images for visualization purposes only we will set faces_per_pixel=1
# and blur_radius=0.0. Refer to rasterize_meshes.py for explanations of these parameters.
raster_settings = RasterizationSettings(
    image_size=512,
    blur_radius=0.0,
    faces_per_pixel=1,
    bin_size=0
)

# Create a phong renderer by composing a rasterizer and a shader. Here we can use a predefined
# PhongShader, passing in the device on which to initialize the default parameters
renderer = MeshRenderer(
    rasterizer=MeshRasterizer(cameras=cameras, raster_settings=raster_settings),
    shader=PhongShader(device=device, cameras=cameras)
)

NDCって何のことかと思ったらNormalized Device Coordinates(正規化デバイス座標系)のことか。

https://qiita.com/T_keigo_wwk/items/d8b8686480b061c453d9

なんだか急激に3Dディープラーニングが当たり前の時代が来てしまった感。


3Dディープラーニング用のPyTorchライブラリ『Kaolin』
NVIDIAから3D系のディープラーニング研究のためのPyTorchライブラリが公開された。まだベータ版だから、これからどんどん充実していくんでしょうね。読み方はカオリンで良いのかな?(なんかかわいい)KaolinKaol...

Mitsuba 2:オープンソースの物理ベースレンダラ
5年前にオープンソースの物理ベースレンダラ「Mitsuba」でちょっと遊んでみたことがあった↓Siggraph Asia 2019でMitsuba 2が発表されたらしい↓Mitsuba 2: A Retargetable Forw...


さっさとBlenderとつないで遊びたい。
BlenderのPython環境にPyTorchをインストールする
多くのDCCツールがPythonスクリプト環境を提供している反面、対応しているのはPython2.x系ばかりで最近流行りのディープラーニングフレームワークが使えない。(Python2.x系は2020年1月1日でサポート終了のはずだが)そん...


スポンサーリンク

関連記事

UnityでLight Shaftを表現する
ニンテンドー3DSのGPU PICA200
SIGGRAPH論文へのリンクサイト
OpenCVベースの背景差分ライブラリ『BGSLibrary』
プロシージャル手法に特化した本が出てるみたい(まだ買わないけど)
RSSフィードを読込んで表示するWordpressプラグイン『RSSImport』
オープンソースのSLAMライブラリ『Cartographer』
第20回 文化庁メディア芸術祭『3DCG表現と特撮の時代』
3Dグラフィックスの入門書
Ambient Occlusionを解析的に求める
ラクガキの立体化
HD画質の無駄遣い
WordPressのテーマを自作する
Mechanizeで要認証Webサイトをスクレイピング
OpenCV 3.3.0 contribのsfmモジュールのサンプルを動かしてみる
BlenderのRigifyでリギング
JavaScriptとかWebGLとかCanvasとか
ラクガキの立体化 1年半ぶりの続き
CGWORLD CHANNEL 第21回ニコ生配信は『シン・ゴジラ』メイキングスペシャル!
DCGAN (Deep Convolutional GAN):畳み込みニューラルネットワークによる敵...
CGAN (Conditional GAN):条件付き敵対的生成ネットワーク
ZBrushのTranspose Masterでポーズを付ける
Twitter APIのPythonラッパー『python-twitter』
Photo Bash:複数の写真を組み合わせて1枚のイラストを制作する
MFnDataとMFnAttribute
ブログのデザイン変えました
adskShaderSDK
ブログが1日ダウンしてました
UnityのTransformクラスについて調べてみた
iOSデバイスのためのフィジカル・コンピューティングツールキット『konashi(こなし)』
トランスフォーマー :リベンジのメイキング (デジタルドメイン)
ZBrushの練習 手のモデリング
WordPressプラグインの作り方
ディープラーニング
タマムシっぽい質感
ZBrushで仮面ライダー3号を造る 仮面編 横顔のシルエットをリファレンスに合わせる
無料で使える人体3DCG作成ツール
UnityでShaderの入力パラメータとして行列を渡す
SSD (Single Shot Multibox Detector):ディープラーニングによる一般...
Autodesk Mementoでゴジラを3次元復元する
.NETで使えるTensorFlowライクなニューラルネットワークライブラリ『NeuralNetwo...
2D→3D復元技術で使われる用語まとめ

コメント