機器之心釋出
機器之心編輯部
OpenCV 創始人 Gary Bradski 等人近期發表了一篇 Kornia 的綜述。Kornia 是一個基於 PyTorch 的可微分的計算機視覺庫,實現了可微的基礎計算機視覺運算元和可微的資料增廣。該專案在 Github 上已經收穫了 3k 星。
無論在深度學習還是傳統的視覺處理方案中,最常用影像處理庫就是 OpenCV 和 PIL 了。然而,因為 OpenCV 和 PIL 都是不可微的,所以這些處理都只可以作為影像的預處理而無法透過觀察梯度的變化來對這些運算元進行最佳化 (gradient-based optimization)。因此,Kornia 便應運而生。
論文連結:
專案連結:
文件連結:
Kornia 是一個基於 PyTorch 的可微分的計算機視覺 (differentiable computer vision) 開源庫,在 Github 上已經有了 3000 星。為了兼顧傳統視覺處理與深度學習的需求,Kornia 實現了:
可微的基礎計算機視覺運算元。
可微的資料增廣(differentiable data augmentation)。
由於 Kornia 是基於 PyTorch 的,它同時會具備如下特性:
可微分性。所有運算元的梯度都可以透過 PyTorch 的 AutoGrad 計算,並使用 PyTorch 的最佳化器(如:Adam)來最佳化。
GPU/TPU 加速。除 CPU 外,Kornia 可以在 GPU 甚至 TPU 中進行運算。
批資料處理。同時處理大量資料來提高執行效率。
1.Kornia 可微計算機視覺
為了解決不同計算機視覺領域的問題,比如顏色轉換、底層影像處理、影像幾何變換、特徵檢測等,Kornia 設計瞭如下圖的模組。
值得一提的是,Kornia 不僅僅是將 OpenCV 的功能用 PyTorch 重新實現,它同時也將一些傳統視覺中不可微的操作可微化,譬如說裁切 (crop) 操作便是透過透視變換 (Perspective transform) 與仿射變換 (Affine transform) 實現的。
基於可微性,Kornia 中傳統的視覺方法也可以透過梯度下降的方法來進行最佳化。比如使用梯度下降的方法來實現影像深度估計 (Depth Estimation):
詳細程式碼可以參考 -examples/blob/master/depth_estimation.ipynb
亦或是使用梯度下降的方法來實現影像配準 (Image Registration):
詳細程式碼可以參考 -examples/blob/master/homography.ipynb
2.Kornia 可微資料增廣
深度學習中最常用的最佳化方法便是基於梯度的最佳化,但常用的資料增廣庫(如 TorchVision,Albumentations)並不具備可微性。為了更好地與深度學習相結合,Kornia 參考了 TorchVision 的 API 並實現了可微的資料增廣(DDA, Differentiable Data Augmentation)。目前,開發團隊也在持續開發更多的可微分的 2D 影像與 3D Volume 的資料增廣,如下圖所示(RGB 3D Volume 很少見,實現與否將由社群驅動)。
由於 Kornia 是基於 PyTorch 開發而來的,那麼資料增廣的邏輯便自然而然地整合進了 PyTorch 的網路中,就像使用卷積層,池化層一樣。相似的,我們可以任意定義、儲存、載入 Kornia 增廣模組,並在任意裝置(CPU/GPU/TPU)上運算。尤其在訓練中,如果你的 CPU 已經開始超負荷執行了,那麼 Kornia 將會更大地提升你的訓練速度與 GPU 利用率。
同時, Kornia 的資料增廣方法也可以輕鬆地透過梯度來進行最佳化。下面的例子展示瞭如何使用 ColorJitter 來更新影像與增廣引數,其中我們透過 nn.Parameter 定義了亮度 (brightness)、飽和度 (saturation)、對比度 (contrast)這三個可微的引數,以及透過 torch.tensor 定義色相 (hue)這一不可微的引數。從結果中,我們可以看到被大學習率(learning rate=1e+5)更新的影像以及三個可微引數的變化。
3. 後話
可微的資料增廣乃至於計算機視覺在近幾年的社群中不斷被更多的人關注。近期的工作,例如 Faster AutoAugment,便是基於 Kornia 的可微性而來的針對自動資料增廣策略的最佳化方法。開發團隊表示,他們也希望自己的工作可以更多地應用於各種有潛力的專案。未來,他們將會加入更多的資料增廣操作、梯度估計方法,以及增加對 JIT 的支援。