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