王玲玉 董文博
(1.中國科學(xué)院大學(xué) 北京 100049)(2.中國科學(xué)院空間應(yīng)用工程與技術(shù)中心 北京 100094)(3.中國科學(xué)院太空應(yīng)用重點(diǎn)實(shí)驗(yàn)室 北京 100094)
為了解決視覺定位系統(tǒng)實(shí)時性差的困境,GPU(Graphic Processing Unit)逐漸被引入到科學(xué)家們的研究范圍內(nèi)。在GPU發(fā)展初期,由于編程困難的緣故很難被推廣應(yīng)用。直到21世紀(jì)初,NVIDIA公司研發(fā)了一種通用的并行計算結(jié)構(gòu)CUDA(Compute Unified Device Architecture),它大大地降低了編程的困難,加速了GPU的發(fā)展,同時也更加適合解決復(fù)雜的計算類問題。
Malik M[1]等發(fā)現(xiàn)對于計算密集型視覺應(yīng)用[2~3],CPU和GPU之間的差距隨著圖像尺寸的增加而降低;對于非密集型應(yīng)用,由于圖像尺寸的增加,在平臺之間觀察到比較明顯的性能和能效差距。在energy-efficiency(EDP)的情況下,GPU對于大于500×500的圖像尺寸而言是最有效的平臺。
Richard Vuduc[4]等認(rèn)為雖然理想化的 GPU 可以提供更好的性能,但是我們發(fā)現(xiàn)至少對于同等CPU的調(diào)整以及對實(shí)際工作負(fù)載和調(diào)用環(huán)境的考慮,我們可以用兩種現(xiàn)代化的四核CPU插槽在性能上大致匹配一個或兩個GPU。事實(shí)上,將矩陣轉(zhuǎn)移到GPU并結(jié)合GPU特定數(shù)據(jù)重組將會產(chǎn)生額外成本。也就是說,GPU的最佳實(shí)現(xiàn)方式不同于CPU的最佳或基準(zhǔn)實(shí)施方式。實(shí)際上,由于合并訪問的性能要求,這種數(shù)據(jù)結(jié)構(gòu)調(diào)整在GPU上更為重要;沒有它,GPU不會超過CPU[5]。
一些研究工作已經(jīng)報告了在CPU上并行執(zhí)行計算機(jī)視覺算法的性能結(jié)果,并將其與加速器實(shí)現(xiàn)進(jìn)行了比較[6~8]。Cope[9]等對圖像卷積在 GPU,F(xiàn)PGA和CPU上的實(shí)現(xiàn)性能進(jìn)行了比較。Russo[10]等比較了GPU和FPGA上的圖像卷積處理。
此外,Asano S 等[11~12]使用圖像處理中二維濾波器,立體視覺和k-均值聚類這三個簡單問題比較了GPU與CPU(四核)的性能,GPU可以顯示其潛力,其中所有像素都可以獨(dú)立處理。對于使用共享陣列的更復(fù)雜的算法,GPU由于其非常小的本地內(nèi)存而無法執(zhí)行這些算法,或者由于其內(nèi)存架構(gòu)導(dǎo)致的內(nèi)存訪問限制,無法顯示出良好的性能。在這些算法中,GPU比CPU要慢得多(如果我們找到可以克服局限性的算法,但是我們找不到它們,可能會實(shí)現(xiàn)更好的性能)。
本文的目的是針對GPU在一個實(shí)際的視覺系統(tǒng)中的應(yīng)用,探究GPU是否能夠取得更快的速度,以及能比CPU取得怎樣的提高。
我們設(shè)計了一個視覺定位系統(tǒng),用于復(fù)雜場景下的目標(biāo)識別和位姿檢測,并為實(shí)時控制系統(tǒng)服務(wù)。系統(tǒng)的軟件主要包括圖像采集、圖像匹配和位姿解算3個部分。圖像采集是由攝像機(jī)拍攝圖片完成;圖像識別和匹配是為了得到目標(biāo)在圖像坐標(biāo)系下的坐標(biāo);位姿解算是通過目標(biāo)的圖像坐標(biāo)和先驗(yàn)知識,得到目標(biāo)與攝像機(jī)之間的相對位姿信息,實(shí)現(xiàn)對目標(biāo)的視覺定位。
其中,圖像匹配算法分為兩個部分。1)粗匹配(目標(biāo)識別):利用CNN訓(xùn)練好的model判斷場景中是否有目標(biāo)存在,沒有目標(biāo)存在時直接處理下一幀圖像。相對于沒有進(jìn)行判斷場景中是否有識別目標(biāo)存在的情況,我們系統(tǒng)整體的定位速度有所提升,加快了系統(tǒng)的工作效率。2)精匹配:有目標(biāo)存在時,進(jìn)行目標(biāo)和圖像之間的特征匹配,得到目標(biāo)在圖像坐標(biāo)系下的精確位置。
基于系統(tǒng)在CPU下運(yùn)行速度太慢,很難保證整個控制系統(tǒng)的實(shí)時性,我們將整個系統(tǒng)的算法移植到GPU的Linux平臺上。NVIDIA的Jetson TX2有6個CPU核心,4個Cortex-A57、2個自研的Denver(丹佛)核心,GPU則是Pascal架構(gòu),256個CUDA核心,搭配8GB 128bit LPDDR4內(nèi)存。
通過命令我們可以查看當(dāng)前CPU的工作模式,并將其模式設(shè)置為6個CPU全部工作的狀態(tài)。并且,我們需要決策整個系統(tǒng)的算法內(nèi)容,哪些函數(shù)需要用GPU進(jìn)行優(yōu)化,哪些函數(shù)在CPU上運(yùn)行計算。
文中會涉及到CPU和GPU性能的比較,此處的比較主要是針對使用Jetson TX2上自帶的CPU和使用GPU加速系統(tǒng)的粗定位和精定位而言。
在特征匹配中常用的算法有 ORB[13](Oriented FAST and Robust BRIEF)算法,SIFT算法和SURF算法三種。ORB算法分為特征點(diǎn)提取和特征點(diǎn)描述兩部分。在ORB算法中,使用FAST[14]特征點(diǎn)檢測算法來進(jìn)行特征點(diǎn)提取,利用BRIEF[15]特征描述子算法來進(jìn)行特征點(diǎn)描述,并將兩者結(jié)合起來,在兩者原有的基礎(chǔ)上做了改進(jìn)與優(yōu)化的算法??紤]到ORB算法尋找特征點(diǎn)及計算描述子的速度較快,我們利用GPU加速提取圖片的ORB特征,為精匹配做準(zhǔn)備。
我們的整個系統(tǒng)的工作流程為:1)攝像頭采集圖像,調(diào)用訓(xùn)練好的模型來判斷場景有無目標(biāo)存在。當(dāng)系統(tǒng)判斷場景中有目標(biāo)存在時,進(jìn)行精定位。否則,直接處理下一幀圖像。2)將CPU上的圖片數(shù)據(jù)下載到GPU上,調(diào)用GPU加速模塊進(jìn)行特征點(diǎn)檢測和特征提取工作。我們利用ORB算法提取目標(biāo)的關(guān)鍵點(diǎn)和特征描述子,采用特征向量之間的歐式距離判斷圖像中特征點(diǎn)的相似性,將滿足最小距離的兩個特征點(diǎn)匹配起來。采用KNN[16](K-Nearest-Neighbor)匹配算法對特征向量進(jìn)行匹配,再判斷圖像間的特征點(diǎn)匹配是否是一一映射,對于不是的點(diǎn)剔除掉。3)利用 RANSAC[17](Random Sample Consensus)算法對匹配正確的特征點(diǎn)進(jìn)行數(shù)據(jù)擬合,求解單應(yīng)性矩陣,建立特征點(diǎn)的對應(yīng)關(guān)系,進(jìn)行位姿解算。系統(tǒng)的軟件流程圖如圖1所示。劃線標(biāo)注的部分使用GPU進(jìn)行加速的模塊,其中利用CNN訓(xùn)練好的模型是離線進(jìn)行的,在系統(tǒng)運(yùn)行時可以直接使用。
理論上的GPU可以加速的部分分析如下:
1)圖像模型訓(xùn)練階段,利用caffe框架離線訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)時,由于GPU可以多核并行運(yùn)算,大大加快了模型訓(xùn)練的時間。我們的GPU有6個CPU核心,理論上訓(xùn)練速度可以加快幾十倍。

