高速VIO特徵 | TX2跑1000FPS!比FAST更快!基於GPU前端加速的增強型特徵檢測器

本文提出一種選擇局部最大響應方法,並提出一種增強的FAST特徵檢測器,在Jetson TX2上特徵檢測和跟蹤速度高達 1000 FPS!代碼剛剛開源
作者團隊:蘇黎世大學& ETH Zurich

https://github.com/uzh-rpg/vilib

1 引言

 

 

本文提出一種選擇局部最大響應方法,並提出一種增強的FAST特徵檢測器,在Jetson TX2上特徵檢測和跟蹤速度高達 1000 FPS!代碼剛剛開源!VIO pipeline的大多數步驟都在視覺特徵上起作用,它們依賴於圖像數據進行檢測和跟蹤這兩個步驟都非常適合並行化。特別是非最大值抑制和隨後的特徵選擇是整個圖像處理延遲的主要來源。

本文貢獻

  • 首先回顧了專門針對GPU進行特徵檢測的非極大值抑制問題,並提出了一種選擇局部最大響應,施加空間特徵分佈並同時提取特徵的解決方案

 

  • 第二個貢獻是引入了一種增強的FAST特徵檢測器,該檢測器應用了上述非極大值抑制方法

  • 最後,與其他最新的CPU和GPU實現進行了比較,在特徵跟蹤和檢測方面始終優於所有其他實現,從而在嵌入式Jetson TX2平臺上實現了超過1000 FPS。此外,我們展示了我們的工作已集成到VIO管道中,以約200fps的速度實現了姿態評估

 

2 問題

  • 延遲

儘管視覺慣性里程錶(VIO)成本低,通用性強,並且成熟度和健壯性提高,但它在計算上仍然很昂貴,並有顯着的延遲。該等待時間影響例如引入暈動病的VR/AR應用程序,或成爲通過其控制機器人系統性能的限制。

  • 計算能力

可用的傳感器功能(視覺和慣性器件)與移動系統的實際信息處理功能之間存在脫節。現成的相機能夠捕獲100fps以上的圖像,但許多算法和實現方式都無法以這種速率處理視覺信息。

目前流行的異構體系結構有三種:

  • 第一種使用帶有數字信號處理器(DSP)的中央處理器(CPU),因此限制了任務集;

  • 第二個結合了一個CPU和可編程序邏輯(e.g.FPGA),這是多才多藝但增加開發時間;

  • 第三種解決方案是一個CPU與GPU的結合,這不僅是合算的,還擅長圖像處理任務由於GPU爲高度並行的建造任務。

在此基礎上作者研究了第三種——結合CPU-GPU平臺的特徵檢測和跟蹤從GPU硬件的角度構建圖像處理,提出了在CPU和GPU之間可行的工作共享,以顯着降低總體處理時間

 

3 主要思路

 

 

3.1 並行化簡介

Compute Unified Device Architecture(簡稱CUDA),是NVIDIA專有的並行計算平臺和編程模型。

  • CUDA允許開發人員卸載中央處理單元,將任務傳給GPU,甚至用於非圖像相關計算。

  • NVIDIA GPU體系結構是圍繞可擴展的多線程流式多處理器(SM)陣列構建的。每個SM都有大量的流處理器(SP),又稱爲CUDA內核。

  • GPU通常每個SM具有1-20個流多處理器和128-256個流處理器。

  • 除了處理核心之外,還有各種類型的可用內存(按與處理核心的接近程度排序):寄存器文件,共享內存,各種高速緩存,片外設備和主機內存。


NVIDIA的GPGPU執行模型引入計算單元的層次結構:線程,線程束,線程塊和線程網格

  • 最小執行單位是線程。

  • 多個線程組成線程束:每個線程束包含32個線程。

  • 線程束進一步組成線程塊。

  • 最後是線程網格,線程網格是線程塊的數組。線程網格中的線程塊彼此獨立執行。

GPU上的指令執行需要強調:線程束中的每個線程都以鎖定步驟執行同一條指令, NVIDIA將此執行模型稱爲單指令多線程(SIMT)。在表I中,總結了可用於在GPU上的執行塊之間交換數據的最快內存。
 

 

3.2 特徵檢測器概述

GPU特別適合特徵檢測,每個計算單元都以並行方式訪問輸入元素(例如,像素)及其近鄰。因此,可以在可用的CUDA核心之間有效地劃分圖像,從而使存儲器訪問合併在一起,從而實現高效的並行化。

爲了進行特徵檢測:

(1) 對輸入圖像進行子採樣以獲取圖像金字塔。

