Learning convolutional networks for content-weighted image compression
發表在2018年CVPR。
以下對於一些專業術語的翻譯可能有些問題。
摘要
-
有損壓縮是一個優化問題,其優化目標是率失真,優化對象是編碼器、量化器和解碼器(同時優化)。
Lossy image compression can be formulated as a joint rate-distortion optimization to learn encoder, quantizer, and decoder.
-
其中,量化器和離散熵預測(discrete entropy estimation)是不可差分的,因此要將壓縮系統用CNN替換是很困難的。
-
作者認為,我們可以根據圖像的局部內容,來決定圖像中每一個區域的重要性,從而控制每一個區域的碼率分配,從而替換掉離散熵估計。
-
此外,作者還采用了一個二元機(binarizer)來實現量化功能。為了讓二元機在BP過程中可差分,作者引入了一個代理函數(proxy function),在BP中代替二元操作。
-
此時,編碼器、解碼器、二元機和權重圖是可以端到端優化的。
-
為了實現無損壓縮,作者還引入了卷積熵編碼器。
-
實驗發現,在低碼率圖像壓縮條件下,算法的SSIM指標超過了JPEG和JPEG 2000。
故事要點
-
一個圖像壓縮系統通常需要包括以下三個組分:編碼器(encoder),量化器(quantizer)和解碼器(decoder)。這才能組成一個編解碼器(codec)。
-
JPEG和JPEG 2000為什么不夠好呢【有哪些提升空間呢】?首先,它們都依賴於主觀設計的圖像變換方法,並且需要對各組分獨立優化。從效果上,在低碼率壓縮時二者表現都很差,會產生模糊、振鈴和塊效應等。
-
CNN為什么有取而代之的潛力呢?因為:復雜的非線性分析和生成變換過程,都可以用幾層CNN實現。此外,CNN結構還可以讓編碼器和解碼器聯合優化。
-
盡管基於深度學習的工作很多,但仍有許多問題亟待解決。首先,我們如何解決量化器的不可差分特性?其次,由於我們的學習目標是 同時最小化 壓縮率和失真,因此我們要衡量熵率(entropy rate)。如何 連續地近似 用離散碼元定義的 離散熵率?
-
因此,本文的目標就是解決(1)量化和(2)熵率預測問題。
-
現有的深度學習方法,為每一個位置都分配相同長度的碼元。顯然,局部信息量(local informative content)是空域變化的,因此比特率也應該是空域變化的。因此作者提出了一個基於內容權重的重要性圖(content-weighted importance map)。其輸出一個與輸入同尺寸的圖。每一個點的值是一個非負數值,指示編碼長度。此時,重要性圖各點求和,就可以作為壓縮率的連續預測,進而作為壓縮率控制器。此時,我們就不再需要預測熵率了。
-
二元機很簡單:首先對特征圖取sigmoid函數,輸出大於0.5的則歸為1,否則為0。在反向傳播時,該二元機被一個代理函數近似。
-
此時,整體網絡就可以聯合優化。如圖:
-
注意:在傳統方法中,編碼是基於上下文(context)的。為此,作者采用了[14]提出的基於上下文的自適應二進制算術編碼方法CABAC,進一步壓縮二進制碼元和重要性圖。
本來我是想看一看重要性圖怎么生成的。看到上圖就知道了,就是簡單的CNN網絡。因此方法沒再細看。
以我的經驗,這種方案最難的是訓練。我們直接看看作者怎么訓練的。
模型訓練
前面提到了,我們要同時最小化壓縮率和失真。因此損失函數設為兩個加權組合:
其中,MSE是從解碼器解碼出來的圖像,與原圖像的\(L_2\)范數。R是碼率損失。作者設置了一個閾值\(r\),若重要性圖的求和大於\(r\),則損失為和;否則為0。總的損失是batch中每一張圖像損失的總和。
在實際訓練時,作者先拋開重要性圖,讓編碼器解碼器主體先收斂;然后按三個階段訓練,學習率分別是\(1e^{-4}\)、\(1e^{-5}\)和\(1e^{-6}\)。每個階段都訓練到損失函數不再下降為止。
\(\gamma\)和\(r\)根據需要可調。