男人天堂日韩,中文字幕18页,天天伊人网,成人性生交大片免费视频

基于OpenCL的尺度不變特征變換算法的并行設計與論文

時間:2021-04-21 11:25:56 論文 我要投稿

基于OpenCL的尺度不變特征變換算法的并行設計與論文

  針對尺度不變特征變換(SIFT)算法實時性差的問題,提出了利用開放式計算語言(OpenCL)并行優(yōu)化的SIFT算法。首先,通過對原算法各步驟進行組合拆分、重構特征點在內(nèi)存中的數(shù)據(jù)索引等方式對原算法進行并行化重構,使得計算機網(wǎng)絡算法的中間計算結果能夠完全在顯存中完成交互;然后,采用復用全局內(nèi)存對象、共享局部內(nèi)存、優(yōu)化內(nèi)存讀取等策略對原算法各步驟進行并行設計,提高數(shù)據(jù)讀取效率,降低傳輸延時;最后,利用OpenCL語言在圖形處理單元(GPU)上實現(xiàn)了SIFT算法的細粒度并行加速,并在中央處理器(CPU)上完成了移植。與原SIFT算法配準效果相近時,并行化的算法在GPU和CPU平臺上特征提取速度分別提升了10.51~19.33和2.34~4.74倍。實驗結果表明,利用OpenCL并行加速的SIFT算法能夠有效提高圖像配準的實時性,并能克服統(tǒng)一計算設備架構(CUDA)因移植困難而不能充分利用異構系統(tǒng)中多種計算核心的缺點。

