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