圖1 系統(tǒng)軟件流程圖
2)圖像傳輸:當(dāng)攝像頭采集到圖片時,我們需要進(jìn)行圖像數(shù)據(jù)的傳輸,此時CPU和GPU的速度幾乎是一樣的。
3)圖像識別:接著,我們利用GPU調(diào)用caffe的分類模型來判斷場景中是否有目標(biāo)出現(xiàn)。神經(jīng)網(wǎng)絡(luò)可以采用并行計算,理論上能夠加速5~10倍。
我們采用OpenCV中的cudafeatures2d等里面存在的CUDA加速庫,調(diào)用函數(shù)例如cv::cuda::ORB和cv::cuda::DescriptorMatcher等來完成系統(tǒng)的加速工作。
雖然使用GPU可以調(diào)用一些加速函數(shù),但是由于CPU和GPU之間數(shù)據(jù)傳輸時間消耗的問題,在有些情況下總消耗時間GPU甚至?xí)菴PU還要慢。
考慮到GPU適用于圖形運(yùn)算,而CPU是設(shè)計用來處理通用任務(wù)的處理、加工、運(yùn)算以及系統(tǒng)核心控制等工作,所以我們將CPU和GPU結(jié)合起來進(jìn)行使用,以達(dá)到最佳效果。
系統(tǒng)的前端是判斷場景中是否有目標(biāo)存在,此時我們需要調(diào)用卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練好的模型進(jìn)行判斷。通過調(diào)用深度學(xué)習(xí)框架自帶的分類模塊來完成,在代碼中,我們選擇GPU加速來完成。
我們?nèi)∠到y(tǒng)在CPU和GPU下連續(xù)20幀的粗定位時間,如圖2所示。

