PyTorch3D

PyTorch3D

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

›レンダラー

はじめに

  • PyTorch3Dを選ぶ理由

データ

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

操作

  • Cubify(立方体化)
  • IoU3D

可視化

  • Plotlyによる可視化

レンダラー

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

カメラ

カメラ座標系

3Dデータを扱う場合、ユーザーは4つの座標系を理解する必要があります。

  • ワールド座標系 オブジェクト/シーンが存在する座標系 - つまり、ワールドです。
  • カメラビュー座標系 画像平面上に原点があり、Z軸が画像平面に垂直な座標系です。PyTorch3Dでは、+Xは左方向、+Yは上方向、+Zは画像平面から外側に向かう方向と仮定します。ワールド座標系からビュー座標系への変換は、回転(R)と平行移動(T)を適用した後に実行されます。
  • NDC座標系 レンダリングされるオブジェクト/シーンの部分をボリューム内に限定する正規化された座標系です。ビューボリュームとも呼ばれます。正方形の画像の場合、PyTorch3Dの規則では、(+1, +1, znear)は左上近隅、(-1, -1, zfar)は右下遠隅です。正方形でない画像の場合、XY平面で最も短い辺の長さは[-1, 1]の範囲で、長い辺の長さは[-s, s]の範囲になります。ここで、sはアスペクト比であり、s > 1(長い辺 / 短い辺)です。ビュー座標系からNDC座標系への変換は、カメラ投影行列(P)を適用した後に実行されます。
  • スクリーン座標系 ビューボリュームの別の表現で、XY座標が正規化空間ではなくピクセル空間で定義されます。(0,0)は左上のピクセルの左上隅、(W,H)は右下のピクセルの右下隅です。

4つの座標系を図示すると、以下のようになります。 cameras

PyTorch3Dでのカメラの定義

PyTorch3Dのカメラは、オブジェクト/シーンをワールド座標系からビュー座標系に変換します。最初にオブジェクト/シーンをビュー座標系に変換し(変換RとTを使用)、次に投影行列P = K[R | T]を使用して3Dオブジェクト/シーンを正規化空間に投影します。ここで、Kは内部パラメータ行列です。Kのカメラパラメータは、正規化空間を定義します。ユーザーがNDC空間でカメラパラメータを定義する場合、変換は点をNDCに投影します。カメラパラメータがスクリーン空間で定義されている場合、変換された点はスクリーン空間にあります。

基本となる`CamerasBase`クラスは、座標系について何も仮定しないことに注意してください。上記のすべての変換は、`R`、`T`、`K`によって純粋に定義される幾何学的変換です。つまり、ユーザーは任意の座標系で任意の変換を行うカメラを定義できます。 `transform_points`メソッドは、入力点に`K`、`R`、`T`を単純な行列変換として適用します。ただし、ユーザーがPyTorch3Dレンダラーでカメラを使用する場合は、PyTorch3Dの座標系に関する仮定に従う必要があります(以下をお読みください)。

PyTorch3Dでは、一般的なカメラタイプのインスタンス化と、ユーザーが投影空間を柔軟に定義する方法を提供しています。

PyTorch3Dレンダラーとの連携

PyTorch3Dのメッシュと点群のレンダラーは、カメラ変換された点、つまりラスタライザーに入力として渡される点が、PyTorch3DのNDC空間にあることを前提としています。そのため、期待どおりのレンダリング結果を得るには、ユーザーは3D入力データとカメラがこれらのPyTorch3D座標系の仮定に従っていることを確認する必要があります。 PyTorch3D座標系は、 `+X:左`、 `+Y:上`、 `+Z:私たちからシーンまで`(右手系)を想定しています。座標系に関する混乱はよくあることなので、PyTorch3Dレンダラーを使用する前に、データとそのデータが存在する座標系を理解し、それに応じて変換することをお勧めします。

カメラの例とPyTorch3Dレンダラーとの連携方法は、チュートリアルに記載されています。

カメラの種類

