隨著互聯(lián)網(wǎng)技術(shù)和多媒體技術(shù)的快速發(fā)展,多媒體數(shù)據(jù)的傳輸和獲取變得越來越便利,人們對高清晰度視頻圖像畫面的需求日益增長。近年來,視頻圖像的分辨率經(jīng)歷了從720P到1080P再到4K的發(fā)展,4K技術(shù)逐漸進(jìn)入到人們的生活。4K讓人們體驗(yàn)到極致的視覺感受的同時(shí)給硬件及軟件也帶來了更高的挑戰(zhàn),這其中就包括圖像顯示過程中涉及的色彩空間轉(zhuǎn)換的問題。YUV與RGB是最常見的兩種色彩空間模型[1],兩者之間的相互轉(zhuǎn)換在數(shù)字多媒體領(lǐng)域尤為重要。眾所周知,4K分辨率為,長寬比為16:9,標(biāo)準(zhǔn)4K分辨率的像素總數(shù)可達(dá)800萬,為全高清1080P(1920×1080)的4倍,是720P(1280×720)的8倍。如何高效地對高分辨率視頻圖像進(jìn)行色彩空間轉(zhuǎn)換,受到了該領(lǐng)域研究者們的廣泛關(guān)注。
目前,業(yè)界主要使用FFmpeg工具進(jìn)行音視頻的開發(fā)。FFmpeg是一款開源、免費(fèi)、跨平臺且功能強(qiáng)大的音視頻處理工具,其主要利用CPU進(jìn)行音視頻數(shù)據(jù)處理,然而當(dāng)數(shù)據(jù)量非常龐大時(shí),CPU在大規(guī)模矩陣類型的數(shù)值計(jì)算上就顯得力不從心[2]。因此,近些年GPU的迅猛發(fā)展彌補(bǔ)了CPU在這方面的不足。GPU可以用大量的并行線程對大規(guī)模矩陣類型數(shù)值進(jìn)行并行計(jì)算,其和CPU并行工作可以極大的提高音視頻處理的效率。為了測試色彩空間轉(zhuǎn)換在GPU上的工作性能,本文分別基于FFmpeg和CUDA對YUV與RGB色彩空間的轉(zhuǎn)換性能進(jìn)行了對比,實(shí)驗(yàn)結(jié)果表明基于CUDA的色彩空間轉(zhuǎn)換由于利用了大量的GPU并行加速有著更好的性能表現(xiàn)。
常用的色彩空間模型有RGB、YUV/YCrCb、CMYK、HSV等[3]。RGB是計(jì)算機(jī)視覺系統(tǒng)中最常見的色彩空間模型,圖1中的立方體形象的表示了RGB色彩空間。3個(gè)坐標(biāo)軸分別對應(yīng)了紅(Red)、綠(Green)、藍(lán)(Blue)3個(gè)顏色分量。原點(diǎn)對應(yīng)黑色,距離原點(diǎn)最遠(yuǎn)的頂點(diǎn)即為白色。黑色原點(diǎn)與白色頂點(diǎn)之間的連線為灰度線。在計(jì)算機(jī)中,RGB色彩空間的存儲(chǔ)方式有多種,最常見的是R、G、B每個(gè)分量采用8比特即一個(gè)字節(jié)進(jìn)行表示,因此每個(gè)像素占用3個(gè)字節(jié)的內(nèi)存空間,每個(gè)分量的顏色強(qiáng)度為0~255。RGB色彩空間總共能表示約1678萬種色彩,通常也稱為1600萬色或24位色。
圖1 RGB色彩空間模型
人眼對亮度和色彩的感知程度不同,其對色彩細(xì)節(jié)的分辨能力比對亮度細(xì)節(jié)的分辨能力低,根據(jù)這一視覺特性產(chǎn)生了YUV、YCbCr、YIQ等色彩空間。YUV是一種基本的色彩空間,其他的色彩空間均是從YUV衍生而來。YUV色彩空間中的Y分量指圖像的亮度成分,顯示的是灰度圖像,U和V分量為色度成分,描述的是色彩和飽和度。
YUV色彩空間有多種采樣格式,如4:4:4,4:,2:2,4:2:0,4:1:1。4:2:0格式是比較常用的,它的含義是對Y分量進(jìn)行全采樣,對U和V分量在水平和垂直方向上采樣率均為在Y分量上的一半。4:2:0格式的YUV通常是平面存儲(chǔ)格式,其一般是先全部存儲(chǔ)Y分量,然后U和V的分量依次存儲(chǔ)。YUV被廣泛的應(yīng)用于視頻會(huì)議、數(shù)字電視和DVD存儲(chǔ)中,本文主要采用YUV420格式進(jìn)行試驗(yàn)對比。
FFmpeg是一個(gè)集錄制,轉(zhuǎn)換,音、視頻頻編解碼功能為一體的完整的開源免費(fèi)解決方案,它包含了非常先進(jìn)的音頻/視頻編解碼庫libavcodec和用于視頻場景比例縮放、色彩空間轉(zhuǎn)換的libswscale庫[4]。FFmpeg項(xiàng)目的部分組成如表1所示。
表1 FFmpeg項(xiàng)目部分組成成員
FFmpeg采用的是主程序+核心庫的編程模式,核心庫隱藏了內(nèi)部各種具體格式的實(shí)現(xiàn),對外提供統(tǒng)一的調(diào)用方法,這樣主程序就不用去關(guān)注如何調(diào)用與具體格式相關(guān)的函數(shù)。本文采用libswscale庫的sws_scale函數(shù)實(shí)現(xiàn)對視頻圖像的格式轉(zhuǎn)換以作對比。
基于FFmpeg的色彩空間轉(zhuǎn)換完全依賴于CPU的計(jì)算,而CPU是一個(gè)負(fù)責(zé)執(zhí)行復(fù)雜邏輯處理和事務(wù)管理的單元,它并不擅長大規(guī)模矩陣類型的數(shù)值計(jì)算,而GPU恰恰相反,它可以用大量的并行線程進(jìn)行處理,可以很好地彌補(bǔ)CPU的不足。2003年NVIDIA公司推出了CUDA架構(gòu),為GPU通用計(jì)算提供了良好的軟硬件開發(fā)環(huán)境。CUDA可以看做是專為NVIDIA GPU設(shè)計(jì)的C語言開發(fā)環(huán)境,有著豐富的套件,讓開發(fā)人員可以更加專注于自己所開發(fā)的應(yīng)用[5]。
在CUDA程序中,能被GPU執(zhí)行的部分稱作內(nèi)核(Kernel),整個(gè)內(nèi)核由成千上萬條簡單的線程組成,并交由GPU處理,無法并行化的部分交由CPU完成。為了提高線程之間的相互協(xié)作能力同時(shí)節(jié)省顯存帶寬,CUDA將線程分成了線程(thread)、線程塊(block)和線程網(wǎng)格(grid)三個(gè)層次結(jié)構(gòu),圖2展示了三者之間的結(jié)構(gòu)關(guān)系。在同一block里面的線程可以共享內(nèi)存數(shù)據(jù)[6]。
圖2 線程、線程塊、線程網(wǎng)格之間的關(guān)系
YUV色彩空間與RGB色彩空間之間的轉(zhuǎn)化公式如下:
本文利用CUDA進(jìn)行色彩空間轉(zhuǎn)換的核心轉(zhuǎn)換算法代碼如下:
其中,maxlongth為圖像的所有像素長度;color_space_conversion_mat數(shù)組表示色彩空間轉(zhuǎn)換矩陣;blockIdx.x表示線程塊的x索引值;blockDim.x表示線程塊中線程的x維度值;threadIdx.x表示線程的x索引值。
為了更直觀地看到兩種方法在色彩空間轉(zhuǎn)換上的效果,本文分別在不同分辨率下對轉(zhuǎn)換時(shí)間以及轉(zhuǎn)換后的主觀視覺效果進(jìn)行了對比。實(shí)驗(yàn)平臺為64位CentOS7操作系統(tǒng),Intel酷睿i5四核處理器,3.3 GHz主頻,32G內(nèi)存。顯卡為Quadro P2000,5G顯存。表2給出了實(shí)驗(yàn)對比結(jié)果,實(shí)驗(yàn)數(shù)據(jù)均為對十幅圖像進(jìn)行色彩空間轉(zhuǎn)
表2 兩種方法在不同分辨率下的轉(zhuǎn)換時(shí)間對比(ms)
換取均值。CUDA/IO表示加入了CPU與GPU內(nèi)存數(shù)據(jù)交換的時(shí)間(內(nèi)存數(shù)據(jù)交換的時(shí)間主要由總線接口(Bus interface)影響)。從表2可以看出,如果不算內(nèi)存交換時(shí)間,CUDA平臺下,720P、1080P、4K的轉(zhuǎn)換時(shí)間只有0.13 ms、0.26 ms和1.12 ms,比FFmpeg高出十幾倍,然而實(shí)際工程中內(nèi)存交換地?fù)p耗是不可避免的,算入IO時(shí)間,轉(zhuǎn)換時(shí)間則分別上升到了1.18 ms、2.67 ms、10.43 ms,比FFmpeg高出不到兩倍,可想而知,內(nèi)存交換極大的影響了色彩空間轉(zhuǎn)換的效率。從數(shù)據(jù)中還可以分析出隨著分辨率的增加CUDA平臺下的轉(zhuǎn)換效率有上升的趨勢,從側(cè)面說明了利用CUDA進(jìn)行并行計(jì)算在越大的數(shù)據(jù)量下越有優(yōu)勢。
圖3給出了兩種方法在720P分辨率下的peppers圖像和baboon圖像上進(jìn)行色彩空間轉(zhuǎn)換后的主觀視覺效果對比,從圖中可以看出,基于FFmpeg和基于CUDA的兩種方法對圖像轉(zhuǎn)換的主觀視覺與原始圖像基本一致。
圖3 基于ffmpeg和CUDA的色彩空間轉(zhuǎn)換主觀視覺對比(a)peppers圖像(b)baboon圖像
本文分別基于FFmepg和CUDA平臺實(shí)現(xiàn)了對YUV到RGB色彩空間轉(zhuǎn)換的仿真實(shí)驗(yàn),通過實(shí)驗(yàn)數(shù)據(jù)的對比分析,可知利用GPU加速可以大幅提高數(shù)據(jù)處理的工作效率,然而CPU與GPU的內(nèi)存交換損耗則成為了系統(tǒng)瓶頸的關(guān)鍵因素,因此,要想提高工作效率,一是要盡力避免頻繁的內(nèi)存交換;二是選擇更有效的存儲(chǔ)方式;三是使用CUDA內(nèi)存優(yōu)化技巧。無論如何,利用CUDA對大規(guī)模矩陣數(shù)據(jù)并行處理相較于CPU都有著一定的優(yōu)勢。如果總線接口傳輸帶寬問題解決,那么世界將真正迎來計(jì)算時(shí)代新紀(jì)元。