FaceBook開源PyTorch3D:基於PyTorch的新3D電腦視覺庫

  • 2020 年 2 月 24 日
  • 筆記

機器之心報道

參與:一鳴、Jamin

PyTorch 進軍三維電腦視覺了,專用庫已出爐。

3D 電腦視覺是一個重要的課題,如何選擇合適的框架進行計算,使得處理效果更好、更高效?近日,FaceBook 部落格更新了一篇新的文章,介紹了團隊開發的針對 3D 電腦視覺的框架——PyTorch3D。這是一個基於 PyTorch 的庫,在 3D 建模,渲染等多方面處理操作上有更好的表現。

項目地址:https://github.com/facebookresearch/pytorch3d

基於 PyTorch 的 3D 電腦視覺處理庫

據項目介紹,PyTorch3d 是一個高效、可復用的 3D 電腦視覺庫。在這一項目中,開發者實現了以下新特性:

1. 他們提出了新的 3D 數據結構——Meshes,這種數據結構可以更好地存儲和修改三角網格的數據;

2. 高效處理三角網格的運算元,如投影變換、圖卷積、取樣、損失函數等;

3. 一個可微分的網格生成器;

由於是基於 PyTorch 的,這個框架主要面向的是深度學習方面的模型。項目目標是將 3D 電腦視覺和深度學習結合,用於對三維數據的預測和計算。在 PyTorch3D 中,所有的運算元都:

1. 使用 PyTorch 的運算元;

2. 可以使用異構的批數據;

3. 可微分;

4. 能夠使用 GPU 加速;

這樣一來,PyTorch3D 吸收了深度學習框架的優勢,同時能夠專門針對 3D 建模渲染等進行計算,有著很好的性能和應用優勢。

主要特性

PyTorch3D 主要有三個值得注意的新特性,這些特性在 FaceBook 的部落格中進行了介紹。

3D 網格數據的新格式:Meshes

由於三維網格包含頂點坐標以及面的索引這兩者的集合,因此在批量處理不同尺寸的三維網格時會需要進行一些調整。為了解決這個問題,研究者們提出了 Meshes,一種在深度學習應用中可以批量處理異構網路的數據結構。

Mesh 的數據結構。

這種數據結構使得研究人員很容易將底層的網格數據轉換為合適的格式,從而讓相應的運算元能夠匹配到最高效的數據表示。Pytorch3D 為用戶提供了在不同的表示視圖間高效切換的方法,同時還可以獲得不同數據表示的屬性,具有很好的靈活性。

對 3D 數據的高效處理

團隊已經完成了部分工作,如優化一些常用運算符、優化三維數據的損失函數,以及支援異構批數據輸入等。

這說明,用戶可以在 Pytorch3D 中直接導入這些運算元,以便於更快的進行實驗。這些運算元包括倒角損失(chamfer loss),它是一種用於比較兩組點雲的方法,可以用作三維網格的損失函數。開發團隊還使用 CUDA 內核為這個損失函數創建了一個算力資源密集型的最近鄰計算優化方法。

通過對倒角損失等進行收斂,從而建模。

可微的影像渲染方法

將 3D 模型渲染為 2D 影像是這一領域的核心部分。這種渲染採用的思路是將 3D 的場景屬性轉換為 2D 影像的像素點資訊。傳統的渲染方法一般是不可微的,因此無法和深度學習結合。可微的渲染方法是一個新的研究領域,而研究者希望通過 PyTorch3D 來實現。

將 3D 模型轉換為 2D 影像的過程。

在項目中,研究者採用了高效、模組化且可微的渲染器(renderer)。而且,這些都是可以擴展的,用戶可以很容易地進行訂製,比如在渲染的時候改變光影效果。而在計算密集的模型轉像素點階段,計算可以在 PyTorch、C++和 CUDA 上並行化,還能夠全面地進行測試,驗證其準確性。和其他 PyTorch3D 的運算元一樣,渲染器也是支援異構批量數據的。

使用教程

除了在部落格中介紹了項目之外,項目研究者還提供了四個相關教程。

將球形點雲分解為海豚: https://github.com/facebookresearch/pytorch3d/blob/master/docs/tutorials/deform_source_mesh_to_target_mesh.ipynb

渲染帶有材質的點云:https://github.com/facebookresearch/pytorch3d/blob/master/docs/tutorials/render_textured_meshes.ipynb

網格調整:https://github.com/facebookresearch/pytorch3d/blob/master/docs/tutorials/bundle_adjustment.ipynb

相機視角優化:https://github.com/facebookresearch/pytorch3d/blob/master/docs/tutorials/camera_position_optimization_with_differentiable_rendering.ipynb