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

ついに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
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ディープラーニングが当たり前の時代が来てしまった感。


Kaolin:3Dディープラーニング用のPyTorchライブラリ
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日でサポート終了のはずだが)そん...


スポンサーリンク

関連記事

機械学習手法『Random Forest』
デザインのリファイン再び
Photogrammetry (写真測量法)
ZBrushでアヴァン・ガメラを作ってみる 歯茎を別パーツへ分割
『シン・ゴジラ』のコンセプトアニメーションのメイキング動画が公開された
スターウォーズ エピソードVIIの予告編
Blender 2.81でIntel Open Image Denoiseを使う
フルCGのウルトラマン!?
Google App Engineのデプロイ失敗
ZBrushのZmodelerとDynamic Subdivisionを学ぶ
『ピクサー展』へ行ってきた
トランスフォーマー :リベンジのメイキング (デジタルドメイン)
ZBrush用トポロジー転送プラグイン『ZWrap Plugin for ZBrush』
Raspberry Pi
服飾デザインツール『CLO』
Unityからkonashiをコントロールする
PolyPaint
Structure from Motion (多視点画像からの3次元形状復元)
UnityでPoint Cloudを表示する方法
立体視を試してみた
まだ続くブログの不調
Raspberry Pi 2のGPIOピン配置
iPhoneで3D写真が撮れるアプリ『seene』
機械学習で遊ぶ
MFnMeshクラスのsplit関数
RSSフィードを読込んで表示するWordpressプラグイン『RSSImport』
ZBrushで仮面ライダー3号を造る ベース編
機械学習に役立つPythonライブラリ一覧
Python拡張モジュールのWindows用インストーラー配布サイト
PGGAN:段階的に解像度を上げて学習を進めるGAN
白組による『シン・ゴジラ』CGメイキング映像が公開された!
映画『ジュラシック・ワールド/炎の王国』のVFXブレイクダウン まとめ
Python2とPython3
写真から3Dメッシュの生成・編集ができる無料ツール『Autodesk Memento』
Point Cloud Libraryに動画フォーマットが追加されるらしい
映画『ミュータント・タートルズ』を観てきた
畳み込みニューラルネットワーク (CNN:Convolutional Neural Network)
複数画像から3次元形状を再構築するライブラリ『Multi-View Environment』
Fast R-CNN:ディープラーニングによる一般物体検出手法
UnityからROSを利用できる『ROS#』
OpenCV 3.1とopencv_contribモジュールをVisual Studio 2015で...
OpenMayaRender

コメント