文獻(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個獨立的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)獨立于硬件的軟件開發(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/.