于夢華,王雙亭,李英成,朱祥娥2,,劉曉龍2,
(1.河南理工大學,河南 焦作 454000;2.航空遙感技術國家測繪地理信息局重點實驗室,北京 100039;3.中測新圖(北京)遙感技術有限責任公司,北京 100039)
隨著各種影像獲取設備性能的發展,遙感影像在數據量和分辨率上都有了很大程度的提高。在眾多遙感影像獲取設備中,無人機以其體積小、靈活性高的優點,在實際生產中得到了越來越廣泛的應用[1]。無人機航程、載荷的增加和各種數碼相機傳感器的性能不斷提高,使得單架次飛行能夠獲取的遙感影像越來越多,單張像片的像幅越來越大,獲取地球地表信息的數據量也越來越大[2]。在實際的生產中一張影像通常包含幾千萬甚至上億像素,且在1 km2測區內有幾百甚至上千張影像,數據量較為龐大。
面對如此復雜龐大的影像數據,為了提升影像后處理的速度,傳統采用的方式主要包括:購買工作站、服務器等設備,或通過提高中央處理器(central processing unit,CPU)主頻來提升數據處理的速度。這些方式的實現是在原始算法程序不變的基礎上,通過硬件設備計算能力的提升實現算法的加速。這些方式可操作性強,但需要工作站服務器等設備價格昂貴,對算法速度的提升有很大的限制。而且這些年CPU硬件的發展速度逐漸放緩,浮點計算能力、CPU主頻和CPU的內存帶寬等重要技術指標參數也幾乎停滯不前,這些發展現狀也直接導致利用多個CPU核心方式來實現算法速度提升的局限性。利用多個CPU核心實現的多線程的算法速度提升方式已不能滿足實際生產需求。而另一些改進和創新的算法由于算法邏輯性強、改進難度較大,生產中可操作性不強。這種現狀約束了遙感影像后處理產品的生產效率,難以滿足大數據時代海量遙感影像數據應急快速處理的需求。因此,在大數據時代如何提高遙感影像數據處理的速度仍然是一個十分關鍵的問題[3]。
圖形處理器(graphic processing unit,GPU)以其較為強大的圖形計算能力受到了越來越多研究者的青睞。熊英等人利用開放式計算語言(open computing language,OpenCL)并行改進植被指數算法,實驗得到了8.1的整體加速比[3]。馬歌等人分析了Prewitt圖像邊緣檢測算法的并行可行性,提出了一種基于OpenCL異構架構并行改進算法。選取數據進行實驗,實驗結果顯示,改進后的并行算法相對傳統的串行算法的加速比達30倍,大幅度地提升了算法的速度,同時算法具有較好的可移植性,研究具有很高的應用價值[5]。黃叢珊在對直方圖均衡化算法進行改進的同時,分析OpenCL異構并行架構的主要特點,判斷并行改進后算法的并行程度,選取算法的3個部分進行并行改進。3個部分分別為圖像噪聲的平滑濾波、拉普拉斯算子變換以及直方圖的均衡化。算法經過OpenCL并行改進后不僅圖像增強的效果遠好于傳統的直方圖均衡化算法,而且算法處理速度大幅提升,并行加速后的處理時間大大減少,尤其是針對像幅大小為4 000×3 200或以上的影像時,加速比高達50倍,并且發現算法的加速比隨著影像分辨率的增加而提升[3]。肖漢、馬歌等同樣利用OpenCL改進Harris角點檢測算法,利用GPU中的全局內存、常量內存等對改進后并行程序進行進一步優化,在OpenCL的框架下完成角點檢測算法的全流程。實驗結果表明,相比于傳統CPU上的串行算法,基于OpenCL異構并行模型的Harries角點檢測并行改進算法的加速比高達77倍,執行效率顯著提升,在大規模數據處理中可以體現出很好的實時處理能力[3]。
GPU是顯卡的核心計算部件,又稱為圖形處理單元同時也是專用的圖形渲染設備。由于可編程圖形處理器PGPU(programmable GPU)的出現以及GPGPU(general Purpose GPU)技術的發展,GPU高度并行化的架構和可編程著色器使人們漸漸開始用它來計算通用任務。它具有運算性能高、浮點運算能力強、運算密集度高、體積小、性能功耗比和性價比高的特點。GPU將更多的晶體管用做計算單元,而CPU更多的是用做緩存和控制單元。因此,GPU更適宜用做并行計算。
在遙感圖像處理方面,很多算法程序是針對像素地操作,需要逐像素地循環進行,也即是像素級的處理,這類算法數據的處理具有以下特點:數據量豐富,需要進行較密集的計算;數據處理方式固定,每個像素執行相同的操作,具有較高的自動化程度;數據處理過程并行性較高,各個像素計算形式相同,且相鄰像素之間的交互是局部的[8]。正如本研究所選取的畸變差糾正算法,該算法為逐像素的處理過程,每個像素所做處理相同,是一個循環計算的過程,采用傳統for循環方式處理比較耗費時間,算法具有天然的并行性,如果調用GPU的計算單元同時進行計算,在理論上將使算法速度大幅提高。
調用GPU計算單元實現算法并行加速處理可以通過多種方式來實現,常用的如CUDA(compute unifined device arcthitecture)、OpenCL等,與CUDA不同的是OpenCL具有設備通用性的優點。
GPU通用計算實現算法加速的方式通常是GPU+CPU的異構模式,由CPU負責邏輯運算,由GPU負責逐像素的密集運算?,F階段不僅工程中對常用算法速度的要求逐步提升,而且科研人員也愈發注重算法處理的速度,因此算法并行加速實現逐漸成為當前的研究熱點。CUDA和OpenCL等基于GPU的并行構架更是應運而生,GPU不只是單純的圖形加速設備,而是作為計算設備在研究中被廣泛應用[8]。CUDA出現最早,技術較為成熟且有著豐富的編程庫,吸引了比較多的編程人員。CUDA具有設備局限性,而OpenCL彌補了這個不足,它是一種跨平臺的通用標準。
OpenCL是面向異構計算平臺的通用編程框架,是可以為由CPU、GPU以及一些其他的計算設備組合成異構的平臺實現算法并行加速的通用編程標準。OpenCL不僅是一門語言,它更是一種并行編程框架,它包含一種類C語言、API(application programming interface)函數庫和一個運行時系統[8]。其架構由平臺模型、執行模型、內存模型、編程模型4個部分組成。
OpenCL的平臺構成通常是一個主機設備和與主機設備連接的多個OpenCL設備,與主機連接的OpenCL 設備主要擔負并行計算任務。算法程序主要運行在主機端,通過在主機端運行的程序向OpenCL設備端發送指令進行計算,OpenCL設備端在完成計算后將計算的結果返回給主機端,最終在主機端程序中輸出計算的結果。OpenCL的主機端算法程序的編寫步驟如下:
①尋找OpenCL設備,獲得各個設備的信息;
②創建上下文和命令隊列,將主機端與OpenCL設備端連接起來;
③創建在設備端運行的程序對象,程序對象的形式為源代碼或二進制代碼;
④為OpenCL設備分配所需的顯存空間,并將主程序數據拷貝到開辟的顯存空間,為算法在OpenCL設備上執行做好準備;
⑤執行在OpenCL設備上運行的內核程序,程序運行結束將執行的結果返回到顯存中,并拷貝到主機程序中;
⑥釋放資源,程序結束。
遙感影像處理算法多是逐像素的處理過程,算法具有天然的并行性,因此越來越多的研究將OpenCL應用于遙感影像處理算法加速研究中來。本研究選取遙感影像預處理階段中代表性的畸變差糾正算法來進行實驗,根據畸變差改正算法的加速效果,來提出是否可將基于OpenCL實現CPU+GPU異構模式算法加速應用到其他遙感影像處理算法中。
非量測型數碼相機的發展,使得利用非量測型相機進行數字攝影測量處理逐漸成為熱點。由于非量測型相機不同于量測型相機經過了嚴格的檢校,非量測型相機存在較大的鏡頭畸變,如果不進行畸變差糾正則無法滿足后續處理的精度要求,因此必須進行畸變差糾正?;儾罴m正算法主要特點是對每個像素的循環處理。傳統的串行程序耗時過長,影響生產效率,有必要對畸變差糾正算法進行并行改進,將逐像素處理過程并行執行,理論上可以大大提高算法處理速度。
畸變差改正所用模型:
Δx=(x-x0)(k1r2+k2r4+k3r6)+P1(r2+2(x-x0)2)+2P2(x-x0)(y-y0)+B1(x-x0)+B2(y-y0)
(1)
Δy=(y-y0)(k1r2+k2r4+k3r6)+P2(r2+2(y-y0)2)+2P1(x-x0)(y-y0)
(2)
式中:Δx、Δy為像點坐標改正值;x、y為像點坐標;x0、y0為像主點坐標;r2=(x-x0)2+(y-y0)2;k1、k2、k3為徑向畸變參數;P1、P2為偏心畸變參數;B1、B2為面陣內畸變參數[11]。
本研究選取的畸變差糾正算法采用間接法對影像進行畸變差糾正。間接法即是利用已知的相機畸變參數,根據畸變差改正模型計算糾正后影像的每個像元在原始影像中的位置,然后利用雙線性插值算法從原始影像中取像素值,并將該值賦給糾正后影像的相應位置,最后保存影像完成畸變差改正。
從間接法的處理過程可以發現,在影像畸變差處理算法中,計算密集的部分是每個像素對應原始影像位置的計算和從原始影像灰度重采樣的過程。對每個像素來說,所進行的操作是完全相同的,具有很高的并行性,因此可以調用GPU來實現算法的加速處理。
基于OpenCL并行改進具體操作是先將影像讀入內存,之后查詢平臺,選擇可用設備,建立上下文和命令隊列;將影像數據拷入顯存,然后將計算坐標改正值、計算原始影像位置、插值計算像素值等逐像素的循環過程放入內核函數,建立程序交給設備端并行執行;執行完成后將結果從顯存拷回內存輸出處理結果并計算加速比,分析加速效果,如圖1所示。

