寫在文章前面,剛剛發現有不少小夥伴收藏轉發了咱們的圖片簡史,因此我就又來了,今天給你們帶來的是辦公室另外一位大牛寫的關於圖片壓縮和深度學習的文章。但願你們喜歡哈~算法
說到圖像壓縮算法,最典型的有JPEG、JPEG2000等。微信
而其中JPEG 採用的是以離散餘弦轉換(Discrete Cosine Transform) 爲主的區塊編碼方式(如圖2)。JPEG2000改用以小波轉換(Wavelet Transform) 爲主的多解析編碼方式。小波轉換的主要目的是將圖像的頻率成分抽取出來。網絡
在有損壓縮下,JPEG2000一個比較明顯的優勢是沒有JPEG壓縮中的馬賽克失真效果。JPEG2000的失真主要是模糊失真。模糊失真產生的主要緣由是高頻量在編碼過程當中必定程度的衰減。在低壓縮比情形下(好比壓縮比小於10:1),傳統的JPEG圖像質量有可能比JPEG2000好。JPEG2000在高壓縮比的情形下,優點纔開始明顯。框架
總體來講,和傳統的JPEG相比,JPEG2000仍然有很大的技術優點,一般壓縮性能大概能夠提升20%以上。通常在壓縮比達到100:1的情形下,採用JPEG壓縮的圖像已經嚴重失真並開始難以識別了,但JPEG2000的圖像仍可識別。函數
深度學習技術設計壓縮算法的目的性能
用深度學習技術設計壓縮算法的一個目的是學習一個比離散餘弦變換或小波變換更優的變換,同時用深度學習技術也能夠設計更簡潔的端到端算法,這樣能夠設計出比JPEG2000等商用算法性能更優的算法。學習
在圖片或視頻壓縮領域,使用最多的深度學習技術是卷積神經網絡(CNN),先簡單介紹卷積神經網絡。如圖3所顯示,像搭積木同樣,一個卷積神經網絡能夠由卷積、池化、非線性函數、歸一化層等模塊組成。最終的輸出根據應用而定,如在人臉識別領域,咱們能夠用它來提取一串數字(專業術語稱爲特徵)來對一幅人臉圖片進行表示。而後能夠經過比較特徵的異同,來進行人臉識別。優化
那如何利用卷積神經網絡作壓縮?如圖4所示,完整的框架包括CNN編碼網絡、量化、反量化、CNN解碼、熵編碼等幾個模塊。編碼網絡的做用是將圖片轉換爲壓縮特徵,解碼網絡就是從壓縮特徵恢復出原始圖片。其中編碼網絡和解碼網絡,能夠用卷積、池化、非線性等模塊進行設計和搭建。編碼
如何評判壓縮算法.net
在深刻技術細節前,咱們先來了解一下如何評判壓縮算法。評判一個壓縮算法好壞的重要指標有兩個:一個是每一個像素佔據的比特位數(bit per pixel, BPP),一個是PSNR。咱們知道,數據在計算機中以比特形式存儲,所須要的比特數越多,則佔據的存儲空間越大。BPP用於表示圖像中每一個像素所佔據的比特數,如一張RGB三通道圖,表示每一個像素須要消耗24個比特。PSNR用來評估解碼後圖像的恢復質量,簡單理解就是PSNR越高,恢復質量越好。
咱們舉個例子,假設長寬爲768512的圖片大小爲1M,咱們利用深度學習技術對它編碼,經過編碼網絡後產生包括9664192個數據單元的壓縮特徵數據,若是表示每一個數據單元平均須要消耗1個比特,則編碼整張圖須要9664192個比特。通過壓縮後,編碼每一個像素須要的比特數爲(9664192)/(768512)=3,因此BPP值爲3bit/pixel,壓縮比爲24:3=8:1。這意味着一張1M的圖,經過壓縮後只須要消耗0.125M的空間,換句話說,以前只能放1張照片的空間,如今能夠放8張。
如何用深度學習作壓縮
談到如何用深度學習作壓縮,仍是用剛纔那個例子。將一張大小768512的三通道圖片送入編碼網絡,進行前向處理後,會獲得佔據9664192個數據單元的壓縮特徵。有計算機基礎的讀者可能會想到,這個數據單元中可放一個浮點數,整形數,或者是二進制數。那問題來了,到底應該放入什麼類型的數據?從圖像恢復角度和神經網絡原理來說,若是壓縮特徵數據都是浮點數,恢復圖像質量是最高的。但一個浮點數佔據32個比特位,那以前講的比特數計算公式變爲(966419232)/(768*512)=96,壓縮後反而每一個像素佔據比特從24變到96,非但沒有壓縮,反而增長了,這是一個糟糕的結果,很顯然浮點數不是好的選擇。
因此爲了設計靠譜的算法,咱們使用一種稱爲量化的技術,它的目的是將浮點數轉換爲整數或二進制數,最簡單的操做是去掉浮點數後面的小數,浮點數變成整數後只佔據8比特,則,表示每一個像素要佔據24個比特位。與之對應,在解碼端,可使用反量化技術將變換後的特徵數據恢復成浮點數,如給整數加上一個隨機小數,這樣能夠必定程度上下降量化對神經網絡精度的影響,從而提升恢復圖像的質量。
即便壓縮特徵中每一個數據佔據1個比特位,但是8:1的壓縮比在咱們看來並非一個很理想的結果。那如何進一步優化算法?咱們再看下BPP的計算公式。假設每一個壓縮特徵數據單元佔據1個比特,則公式可寫成:,計算結果是3bit/pixel,從壓縮的目的來看,BPP越小越好。在這個公式中,分母由圖像決定,咱們能夠調整的部分在分子,分子中9六、6四、192這三個數字與網絡結構相關。很顯然,當咱們設計出更優的網絡結構,這三個數字就會變小。
那1與哪些模塊相關?1表示每一個壓縮特徵數據單元平均佔據1個比特位,量化會影響這個數字,但它不是惟一的影響因素,它還與碼率控制和熵編碼有關。碼率控制的目的是在保證圖像恢復質量的前提下,讓壓縮特徵數據單元中的數據分佈儘量集中,出現數值範圍儘量小,這樣咱們就能夠經過熵編碼技術來進一步下降1這個數值,圖像壓縮率會進一步提高。
用深度學習作視頻壓縮,能夠看做是在深度學習圖片壓縮的基礎上擴展,可結合視頻序列幀間的光流等時空信息,在單張壓縮的基礎上,進一步下降碼字。
總結
總的來講,用深度學習來設計視頻和圖像壓縮算法是個很是具備前景但也是很是具備挑戰性的技術。目前,其已經在人臉識別等領域證實了它的強大能力,有理由相信在不久的未來,深度學習技術將爲圖像視頻壓縮領域帶來更大的突破。現階段咱們公司自主研發的算法已經超過商用的JPEG2000。 如圖6和圖7
關注圖鴨微信公衆號(微信搜索:tucodec) 聯繫咱們