姓名:李濤
學(xué)號:17021211100
轉(zhuǎn)載自http://mp.weixin.qq.com/s/ENR1M29Cu0QbmHTciIHsVA有修改
【嵌牛導(dǎo)讀】:FPGA在圖像處理中的應(yīng)用。
【嵌牛鼻子】:FPGA;
【嵌牛提問】:FPGA如何入門?
【嵌牛正文】:
“No PP赂乐,No WAY”這是個眼見為實的世界惕澎,這是個視覺構(gòu)成的信息洪流的世界鳖宾。大腦處理視覺內(nèi)容的速度比文字內(nèi)容快6萬倍掀亩,而隨著智能手機(jī)的普及卢鹦,圖片悄泥、視頻的產(chǎn)生和分享已經(jīng)是人們在社交平臺上的基本交流方式虏冻。用戶通過手機(jī)、平板弹囚、電腦上傳和分享自己的圖片厨相,而且這個趨勢是每年都在增長(參見圖1)。
圖1.? 2016年KPCB統(tǒng)計報告[1]
每天QQ相冊、微信朋友圈上领铐,用戶上傳的圖片數(shù)量有上億張悯森,這些圖片被后臺服務(wù)器存儲下來,再通過網(wǎng)絡(luò)分發(fā)出去绪撵。如果每張圖片可以進(jìn)行壓縮瓢姻,使得圖片存儲和傳輸分發(fā)的數(shù)據(jù)量越少,既節(jié)省了用戶帶寬音诈,也提高了用戶下載圖片的速度幻碱,用戶體驗更好。那么圖片是可以進(jìn)行壓縮的么细溅?1948年褥傍,信息論學(xué)說的奠基人香農(nóng)曾經(jīng)論證:不論是語音或者圖片,由于其信號中包含很多的冗余信息喇聊,所以可以對其進(jìn)行壓縮恍风。圖像壓縮算法有:JPEG、WEBP誓篱、H264(幀內(nèi)壓縮)朋贬、HEVC(幀內(nèi)壓縮),壓縮能力是:JPEG < WEBP/H264(幀內(nèi)壓縮) < HEVC(幀內(nèi)壓縮)窜骄,這個壓縮能力是通過計算復(fù)雜度的提高來實現(xiàn)锦募,其中WEBP、HEVC的計算復(fù)雜度是?JPEG?壓縮的?10?倍以上邻遏。目前在社交平臺上用戶上傳的大量圖片是JPEG格式糠亩,通過后臺服務(wù)器用更加復(fù)雜的算法如WEBP、HEVC(幀內(nèi)壓縮)准验,進(jìn)一步壓縮以節(jié)省存儲和帶寬赎线,所以對圖像的壓縮,從本質(zhì)上是通過提高計算算力來降低存儲和帶寬糊饱。同時更加復(fù)雜的算法也帶來計算算力的大量消耗和處理延時的增加氛驮。
從業(yè)務(wù)角度來看,對于離線業(yè)務(wù)济似,可以通過業(yè)務(wù)在波峰和波谷之間閑置的計算算力進(jìn)行圖片轉(zhuǎn)碼處理;但對于在線業(yè)務(wù)盏缤,圖片轉(zhuǎn)碼處理對于處理延時的要求就會有較高要求砰蠢,為了滿足處理延時的要求,有時候會先進(jìn)行圖片轉(zhuǎn)碼處理唉铜,把轉(zhuǎn)碼好的圖片存儲下來台舱,當(dāng)用戶需要的時候直接傳輸,這樣通過消耗存儲資源為代價來解決處理延時的要求。但是這又帶來一個新問題竞惋,用戶查看圖片的智能終端屏幕大小不一柜去,如果都傳同樣大小的圖片,顯然不是最優(yōu)拆宛。最優(yōu)處理方法還是能夠通過計算算力嗓奢,實時進(jìn)行圖片轉(zhuǎn)碼處理。
在數(shù)據(jù)中心里面浑厚,計算算力通常由x86 CPU來提供股耽,以前的x86 CPU性能每18個月就能翻倍(眾所周知的“摩爾定律”),但目前工業(yè)界的發(fā)展方向是摩爾定律已經(jīng)走到終點钳幅。例如物蝙,2016年3月24日,英特爾宣布正式停用“工藝年-架構(gòu)年(Tick-Tock)”處理器研發(fā)模式敢艰,未來研發(fā)周期將從兩年周期向三年期轉(zhuǎn)變诬乞。而國際半導(dǎo)體技術(shù)發(fā)展路線圖(International Technology Roadmap for Semiconductors,簡寫 ITRS)在維持了數(shù)十年钠导,每兩年更新一次震嫉,為全世界半導(dǎo)體行業(yè)提供建議和規(guī)劃指南,也在2016年宣布不再做進(jìn)一步的更新辈双。
一方面處理器性能再無法按照摩爾定律進(jìn)行增長责掏,另一方面數(shù)據(jù)增長對計算性能要求超過了按“摩爾定律”增長的速度。處理器本身無法滿足高性能計算(HPC:High Performance Compute)應(yīng)用軟件的性能需求湃望,導(dǎo)致需求和性能之間出現(xiàn)了缺口(參見圖2)换衬。
圖 2. 計算需求和計算能力的缺口發(fā)展形式
圖像處理解決方案
圖片服務(wù)支持的能力豐富多樣,基礎(chǔ)功能包括多種縮略剪裁方式证芭、文字圖片水印瞳浦、格式轉(zhuǎn)換、斷點續(xù)傳废士、鏡像存儲叫潦、防盜鏈等。我們結(jié)合當(dāng)前圖文時代的用戶需求官硝,提供圖片的上傳矗蕊、存儲、處理氢架、分發(fā)的全方位一體化的解決方案傻咖。目前,互聯(lián)網(wǎng)圖片服務(wù)的解決方案中落地存儲和下載大部分圖片格式還是JPEG/WEBP岖研,但隨著新的編碼標(biāo)準(zhǔn)HEVC的出現(xiàn)卿操,在同等圖像質(zhì)量下,HEVC的壓縮效率會比JPEG/WEBP好30%~70%,可以節(jié)省大量的存儲和帶寬害淤,但是HEVC的算法復(fù)雜度高導(dǎo)致CPU的編碼延遲和吞吐在線上環(huán)境中無法滿足扇雕,因此,我們開發(fā)了基于FPGA的新的解決方案窥摄。FPGA圖像處理方案可以很好的解決線上環(huán)境的需求镶奉,當(dāng)然,F(xiàn)PGA圖像處理解決方案也兼容當(dāng)前用戶線上系統(tǒng)的WEBP等其他圖像轉(zhuǎn)碼格式溪王,可以很好的適應(yīng)不同用戶的需求腮鞍,提供低延遲,高吞吐莹菱,低成本的解決方案移国。
我們以HEVC FPGA 圖像處理為例,來說明在互聯(lián)網(wǎng)業(yè)務(wù)中圖片上傳道伟,存儲迹缀,處理和下載的架構(gòu)。
圖3. HEVC FPGA 圖片上傳存儲蜜徽,處理祝懂,下載解決方案
如圖3所示,圖片HEVC FPGA轉(zhuǎn)碼的部署主要是落地存儲前以及下載前的轉(zhuǎn)碼服務(wù)器拘鞋,使用FPGA做轉(zhuǎn)碼主要有以下優(yōu)勢:
FPGA轉(zhuǎn)碼落地存儲HEVC砚蓬,可有效節(jié)省存儲成本。
FPGA轉(zhuǎn)碼服務(wù)器和CPU轉(zhuǎn)碼相比可以降低服務(wù)器成本盆色。
FPGA轉(zhuǎn)碼HEVC圖片和CPU相比吞吐量可以大大提高灰蛙。
在下載時實時生成HEVC圖片,使用FPGA進(jìn)行圖片轉(zhuǎn)碼加速隔躲,會大大降低轉(zhuǎn)碼延遲摩梧,提高用戶體驗。
圖像編碼算法分析
在圖像和視頻編解碼算法中宣旱,各個模塊都是基于像素級運(yùn)算或者基于塊操作仅父,而且針對各個像素或者圖像塊的操作是相同和重復(fù)的。早期的圖片壓縮標(biāo)準(zhǔn)JPEG和JPEG200浑吟,原始圖像首先經(jīng)過基于塊的DCT變換或者小波變換笙纤,變換后的系數(shù)經(jīng)過量化后再進(jìn)行熵編碼(包括Huffman編碼或者自適應(yīng)算術(shù)編碼),進(jìn)而輸出壓縮后的碼流信息组力。在解碼端粪糙,通過反向操作,可將碼流信息進(jìn)行解碼忿项。在JPEG2000中,DCT變換被小波變換替代,可以更好的消除圖像塊內(nèi)的冗余性轩触,而且量化后的系統(tǒng)按照比特位平面進(jìn)行自適應(yīng)算術(shù)編碼寞酿,可以達(dá)到更好的壓縮性能。
除了JPEG這類對原始圖像直接變換的方法脱柱,還有一種是基于塊預(yù)測的方法伐弹。也就是對一個圖像塊先進(jìn)行預(yù)測,原始圖像塊和預(yù)測塊的殘差再進(jìn)行變換榨为,量化和編碼惨好。比較典型標(biāo)準(zhǔn)就是從H.264的幀內(nèi)預(yù)測發(fā)展而來的WebP。隨著新一代視頻編碼標(biāo)準(zhǔn)HEVC/H.265的推出随闺,其幀內(nèi)編碼的壓縮性能日川,較上一代標(biāo)準(zhǔn)提升接近一倍[2]。因此矩乐,將HEVC的幀內(nèi)編碼用于圖像壓縮也成為一種趨勢龄句。HEVC的幀內(nèi)編碼過程如圖4所示。
圖4. HEVC幀內(nèi)編碼的過程
在HEVC中散罕,塊劃分的方式是基于非完全四叉樹結(jié)構(gòu)分歇,這更適用于不同的圖像場景。每一個最終確定大小的塊只需要一個獨立的預(yù)測模式欧漱。圖5是HEVC圖片編碼中塊劃分和預(yù)測模式的一個例子职抡。可以看出當(dāng)一個塊可以通過單獨的某一個角度進(jìn)行預(yù)測的時候误甚,則不需要劃分為更小的塊缚甩。而場景信息較為復(fù)雜區(qū)域則需要劃分為較小的塊。編碼器的一項重要任務(wù)靶草,就是尋找最佳的塊劃分方式和最優(yōu)的預(yù)測角度蹄胰。
圖5. HEVC圖片編碼塊劃分及預(yù)測模式
圖6(a) 就是根據(jù)最終的塊劃分方式和預(yù)測模式得到的預(yù)測圖片。預(yù)測圖片和原始圖片的差值(殘差)通過DCT變換奕翔,量化之后裕寨,最終通過熵編碼器輸出。圖片預(yù)測的殘差如圖6(b)所示派继。在解碼器中宾袜,根據(jù)得到的殘差數(shù)據(jù),并進(jìn)行和編碼器相同的預(yù)測驾窟,可以得到最終的重構(gòu)圖片庆猫,圖6(c)所示的就是重構(gòu)數(shù)據(jù)。由于編碼過程需要用到重構(gòu)數(shù)據(jù)作為參考數(shù)據(jù)绅络,因此在編碼器也需要進(jìn)行重構(gòu)的過程月培。原始圖片如圖6(d)所示嘁字,可以看出,重構(gòu)的圖片和原始圖片損失非常小杉畜。
圖6. HEVC圖片編碼過程中的預(yù)測纪蜒,殘差,重構(gòu)以及原始數(shù)據(jù)
在HEVC的幀內(nèi)編碼中此叠,由于要進(jìn)行最佳編碼模式的搜索纯续,造成編碼器的計算復(fù)雜度高。傳統(tǒng)的CPU無法達(dá)到理想的吞吐量∶鹪現(xiàn)在的GPU雖然也大量應(yīng)用的圖片和視頻領(lǐng)域猬错,然而GPU的并行化更適用的是各個像素點進(jìn)行相同操作,完成之后再進(jìn)行下一步的并行化操作茸歧。這并不利于HEVC圖片編碼各個模塊控制較為復(fù)雜的情況倦炒。在Nvidia的GPU中,圖片和視頻編解碼也采用的專用的芯片來處理举娩。而FPGA可以實現(xiàn)各個不同的模塊的流水化運(yùn)算析校,實現(xiàn)時間上的并行。同時铜涉,由于只是進(jìn)行幀內(nèi)編碼智玻,不同圖像之間是相互獨立的,在FPGA中也可以設(shè)計多路的編碼器芙代,對不同的圖片進(jìn)行并行的編碼壓縮吊奢。
當(dāng)然,對于基于塊預(yù)測的圖像編碼方法纹烹,也存在一些限制FPGA并行化實現(xiàn)因素页滚。但是,這些受到限制的部分铺呵,也可以通過FPGA設(shè)計的特點來解決裹驰。例如,如圖4所示片挂,幀內(nèi)預(yù)測的參考點需要通過重構(gòu)的方法得到幻林,這就增加了不同塊之間的依賴性,限制了塊之間的并行化音念,和流水化設(shè)計沪饺。在實際的FPGA設(shè)計中,可以在進(jìn)行預(yù)測模式初選時闷愤,用原始數(shù)據(jù)替代重構(gòu)數(shù)據(jù)作為參考整葡,而在最終編碼時用重構(gòu)數(shù)據(jù)在作為參考數(shù)據(jù)[3]。在FPGA的實現(xiàn)過程中讥脐,也可以更改掃描順序遭居,優(yōu)先處理那些有依賴關(guān)系的像素點啼器。此外,在自適應(yīng)熵編碼部分魏滚,由于存在更新碼表和更新概率估計的過程镀首,部分比特數(shù)據(jù)進(jìn)行熵編碼時,也存在依賴關(guān)系鼠次。在實際的FPGA設(shè)計過程中,可以通過將這些需要進(jìn)行編碼的數(shù)據(jù)進(jìn)行分組芋齿,將沒有依賴關(guān)系的數(shù)據(jù)分為一組腥寇,同時,通過數(shù)據(jù)緩存觅捆,可以預(yù)先判斷接下來的數(shù)據(jù)是否存在依賴關(guān)系赦役,從而提高熵編碼的吞吐量[4]。
HEVC圖像編碼算法的FPGA實現(xiàn)
FPGA圖像編碼架構(gòu)
目前栅炒,我們圖片業(yè)務(wù)已經(jīng)實現(xiàn)WEBP和HEVC格式的FPGA硬件加速掂摔,下面以HEVC I幀圖像硬件加速舉例,說明圖像編碼在FPGA中是如何實現(xiàn)的赢赊。
FPGA的邏輯架構(gòu)主要包括平臺部分和HEVC編碼器IP部分乙漓,其中FPGA平臺主要包括PCIE DMA以及DDR總線相關(guān)邏輯,這部分邏輯主要實現(xiàn)和host CPU的數(shù)據(jù)通信以及和FPGA板卡上的DDR通信释移。如圖7所示叭披,F(xiàn)PGA架構(gòu)上實例化了4個HEVC core(具體幾個是和FPGA資源有關(guān)),每一個HEVC core完成HEVC編碼算法的完整處理玩讳,這里4核心并行工作涩蜘,也就是同一時刻,4個編碼任務(wù)可以并行工作熏纯,同時輸出4條HEVC碼流同诫。
圖7. FPGA內(nèi)部邏輯架構(gòu)
FPGA內(nèi)部邏輯主要包括:
HEVC CORE 0-3:H265編碼器IP,實現(xiàn)HEVC的編碼算法樟澜;
PCIE/DMA:實現(xiàn)和host CPU進(jìn)行通信误窖;
REGISTER RW/INT:寄存器讀寫以及中斷處理;
HEVC RW ARBITER:總線讀寫仲裁模塊往扔;
AXI INTERCONNECT/DDRC/DDRY: 總線控制訪問DDR邏輯贩猎;
FPGA圖像編碼流程
FPGA HEVC core內(nèi)部算法處理流程如圖8所示:分為當(dāng)前圖像載入,intra預(yù)測初選萍膛,intra預(yù)測精選吭服,CABAC編碼,碼流輸出蝗罗。
圖8. HEVC core內(nèi)部算法處理流程
那么如何設(shè)計HEVC core實現(xiàn)算法功能呢艇棕?這里蝌戒,編碼器模塊流水線設(shè)計成四級流水,如圖9所示沼琉,四級流水CURLD/PINTRA/SEL/CABAC處理性能設(shè)計接近北苟,并行起來后,平均處理每個LCU需要8400個周期打瘪,如果按照1080p圖片一共510個LCU計算友鼻,單核理論上編碼可以達(dá)到編46 幀/s (FPGA電路實現(xiàn)頻率200M),這樣4核并行能達(dá)到184幀/s闺骚。
具體來說彩扔,CURLD完成當(dāng)前圖像的載入邏輯,PINTRA完成intra預(yù)測初選35種模式的遍歷僻爽,得到最優(yōu)的預(yù)測模式虫碉,這級流水算法上做了優(yōu)化,預(yù)測參考像素沒有像傳統(tǒng)方式選擇重構(gòu)像素胸梆,而是選擇當(dāng)前像素做參考像素敦捧,這樣優(yōu)化,使得intra預(yù)測初選可以單獨劃分為一級流水碰镜,和intra預(yù)測精選分開兢卵,使得編碼器整體處理性能增加一倍。SEL完成幀內(nèi)預(yù)測模式精選以及RDO模式選擇洋措,預(yù)測塊大小支持32/16/8济蝉,由于涉及到變換量化等運(yùn)算量大的邏輯,這一級流水是整個編碼器的資源消耗大戶菠发,設(shè)計上在算法上以及邏輯資源消耗上做了權(quán)衡王滤;CABAC模塊完成頭信息的碼流生成以及每個LCU的語法元素和殘差的編碼,并完成碼流的打包輸出滓鸠,這一級流水的主要問題在于CABAC的性能是否足夠快雁乡,從而應(yīng)對QP比較小編碼更多bin的處理及時。
圖9. 運(yùn)算模塊流水線
性能和收益
用FPGA完成JPEG格式圖片轉(zhuǎn)成HEVC格式圖片糜俗,圖片分辨率大小為1920x1080踱稍,F(xiàn)PGA處理延時相比CPU降低7倍,F(xiàn)PGA處理性能是CPU機(jī)器的10倍悠抹,F(xiàn)PGA機(jī)型單位性能成本是CPU機(jī)型的1/3(參見圖10)珠月。
圖10.圖片轉(zhuǎn)碼FPGA和CPU對比
總之,圖片算法的FPGA實現(xiàn)楔敌,如果不考慮FPGA資源啤挎、硬件實現(xiàn)架構(gòu)和處理性能,CPU圖像壓縮算法可以完全在FPGA進(jìn)行“復(fù)制”實現(xiàn)卵凑,F(xiàn)PGA算法壓縮性能可以完全等同CPU庆聘。但是現(xiàn)實沒那么理想胜臊,F(xiàn)PGA算法實現(xiàn)要統(tǒng)一考慮FPGA性能,資源伙判,算法實現(xiàn)復(fù)雜度等要素象对,只有聯(lián)合設(shè)計才能設(shè)計出最優(yōu)秀的方案,為了發(fā)揮FPGA硬件實現(xiàn)的速度優(yōu)勢宴抚,算法進(jìn)行優(yōu)化是必須要做的勒魔,綜合考慮各方面,我們在實際應(yīng)用中菇曲,往往FPGA的算法實現(xiàn)要做一些“讓步”沥邻。另外,某種型號的FPGA一旦被選定羊娃,它的運(yùn)算以及布線資源往往有個理論值,算法的實現(xiàn)同時要考慮FPGA資源的利用情況埃跷,如何能在相同的FPGA資源上實現(xiàn)最好的壓縮算法成為設(shè)計的難點蕊玷。我們用FPGA進(jìn)行算法實現(xiàn)的目標(biāo)-----實現(xiàn)算法性能盡量接近CPU,圖片處理吞吐量弥雹,以及處理延遲讓CPU望其項背垃帅。