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