大きな工場の事務
情報
Yang Bai
内容紹介
マシン ビジョンの分野では、3D ディープ ラーニングは常に困難であり、シーンの 3 次元モデルを正確かつ効率的に確立し、比較的現実的なレンダリング結果を得るために、業界の一部の大手メーカーは独自の研究をオープンソース化しています。開発結果。
しかし、現実の環境では、オブジェクトはほとんどが 3D 構造の形で存在します。複雑な現実環境を認識して理解し、3D 画像を正しく処理する AI システムの能力を正確に向上させる方法、それはますます重大な技術的問題になりつつあります。
2020 年 1 月 23 日、Facebook AI は PyTorch3D v0.1.0 をリリースしました。 PyTorch3D は、最適化され効率的で再利用可能な PyTorch のコンポーネント ライブラリであり、効率的、モジュール化可能、微分可能という 3 つの優れた機能を備えています。PyTorch での 3D ディープ ラーニングを簡素化するように設計されています。
PyTorch3D は、3D オペレーターとレンダリングという 2 つの主要なコンポーネントを提供します。
3D オペレーターでは、Fit Meshでは3Dロス機能を利用することができ、初期の一般的な形状をターゲットの形状に変換し、いくつかのルールを使用してターゲットの形状をより滑らかにします。3Dオペレーターでのビーム調整方法(バンドル調整)、次に提供します カメラ 、 変換する 、 so3 合計 3 つの API があり、指定されたカメラの視点に基づいてカメラの視点へのマッピングを形成し、それによってシーンの 3D 構造を推測します。
レンダリングには、テクスチャ メッシュのレンダリング、DensePose メッシュ レンダラー (DensePose Meshed のレンダリング)、カラー ポイントクラウド レンダラー (カラー ポイントクラウドのレンダリング) などが含まれます。これらのレンダラーを使用すると、結果として得られるシーンの 3D 構造をさらに最適化できます。
2020 年 2 月 6 日、PyTorch3D 関連のコードが GitHub でオープンソース化されました。 5 回のバージョン反復を経て、2021 年 2 月 9 日に、PyTorch3D は 6 番目のパブリック バージョン v0.4.0 をリリースしました。インプリシット関数、立体視レンダリング、NeRF再実装などの新機能を追加し、3D ディープラーニング研究用に、より高速で柔軟なオープンソース ライブラリを提供します。
暗黙的な形状レンダリング
暗黙的シェイプ レンダリングとは、入力シーンの新しい視点に基づいて 3D シーンの現実的なレンダリングを生成することを指します。中心となるアイデアは、ニューラル ネットワークと微分可能レンダリングを使用して、3D シーン サーフェスの暗黙的な形状を再構築することです。これにより、2D ビューのみに依存して 3D シーンのジオメトリを学習できるようになります。
暗黙的な形状レンダリングを行うには、いくつかの重要なコンポーネントが必要です。ボリューム データの抽象化と微分可能な暗黙的な形状レンダラーが含まれています。
業界の実務者が暗黙的な形状レンダリングを簡単に実験できるようにするために、PyTorch3D はすでに、一般的に使用される一連の 3D 演算子と損失関数、およびモジュール式の微分可能なレンダリング API をユーザーに提供しています。コアの再利用可能なコンポーネントを指摘しながら、これらのコンポーネントの実証済みの標準化された実装も提供します。
PyTorch3D v0.4.0 には、暗黙的な形状レンダリングをサポートする 5 つの新機能が含まれています。
1. 新しいデータボリューム構造 (ボリュームのデータ構造)、3D ボリュームのバッチ処理と座標フレーム間の変換をサポートします。
2. 複数のライト テクスチャ実装メソッドを追加しました: GridRaysampler、MonteCarloRaysampler、NDCGridRaysampler
3. 複数の Raymarcher 実装メソッドを追加しました: AbsorptionOnlyRaymarcher、EmissionAbsorptionRaymarcher
4. 暗黙的なレンダラーを追加しました (ImplicitRenderer) およびボリューム レンダラー (ボリュームレンダラー) Raysampler と Raymarcher を構成する API
5. 点群からボリュームへの微分可能変換など、複数のユーティリティ関数を追加しました。
これらの新しいコンポーネントを使用するには、十分に文書化されたモジュール式の NeRF 再実装が利用可能です。
NeRF は深層学習モデルであり、Google Research チームによって開発されたこのツールは、神経放射フィールド (Neural Radiance Fields) を使用してシーンを表現し、ビュー合成 (View Synthesis) を実行することを目的としています。
NeRF は、非構造化画像コレクションのみを使用して複雑な 3D シーン グラフを合成できます。
NeRF の改良版は再実装され、出力画像の品質を確保しつつ、正式版よりも高速に動作します。
チュートリアル (テクスチャ ボリュームのフィット)
公式 PyTorch3D GitHub チュートリアル Fit Textured Volume に基づいて、PyTorch3D での使用方法を示すために中国語化および整理しました。微分可能な立体レンダリングは、一連のビューに基づいて特定のシーンの立体構造を予測するために使用されます。
Raymarching を使用してシーンの 3D 三次元構造を構築します。このチュートリアルでは次のことを説明します。
注: スペースが限られているため、この記事ではコードの一部のみを示しています。完全なコードを参照してください。ここをクリック。
0. モジュールのインストールとインポート
インストールされていることを確認してください トーチ そして トーチビジョン 。
インストールされていない場合 pytorch3d をインストールしてください。
1. シーン画像とマスク画像を生成する
次のコードはこのトレーニング データを生成します。それは過ぎます fit_textured_mesh.ipynb 複数の角度から牛の画像をレンダリングし、以下を返すチュートリアル:
すべてのカメラ ショットに 1 対 1 対応するレンダラーによって生成された一連の画像テンソルとそのシルエット。
注: generate_cow_renders 関数に実装されたグリッド レンダリングの動作原理については、以下を参照してください。
fit_textured_mesh.ipynb
target_cameras, target_images, target_silhouettes = generate_cow_renders(num_views=40)
print(f'Generated {len(target_images)} images/silhouettes/cameras.')
2. ボリュームレンダラーを初期化する
ボリューム レンダラーを初期化すると、ターゲット イメージの各ピクセルからレイが放射され、レイに沿って等間隔の点のセットがサンプリングされます。各光線点に対応する密度と色の値は、シーンのボリューム モデル内の対応する位置をクエリすることによって取得されます。
レンダラーは次のもので構成されます。 レイマーチャー そして レイサンプラー 構成します。
レイサンプラー 画像ピクセルから光線を放出し、光線に沿った点をサンプリングします。ここで使われているのは、 NDCグリッドレイサンプラー 、標準の PyTorch3D 座標グリッド仕様に準拠しています。
レイマーチャー 光線サンプルの密度と色を取得し、すべての光線を光源ピクセルの色と不透明度の値にレンダリングします。ここで使われているのは、 放射吸収レイマーチャー 、標準を実装します 放射吸収レイマーチング アルゴリズム。
# render_size 表示渲染图像各个边的像素大小,将其设置为与目标图像尺寸一致
# 也就是说将其渲染成与基准图像一样的尺寸
render_size = target_images.shape[1]
# 渲染场景以(0,0,0)为中心,被限定在一个边长约等于 3.0 (国际单位) 的边框内。
volume_extent_world = 3.0
# 1) 实例化 raysampler
# 此处 NDCGridRaysampler 会生成一矩形图像网格的射线,其坐标遵循 pytorch3d 坐标规定
# 由于此处设定的体积是 128^3,因此取样 n_pts_per_ray=150
# 大致相当于每个体素都有一个射线点
# 进一步设置 min_depth=0.1,因为相机平面内的所有表面都超过了 0.1 单位
raysampler = NDCGridRaysampler(
image_width=render_size,
image_height=render_size,
n_pts_per_ray=150,
min_depth=0.1,
max_depth=volume_extent_world,
)
# 2) 实例化 raymarcher.
# 此处用的是标准 EmissionAbsorptionRaymarcher
# 它会沿着每条射线前进
# 将每条射线都渲染成一个单一的 3D 颜色向量和一个不透明度标量
raymarcher = EmissionAbsorptionRaymarcher()
# 最后,用 raysampler 和 raymarcher 实例化体积渲染器
renderer = VolumeRenderer(
raysampler=raysampler, raymarcher=raymarcher,
)
3. ボリュームモデルの初期化
次に、シーンのボリューム モデルをインスタンス化します。これにより、3D 空間が体積ピクセルに量子化されます。各ボクセルは、ボクセルの RGB カラーの 3D ベクトルと、ボクセルの不透明度を表す密度スカラー ([0-1] の範囲で、数値が大きいほど高くなります) で表されます。不透明)を表現します。
濃度と色の値の範囲が [0-1] の間にあることを保証するために、体積の色と濃度を対数空間で表します。モデルの実行 フォワード 関数、 ログスペース 値は渡されます シグモイド 機能移転なので、 ログスペース 値は正しい範囲内にあります。
また、 ボリュームモデル レンダラー オブジェクトも含まれます。このオブジェクトは、最適化プロセスを通じて変更されません。
コードのこの部分では以下も定義されています フーバー レンダリングされたカラーとマスクの差を計算する損失関数。
4. ボリュームフィッティング
このステップでは、微分可能レンダリングを使用してボリューム フィッティングを実行します。
ボリュームに合わせて、次から始めます。 ターゲットカメラ ユーザーの視点からレンダリングし、レンダリング結果を観察された結果と比較します。 ターゲット画像 そして ターゲットシルエット 比較してみましょう。
この比較は次のように評価されます。 target_images/rendered_images そして target_silhouettes/rendered_silhouettes これは、平均フーバー (smooth-l1) 誤差によって行われます。
5. 最適化されたシーンボリュームを視覚化する
最後に、シーン ボリュームの Y 軸が回転され、複数の視点からレンダリングされ、最適化されたボリュームが視覚化されます。
def generate_rotating_volume(volume_model, n_frames = 50):
logRs = torch.zeros(n_frames, 3, device=device)
logRs[:, 1] = torch.linspace(0.0, 2.0 * 3.14, n_frames, device=device)
Rs = so3_exponential_map(logRs)
Ts = torch.zeros(n_frames, 3, device=device)
Ts[:, 2] = 2.7
frames = []
print('Generating rotating volume ...')
for R, T in zip(tqdm(Rs), Ts):
camera = FoVPerspectiveCameras(
R=R[None],
T=T[None],
znear = target_cameras.znear[0],
zfar = target_cameras.zfar[0],
aspect_ratio = target_cameras.aspect_ratio[0],
fov = target_cameras.fov[0],
device=device,
)
frames.append(volume_model(camera)[..., :3].clamp(0.0, 1.0))
return torch.cat(frames)
with torch.no_grad():
rotating_volume_frames = generate_rotating_volume(volume_model, n_frames=7*4)
image_grid(rotating_volume_frames.clamp(0., 1.).cpu().numpy(), rows=4, cols=7, rgb=True, fill=True)
plt.show()
6. 結論
このチュートリアルでは、既知の視点の体積レンダリングが各視点からの観察画像と一致するように、シーンの 3D 体積構築を最適化する方法を説明します。
チュートリアルでのレンダリングでは、 NDCグリッドレイサンプラー そして 放射吸収レイマーチャー PyTorch3D ステレオ レンダラによって完成されます。
完全なチュートリアルをご覧くださいここをクリック。