基于OpenCL的尺度不變特征變換算法的并行設計與論文

  0引言

  以尺度不變特征變換(Scale Invariant Feature Transform, SIFT)算法[1]為代表的基于特征的圖像匹配方法近幾年發(fā)展迅速,該算法對光照、角度或尺度變化的圖像都有較好的匹配精度和適應性,但實時性差。為了提高實時性,在此基礎上又衍生出了主成分分析(Principal Component Analysis, PCA)SIFT[2]、快速魯棒特征(Speed Up Robust Feature, SURF)檢測[3]等改進算法。這些改進的算法盡管在速度方面有所提升,但實時性仍然不能滿足實際應用要求且在抗尺度和抗旋轉方面性能都有不同程度的下降,因此仍無法取代經(jīng)典的SIFT算法[4]。

  近年來隨著圖形處理器(Graphics Processing Unit, GPU)計算能力的不斷提升,利用GPU天然硬件并行的特性來加速非圖形通用大規(guī)模運算逐漸受到人們的青睞,目前較為成熟并得到廣泛應用的GPU并行編程模型為英偉達(NVIDIA)公司開發(fā)的統(tǒng)一計算設備架構(Compute Unified Device Architecture, CUDA)模型。文獻[5-7]利用CUDA實現(xiàn)了SIFT算法關鍵步驟的GPU并行加速,取得了一定的加速效果。文獻[8-9]在移動GPU平臺上利用開放式計算語言(Open Computing Language, OpenCL)實現(xiàn)了SIFT算法的并行加速,相對于移動中央處理器(Central Processing Unit, CPU)取得了4.6~7.8倍的加速效果。另外,完成同樣的計算,GPU比CPU的功耗低87%,即利用OpenCL實現(xiàn)的GPU并行運算相對于傳統(tǒng)的CPU具有更高的性能功耗比,但以上方法大多采用步驟分離的優(yōu)化,沒能充分利用GPU全局內(nèi)存以及算法各步驟的中間計算結果,加速效果受顯存帶寬的制約。

  另外利用CUDA實現(xiàn)的算法只適用于NVIDIA顯卡,移植困難,而目前的計算機系統(tǒng)大多是“CPU+協(xié)處理器”的異構系統(tǒng)[10],這使得CUDA無法充分利用異構系統(tǒng)中不同類型的計算核心。具有跨平臺特性的開放式并行編程語言OpenCL的出現(xiàn)為解決此問題提供了契機,利用OpenCL設計的并行算法能夠在CPU+(GPU、數(shù)字信號處理器(Digital Signal Processor, DSP)、現(xiàn)場可編程門陣列(FieldProgrammable Gate Array, FPGA)等異構系統(tǒng)間移植[11-12],該特性使得經(jīng)OpenCL優(yōu)化的算法能夠擺脫對硬件平臺的依賴。自2010年OpenCL1.1發(fā)布以來,對OpenCL技術的應用研究逐漸興起。陳鋼等[13]對OpenCL內(nèi)存操作作了深入的分析;Yan等[14]利用OpenCL實現(xiàn)了SURF算法的并行加速。OpenCL編程相比CUDA更為復雜[15],在軟件開發(fā)方面也面臨更多的挑戰(zhàn)和困難,目前在PC平臺上還沒有利用OpenCL并行優(yōu)化的SIFT算法出現(xiàn)。

  針對以上問題,本文對SIFT算法步驟及數(shù)據(jù)索引方式進行重構,提高其并行度,然后通過優(yōu)化內(nèi)存讀取、合理利用OpenCL內(nèi)存層次等策略對該算法進一步優(yōu)化,在NVIDIA GPU平臺上實現(xiàn)了SIFT特征的快速提取。為研究OpenCL的可移植性,將優(yōu)化的GPU版本移植到Intel雙核CPU平臺上,實驗表明優(yōu)化后的算法在兩種計算平臺上的實時性都有一定提升。

  1SIFT特征提取算法流程

  SIFT算法最早由Lowe[1]在1999年提出并于2004年完善,由于其良好的匹配特性,目前已得到廣泛研究與應用。SIFT特征點提取實質是在不同尺度空間上查找關鍵點(特征點),算法基本步驟如下。

  1)尺度空間構建。

  2)高斯差分金字塔空間構建。

  3)DOG空間極值點檢測。

  DOG空間極值點檢測就是將DOG圖像中每個像素與它同尺度的8鄰域點及上下相鄰尺度對應的9×2個鄰域點進行比較,若為極值點則作為候選特征點,記錄其位置和對應的尺度。為獲得更精確的特征點位置,在候選特征點處進行泰勒展開,得到式(4):

  D(x)=D+DTxx+12xT2Dx2x(4)

  其中:關鍵點偏移量為x此處的偏移量x,與后面的x的命名重復,不太規(guī)范,因一篇論文中,一個變量僅能代表一個含義,若包括兩個含義,則指代不清晰,是否可以用另一個變量對此進行說明?

  回復:這兩個變量x是使用字體來區(qū)分的,一個是粗斜體表示向量,一個是細斜體,表示普通變量。是可以區(qū)分的。

  這個公式是經(jīng)典文獻[1]中此算法的原作者提出的公式,也是用這種方式表述的。為保持統(tǒng)一,所以我覺得可以不用修改。=(x,y,σ)T;(x,y,σ)在該極值點處的值為D;令D(x)x=0,可通過式(5)求得極值:

  =-2D-1x2Dx(5)

  在Lowe[1]的文章中當在任意方向上的偏移量大于0.5時,認為該點與其他關鍵點很相似,將其剔除;否則保留該點為候選特征點,并計算該點對應的尺度。

  4)特征點主方向計算。

  5)SIFT特征矢量生成。

  將特征點鄰域內(nèi)圖像坐標根據(jù)步驟4)計算出的特征點主方向進行旋轉,使得特征向量具有旋轉不變性,旋轉后以特征點為中心劃分成4×4個子區(qū)域,在每個子區(qū)域內(nèi)計算8方向的梯度方向直方圖,即可構成4×4×8共128維SIFT特征矢量。

  2SIFT算法的并行化重構

  OpenCL標準將內(nèi)核可用的內(nèi)存分為私有內(nèi)存、局部內(nèi)存和全局內(nèi)存/常量內(nèi)存等類型[16],所以在利用OpenCL優(yōu)化算法時,充分挖掘GPU內(nèi)存的存儲層次,合理分配工作組大小是提高并行運算效率的關鍵[17]。為提高算法并行度方便數(shù)據(jù)劃分、降低內(nèi)存帶寬要求,本文對SIFT算法作了以下重構。

  1)步驟合并。將構造尺度空間、創(chuàng)建高斯金字塔及極值點檢測三步驟統(tǒng)一設計,目的是充分利用OpenCL的global memory和local memory的訪問機制,使得這3個步驟的中間計算結果最大限度地在顯存中完成交互,減少內(nèi)存與顯存間的數(shù)據(jù)交換次數(shù),隱藏帶寬延時。

  2)步驟拆分。將極值點定位分為極值點坐標檢測和極值點精確定位兩步:第1步只返回極值點坐標,目的是輔助主機端完成內(nèi)存分配;第2步完成極值點精確定位。

  3)重構數(shù)據(jù)索引。本文全面摒棄基于隊列的特征點索引方式,而是采用線性存儲的方式管理特征點集,這對OpenCL內(nèi)核的工作項劃分、提高數(shù)據(jù)讀取效率以及降低內(nèi)存訪問沖突都非常有效。

  4)任務細粒度并行。經(jīng)過數(shù)據(jù)索引重構,在OpenCL的內(nèi)核運行時,可方便地部署大規(guī)模的工作組和工作項,實現(xiàn)計算任務的細粒度劃分。經(jīng)過以上設計后不僅能提高數(shù)據(jù)訪問速度,而且能夠避免潛在的內(nèi)存訪問沖突。

  3SIFT算法的OpenCL實現(xiàn)

  圖1為并行設計的SIFT特征提取流程。整個設計充分利用全局內(nèi)存以降低數(shù)據(jù)傳輸延時。主機端首先分配相應內(nèi)存對象,然后依次入列高斯模糊、DOG金字塔和極值點檢測3個OpenCL內(nèi)核,完成后即可生成尺度空間和DOG金字塔,從全局優(yōu)化考慮,將這兩部的結果駐留在全局內(nèi)存中,只返回經(jīng)壓縮的極值點坐標。接著按序運行極值點精確定位、特征點方向計算和特征向量生成3個步驟,計算完成后即完成特征提取全過程。整個流程僅有返回極值點坐標和返回特征點結果兩次讀回操作,其余的中間結果全部在顯存中完成交互,提高數(shù)據(jù)利用率,降低顯存帶寬要求。

  3.1高斯模糊+DOG+極值點檢測內(nèi)核設計

  深入發(fā)掘算法的并行潛力,充分利用OpenCL的內(nèi)存層次、合理配置工作項數(shù)量和工作組大小是性能提升的關鍵,也是內(nèi)核設計的難點。

  3.1.1高斯濾波內(nèi)核設計及工作項分配

  為降低計算量,將二維高斯變換分解為沿水平和垂直方向的一維變換,分解后可減少(N2-2×N)×W×H次乘法運算(N為高斯核大小,W、H為圖像的寬和高)。由于每個像素相互獨立,所以在NDRange函數(shù)入列高斯濾波內(nèi)核時將工作項大小設置為W×H-N,即每個工作項完成一個像素的卷積。另外,進行卷積時相鄰像素(圖2黑實線框內(nèi)數(shù)據(jù))要重復讀取圖2灰色部分的數(shù)據(jù),為提高讀取效率,本文通過配置工作組,實現(xiàn)原始數(shù)據(jù)在局部內(nèi)存中共享。圖2為水平高斯核寬度為7、工作組大小設置為8時的數(shù)據(jù)分配,圖2表示每8個工作組讀取14個數(shù)據(jù),完成8個點(圖2黑虛線框內(nèi)數(shù)據(jù))的卷積運算。

  在工作組內(nèi)共享局部內(nèi)存通常能提高計算性能,但并不絕對[18]。為找到工作組的最佳大小,本文測試了不同工作組大小時,寬度為11的高斯核對分辨率為1280×960的圖片進行水平卷積的耗時,測試結果如圖3所示。隨著工作組的增大,耗時逐漸減少,當工作組大于128后,耗時基本不再改變,又因為局部內(nèi)存的限制,工作組不宜太大,于是本文將工作組大小配置為128。如此設計需考慮同一工作組中工作項的同步化問題,本文采用OpenCL提供的barrier(CLK_LOCAL_MEM_FENCE)障礙函數(shù)來實現(xiàn),垂直濾波與此類似,不再贅述。

  3.1.2DOG金字塔構建

  此步驟的內(nèi)核有兩種設計方法:1)一次入列內(nèi)核,只將高斯金字塔相鄰兩層相減,得到一層DOG圖像;2)一次入列內(nèi)核,將高斯金字塔整組圖像傳入內(nèi)核,計算完成后即可得到一組DOG圖像。

  經(jīng)實驗發(fā)現(xiàn),第2種方法數(shù)據(jù)利用率高,耗時較短。又因為高斯金字塔每組層數(shù)固定,所以第2種設計的參數(shù)也固定,于是本文采用第2種設計方法,數(shù)據(jù)劃分如圖4所示。為進一步提高運算效率,對數(shù)據(jù)的運算都以float4型向量進行,共配置(W×H+3)/4個工作項,即每個工作項完成一組高斯金字塔對應位置(圖4單個虛線框內(nèi)數(shù)據(jù))的float4型向量相減。

  3.1.3極值點檢測及內(nèi)核精確定位

  入列極值點精確定位內(nèi)核前,主機端需預先分配內(nèi)存,而事先并不知道需要為多少個特征點分配內(nèi)存,所以本文將極值點檢測和精確定位作為兩個內(nèi)核先后入列,為減少數(shù)據(jù)傳輸,極值點檢測內(nèi)核只返回壓縮的極值點坐標數(shù)組。

  極值點檢測內(nèi)核計算完成后,根據(jù)返回的極值點坐標在CPU端統(tǒng)計極值點位置和個數(shù)N,然后為N個特征點分配內(nèi)存,如圖5所示(實際分配1.5×N個,Lowe[1]文中指出實際的特征點數(shù)會是極值點數(shù)N的1.15倍左右)。圖5中每個虛線框用來保存一個特征點的完整信息。最后入列極值點精確定位內(nèi)核,每個極值點配置一個工作項,計算出的精確坐標按工作項索引存入圖5對應的位置。

  3.2計算梯度方向直方圖

  至此,已經(jīng)得到每個特征點的坐標、尺度,并按線性存儲在圖5所示的全局內(nèi)存中。因為每個特征點在內(nèi)存中按線性排列,相互獨立,所以為每個特征點配置一個工作組來計算梯度方向直方圖,工作組分配如圖6(a)所示。將工作組內(nèi)工作項設置為2維,為確定工作組最佳大小,本文嘗試了{1,RAD}、{2,RAD}、{4,RAD}、{8,RAD}四種方式,經(jīng)測試{2,RAD}效果最好(其中RAD為特征點的鄰域寬度)。當RAD=5時,每個工作組分配10個工作項,工作組中的數(shù)據(jù)分配如圖6(b)所示,圖6(b)中標有相同數(shù)字的像素被同一工作項處理。為實現(xiàn)數(shù)據(jù)共享,在工作組local_memory中構建方向直方圖,這時必須使用OpenCL提供的atomic_add原子累加操作才能保證多個工作項同時累加直方圖同一位置時不會出錯。直方圖生成后統(tǒng)計出大于直方圖極值80%的點的個數(shù)和角度,作為獨立的候選特征點,將結果填入圖5中對應的位置。

  3.3特征向量生成

  計算出特征點主方向后,即可入列特征向量生成內(nèi)核,因數(shù)據(jù)重構后各特征點在內(nèi)存中線性存儲且可獨立計算,所以為每個特征點分配一個工作組。又因每個特征點鄰域被劃分為4×4個子區(qū)域,所以為每個工作組配置16個工作項分別計算每個子區(qū)域的8個方向,數(shù)據(jù)劃分如圖7。圖7中每個箭頭的長度表示每個方向的梯度累計值,箭頭越長代表值越大。所有工作組計算完畢后,整個SIFT特征提取算法執(zhí)行完畢,提取出的特征點全部存儲在圖5所示的線性內(nèi)存中。

  利用以上方法對兩幅圖片進行特征提取后,即可利用歐氏距離準則完成兩幅圖片特征點的粗匹配,然后用隨機抽樣一致(RANdom Sample Consensus, RANSAC)算法對粗匹配對進行提純,計算得到兩幅圖片之間的變換矩陣,完成兩幅圖片的匹配。

  4優(yōu)化后的算法在CPU上的移植

  為進一步驗證OpenCL的可移植性并比較OpenCL在不同平臺上的加速性能,本文將優(yōu)化后的OpenCL_GPU_SIFT算法移植為能在CPU上運行的OpenCL_CPU_SIFT版本。盡管OpenCL具有跨平臺特性,但由于硬件資源的差異,仍需注意以下兩點:

  1)本文采用的Intel core i5 3210m CPU不支持OpenCL 32位原子操作,所以在3.2節(jié)的內(nèi)核設計中無法使用atomic_add原子累加操作,只能將3.2節(jié)的'工作組大小配置為1,此時每個工作組中只有一個工作項,因而不能實現(xiàn)局部內(nèi)存共享。

  2)工作組中工作項的數(shù)量上限一般受限于兩點:一是設備所能提供的資源數(shù),二是內(nèi)核所需的資源數(shù),這里的資源主要指的是局部內(nèi)存。針對3.2節(jié)的內(nèi)核,GT635m GPU的局部內(nèi)存為47KB(K表示×1024),工作組上限為512,而Intel 3210m CPU的局部內(nèi)存只有32KB(K表示×1024),工作組上限為352,所以工作組大小一定要根據(jù)硬件平臺來設置,這點尤為重要。針對以上兩點修改后得到的OpenCL_CPU_SIFT版本即可運行于Intel 3210m CPU中,可見OpenCL具有較好的可移植性。

  5實驗結果及分析

  5.1實驗平臺

  本實驗的實驗平臺CPU為Intel Core i5 3210m,雙核心四線程,2.5GHz;GPU采用NVIDA GeForce GT 635m,核心頻率660MHz,96個流處理器單元,128位總線寬度;開發(fā)環(huán)境為Vs2013,OpenCV版本2.4.9,OpenCL版本1.1。

  5.2實驗方法

  本文實驗的代碼是在Rob Hess維護的SIFT算法(http://robwhess.github.io/opensift/,本文稱之為CPU_SIFT)的基礎上修改而來。實驗分別測試并行化的OpenCL_CPU_SIFT和OpenCL_GPU_SIFT這兩個版本用時,并與未優(yōu)化的CPU_SIFT版本用時作比較分別計算兩個版本的加速比。實驗選取a,b兩組圖片。a組有a1~a5共5幅圖片,b組有b1~b4 4對共8幅圖片。為使實驗結果更具有參考性,其中a1選取Rob Hess采用的behavior圖,分辨率為320×300;a2選取國際通用的Lena圖,分辨率為512×512;a3此處是否描述有誤?即a2~a5,共4幅圖像,而后面的描述中卻有3幅,所以請作相應調(diào)整!玜5為利用CCD攝像頭獲取的3幅紋理從簡單到復雜的測試圖片,分辨率分別為960×720、1280×960、2560×1440。另外為了測試優(yōu)化后的算法對不同圖片的適應性,b組圖片選取4對有角度、光照和尺度變化的圖片,分辨率統(tǒng)一為1280×960。

  5.3實驗結果

  在與原CPU_SIFT算法匹配效果一致的情況下,各圖片的耗時如表2所示,利用OpenCL優(yōu)化后的CPU版本和GPU版本的加速比最大分別為4倍和19倍左右,如圖8所示。這表明OpenCL不僅具有優(yōu)秀的并行計算能力,而且具有較好的跨平臺特性,這也是OpenCL相對于CUDA的一大優(yōu)勢。

  通過對比表1和表2可知,本文在PC平臺實現(xiàn)的SIFT算法的加速比比文獻[9]中實現(xiàn)的加速比更高,特別是當圖像分辨率較大時,本文實現(xiàn)的加速比會進一步增大。這主要是因為兩點:1)數(shù)據(jù)量越大,越能充分發(fā)揮GPU并行運算的能力,越能隱藏數(shù)據(jù)傳輸延時;2)由于移動處理器架構的限制,文獻[9]只針對SIFT特征點檢測部分進行了優(yōu)化,而本文則是對整個SIFT算法流程進行統(tǒng)一優(yōu)化,充分利用了GPU的全局內(nèi)存,數(shù)據(jù)讀取效率更高。另外,通過對比進一步證明了OpenCL對移動平臺和PC平臺都具有廣泛的適用性,再次說明OpenCL具有較好的可移植性和跨平臺性。

  圖9為本文算法對a組圖像的特征提取結果。由圖9可知,優(yōu)化的算法對圖像處理領域常用的Lena圖和behavior圖都能有效地提取特征點,a3~a5三張圖片的紋理由簡單到復雜,優(yōu)化后的算法均能有效提取特征點。在b組圖片中,b1的兩幅圖片有角度變化,b2有光照變化,b3既有角度又有光照變化,b4的角度、光照和尺度均有變化,匹配結果如圖10所示。綜合圖9和圖10的實驗結果可知,優(yōu)化后的算法對不同分辨率、不同紋理復雜度的圖像都能提取穩(wěn)定的特征點,對具有角度、光照和尺度變化的圖像都能正確匹配,這表明并行化后的算法對各種圖片都有較好的適應性。

  為進一步分析不同平臺不同數(shù)據(jù)規(guī)模對OpenCL加速性能的影響,針對a3、a4和a5三幅不同分辨率的圖像,本文分別統(tǒng)計了優(yōu)化后的GPU和CPU版本各步驟的加速比,結果如圖11和圖12。圖11和圖12中步驟1為高斯模糊+高斯差分金字塔生成,步驟2為極值點定位,步驟3為計算方向直方圖,步驟4為特征矢量生成。對比圖11和圖12可知,無論是GPU還是CPU平臺,優(yōu)化后,高斯模糊+高斯差分金字塔生成步驟加速比都最大,GPU版本甚至達到了50倍,這是因為該步驟中各工作項數(shù)據(jù)獨立無分支,并行度高。而極值點定位步驟有大量的選擇判斷語句,并行度較差,閆鈞華等[19]將此步驟放在CPU端執(zhí)行,本文將此步驟一并優(yōu)化,速度有一定提升但不夠理想,這是因為在并行編程中無論CPU還是GPU都受分支語句的影響,GPU尤其如此。另外,與圖11不同,圖12中的三條曲線無交叉,隨著圖片分辨率的增大各步驟的加速比都逐步增大,說明數(shù)據(jù)規(guī)模越大越能發(fā)揮并行運算的優(yōu)勢。另外OpenCL_CPU_SIFT版本的特征向量生成步驟比計算方向直方圖步驟的加速效果更好,這是因為前者通過工作組共享局部內(nèi)存能充分利用CPU的L1 cache,從而提升運算性能。

  6結語

  本文對SIFT算法進行合并、拆分和數(shù)據(jù)重構等并行化設計,改善提高了算法的并行度,并通過合理設置工作組和工作項大小,充分利用內(nèi)存層次等方法對算法進一步優(yōu)化。利用OpenCL并行編程語言的跨平臺特性,本文分別在NVIDIA GPU和Intel CPU平臺上對該算法進行并行優(yōu)化,分別取得了10.51~19.33和2.34~4.74倍的加速,并利用OpenCL的可移植性解決了CUDA對硬件平臺的依賴問題。本文的研究內(nèi)容及結果可應用于提升遙感圖像拼接、醫(yī)學影像配準和流水線工件定位等領域的圖像匹配速度。

  目前本文的優(yōu)化方法在同一時刻只將OpenCL內(nèi)核入列到CPU或者GPU中,即同一時刻只能充分利用CPU或GPU的計算能力,接下來本文將進一步研究異構系統(tǒng)中不同平臺間的并行性,將可并行運行的內(nèi)核同時入列到CPU和GPU中運行,進而擴展到多核多CPU和多GPU的復雜異構系統(tǒng)中,進一步提高算法的運行速度。

【基于OpenCL的尺度不變特征變換算法的并行設計與論文】相關文章:

基于遺傳算法的優(yōu)化設計論文11-20

基于多島遺傳算法的多狀態(tài)動力學模型并行修正方法論文05-17

基于遺傳算法的大型圓振動篩的優(yōu)化設計論文07-14

算法設計與分析課程論文11-18

簡議基于遺傳算法的MR減振器多目標優(yōu)化設計論文11-16

基于現(xiàn)代密碼學的加密算法驗證系統(tǒng)的設計與實現(xiàn)的論文11-14

基于改進多級中值濾波的加權濾波算法論文06-16

基于科技創(chuàng)新團隊特征的培育建議的論文08-25

下沉式廣場尺度空間設計論文11-21