圖1 畸變差改正并行改進流程圖
根據實驗需要選取軟硬件平臺,實驗環境和平臺信息,如表1和表2所示。

表1 實驗環境介紹

表2 GPU芯片參數
本次實驗選取不同像幅大小的3組數據,每組數據包含100張影像,3組數據像幅大小如下:
第1組數據:6 016×4 016
第2組數據:7 360×4 912
第3組數據:10 328×7 760
分別對3組數據做畸變差改正處理,每組數據都用2種方式進行處理,2種方式分別為調用GPU的CPU+GPU方式和CPU串行處理方式,記錄每組數據每種方式的每張影像處理用時,對每組100張影像求得平均每張影像CPU和CPU+GPU用時,結果如表3和表4所示。

表3 各批影像平均每張影像處理用時(OpenCL)

表4 各批影像平均每張影像處理用時(CUDA)
從表3可以看出CPU+GPU方式算法加速效果明顯,但隨著幅面的增大加速比反而在減小。這一方面是由于在OpenCL并行程序中CPU負責影像的讀取和輸出,這一過程并沒有經過加速,因此影像幅面越大,讀取和輸出影像所耗費的時間越多;另一方面是由于GPU顯存大小和內存帶寬的限制導致大幅面影像的加速效果小于小幅面的影像。
由表3和表4可以看出將傳統畸變差改正算法進行OpenCL改進后算法速度明顯提高,且經過OpenCL改進算法可以達到CUDA算法大致相同的加速效果。
僅僅計算每張影像的平均用時的加速比不足以顯示GPU的加速效果,因為在OpenCL并行程序中GPU是對密集計算的加速,因此統計計算部分的加速比,能更好地體現GPU的加速效果。CPU計算部分處理用時統計的是每張影像的for循環部分用時,GPU計算部分處理用時統計的是OpenCL中執行內核函數環節的時間,即統計核心計算部分的用時,再計算加速比更能體現算法在調用GPU處理的加速效果,如表5所示。

