文獻(xiàn)標(biāo)識碼: A
DOI:10.16157/j.issn.0258-7998.2016.04.031
中文引用格式: 田旭文,朱茂華. 基于異構(gòu)平臺的自適應(yīng)圖像去馬賽克的OpenCL加速[J].電子技術(shù)應(yīng)用,2016,42(4):111-115.
英文引用格式: Tian Xuwen,Zhu Maohua. An OpenCL implementation of an image de-mosaicking algorithm on a hybrid platform of heterogeneous system architecture[J].Application of Electronic Technique,2016,42(4):111-115.
0 引言
隨著高清影像與手持?jǐn)?shù)碼產(chǎn)品的普及,數(shù)字影像技術(shù)受到了產(chǎn)業(yè)界的重視,因數(shù)字影像攜帶大容量信息且引起豐富的創(chuàng)造潛能。高清、高幀率影像不僅能展現(xiàn)更高的畫面質(zhì)量,還能提升畫面的連續(xù)性,在網(wǎng)絡(luò)監(jiān)控、醫(yī)療等領(lǐng)域有廣闊的前景。通常,數(shù)字影像采集設(shè)備用成像芯片將光學(xué)圖像轉(zhuǎn)換為電荷,成像芯片決定影像質(zhì)量,占相機(jī)成本的10%~25%??紤]到成本、體積及硬件工藝,多數(shù)影像采集設(shè)備使用覆蓋有一層色彩濾鏡陣列的單個成像芯片。每個感光單元只能取樣一種色彩,其余兩種顏色值需用相鄰單元的取樣值進(jìn)行插值計算得到。這種色彩插值就是去馬賽克,是數(shù)字影像采集流水線的一個關(guān)鍵環(huán)節(jié),在高幀率、高清圖像處理應(yīng)用中有重要價值。
本設(shè)計基于異構(gòu)計算實現(xiàn)了一個自適應(yīng)去馬賽克算法的OpenCL代碼,并在AMD Bald Eagle和AMD FirePro W8100(或ES8950 MXM)GPU組成的異構(gòu)計算平臺上進(jìn)行了測試。據(jù)了解,目前還沒有異構(gòu)平臺的去馬賽克并行代碼。深度優(yōu)化的代碼充分發(fā)揮了異構(gòu)平臺的架構(gòu)優(yōu)勢以及FirePro W8100的浮點運(yùn)算能力和高GFLOPS/J特點。整個系統(tǒng)具有低的計算耗時,處理圖像的速率超過了100 f/s,每幀的像素數(shù)量是1 920×1 080。實驗數(shù)據(jù)證明該方案能滿足醫(yī)療、安監(jiān)等領(lǐng)域?qū)Ω邘屎透咔鍞?shù)字影像的需求。
1 圖像插值算法和異構(gòu)計算
1.1 圖像去馬賽克算法
圖像去馬賽克算法是數(shù)碼影像產(chǎn)品里的一項關(guān)鍵技術(shù),其性能優(yōu)劣直接影響著圖像質(zhì)量,性能不好的算法會使重建圖像有彩色馬賽克或拉鏈?zhǔn)д娴然?。按是否利用空間相關(guān)性,文獻(xiàn)[1]將現(xiàn)有的算法分為兩類——非自適應(yīng)插值法(如最近鄰域復(fù)制、雙線性插值和三次樣條插值)和利用相關(guān)性的插值法。前一類算法易于實現(xiàn),可以在圖像的平滑區(qū)域得到滿意的插值效果,但在目標(biāo)邊緣等高頻區(qū)域易引起插值畸變。后一類方法利用相關(guān)性實現(xiàn)插值,相關(guān)性包括每個色彩通道內(nèi)像素間的空間相關(guān)性和多通道間的色彩值相關(guān)性。第二類算法能得到高質(zhì)量的重建圖像,但是計算復(fù)雜度高。沒有專用加速計算芯片的支持,數(shù)字影像采集設(shè)備很難實時運(yùn)行后一類算法。本文采用的Adaptive Homogeneity-Directed De-Mosaicking(AHDDM)屬于利用相關(guān)性的插值算法[2]。該算法適于處理以Bayer色彩濾波陣列模式采集到的圖像,圖1是該算法的主要計算步驟流程。雖然這些步驟需要大量的浮點運(yùn)算和復(fù)雜的數(shù)值計算,但是適于用并行計算代碼實現(xiàn)加速。
1.2 異構(gòu)計算
傳統(tǒng)的圖像處理平臺用CPU,系統(tǒng)運(yùn)算能力的提升受限于因提高CPU工作頻率引起的功耗的顯著增加。雖然CPU的同構(gòu)并行和分布系統(tǒng)能提升運(yùn)算能力,但其提升幅度不能隨著處理器數(shù)量線性增長。在這些系統(tǒng)上,即便得到成熟的開發(fā)經(jīng)驗、編程語言、算法和調(diào)試工具等手段的協(xié)助,開發(fā)圖像處理軟件也是一項困難的工作。異構(gòu)計算技術(shù)產(chǎn)生于80年代中期,主要指使用不同類型指令集、體系架構(gòu)的計算單元組成混合系統(tǒng)的一種計算方式。常見的計算單元包括兼容X86指令集的多核CPU、GPU、FPGA、DSP、音頻/視頻處理等專用集成電路(ASIC)[3-4]。由于異構(gòu)計算能經(jīng)濟(jì)、有效地配置計算資源,提升資源利用率和可擴(kuò)展性,該技術(shù)已成為并行/分布計算領(lǐng)域中的一個研究熱點。異構(gòu)平臺通常由多核CPU和GPU組成。
1.3 AMD GPU
在2012年以前,AMD 的GPU架構(gòu)采用VLIW4作為計算單元的指令格式,這使GPU適用于圖像渲染和3D圖形運(yùn)算。通常,通用計算的數(shù)據(jù)有復(fù)雜的結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)很難被歸并到有限的類型之中,因此舊架構(gòu)的GPU芯片難以高效地完成通用并行計算或合理地配置資源。從2012年開始,AMD 發(fā)布的GPU芯片采用了新架構(gòu)GCN[5],如圖2所示。GCN架構(gòu)不僅支持渲染和3D圖形計算,還支持通用計算和OpenCL 1.2標(biāo)準(zhǔn)。
GCN架構(gòu)的核心特點表現(xiàn)在兩個方面。首先,該架構(gòu)用了新的CU結(jié)構(gòu)和指令集。每個CU有4個獨(dú)立的SIMD向量處理器和向量寄存器,還有一個標(biāo)量處理器和8 KB寄存器,用于減少向量計算的冗余計算。除了私有資源,4個SIMD共享前端、分支單元和數(shù)據(jù)緩存。這些設(shè)計使得一個CU能支持多達(dá)2 560 個線程。其次,GCN架構(gòu)還將改變擴(kuò)展到整個系統(tǒng),如GCN架構(gòu)采用分級緩存。由一個向量數(shù)據(jù)讀取指令引發(fā)的64個存儲訪問會被合并成一個訪問。合并機(jī)制將讀取同一個cache line里的數(shù)據(jù)合并為一次訪問,這能顯著地降低片外存儲器的讀取次數(shù)。數(shù)據(jù)存儲采用了不同于讀取的合并方式。在合并存儲器讀取請求之后,數(shù)據(jù)將被送至一級數(shù)據(jù)緩存,即分級緩存的第一級。如果CU需要的數(shù)據(jù)不在一級緩存,那么CU將通過開關(guān)矩陣訪問二級緩存。二級緩存有多個bank,采用交織尋址方式,各bank通過一個64位雙通道存儲控制器連接到片外存儲器。GCN分級存儲是一個合并讀寫的緩存系統(tǒng),支持虛擬內(nèi)存和原子操作,進(jìn)而支持GPU和CPU間的數(shù)據(jù)零拷貝。
1.4 OpenCL
通常,硬件廠商僅提供支持自身芯片的編程模型和工具,所以難用一種風(fēng)格的編程語言實現(xiàn)異構(gòu)編程。此外,將不同設(shè)備作為統(tǒng)一的計算單元來處理是非常困難的。為解決該問題,OpenCL通過一套機(jī)制實現(xiàn)獨(dú)立于硬件的軟件開發(fā)環(huán)境,還能支持多級別的并行計算和不同設(shè)備的并行特性,將高級語言的代碼有效地映射到由CPU、GPU和其他芯片組成的系統(tǒng)上[6]。OpenCL定義了運(yùn)行時系統(tǒng)管理資源,將不同類型的硬件結(jié)合在同種執(zhí)行環(huán)境中,用來支持動態(tài)平衡計算、功耗及其他資源[7]。圖3示意了平臺模型和執(zhí)行模型間的關(guān)系。
2 OpenCL代碼設(shè)計及優(yōu)化
本文用OpenCL 1.2標(biāo)準(zhǔn)設(shè)計GPU代碼,實現(xiàn)一個高復(fù)雜度的自適應(yīng)去馬賽克算法。因為該算法對每個像素進(jìn)行多次插值、濾波和非線性映射等操作,所以這個算法需要大量的浮點運(yùn)算以及數(shù)值計算,屬于數(shù)據(jù)密集型應(yīng)用,適合于GPU實現(xiàn)。為高速實現(xiàn)該算法,OpenCL代碼必須充分利用GPU的計算資源,如高速浮點運(yùn)算能力。目標(biāo)異構(gòu)平臺以CPU為核心,包含一個或多個OpenCL設(shè)備,這要求不同架構(gòu)的微處理器同時運(yùn)行不同性質(zhì)和內(nèi)容的計算任務(wù),因此代碼應(yīng)同時進(jìn)行數(shù)據(jù)傳輸和計算,以利于整個系統(tǒng)高速地處理數(shù)據(jù)幀序列。
OpenCL代碼的主要技術(shù)特點如下所述。在代碼加速方面,優(yōu)化了中值濾波和線性濾波的計算流程,優(yōu)化了片外存儲數(shù)據(jù)的訪問。設(shè)備代碼還采用OpenCL內(nèi)建函數(shù),加速了立方根等數(shù)值計算函數(shù),這顯著地降低了處理器時間。軟件優(yōu)化了數(shù)據(jù)的存儲布局,降低了讀寫數(shù)據(jù)次數(shù)。部分優(yōu)化方法的說明可參考文獻(xiàn)[7-8]。在異構(gòu)加速方面,軟件創(chuàng)建了兩個命令隊列,分別控制OpenCL設(shè)備完成圖像處理和主機(jī)與設(shè)備間的數(shù)據(jù)傳輸。相比于單命令隊列控制OpenCL設(shè)備的計算和通信,新做法隱藏了數(shù)據(jù)傳輸,進(jìn)一步提高了每幀數(shù)據(jù)的處理速度。軟件采用了兩個事件對象同步兩個命令隊列。這種方式通過交替地創(chuàng)建和釋放事件對象,有效地避免了不同隊列里的命令在任一個時刻處理同一幀數(shù)據(jù),保證了數(shù)據(jù)一致性。下面分別介紹這些代碼部分的設(shè)計。
2.1 軟件流程設(shè)計和描述
按照OpenCL 1.2標(biāo)準(zhǔn),采用主機(jī)和OpenCL設(shè)備協(xié)作實現(xiàn)AHDDM算法。主機(jī)代碼按照一個指定順序啟動設(shè)備執(zhí)行設(shè)備代碼,完成平臺和設(shè)備信息的獲取、設(shè)備選擇、各種對象創(chuàng)建、主機(jī)和設(shè)備間通信、設(shè)備代碼的輸入?yún)?shù)配置和資源釋放。設(shè)備完成圖像處理計算,對輸入數(shù)據(jù)進(jìn)行插值和濾波,得到重建結(jié)果。在圖像處理中,水平/豎直方向插值、homogeneity計算、中值濾波和色彩空間轉(zhuǎn)換需要大量運(yùn)算。下面概略地介紹這些算法步驟。
2.1.1 插值
對于一幅輸入圖像,AHDDM算法用一個像素的周邊像素值分布估計出該點缺失的信息,對水平插值和豎直插值結(jié)果進(jìn)行了選擇性組合。水平插值過程是:(1)求像素RGB值的和,存于矩陣X中;(2)在處理G通道時,對應(yīng)于G Mask的像素取矩陣X的值,對應(yīng)于R/B Mask的像素取矩陣X水平方向的鄰近4個值的加權(quán)平均;(3)在處理R和B通道時,輸出像素取以其為中心的3×3窗口內(nèi)所有R/B Mask像素的平均值。豎直插值過程是:除G通道R/B Mask下的像素取矩陣X豎直方向的最近4個值的計算結(jié)果以外,其余與水平插值相同。
2.1.2 計算Homogeneity矩陣
該算法將水平插值和豎直插值得到的圖像轉(zhuǎn)換成LAB格式,并求出這兩張LAB圖像的亮度差和色彩差。隨后根據(jù)這兩個差值矩陣,OpenCL設(shè)備計算出水平插值和豎直插值的同質(zhì)矩陣Hx和Hy;接著對這兩個矩陣?yán)锏臄?shù)據(jù)進(jìn)行平滑處理。根據(jù)平滑結(jié)果,OpenCL設(shè)備合并水平插值圖像和豎直插值圖像,每個像素的取值判據(jù)是選擇其在Hx/Hy較大的像素值。
2.1.3 中值濾波
合并后的插值圖像需要進(jìn)行中值濾波,以保證重建質(zhì)量。在R和B通道,每個像素取其相鄰的8個像素的中值濾波結(jié)果;在G通道里,每個像素取其上下左右4個相鄰的像素的中值濾波結(jié)果。中值計算需先將輸入的數(shù)據(jù)按照升序或降序排列,再輸出中間位置上的那個數(shù)值。當(dāng)輸入奇數(shù)個數(shù)據(jù)時,計算結(jié)果將是排序后的序列中間的數(shù)據(jù);當(dāng)輸入偶數(shù)個數(shù)據(jù)時,計算結(jié)果將是排序后的序列中間的兩個數(shù)據(jù)的平均值。自適應(yīng)算法用兩次中值濾波,以得到較好的濾波效果。
2.1.4 色彩空間轉(zhuǎn)換
RGB和CIELAB是常用的顏色空間。RGB便于建模物理設(shè)備的輸出,但不適合描述人類視覺感知。CIELAB具有視覺上的均勻性,接近于人類的視覺感知,即色彩值的變化和視覺感知到的變化程度是一致的[9]。RGB和CIELAB之間的色彩值轉(zhuǎn)換需要分兩步進(jìn)行,即先規(guī)范化RGB值到0~1之間,用XYZ顏色空間作中間層;再用一組非線性變換得到CIELAB值[10]。
轉(zhuǎn)換公式顯示CIELAB轉(zhuǎn)換需要浮點型運(yùn)算,雖然可截取浮點計算結(jié)果的整數(shù)部分換取計算速度的增加,但是損失了計算精度。因為RGB轉(zhuǎn)換CIELAB需要較多的數(shù)值計算,所以快速轉(zhuǎn)換是OpenCL代碼設(shè)計的一個重點。本文用一個3×3矩陣和一個1×3向量的浮點乘法實現(xiàn)規(guī)范化計算,用OpenCL 1.2標(biāo)準(zhǔn)的內(nèi)建立方根等函數(shù)實現(xiàn)非線性數(shù)值計算,用三元運(yùn)算符而不是條件指令加快非線性轉(zhuǎn)換中的流程控制。
2.2 并行圖像處理和數(shù)據(jù)通信
本文用單個命令隊列實現(xiàn)單幅圖像的插值處理,用兩個命令隊列處理一個幀序列,隱藏了數(shù)據(jù)傳輸時間。代碼采用任務(wù)并行的方式,同步地完成圖像處理和數(shù)據(jù)通信。主機(jī)代碼用一個命令隊列里的命令啟動OpenCL設(shè)備執(zhí)行設(shè)備代碼,用另一個命令隊列中的命令去控制設(shè)備內(nèi)存和主機(jī)內(nèi)存之間的數(shù)據(jù)通信。系統(tǒng)使用兩個事件對象同步兩個命令隊列的命令,通過交替地監(jiān)測兩個事件對象建立和釋放的返回值,安排兩個命令隊列中的命令讀寫不同的存儲位置,免除了兩個隊列里的命令讀寫相同的存儲位置。
2.3 存儲空間配置
根據(jù)算法流程,在開始插值計算前,需鏡像擴(kuò)展原始圖像的邊緣部分。其次,一些計算步驟訪問多個相鄰的像素,這需要條件指令限定并行線程的處理范圍,否則邊緣像素的重建結(jié)果將會有明顯偏差。軟件采取了圖像補(bǔ)零法,填補(bǔ)寬度是各步驟的最大補(bǔ)零長度,這利于合并掉一些條件指令,減少計算時間。如果原始圖像的尺寸是M×N,鏡像擴(kuò)展圖像的尺寸是H×W,則輸入和輸出圖像的尺寸是M×N,中間結(jié)果的尺寸均是(H+2×P)×(W+2×P),其中P是補(bǔ)零寬度,取2和delta(homogeneity函數(shù)的參數(shù))的最大值。在本文的實驗中,delta默認(rèn)取值為3,所以P取delta值。最后,代碼將擴(kuò)展圖像的寬度和高度取為16的整數(shù)倍,以提高數(shù)據(jù)訪問效率。在實驗中,原始圖像和重建圖像的尺寸是1 920×1 080像素,中間結(jié)果是1 952×1 104像素。
3 實驗及討論
本文的異構(gòu)計算平臺的配置如下:硬件平臺由AMD Bald Eagle和AMD FirePro W8100[11](或ES8950 MXM)組成,軟件開發(fā)環(huán)境是Win7、AMD Catalyst 13.11以上版本和AMD APP SDK 2.8[12],編程語言及版本號是VC2010和OpenCL 1.2 C。圖4是原始RGB圖像、模擬數(shù)據(jù)和插值重建圖像。三幅圖像的尺寸均為1 920×1 080像素,有3個圖像通道。按照Bayer模式,對原始圖進(jìn)行采樣得到模擬圖,模擬圖偏綠。對比原始圖像和重建結(jié)果,可看出重建結(jié)果非常接近于原始圖像,而且差別很小。該異構(gòu)平臺的重建圖像與CPU代碼的計算結(jié)果不存在明顯差異,區(qū)域交界處的虛假色塊和拉鏈等失真被抑制和消除,細(xì)節(jié)得到了保留。
在Intel i7平臺上,該算法的MATLAB代碼的運(yùn)行時間約為7 s。圖5是 FirePro W8100的一段工作時序,顯示了兩個命令隊列的運(yùn)行情況,其中Queue0 和Queue1分別對應(yīng)于數(shù)據(jù)處理命令隊列和通信命令隊列。該圖顯示出交疊的數(shù)據(jù)通信和數(shù)據(jù)處理命令節(jié)省了GPU計算時間。AMD Bald Eagle APU處理器集成有X86 CPU內(nèi)核和GPU內(nèi)核,但其GPU核的計算單元數(shù)量遠(yuǎn)小于W8100的計算單元數(shù)量。因為用一個命令隊列完成數(shù)據(jù)通信和執(zhí)行處理算法,所以該GPU核大約用67 ms完成單幅圖像的去馬賽克處理,如圖6所示。表1列出了W8100處理各步驟的耗時,總和約為6.22 ms,因為設(shè)備啟動命令需要時間,所以每一幅圖像的插值處理大約用8.6 ms。兩種工作時序的對比顯示出多命令隊列方式能更高效地使用OpenCL設(shè)備的計算資源。
除了上述的代碼優(yōu)化方法以外,OpenCL代碼仍有進(jìn)一步提升性能的方式,如使用三維查找表插值法提高RGB值轉(zhuǎn)換為CIELAB值的速度。
4 小結(jié)
按照OpenCL 1.2標(biāo)準(zhǔn),本文開發(fā)了自適應(yīng)去馬賽克并行代碼,在AMD Bald Eagle和AMD FirePro W8100 GPU組成的異構(gòu)系統(tǒng)上進(jìn)行了驗證。AMD FirePro W8100能滿足100 f/s的圖像處理,圖像尺寸達(dá)到了1 920×1 080像素,每個像素有RGB值。本文的實驗證明異構(gòu)計算是一種適于高清影像和大尺幅圖像處理的有效方案。
參考文獻(xiàn)
[1] LI X.Image demosaicking:a systematic survey[C].Proc.of SPIE Electronic Imaging Conference,2008.
[2] HIRAKAWA K.Adaptive homogeneity-directed demosaicing algorithm[J].IEEE Trans.on Image Processing,2005,14(3):360-369.
[3] HSA Foundation.Heterogeneous system architecture:A technical review presentation[EB/OL].(2012)[2015].Available:http://www.slideshare.net/hsafoundation/hsa10-whitepaper.
[4] AMD Inc.AMD and HSA:A new era of vivid digital experiences website[EB/OL].(2013)[2016].Available:http://www.amd.com/us/products/technologies/hsa/Pages/hsa.aspx#1.
[5] AMD Inc.AMD Graphics Cores Next(GCN) architecture[EB/OL].(2012)[2016].Available:http://www.amd.com/jp/Documents/GCN Architecture whitepaper.pdf.
[6] Khronos OpenCL Working Group.The OpenCL specification 1.2[EB/OL].(2011)[2016].Available:http://www.khronos.org/registry/cl/specs/opencl-1.2.pdf.
[7] MUNSHI A.OpenCL programming guide for optimization techniques[M].Addison-Wesley Professional,2011.
[8] AMD Inc.ATI streaming SDK OpenCL programming guide 4.2[EB/OL].(2013)[2016].Available:http://developer.amd.com/wordpress/media/2013/07/AMD_Accelerated_Parallel_Processing_OCL_Programming_Guide-2013-06-21.pdf.
[9] BILLMEYER F W,SALTZMAN J M.Principles of color technology[M].2nd ed.,John Wiley & Sons,Inc.,New York,1981.
[10] SCHALLER N C.Color conversion algorithms[EB/OL].(2015)[2016].Available:http://www.cs.rit.edu/~ncs/color/t_convert.html.
[11] AMD Inc.FirePro datasheet[EB/OL].(2015)[2016].Available:http://www.amd.com/Documents/FirePro-W8100-Data-Sheet.pdf.
[12] AMD Inc.AMD accelerated parallel processing software development Kit[EB/OL].(2016)[2016].Available:http://developer.amd.com/sdks/amdappsdk/.