Kornia開源可微分計(jì)算機(jī)視覺庫(kù),基于Pytorch,GitHub 3000星
OpenCV 創(chuàng)始人 Gary Bradski 等人近期發(fā)表了一篇 Kornia 的綜述。Kornia 是一個(gè)基于 PyTorch 的可微分的計(jì)算機(jī)視覺庫(kù),實(shí)現(xiàn)了可微的基礎(chǔ)計(jì)算機(jī)視覺算子和可微的數(shù)據(jù)增廣。該項(xiàng)目在 Github 上已經(jīng)收獲了 3k 星。
無論在深度學(xué)習(xí)還是傳統(tǒng)的視覺處理方案中,最常用圖像處理庫(kù)就是 OpenCV 和 PIL 了。然而,因?yàn)?OpenCV 和 PIL 都是不可微的,所以這些處理都只可以作為圖像的預(yù)處理而無法通過觀察梯度的變化來對(duì)這些算子進(jìn)行優(yōu)化 (gradient-based optimization)。因此,Kornia 便應(yīng)運(yùn)而生。
- 論文鏈接:https://arxiv.org/pdf/2009.10521.pdf
- 項(xiàng)目鏈接:https://github.com/kornia/kornia
- 文檔鏈接:https://kornia.readthedocs.io/en/latest/index.html
Kornia 是一個(gè)基于 PyTorch 的可微分的計(jì)算機(jī)視覺 (differentiable computer vision) 開源庫(kù),在 Github 上已經(jīng)有了 3000 星。為了兼顧傳統(tǒng)視覺處理與深度學(xué)習(xí)的需求,Kornia 實(shí)現(xiàn)了:
- 可微的基礎(chǔ)計(jì)算機(jī)視覺算子。
- 可微的數(shù)據(jù)增廣(differentiable data augmentation)。
由于 Kornia 是基于 PyTorch 的,它同時(shí)會(huì)具備如下特性:
- 可微分性。所有算子的梯度都可以通過 PyTorch 的 AutoGrad 計(jì)算,并使用 PyTorch 的優(yōu)化器(如:Adam)來優(yōu)化。
- GPU/TPU 加速。除 CPU 外,Kornia 可以在 GPU 甚至 TPU 中進(jìn)行運(yùn)算。
- 批數(shù)據(jù)處理。同時(shí)處理大量數(shù)據(jù)來提高運(yùn)行效率。
1.Kornia 可微計(jì)算機(jī)視覺
為了解決不同計(jì)算機(jī)視覺領(lǐng)域的問題,比如顏色轉(zhuǎn)換、底層圖像處理、圖像幾何變換、特征檢測(cè)等,Kornia 設(shè)計(jì)了如下圖的模塊。
值得一提的是,Kornia 不僅僅是將 OpenCV 的功能用 PyTorch 重新實(shí)現(xiàn),它同時(shí)也將一些傳統(tǒng)視覺中不可微的操作可微化,譬如說裁切 (crop) 操作便是通過透視變換 (Perspective transform) 與仿射變換 (Affine transform) 實(shí)現(xiàn)的。
基于可微性,Kornia 中傳統(tǒng)的視覺方法也可以通過梯度下降的方法來進(jìn)行優(yōu)化。比如使用梯度下降的方法來實(shí)現(xiàn)圖像深度估計(jì) (Depth Estimation):
詳細(xì)代碼可以參考 https://github.com/kornia/kornia-examples/blob/master/depth_estimation.ipynb
亦或是使用梯度下降的方法來實(shí)現(xiàn)圖像配準(zhǔn) (Image Registration):
詳細(xì)代碼可以參考 https://github.com/kornia/kornia-examples/blob/master/homography.ipynb
2.Kornia 可微數(shù)據(jù)增廣
深度學(xué)習(xí)中最常用的優(yōu)化方法便是基于梯度的優(yōu)化,但常用的數(shù)據(jù)增廣庫(kù)(如 TorchVision,Albumentations)并不具備可微性。為了更好地與深度學(xué)習(xí)相結(jié)合,Kornia 參考了 TorchVision 的 API 并實(shí)現(xiàn)了可微的數(shù)據(jù)增廣(DDA, Differentiable Data Augmentation)。目前,開發(fā)團(tuán)隊(duì)也在持續(xù)開發(fā)更多的可微分的 2D 圖像與 3D Volume 的數(shù)據(jù)增廣,如下圖所示(RGB 3D Volume 很少見,實(shí)現(xiàn)與否將由社區(qū)驅(qū)動(dòng))。
由于 Kornia 是基于 PyTorch 開發(fā)而來的,那么數(shù)據(jù)增廣的邏輯便自然而然地整合進(jìn)了 PyTorch 的網(wǎng)絡(luò)中,就像使用卷積層,池化層一樣。相似的,我們可以任意定義、保存、載入 Kornia 增廣模塊,并在任意設(shè)備(CPU/GPU/TPU)上運(yùn)算。尤其在訓(xùn)練中,如果你的 CPU 已經(jīng)開始超負(fù)荷運(yùn)行了,那么 Kornia 將會(huì)更大地提升你的訓(xùn)練速度與 GPU 利用率。
同時(shí), Kornia 的數(shù)據(jù)增廣方法也可以輕松地通過梯度來進(jìn)行優(yōu)化。下面的例子展示了如何使用 ColorJitter 來更新圖像與增廣參數(shù),其中我們通過 nn.Parameter 定義了亮度 (brightness)、飽和度 (saturation)、對(duì)比度 (contrast)這三個(gè)可微的參數(shù),以及通過 torch.tensor 定義色相 (hue)這一不可微的參數(shù)。從結(jié)果中,我們可以看到被大學(xué)習(xí)率(learning rate=1e+5)更新的圖像以及三個(gè)可微參數(shù)的變化。
3. 后話
可微的數(shù)據(jù)增廣乃至于計(jì)算機(jī)視覺在近幾年的社區(qū)中不斷被更多的人關(guān)注。近期的工作,例如 Faster AutoAugment,便是基于 Kornia 的可微性而來的針對(duì)自動(dòng)數(shù)據(jù)增廣策略的優(yōu)化方法。開發(fā)團(tuán)隊(duì)表示,他們也希望自己的工作可以更多地應(yīng)用于各種有潛力的項(xiàng)目。未來,他們將會(huì)加入更多的數(shù)據(jù)增廣操作、梯度估計(jì)方法,以及增加對(duì) JIT 的支持。