PyTorch3D

PyTorch3D

  • ドキュメント
  • チュートリアル
  • API
  • GitHub

›レンダラー

はじめに

  • PyTorch3Dを使う理由

データ

  • ファイルIO
  • ファイルからの読み込み
  • データローダー
  • バッチ処理

操作

  • Cubify
  • IoU3D

可視化

  • Plotlyによる可視化

レンダラー

  • 概要
  • はじめに
  • カメラ

レンダラーの使い方

アーキテクチャ概要

レンダラーは、モジュール式で拡張可能であり、すべての入力に対してバッチ処理と勾配をサポートするように設計されています。次の図は、レンダリングパイプラインのすべてのコンポーネントを示しています。

フラグメント

**ラスタライザー**は、名前付きタプルで4つの出力テンソルを返します。

  • **`pix_to_face`**: 形状が `(N, image_size, image_size, faces_per_pixel)` の LongTensor で、画像の各ピクセルと重なる面(パックされた面の中)のインデックスを指定します。
  • **`zbuf`**: 形状が `(N, image_size, image_size, faces_per_pixel)` の FloatTensor で、ワールド座標系における各ピクセルで最も近い面の z 座標を昇順でソートしたものを示します。
  • **`bary_coords`**: 形状が `(N, image_size, image_size, faces_per_pixel, 3)` の FloatTensor で、NDC 単位系における各ピクセルで最も近い面の重心座標を昇順でソートしたものを示します。
  • **`pix_dists`**: 形状が `(N, image_size, image_size, faces_per_pixel)` の FloatTensor で、各点のピクセルに最も近い x/y 平面における符号付きユークリッド距離(NDC 単位系)を示します。

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


注意

微分可能なレンダラー API は実験段階であり、変更される可能性があります。


座標変換規則

レンダリングには、ワールド空間、ビュー/カメラ空間、NDC 空間、スクリーン空間など、いくつかの異なる座標フレーム間の変換が必要です。各ステップにおいて、カメラの位置、+X、+Y、+Z 軸の向き、および値の範囲を知ることが重要です。次の図は、PyTorch3Dで使用される規則の概要を示しています。

たとえば、ティーポットメッシュが与えられた場合、ワールド座標フレーム、カメラ座標フレーム、および画像は下の図のようになります。ワールド座標フレームとカメラ座標フレームは、+z 方向がページの奥を向いていることに注意してください。


注意: PyTorch3D vs OpenGL

OpenGL のいくつかの側面をエミュレートしようとしましたが、座標フレームの規則には違いがあります。

  • PyTorch3D のデフォルトのワールド座標フレームは +Z が画面の奥を向いていますが、OpenGL では +Z は画面の手前を向いています。どちらも右手系です。
  • PyTorch3D の NDC 座標系は **右手系** ですが、OpenGL の NDC 座標系は **左手系** です(射影行列によって handedness が切り替わります)。


正方形でない画像のラスタライズ

H != W の画像をラスタライズするには、`RasterizationSettings` で `image_size` を (H, W) のタプルとして指定できます。

アスペクト比には特別な考慮が必要です。注意すべきアスペクト比は2つあります。- 各ピクセルのアスペクト比 - 出力画像のアスペクト比 カメラ(例: `FoVPerspectiveCameras`)では、`aspect_ratio` 引数を使用してピクセルアスペクト比を設定できます。ラスタライザーでは、正方形のピクセルを想定していますが、画像のアスペクト比は可変です(つまり、長方形の画像)。

ほとんどの場合、カメラのアスペクト比を 1.0(つまり、正方形のピクセル)に設定し、`RasterizationSettings` の `image_size`(つまり、ピクセル単位の出力画像の寸法)のみを変更します。


Pulsar バックエンド

v0.3 以降、pulsar をポイントレンダリングのバックエンドとして使用できます。効率性に重点を置いており、長所と短所があります。高度に最適化されており、すべてのレンダリングステージが CUDA カーネルに統合されています。これにより、速度が大幅に向上し、スケーリングの動作が向上します。Facebook Reality Labs では、最大 4K の解像度で数百万個の球体で構成されるシーンをレンダリングおよび最適化するためにこれを使用しています。以下の実行時間比較プロットをご覧ください(設定: `bin_size=None`、`points_per_pixel=5`、`image_size=1024`、`radius=1e-2`、`composite_params.radius=1e-4`、RTX 2070 GPU でベンチマーク)。