表5 各批影像平均每張影像計算部分處理用時
由于OpenCL采取CPU+GPU的異構模式實現算法加速,時間會消耗在讀寫影像和CPU與GPU的影像傳遞上,所以計算部分的加速比會高于整體的加速比。由表5可以看出OpenCL改進畸變差改正算法計算部分加速比大于總體的加速比,而且6 016×4 016和7 360×4 912兩種幅面大小的影像計算部分加速比甚至達到了60倍,得到了較好的加速效果。
為驗證OpenCL改進過后算法的設備通用性,CUDA加速程序無法在AMD顯卡上進行處理,特選取一臺配備有AMD顯卡設備的計算機進行實驗,設備特性如表6所示。實驗數據選取為7 360×4 912和10 328×7 760兩種幅面大小各50張影像,實驗結果與分析如表7所示。

表6 AMD顯卡設備配置

表7 AMD顯卡平均每張影像處理用時(OpenCL)
由表7可以看出,在AMD顯卡設備上算法加速效果明顯,很好地驗證了OpenCL改進后算法的設備通用的特性。
本文針對提升遙感影像處理算法速度問題,提出了基于OpenCL改進傳統遙感影像處理算法,調用GPU實現算法加速的方法,利用該方法實現了無人機影像的畸變差改正程序開發并利用實際飛行數據進行了實驗驗證。實驗證明這種方法不僅可以達到良好的加速效果,而且彌補了CUDA調用GPU加速的設備局限性問題。展望整個遙感影像處理全流程中,許多含有密集運算的影像處理算法都可以通過此方式實現算法的加速。算法的加速效果與設備的配置和算法中計算任務的分配方式均有關系,有待于后續進一步的深入研究。