ついに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には対応していないみたいですね。
PyTorch3DまだWindows対応していないので、MacやLinux環境ないけどサクッと試したいだけの人はGoogleColabがおススメ。Notebookの先頭に以下でインスコすれば動きます。
!pip install 'git+https://t.co/8Cs3tKNij8'— Teppei Kurita (@kuritateppei) February 10, 2020
追記:Facebookの公式ブログの記事も公開された↓
https://ai.facebook.com/blog/-introducing-pytorch3d-an-open-source-library-for-3d-deep-learning/
We just released PyTorch3D, a new toolkit for researchers and engineers that’s fast and modular for 3D deep learning research: https://t.co/RmMSXJoWCm pic.twitter.com/H75Ai9gH2I
— Facebook AI (@facebookai) February 6, 2020
言及されている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のレンダラーはrasterizerとshaderで構成されています。レンダラーを作成するには以下のように記述します。
# 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
https://note.com/npaka/n/nc8db869964f2
Google Colabで試すのが近道かな。
https://medium.com/analytics-vidhya/get-started-with-pytorch3d-in-4-minutes-with-google-colab-16d40968053e
なんだか急激に3Dディープラーニングが当たり前の時代が来てしまった感。



さっさとBlenderとつないで遊びたい。

関連記事
SSII2014 チュートリアル講演会の資料
SVM (Support Vector Machine)
マルコフ連鎖モンテカルロ法
『スター・ウォーズ/スカイウォーカーの夜明け』のVFXブレイ...
ZBrushで仮面ライダー3号を造る ベース編
ZBrushで仮面ライダー3号を造る 仮面編 DynaMes...
マイケル・ベイの動画の感覚
顔画像処理技術の過去の研究
Paul Debevec
ZBrushでアヴァン・ガメラを作ってみる 脚のポーズ調整
オープンソースの顔の動作解析ツールキット『OpenFace』
TVML (TV program Making langua...
BlenderのGeometry Nodeで遊ぶ
3Dスキャンに基づくプロシージャルフェイシャルアニメーション
ROSの薄い本
第20回 文化庁メディア芸術祭『3DCG表現と特撮の時代』
ZBrush 2018での作業環境を整える
OpenMayaのPhongShaderクラス
Ambient Occlusionを解析的に求める
TorchStudio:PyTorchのための統合開発環境と...
AndroidもopenGLも初心者さ (でもJavaは知っ...
オープンソースの物理ベースレンダラ『Mitsuba』をMay...
ゴジラ三昧
UnityでShaderの入力パラメータとして行列を渡す
PGGAN:段階的に解像度を上げて学習を進めるGAN
Javaで作られたオープンソースの3DCGレンダラ『Sunf...
Twitter APIのPythonラッパー『python-...
CEDEC 3日目
ZBrushでアヴァン・ガメラを作ってみる 全体のバランス調...
ZBrushで仮面ライダー3号を造る 仮面編 Clay Po...
MeshroomでPhotogrammetry
写真から3Dメッシュの生成・編集ができる無料ツール『Auto...
ZBrushのハードサーフェイス用ブラシ
Active Appearance Models(AAM)
GoB:ZBrushとBlenderを連携させるアドオン
ZBrushでアヴァン・ガメラを作ってみる 甲羅のバランス調...
Unityの各コンポーネント間でのやり取り
まだ続くブログの不調
映画『ゴジラ-1.0』 メイキング情報まとめ
Amazon EC2ログイン用の秘密鍵を無くした場合の対処方...
CGレンダラ研究開発のためのフレームワーク『Lightmet...
Structure from Motion (多視点画像から...





コメント