Pulsar の処理ステップは CUDA カーネルと緊密に統合されており、カスタムの `rasterizer` および `compositor` コンポーネントでは機能しません。Pulsar を使用するには、2 つの方法があります。(1)PyTorch3D 呼び出し規約とシームレスに一致する統一インターフェースがあります。これは、たとえば、点群チュートリアル に示されています。(2)pulsar バックエンドに直接アクセスできるインターフェースがあり、バックエンドのすべての機能(PyTorch3D ではまだ利用できない不透明度を含む)を利用できます。その使用方法と対応する PyTorch3D インターフェースコードの例は、このフォルダー にあります。


テクスチャオプション

メッシュテクスチャリングには、いくつかのオプションがあります(`pytorch3d/renderer/mesh/texturing.py` にあります)。

  1. **頂点テクスチャ**: 各頂点の D 次元テクスチャ(たとえば、RGB カラー)で、面全体に補間できます。これは `(N, V, D)` テンソルとして表すことができます。ただし、これはかなり単純な表現であり、メッシュ面が大きい場合、複雑なテクスチャをモデル化できません。
  2. **UV テクスチャ**: 頂点 UV 座標とメッシュ全体の **1 つの** テクスチャマップ。重心座標が与えられた面上の点について、頂点 UV 座標を補間してからテクスチャマップからサンプリングすることにより、面のカラーを計算できます。この表現には 2 つのテンソル(UV: `(N, V, 2)`、テクスチャマップ: `(N, H, W, 3)`) が必要であり、メッシュごとに 1 つのテクスチャマップのみをサポートするように制限されています。
  3. **面テクスチャ**: ShapeNet メッシュなどのより複雑なケースでは、メッシュごとに複数のテクスチャマップがあり、一部の面にはテクスチャがありますが、他の面にはありません。これらの場合、より柔軟な表現はテクスチャアトラスです。各面は `(RxR)` テクスチャマップとして表され、R はテクスチャの解像度です。面上の特定の点について、点の重心座標を使用して、面ごとのテクスチャマップからテクスチャ値をサンプリングできます。この表現には、形状が `(N, F, R, R, 3)` のテンソルが 1 つ必要です。このテクスチャリング方法は、SoftRasterizer の実装に触発されています。詳細については、`make_material_atlas` 関数と `sample_textures` 関数を参照してください。**注意**: `TexturesAtlas` テクスチャサンプリングは、テクスチャアトラスに関してのみ微分可能であり、重心座標に関して微分可能ではありません。


シンプルなレンダラー

PyTorch3D のレンダラーは、**ラスタライザー**と**シェーダー**で構成されています。簡単な手順でレンダラーを作成します。

# Imports
from pytorch3d.renderer import (
    FoVPerspectiveCameras, look_at_view_transform,
    RasterizationSettings, BlendParams,
    MeshRenderer, MeshRasterizer, HardPhongShader
)

# Initialize an OpenGL perspective camera.
R, T = look_at_view_transform(2.7, 10, 20)
cameras = FoVPerspectiveCameras(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,
)

# 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=HardPhongShader(device=device, cameras=cameras)
)

カスタムシェーダー

シェーダーは、PyTorch3D レンダリング API の最も柔軟な部分です。shaders.py にシェーダーの例をいくつか作成しましたが、これは網羅的なセットではありません。

シェーダーは、いくつかのステップを組み込むことができます。

  • テクスチャリング(例:頂点 RGB カラーの補間、または頂点 UV 座標の補間とそれに続くテクスチャマップからのサンプリング(補間はラスタライズから出力された重心座標を使用))
  • ライティング/シェーディング(例:アンビエント、ディフューズ、スペキュラーライティング、フォン、グーロー、フラット)
  • ブレンディング(例:各ピクセルに最も近い面のみを使用するハードブレンディング、またはピクセルごとに上位 K 個の面の加重和を使用するソフトブレンディング)

現在サポートしているテクスチャリング/シェーディング/ブレンディングのサポートに基づいて、これらの関数のいくつかの組み合わせの例を用意しています。これらを以下の表にまとめます。他にも多くの組み合わせが可能であり、テクスチャリング、シェーディング、ブレンディングに使用できるオプションを拡張する予定です。

シェーダーの例頂点テクスチャUV テクスチャテクスチャアトラスフラットシェーディンググーローシェーディングフォンシェーディングハードブレンディングソフトブレンディング
HardPhongShader✔️✔️✔️✔️✔️
SoftPhongShader✔️✔️✔️✔️✔️
HardGouraudShader✔️✔️✔️✔️✔️
SoftGouraudShader✔️✔️✔️✔️✔️
HardFlatShader✔️✔️✔️✔️✔️
SoftSilhouetteShader✔️
← 概要カメラ →
pytorch3d
Facebook Open Source
Copyright © 2024 Meta Platforms, Inc
法律関連:プライバシー利用規約