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などの研究プロジェクトで使用しています。

ドキュメントはこちら
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(正規化デバイス座標系)のことか。

なんだか急激に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日でサポート終了のはずだが)そん...


スポンサーリンク

関連記事

PCA (主成分分析)
ちょっと凝り過ぎなWebキャンペーン:全日本バーベイタム選手権 (MITSUBISHI KAGAKU...
CGAN (Conditional GAN):条件付き敵対的生成ネットワーク
WordPressプラグインの作り方
DCGAN (Deep Convolutional GAN):畳み込みニューラルネットワークによる敵...
OpenCVでカメラ画像から自己位置認識 (Visual Odometry)
顔追跡による擬似3D表示『Dynamic Perspective』
Amazon EC2ログイン用の秘密鍵を無くした場合の対処方法
定数
Mask R-CNN:ディープラーニングによる一般物体検出・Instance Segmentatio...
iOSで使えるJetpac社の物体認識SDK『DeepBelief』
Maya LTのQuick Rigを試す
『スター・ウォーズ フォースの覚醒』のVFXブレイクダウン まとめ
2012 昨日のクローズアップ現代を見た
デザインのリファイン再び
SONYの自律型エンタテインメントロボット『aibo』
マジョーラ
サンプルコードにも間違いはある?
OpenCVのための軽量GUIライブラリ『cvui』
Unityからkonashiをコントロールする
MeshroomでPhotogrammetry
ZBrushと液晶ペンタブレットでドラゴンをモデリングするチュートリアル動画
IronPythonを使ってUnity上でPythonのコードを実行する
Unityで強化学習できる『Unity ML-Agents』
ラクガキの立体化 3Dプリント注文
BlenderでPhotogrammetryできるアドオン
BSDF: (Bidirectional scattering distribution funct...
機械学習について最近知った情報
人間の顔をそっくりそのままCGで復元する『Digital Emily Project』
マイケル・ベイの動画の感覚
ZBrushで基本となるブラシ
映画から想像するVR・AR時代のGUIデザイン
HerokuでMEAN stack
Photoshopで作る怪獣特撮チュートリアル
Raspberry PiでIoTごっこ
Vancouver Film Schoolのデモリール
CEDEC 3日目
「ベンジャミン·バトン数奇な人生」でどうやってCGの顔を作ったのか
ZBrushで仮面ライダー3号を造る 仮面編 ClipCurve
PythonのHTML・XMLパーサー『BeautifulSoup』
昔Mayaでモデリングしたモデルをリファインしてみようか
ZBrushで仮面ライダー3号を造る 仮面編 Clay Polish

コメント