摘 要:當(dāng)代圖像處理,特別是基于大量密集科學(xué)計算的數(shù)據(jù)處理,需要用高度的并行處理技術(shù)來解決計算效率問題。然而處理速度更多依賴于具體的算法和系統(tǒng)實現(xiàn)間的相互聯(lián)系,這就對進行并行處理的工作人員的并行技術(shù)及相關(guān)經(jīng)驗提出了一定的要求。為完成并行處理并加大并行計算效益,采用了DirectCompute方法。針對工程中的角點匹配計算時延問題,憑借有效的硬件資源,對其進行了并行處理,提高了程序執(zhí)行效率,并縮短了計算延時。
關(guān)鍵詞:圖像三維重建; 并行計算; GPU; DirectCompute
中圖分類號:TN91934; TP391 文獻標(biāo)識碼:A 文章編號:1004373X(2012)22005504
隨著并行處理機及并行處理技術(shù)的飛速發(fā)展,并行計算已逐步應(yīng)用于科學(xué)計算領(lǐng)域及相關(guān)工程領(lǐng)域,并不斷取得卓越成果。圖像并行處理技術(shù)是一種將并行計算應(yīng)用于圖像處理中以提高圖像處理速度的技術(shù)。如何設(shè)計算法并通過系統(tǒng)實現(xiàn)完成并行處理并使得并行計算效益最大,這是圖像并行處理技術(shù)應(yīng)用的一個難題。對于工程中的角點匹配計算時延問題,DirectCompute方法有效地縮短了計算時延。
1 圖像三維重建簡介
圖像三維重建是圖像工程中的研究對象。通過使用多臺攝像機,從360°對一個做自轉(zhuǎn)運動的物體進行拍攝,從得到的同一時刻該物體的圖像以及圖像間的關(guān)聯(lián)信息計算該運動物體的三維結(jié)構(gòu)并重建出來。圖1是某一時刻對各攝像機單幀圖像組處理的流程圖。
圖1 三維重建在整個圖像三維重建過程中,特征點檢測與匹配[1](圖1中第2步)是工程開始階段非常重要的一步。它將不同攝像機同一時刻拍到的運動物體圖像,經(jīng)過多尺度Harris角點HH檢測算法[24]找出圖像之間關(guān)聯(lián)的角點組,并通過寬基線匹配算法[5]對這些角點進行粗匹配最后再由引導(dǎo)匹配[6]算法根據(jù)不同圖像之間角點的相似性匹配圖像。
對于待匹配的2幅圖像,通過Harris角點檢測得到的每一組角點p1(x,y)、 p2(x,y),分別以它們作為中心原點畫邊長為w的正方形,并以該正方形為窗口對兩幅圖像進行截取,由這樣得到的2個二維矩陣MAW×W,MBW×W計算出關(guān)于該兩組角點的相關(guān)系數(shù)。由這樣計算出的所有角點的相關(guān)系數(shù)組成了相關(guān)系數(shù)矩陣CK×L,其中K為圖像1中的角點組數(shù),L為圖像2中的角點組數(shù)。最后再通過相關(guān)系數(shù)矩陣找出圖像1與圖像2中相似性最高的對應(yīng)角點,從而實現(xiàn)粗匹配。引導(dǎo)匹配則是根據(jù)粗匹配的結(jié)果,通過相對應(yīng)角點的位置對圖像劃定一個范圍,并將范圍內(nèi)每一個元素作為新的角點進行粗匹配過程,從而使匹配更精確。
實驗測得,通過Harris角點檢測算出的兩幅待匹配圖像角點數(shù)目一般為800組左右。截取窗口邊長w= 41時,匹配效果最好。由于進行初始匹配時并不能確定兩幅圖像的角點組間的相關(guān)性,因此需要對其進行兩兩匹配。經(jīng)計算,僅完成一次粗匹配中的窗口矩陣點乘的操作就需要大約11億次的浮點運算,而后續(xù)的引導(dǎo)匹配則更是重復(fù)這樣的計算過程。由此可以看出,整個角點的匹配工作不僅占用內(nèi)存資源,而且耗時嚴重。實驗測得,特征點檢測與匹配過程大約耗時800 s,不用說實時顯示,對于圖像三維重建工程的后續(xù)工作也是一種漫長的等待。要尋求一種解決方案,在不影響數(shù)據(jù)計算結(jié)果的情況下,盡可能加快其計算過程。
2 DirectCompute簡介
圖形處理器(Graphics Processing Unit,GPU)又稱圖形處理單元,是一種專用圖形渲染設(shè)備,是顯卡的計算核心。GPU所擁有的計算核心數(shù)目遠遠大于CPU,這樣的硬件設(shè)計架構(gòu)決定了GPU擁有比CPU強大得多的浮點運算能力[79]。
DirectCompute是微軟開發(fā)和推廣的一種用于GPU通用計算的應(yīng)用程序接口,集成在Microsoft DirectX(微軟創(chuàng)建的多媒體編程接口)內(nèi)。除了GPU通用計算,DirectCompute還支持CPU+GPU異構(gòu)運算,即CPU運算復(fù)雜的串行序列代碼,而GPU運行大規(guī)模的并行應(yīng)用程序,CPU與GPU分工合作,異步執(zhí)行,組成協(xié)同處理環(huán)境[10]。DirectCompute的編程模型基于Direct3D著色器模型架構(gòu),并且采用高級渲染語言HLSL(High Level Shader Language)進行編程。
相比于一般的GPU通用計算,DirectCompute擁有以下特點:
(1) 由于是集成在DirectX中,因此與其中的D3D圖形資源(紋理、緩存等)可以進行有效的互操作;
(2) 包含立方環(huán)境貼圖cubemap和多級貼圖mipmapping在內(nèi)的所有紋理映射技術(shù);
(3) 使用類HLSL渲染語言;
(4) 在Windows平臺上對所有顯卡供應(yīng)商提供統(tǒng)一圖形API;
(5) 對于不同硬件及產(chǎn)生的超時,DirectCompute盡量保證它們的結(jié)果一致性;
(6) 提供存儲溢出檢測。
在DirectX[11]結(jié)構(gòu)中有很多種著色器模型,而微軟在DirectCompute中增添了一種新的著色器類型——Compute Shader,計算著色器——用來處理更廣泛的通用計算問題。計算著色器并不屬于圖形流水線中的某一級,它通過其中的圖形資源(例如渲染目標(biāo)、緩存或紋理)來與流水線中的其他模塊進行交互。不同于向量著色器與像素著色器,計算著色器不必對處理的數(shù)據(jù)和線程完成一對一的映射。一條線程可以處理多個數(shù)據(jù),并且應(yīng)用程序可以根據(jù)計算的規(guī)模來直接分配所需的線程數(shù)。此外,計算著色器允許亂序內(nèi)存訪問,即可以實現(xiàn)對緩存中任意位置的寫操作。
3 DirectCompute方法的實現(xiàn)
計算著色器通過名為“Dispatch”的函數(shù)來規(guī)劃和分配參與計算的線程數(shù),如圖2所示,Dispatch(X,Y,Z)表示線程組在x,y和z維度的線程塊數(shù)分別為X,Y和Z。線程組中每一個元素被看做一個線程塊,用HLSL語言表示成:numthreads(nx, ny, nz),其中nx,ny,nz分別是線程塊中每個維度上線程的數(shù)量。SV_GroupID表示線程組中每個維度上線程塊的索引ID,SV_GroupThreadID表示線程塊中每個線程的索引ID,它們都是三維的,SV_DispatchThreadID則是線程在整個線程組中完整的索引ID映射。SV_GroupIndex則是將線程在線程組內(nèi)索引ID轉(zhuǎn)換成一維的形式,其計算方法為:
groupIndex= groupThreadID.x*dimx*dimy+groupThreadID.y*dim+groupThreadID.x。
使用計算著色器進行通用計算一般分為以下幾個步驟:
(1) 創(chuàng)建D3D設(shè)備和用來切換的上下文;
(2) 創(chuàng)建計算著色器CS并對其進行編譯;
(3) 創(chuàng)建輸入資源對象Input Resource并向其填充輸入數(shù)據(jù);
(4) 創(chuàng)建資源視圖SRV,綁定輸入資源對象;
(5) 創(chuàng)建輸出資源對象Output Resource;
(6) 創(chuàng)建資源視圖UAV,綁定輸出資源對象;
(7) 利用計算著色器CS進行多線程計算;
(8) 將計算結(jié)果傳回資源視圖UAV綁定的輸出資源對象中;
(9) 從輸出資源對象中取出數(shù)據(jù),釋放資源。
#define W_SIZE 41
#define NUM_IN_GROUP_X 850
//X維度線程組數(shù)量
#define NUM_IN_BLOCK_X 850
//X維度線程組中線程數(shù)量
structBufType{
//定義結(jié)構(gòu)體
float data;
}
//初始化工作
CreateComputeDevice(pDevice, pContext);
//創(chuàng)建D3D設(shè)備和上下文
CompileFromFile(pSrcFile, pDevice, pBlob);
//從HLSL文件編譯計算著色器
CreateStructureBuffer(pDevice, InputBuffer0, pInBuf0);
//創(chuàng)建結(jié)構(gòu)體緩存并傳入數(shù)據(jù)
CreateStructureBuffer(pDevice, InputBuffer1, pInBuf1);
CreateStructureBuffer(pDevice, OutputBuffer, pOutBuf);
CreateBufferSRV(pDevice, pInBuf0, pInBuf1, pInputBufferSRV);
//輸入緩存綁定SRV
CreateBufferUAV(pDevice, pOutBuf, pOutputBufferUAV);
//輸出緩存綁定UAV
pContext->Dispath(NUM_IN_GROUP_X, 1, 1);
//分配線程組
CreateAndCopyToDebugBuf(pDevice, pContext, pOutBuf);
//將計算結(jié)果傳回CPU
//釋放資源
圖2 通過“dispatch”進行線程規(guī)劃按照這個步驟開始進行對角點組的匹配工作。著色器模型中的緩存類型選用structured buffer,當(dāng)然之前要先定義一個結(jié)構(gòu)體,緩存中每個元素都是這個結(jié)構(gòu)體的對象。在處理窗口矩陣相關(guān)系數(shù)矩陣計算的時候,將所有窗口矩陣均按行順序存儲方式存為2個大矩陣Matrix_A和Matrix_B中。創(chuàng)建兩個結(jié)構(gòu)體緩存InputBuffer0和InputBuffer1并將這兩個矩陣存入,同時創(chuàng)建兩個資源視圖InputBufferSRV0和InputBufferSRV1對緩存進行綁定。另外創(chuàng)建一個讀寫結(jié)構(gòu)體緩存OutputBuffer并綁定到資源視圖OutputBufferUAV上。接下來利用Dispatch分配線程數(shù),考慮需要進行匹配的角點組數(shù)量以及計算著色器模型中對線程數(shù)目的限定,在x維度上分配850個線程組,y維度和z維度為1,每個線程組中在x維度上分配850個線程數(shù),y維度和z維度也均為1。這樣做的目的是,每個線程組內(nèi)的線程數(shù)量對應(yīng)一個大矩陣的元素,使其每個線程完成一次窗口矩陣的2范數(shù)與點乘運算;所有線程組數(shù)量對應(yīng)另一個大矩陣的元素,從而使得這些計算并發(fā)進行,達到加速優(yōu)化的效果。利用DirectCompute進行并行匹配計算的一些核心代碼請見上圖。
4 性能測試
CPU與DirectCompute加速方案測試結(jié)果對比如表1所示。
由表1可知,在實驗中,利用DirectCompute進行粗匹配的加速效果是十分顯著的,對于GeForce GTX 460顯卡來說,整個匹配工作幾乎是“瞬間”完成的。根據(jù)GTX460的工作手冊,可以看到其支持的DirectX的版本為11.0,對應(yīng)計算著色器的模型為CS5.0,對于DirectCompute的支持也更充分。
為了更好地測試DirectCompute的加速性能,對基于GTX 460加速的整個運行流程進行了分段測試,包括窗口矩陣2范數(shù)的計算時間、窗口矩陣點乘的時間以及數(shù)據(jù)傳輸?shù)臅r間,如表2所示。從表中可以看到,利用DirectCompute進行計算的時間大約為4.5 ms,數(shù)據(jù)傳輸時間大約為40 ms,也就是說整個角點粗匹配過程中,利用DirectCompute加速后的計算時間所占百分比不到1%,數(shù)據(jù)傳輸?shù)臅r間占整個執(zhí)行時間的8%。就是說GPU的執(zhí)行效率是比較低的,這也是基于GPU的通用計算上所需要解決的典型問題。另外可以看到,大矩陣Matrix_A的2范數(shù)計算階段總時間和大矩陣相乘階段總時間很長,特別是后者,這是創(chuàng)建D3D設(shè)備和相關(guān)圖形資源以及釋放資源造成的延時。
5 結(jié) 語
目前并行計算已經(jīng)迅速發(fā)展為與眾多工程類學(xué)科交叉的一門計算科學(xué),并已成為許多科研和工程技術(shù)人員進行科學(xué)研究和開發(fā)的重要手段。并行處理技術(shù)也在眾多領(lǐng)域取得顯著成果,圖像并行處理技術(shù)更是在傳統(tǒng)的圖像處理領(lǐng)域發(fā)揮著重要作用。然而并行處理技術(shù)在圖像處理方面的發(fā)展也面臨許多挑戰(zhàn),其中最主要的就是如何提高解決實際復(fù)雜問題的綜合能力,包括圖像處理中復(fù)雜問題求解和處理速度高速化問題。
本文主要是將基于GPU的高性能并行計算技術(shù)(DirectCompute方法)應(yīng)用于實際處理的圖像工程中。針對工程中具體的角點匹配計算時延問題,依照并行處理規(guī)則,憑借有效的硬件資源,對其進行并行處理,提高程序執(zhí)行效率,縮短計算延時。隨著并行計算的不斷發(fā)展以及圖像并行處理技術(shù)的日益成熟,相信高性能并行計算必將成為圖像處理不可或缺的組成部分并將不斷推動其走向新的階段。
參 考 文 獻
[1] 聶曉桃,王慧.一種改進的特征點匹配算法[J].科技廣場,2010(1):9899.
[2] 薛翠紅,于洋,梁艷,等.多攝像機視野分界線恢復(fù)算法[J].無線電通信技術(shù),2012(2):6668.
[3] 陳白帆,蔡自興.基于尺度空間理論的Harris角點檢測[J].中南大學(xué)學(xué)報,2005,36(5):751753.
[4] 蔡勝利,張會清.基于Harris角點檢測的圖像旋轉(zhuǎn)測量[J].計算機測量與控制,2011(1):3032.
[5] 左森,郭曉松.寬基線視察圖像的拼接算法[J].計算機工程,2007,33(10):175176.
[6] 梁棟,童強,屈磊,等.一種基于極幾何和單應(yīng)約束的圖像匹配算法[J].系統(tǒng)仿真學(xué)報,2006(7):4446.
[7] 厲旭杰.GPU加速的圖像匹配技術(shù)[J].計算機工程與應(yīng)用,2012(2):173176.
[8] LI Ping, SUN Hanqiu, SHENG Bin, et al. Image stylization with enhanced structure on GPU(英文版)[J].中國科學(xué)信息科學(xué),2012(5):10931105.
[9] 韓博,周秉鋒.GPGPU性能模型及應(yīng)用實例分析[J].計算機輔助設(shè)計與圖形學(xué)學(xué)報,2009,21(9):12201223.
[10] CHANG Janlen.異構(gòu)計算:計算巨頭的下一個十年[J].個人電腦,2011(11):8288.
[11] 陳希棠.基于DirectX的圖像旋轉(zhuǎn)算法的研究與實現(xiàn)[J].電腦知識與技術(shù),2011(7):46254627.
[12] 張聰,邢同舉,羅穎,等.基于GPU的數(shù)學(xué)形態(tài)學(xué)運算并行加速研究\[J\].電子設(shè)計工程,2011(19):141143.
[13] 張曉東,孔祥輝,張歡陽.利用GPU實現(xiàn)SAR圖像的并行處理\[J\].電子科技,2011(11):9495.
[14] 程飛,黃曦.基于OGRE的三維紅外云仿真\[J\].電子科技,2010(6):47.
作者簡介: 張益男 女,1984年出生,江蘇南通人,碩士,講師。研究方向為控制及電子方面。
袁 杰 男,1978年出生,江蘇南京人,碩士生導(dǎo)師,副教授。研究方向為圖像與視頻處理。