すべてのカメラは、すべてのカメラの基本クラスである`CamerasBase`を継承します。 PyTorch3Dは、4種類のカメラを提供します。 `CamerasBase`は、すべてのカメラモデルに共通のメソッドを定義します。

  • `get_camera_center`:ワールド座標系におけるカメラの光学中心を返します。
  • `get_world_to_view_transform`:ワールド座標系からカメラビュー座標系への3D変換 `(R、T)`を返します。
  • `get_full_projection_transform`:投影変換 `(K)`をワールド座標系からビュー座標系への変換 `(R、T)`と合成します。
  • `transform_points`:ワールド座標系にある入力点のセットを受け取り、[-1, -1, znear]から[+1, +1, zfar]までのNDC座標に投影します。
  • `get_ndc_camera_transform`:PyTorch3DのNDC空間への変換を定義し、PyTorch3Dレンダラーと連携するときに呼び出されます。カメラがNDC空間で定義されている場合、恒等変換が返されます。カメラがスクリーン空間で定義されている場合、スクリーンからNDCへの変換が返されます。ユーザーが独自のカメラをスクリーン空間で定義する場合、スクリーンからNDCへの変換を検討する必要があります。 `PerspectiveCameras`と`OrthographicCameras`の例を示します。
  • `transform_points_ndc`:ワールド座標系にある点のセットを受け取り、PyTorch3DのNDC空間に投影します。
  • `transform_points_screen`:ワールド座標系にある入力点のセットを受け取り、[0, 0, znear]から[W, H, zfar]までのスクリーン座標に投影します。

ユーザーは独自のカメラを簡単にカスタマイズできます。新しいカメラごとに、カメラビュー座標からNDC座標へのマッピング`P`を返す`get_projection_transform`ルーチンを実装する必要があります。

FoVPerspectiveCameras、FoVOrthographicCameras

これら2つのカメラは、それぞれ透視投影カメラと平行投影カメラのOpenGL規則に従います。ユーザーは、ビューボリュームを`Z`軸に限定するニアフィールド`znear`とファーフィールド`zfar`を提供します。 `XY`平面のビューボリュームは、`FoVPerspectiveCameras`の場合は視野角(`fov`)によって、`FoVOrthographicCameras`の場合は`min_x`、`min_y`、`max_x`、`max_y`によって定義されます。これらのカメラはデフォルトでNDC空間にあります。

PerspectiveCameras、OrthographicCameras

これら2つのカメラは、カメラの多視点幾何学規則に従います。ユーザーは、焦点距離(`fx`、`fy`)と主点(`px`、`py`)を提供します。たとえば、 `camera = PerspectiveCameras(focal_length=((fx, fy),), principal_point=((px, py),))`

ビュー座標系における3D点 `(X、Y、Z)`のカメラ投影は、投影空間(NDCまたはスクリーン)の点 `(x、y、z)`になります。

# for perspective camera
x = fx * X / Z + px
y = fy * Y / Z + py
z = 1 / Z

# for orthographic camera
x = fx * X + px
y = fy * Y + py
z = Z

ユーザーは、カメラパラメータをNDCまたはスクリーン空間で定義できます。スクリーン空間のカメラパラメータは一般的であり、その場合は、ユーザーは`in_ndc`を`False`に設定し、スクリーンの`image_size =(height、width)`、つまり画像を提供する必要があります。

`get_ndc_camera_transform`は、PyTorch3Dでスクリーン空間からNDC空間への変換を提供します。スクリーン空間では、主点が `+X左`、 `+Y下`、画像の左上隅を原点とする空間で提供されると想定されていることに注意してください。NDCに変換するには、正規化空間のスケーリングと`XY`方向の変化を考慮する必要があります。

以下は、それぞれNDC空間とスクリーン空間における同等の`PerspectiveCameras`インスタンス化の例です。

# NDC space camera
fcl_ndc = (1.2,)
prp_ndc = ((0.2, 0.5),)
cameras_ndc = PerspectiveCameras(focal_length=fcl_ndc, principal_point=prp_ndc)

# Screen space camera
image_size = ((128, 256),)    # (h, w)
fcl_screen = (76.8,)          # fcl_ndc * min(image_size) / 2
prp_screen = ((115.2, 32), )  # w / 2 - px_ndc * min(image_size) / 2, h / 2 - py_ndc * min(image_size) / 2
cameras_screen = PerspectiveCameras(focal_length=fcl_screen, principal_point=prp_screen, in_ndc=False, image_size=image_size)

カメラの `focal_length` と `principal_point` のスクリーン座標とNDC座標の関係は、以下の式で表されます。ここで、`s = min(image_width, image_height)` です。スクリーン座標とNDC座標間のx座標とy座標の変換は、pxとpyと全く同じです。

fx_ndc = fx_screen * 2.0 / s
fy_ndc = fy_screen * 2.0 / s

px_ndc = - (px_screen - image_width / 2.0) * 2.0 / s
py_ndc = - (py_screen - image_height / 2.0) * 2.0 / s
← はじめに
  • カメラ座標系
  • PyTorch3Dでのカメラの定義
  • PyTorch3Dレンダラーとの連携
    • カメラの種類
pytorch3d
Facebook Open Source
Copyright © 2024 Meta Platforms, Inc
法務関連:プライバシー利用規約