圖2 CPU和GPU下的粗定位時間對比
對比使用CPU和使用GPU,經(jīng)統(tǒng)計連續(xù)20幀系統(tǒng)處理的時間,我們?nèi)【担l(fā)現(xiàn)當(dāng)圖像像素為480×360時,粗定位過程中CPU平均耗時是GPU的8.7546倍;當(dāng)圖像像素為640×480時,粗定位過程中CPU平均耗時是GPU的10.6272倍。
我們?nèi)∠到y(tǒng)在CPU和GPU下連續(xù)20幀的精定位時間,如圖3所示。

圖3 CPU和GPU下的精定位時間對比
對比使用CPU和使用GPU,經(jīng)統(tǒng)計連續(xù)20幀系統(tǒng)處理的時間,我們?nèi)【担l(fā)現(xiàn)當(dāng)圖像像素為480×360時,精定位過程中CPU平均耗時是GPU的1.0021倍;當(dāng)圖像像素為640×480時,精定位過程中CPU平均耗時是GPU的1.0466倍。
由此,我們可以看出,在精定位過程中,GPU和CPU所用時間相差并不是很大。并且隨著圖像像素的增大,這種差距會不斷縮小。即圖像像素越大,GPU加速效果越好。
在進(jìn)行CPU和GPU對比之前,我們定義加速比來衡量GPU的優(yōu)化性能。加速比=CPU運(yùn)行時間/GPU運(yùn)行時間,此處我們涉及到的CPU運(yùn)行時間和GPU運(yùn)行時間是各種開銷和數(shù)據(jù)傳輸?shù)目倳r間。表1是當(dāng)圖像像素為640×480時,視覺系統(tǒng)各個模塊消耗的統(tǒng)計時間。

表1 系統(tǒng)處理一幀大小為640×480圖像的時間
此外,我們還比較了當(dāng)圖像大小為640×480和480×360時,系統(tǒng)在CPU和GPU環(huán)境下的運(yùn)行時間,并做了表2的對比分析。

表2 系統(tǒng)處理一幀圖像時CPU和GPU執(zhí)行時間對比
根據(jù)實(shí)驗(yàn)結(jié)果可以看出,整個系統(tǒng)在粗定位模塊的加速效果較為明顯,在位姿解算模塊使用GPU反而比使用CPU還要慢。所以我們聯(lián)想將CPU和GPU結(jié)合起來,粗匹配和精匹配用GPU來實(shí)現(xiàn),定位模塊用CPU實(shí)現(xiàn),從而將系統(tǒng)用CPU和GPU相結(jié)合來實(shí)現(xiàn)。
通過表格,我們發(fā)現(xiàn),使用CPU和GPU相結(jié)合時,視覺定位系統(tǒng)可以從1幀/s達(dá)到7幀/s左右,遠(yuǎn)遠(yuǎn)快于單獨(dú)使用CPU或者單獨(dú)使用GPU的情況。尤其在采用深度卷積網(wǎng)絡(luò)時的粗定位環(huán)節(jié)(最占用時間的環(huán)節(jié))。
為了研究圖像像素大小對于GPU加速的影響,我們?nèi)∠袼胤謩e為 320×240,400×300,480×360,560×420,640×480,比較不同像素作用下,GPU對CPU在粗匹配模塊的加速比。以圖像像素不斷增加為X軸,加速比為Y軸,如圖4所示。

圖4 不同像素的GPU對CPU的加速比
通過圖像我們發(fā)現(xiàn),當(dāng)圖像像素越大,GPU的加速效果體現(xiàn)越好。但這個分析僅限于我們設(shè)計的系統(tǒng)中粗定位模塊。
最后,我們認(rèn)為GPU并不是一定可以對任意系統(tǒng)加速,并且它的功耗是比較大的。
據(jù)我們所知,CPU適合處理擁有復(fù)雜的指令、邏輯判斷、循環(huán)、分支等的程序,而GPU更加適合高度的并行性、巨大的數(shù)據(jù)量、數(shù)據(jù)耦合度低、高的計算密度以及與CPU盡量少的數(shù)據(jù)傳輸?shù)忍攸c(diǎn)。在幾組對比分析中,我們也發(fā)現(xiàn)了這個規(guī)律。當(dāng)圖像像素為480×360時,我們在粗定位系統(tǒng)中采用GPU加速,相對于CPU而言,平均耗時加速到8.7546倍。并且,隨著圖像像素的增加,GPU的加速效果會愈來愈好。同時,我們發(fā)現(xiàn)GPU在圖像處理方面比CPU效果好很多,而處理數(shù)據(jù)相關(guān)性不大的計算類問題時,CPU表現(xiàn)更加突出。
總之,我們應(yīng)該針對具體應(yīng)用選擇合適的GPU加速方案。下一步的計劃是根據(jù)系統(tǒng)中算法已有的并行性把算法改變成并行算法,使之更適用于GPU編程模型的并行算法。