陳財富, 汪 雙, 陳 波, 張 華, 王 姮
(1.西南科技大學 信息工程學院,四川 綿陽 621000; 2.西南科技大學 特殊環(huán)境機器人四川省重點實驗室,四川 綿陽 621010)
港科大開源的VINS-Mono[1]是視覺慣性里程計(visual inertial odometer,VIO)[2]系統(tǒng),它的前端主要包括均值化預處理[3]限制對比度的自適應性直方圖均衡化(CLAHE)、Shi-Tomasi角點特征提取和光流跟蹤[4]。雖然VIO系統(tǒng)前端適用性強以及魯棒性高,但它計算成本較高且計算耗時不穩(wěn)定,在要求十分苛刻的虛擬現實(VR)/增強現實(AR)和無人機機器人平臺上實時運行困難。針對上述系統(tǒng)實時性的問題,考慮尺寸重量大小滿足應用要求,本文選用較小的尺寸和重量中央處理器(CPU)-圖像處理器(GPU)組合的NVIDIA TX2處理器,TX2不僅在成本上有一定的經濟>效益,而且在GPU加速處理非常出色[5,6]。同時本文改進VINS-Mono前端,提出了一種基于GPU并行加速VIO方法,采用FAST特征提取和特征點光流跟蹤進行并行加速,以獲得更高實時且耗時穩(wěn)定的VIO前端;并且對文獻[7]特征提取查表方式進行了改進,占用更少的內存空間。本文方法還在特征提取之前通過GPU對CLAHE加速,在特征提取后采用非極大值抑制[8],消除周圍非極大值元素,使特征點分布相對均勻。最后,采用多層金字塔平均強度反向光流法進行角點跟蹤,求解特征點匹配。實驗部分,本文將改善后的前端系統(tǒng)與VINS-Mono后端結合,選用EuROC數據集[9],在嵌入式CPU-GPU異構平臺TX2上進行了全方面的評估。
本文提出的GPU并行加速VIO前端方法包括圖像灰度化、CLAHE、FAST特征點提取并進行非極大值抑制、FAST特征點光流跟蹤以及特征點跟蹤誤差剔除,再結合VINS-Mono中IMU處理部分和后端部分構成一個完整的即時定位與地圖構建(simultaneous localization and mapping,SLAM)系統(tǒng)。整個系統(tǒng)框圖如圖1所示。其中,自適應直方圖均值化、特征點提取、特征點跟蹤都通過GPU進行并行加速運算,其他都將在CPU下進行處理。
圖1 總體系統(tǒng)框圖
英偉達(NVIDIA)公司的GPU架構是由可擴展的多線程多處理陣列構建[10]。每一個多處理陣列又被劃分為若干個流處理器,每一個流處理器又包含若干個處理器。為了更容易進行GPU并行處理開發(fā),采用NVIDIA公司提供的CUDA并行計算框架,它包含重要的指令集架構、層次化線性模型以及并行的計算引擎。CUDA編程模型包含以下層次結構:線程、線程塊、塊網格以及線程Kernel。一個并行計算有多個Kernel,一個Kernel處理一個塊網格,一個塊網格由若干個線程塊組成,一個線程塊又由若干個線程構成,線程與線程之間并行運行[11]。整個系統(tǒng)的運行采用CPU與GPU串并結合協(xié)同工作、各司其職的工作方式,如圖2所示。
圖2 CPU-GPU異構模型
CLAHE的核心思想是先對圖像均勻分成等份矩形,再對每部分矩形區(qū)域求解累計分布直方圖并進行對比度限幅,最后求解每個區(qū)域塊的變換函數對每一個像素點進行像素值轉換,對于相鄰區(qū)域的像素值需進行插值操作,以消除塊狀效應。并行化設計具體過程如下:
1)圖像分塊:將圖像劃分成等大小的矩形區(qū)域塊,本文劃分為8×8的區(qū)域塊。
2)計算每一個區(qū)域塊的分布直方圖
(1)
3)對每一個區(qū)域塊分布直方圖進行對比度限幅,并調整像素點
(2)
4)計算第i,j區(qū)域塊下直方圖累計變換函數
(3)
式中Wij,Hij為第i,j區(qū)域塊的寬度和長度。
5)根據整個圖像每一個像素點在不同區(qū)域的分布情況,執(zhí)行不同的像素點映射(直接映射,線性插值映射,雙線性插值映射),本文直接采用插值的方式,有效防止if else指令的發(fā)散,計算如下:
a.確定某個像素點(m,n)相鄰的4個映射函數si0j0,si0j1,si1j0,si1j1,如果在邊界不滿足映射函數則按照取最近的映射函數操作
(4)
b.確定不同映射函數的占比
(5)
c.對像素點進行映射
si1j0(Imn)×(1-α)×β+si1j1(Imn)×(1-α)×(1-β)
(6)
6)GPU加速設計:GPU加速過程采用兩個核Kernel進行,第一個Kernel_1處理上述過程(1)~(4),分為64個線程分別求解每一個區(qū)域塊的映射函數;第二個Kernel_2處理上述過程(5),分別對圖像中每一個像素點進行映射插值操作,最后得到映射后的圖像。
FAST算法是一種檢測局部像素灰度變化明顯的特征檢測方法。本文在CPU-GPU異構平臺上采用GPU并行設計實現FAST角點快速檢測,最后再通過GPU對檢出的角點進行非極大值抑制加速處理。FAST特征檢測核心思想是一個像素與領域像素的光度強度差別較多或較大時,該像素點即為FAST角點。
本文特征檢測并行化設計過程如下:
1)對圖像遍歷取像素點(不包括邊界為3的像素點),設第i行第j列的像素點灰度值為Iij。
3)設置閾值T,并將像素點與其周圍16個像素點進行比較,區(qū)分出更亮、更暗或者相似的像素點,并進行標記
(7)
4)對上述計算出的16個像素點得出的標簽進行分類,如果有連續(xù)的N個像素點的Ln=darker或者Ln=brighter,則像素點為Iij特征點。對于上述判斷連續(xù)N個點是更亮或者更暗的點,在CUDA編程處理的過程中if else指令將會頻繁調用,并且不同線程之間if else活動范圍不一致,會降低GPU并行處理吞吐量,效率會下降。文獻[7]先通過計算16個像素點更亮和更暗值,再通過01二進制的方式保存,第0個像素點對應低位,第1個像素點對應位加一,依此類推,將更亮和更暗的數據分別保存在216位并作為地址,最后,通過預先設計8 K字節(jié)查詢表,直接查詢是否是角點。而本文則是設計一個快速查詢角點的函數,節(jié)約空間,并且這個函數具有少量運算指令、少量參數和無if else指令,通過輸入更亮和更暗的地址直接快速計算出是否為角點。計算更亮和更暗查詢地址(addr_brighter和addr_darker)
(8)
快速角點查詢函數設計
(9)
式中 Ξ&為連續(xù)求與符號,CN為連續(xù)N個角點查詢數據庫,共16個字節(jié)數據大小。如果F(Addr)=1,則為非角點;反之,F(Addr)=0,則為角點。最后,對每個像素點計算出角點得分,非角點為0,角點則根據像素差進行計算。
5)進行非極大值抑制,對圖像柵格化劃分為32×32等分進行非極大值抑制篩選。
6)GPU加速設計:特征檢測過程GPU設計上需要分為兩個Kernel。第一個Kernel處理上述過程(1)~(4) ,通過快速角點提取函數對角點判斷,并執(zhí)行計算得分角點響應得分,整個過程分為128個線程并行運行,每一個線程平均處理圖像像素點。第二個Kernel處理上述過程(5)非線性抑制過程,先對圖片劃分32×32的單元格區(qū)域,線程分為32個,每一個線程處理一行單元格像素點,線程中并行執(zhí)行像素點抑制,并在全局共享內存中保存在該單元格中響應得分最大值。
本文采用多層金字塔平均強度反向光流法作為特征跟蹤。多層光流有效克服局部最小值,同時平均強度能有效提高跟蹤效果,而反向光流則可以節(jié)省計算時間。本文光流跟蹤并行化設計過程如下:
1)設置金子塔層數,并設定跟蹤規(guī)則:在計算光流時,先從頂層的圖像跟蹤計算,再把跟蹤結果作為下一層光流跟蹤的初始值,直到最底層。
2)建立光流跟蹤:光流跟蹤其實是解決以下最小二乘問題
(10)
(11)
式中I1(x),I2(x)分別為上幀圖片和當前幀圖片某像素的光度強度。1,2分別為上一幀圖片和當前幀圖片某像素在指定范圍內像素點的平均光度強度
(12)
求解最小二乘問題,得雅可比
(13)
求解像素位移增量
(14)
其中,H為海森矩陣
(15)
最后,更新位移量。
3)GPU加速設計:在這一過程中GPU并行加速運行存在兩個主要的問題:內存合并和運行發(fā)散。為了解決這些問題,本文采用一個FAST角點跟蹤占用一個線程,并設定迭代相同的迭代次數克服運行發(fā)散。整個并行過程只采用一個Kernel,并創(chuàng)建128的線程同時處理這些FAST角點,處理完成后將結果合并在一個內存塊中,最后交給CPU處理。
本文實驗硬件平臺為NVIDIA嵌入式處理器TX2。TX2的GPU采用NVIDIA Pascal架構,配有256個計算核心,算力高到6.2,它的CPU采用雙核Denver2 64位和4核ARM A57,內存為8 GB 128位LPDDR4,TX2較小的尺寸和重量非常適用于無人機等輕負載機器人。本文實驗分為兩部分:1)系統(tǒng)耗時對比;2)系統(tǒng)精度對比。本文評估的數據選用數據集EuROC Machine Hall(MH)序列集,該數據序列集包括2 273幀圖片。
圖3進行4組耗時統(tǒng)計實驗,選用MH—05數據集測試。圖3(a)~(c)分別表示CLAHE,FAST和光流跟蹤耗時對比曲線,每一個曲線分別進行OpenCV-CPU,OpenCV-GPU和本文GPU耗時對比實驗;圖(d)為本文前端與VINS-Mono前端耗時對比曲線。分析圖(a)~(c)可知,本文Clahe-GPU耗時與OpenCV-GPU耗時基本一致但更平穩(wěn),同時比CPU耗時更低;而本文FAST和光流跟蹤耗時明顯低于OpenCV-GPU和CPU;兩者都具有較高的運算速度。分析曲線圖(d)可知,VINS-Mono前端平均耗時為0.017 65 s,而本文前端平均耗時為0.005 62 s,具有更快的計算速度;曲線中VINS-Mono前端多幀耗時明顯大于0.035 s,而本文前端耗時比較平穩(wěn)。
本文以EuROC中MH_01,MH_02,MH_03,MH_04和MH_05作為實驗數據集,采用均方根誤差來評估本文前端結合VINS-Mono后端的里程計軌跡精度,并與VINS-Mono系統(tǒng)進行對比。誤差計算采用EVO評估工具[12],計算結果如表1所示。
表1 軌跡均方根誤差 m
根據表1所示,在MH—04和MH—05運動比較劇烈的數據集下本文精度略高于VINS-Mono,在其他數據集本文精度與VINS-Mono相近,平均均方根相差0.008 963 m。本文保持了較好的定位精度,與VINS-Mono相差很小。
本文設計了一種基于GPU并行加速視覺里程計前端方法,對系統(tǒng)中CLAHE、FAST角點提取和光流跟蹤進行GPU并行化設計。實驗結果表明:本文系統(tǒng)在不降低整體定位精度的情況下,明顯提高算法的實時性效率,能保證定位導航的實時性要求。雖然實現性能得到了提升,但精度卻保持了原來的精度。下一步工作將在本文的基礎上對VIO前端算法改進,提高系統(tǒng)的精度,最后在實際情況下進行定位測試。