(2) 對於每種圖像分辨率,通常在每個像素處評估兩個函數:粗角響應函數(CCRF)角響應函數(CRF)

注:CCRF是一種快速評估,可以迅速排除大多數候選者,因此速度較慢的CRF功能僅接收通過首次驗證的候選者。一旦在ROI內評估了每個像素,便會應用非最大值抑制來僅選擇局部最大值。

算法1總結了特徵檢測器算法的一般執行方案。圖像幀上均勻的特徵分佈能夠提高VIO流程的穩定性。

爲了滿足這一要求,引入了二維網格單元的概念

  • 將圖像劃分爲具有固定寬度和高度的矩形

  • 在每個單元中,只有一個特徵被選中-該特徵的CRF得分在該單元中最高

這種方法不僅將特徵均勻地分佈在圖像上,而且還對提取的特徵計數施加了上限

 

3.3 CUDA的非極大值抑制

單元內的特徵選擇可以理解爲歸約操作,其中僅選擇具有最大分數的特徵。此外,鄰域內的非最大值抑制也可以視爲一種歸約操作,可以減少對有限鄰域內的單個像素位置的角點響應。

作者將角點響應圖分爲規則的單元格網格。爲了簡化說明,在32x32單元中使用了1:1的warp-to-cell映射。

  • wrap讀取單元格的第一行時,wrap內的每個線程都獲得了一個像素響應。

  • 整個wrap開始鄰域抑制:每個線程都驗證其響應是否在其摩爾鄰域內達到最大值。鄰域驗證完成後,一些線程可能會抑制其響應。

  • wrap繼續到下一行,並重復之前的操作。線程將在所有單元格中繼續執行此操作,直到處理完整個單元格爲止。

爲了加快還原速度,多個warp處理一個單元,因此,在warp級別減少之後,共享內存中的最大值將減少。一旦線程塊中的所有warp將其最大結果(分數,x-y位置)寫入其指定的共享內存區域,則該塊中的第一個線程將爲每個單元選擇最大值並將其寫入全局內存,從而完成該單元的處理。
 

3.4 FAST特徵檢測器

FAST角點檢測方法比較基礎,這裏不再贅述,可以歸結爲下式:

 

  • FAST中避免計算散度

如果每個線程在NVIDIA單指令多線程(SIMT)執行模型中執行(1)的比較,則if/else指令中的比較將執行不同的代碼塊。由於所有線程都在wrap中執行同一條指令,因此某些線程在if分支期間處於非活動狀態,而其他線程在else分支期間處於非活動狀態。這稱爲代碼發散,會顯著降低並行化的吞吐量

 

作者的方法是將16個比較的結果存儲爲一個位數組,用作查找表的索引。預先計算了所有可能的16位向量。由於所有2^16個向量的結果都是二進制的,因此結果可以存儲在2^16位(即8KB)中。可以使用4字節整數存儲這些結果,每個整數存儲32個組合。該表的緩存命中率高於以前的方法,改善了延遲問題

 

3.5 Lucas-Kanade特徵跟蹤器

作者的方法是將金字塔逆合成Lucas-Kanade算法部署爲特徵跟蹤器。逆合成算法是一種擴展,通過允許預先計算海森矩陣並在每次迭代中重用它,改進了每次迭代的計算複雜度。同時逆合成的Lucas-Kanade增加了仿射光照變化的估計。

該算法能夠將多個金字塔級別上每個要素周圍的矩形鄰域中的光度學誤差最小化。但是,

(1) 如果warp中的線程處理了不同的功能,則內存訪問將無法處理,

(2) 如果某些功能軌跡未收斂或同一級別的迭代次數不同,則warp中的某些線程將處於空閒狀態。

爲了解決這兩個問題,啓動了整個warp來處理一個特徵。另外還選擇了可以通過warp協同處理的矩形補丁尺寸:在高分辨率16x16上,和低分辨率8x8像素上。

該方法的新穎之處在於線程到功能的分配。以前提出的方法使用的是一對一分配,這意味着只有較大的特徵數才能使用大量線程。這會對功能計數較小的GPU上的延遲隱藏產生不利影響,這通常適用於VIO。作者的方法通過使wrap協同解決特徵補丁來加快算法的速度,減少了每個線程的工作量,同時使用了最快的通信介質

 

4 實驗及結果

  • 硬件

 

  • 非極大抑制

 

  • 特徵檢測器

     

 

  • 特徵跟蹤

 

  • 視覺里程計 VIO

在嵌入式Jetson TX2平臺的多個數據集上實現∼200fps。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章