官方開源代碼位址:https://github.com/GuoLusjtu/DVC
DVC是一個端到端的視訊編碼模型,之前也有過一些基于DNN的視訊編碼方法,但是通常是使用DNN模型替換視訊編碼的某個子產品,整體的訓練流程不是端到端的。
DVC将傳統的基于塊的編碼架構的所有子產品都使用神經網絡替換,圖1(a)是傳統的視訊編碼架構,圖1(b)是DVC架構。
圖1
符号定義
表示視訊序列, 是第t幀,
是對應的預測幀,
是重建/解碼幀。
表示殘差,
是殘差的重建/解碼值。
是運動向量,
是對應的重建值。由于編碼過程中還會進行變換量化,
變換的結果為
,
變換結果是
。
DVC架構
運動估計和壓縮
使用CNN進行光流估計,得到的結果作為運動資訊
。其中運動資訊還會經過MV編解碼網絡進行壓縮。如圖1(b)中Optical Flow Net、MV Encoder Net、MV Decoder Net。
運動補償
運動補償網絡motion compensation network主要根據前面獲得的光流計算預測幀
。
變換、量化和反變換
和傳統的DCT、DST變換不同,這裡使用殘差編解碼網絡進行非線性變換。殘差
非線性變換的為
,
量化為
。
通過殘差解碼網絡可以得到重建的殘內插補點
。
熵編碼
量化的運動資訊
和殘差
要編碼為比特流,為了估計比特數,使用Bit rate estimation net擷取
和
的分布。
幀重建
幀重建過程和傳統編碼架構一樣。
MV編解碼網絡
圖2 MV編解碼網絡
圖2是MV的編解碼網絡,Conv(3,128,2)表示卷積操作,卷積核為3x3,輸出128通道,步長2。GDN/IGDN是非線性變換函數。
如果輸入光流
的尺寸是MxNx2,MV編碼網絡的輸出
的尺寸則為M/16 x N/16 x 128,
量化為
。MV解碼網絡将
解碼為
。此外,
還要用于熵編碼過程。
運動補償網絡
給定前一幀的重建幀
和
,運動補償網絡可以生成目前幀的重建幀
,如圖3。
圖3 運動補償網絡
這裡的運動補償是像素級的,是以可以提供更精準的時域資訊,避免了傳統的基于塊的運動補償的塊效應等,是以不需要環路濾波。網絡詳細情況請參考論文。
殘差編解碼網絡
殘差資訊通過圖1中的殘差編解碼網絡進行編碼,這個網絡是高度非線性的,和傳統的DCT等相比可以更充分的挖掘非線性變換的能力。
訓練政策
損失函數
訓練的目标是減小失真的同時降低碼率。其他d(.)計算失真的函數,用MSE計算失真,H(.)表示估計碼率。如圖1所示,重建幀、原始幀和估計的碼率都會輸入損失函數。
量化
殘差和運動向量都需要量化後才能進行熵編碼,但是量化本身是不可微的,是以論文在訓練階段通過加一個均勻噪聲來代替量化。
其中alpha是均勻噪聲。
在推理階段直接使用取整操作,
碼率估計
為了平衡碼率和失真,需要在編碼過程中估計殘差和運動向量的碼率,估計碼率需要求得資料的熵,即要擷取資料的分布,論文通過一個CNN實作。
緩存曆史幀
由于在運動估計和運動補償中需要用到參考幀,參考幀是網絡輸出的前一幀的重建幀,即第t幀需要第t-1幀的重建幀,第t-1幀需要第t-2幀的重建幀,以此類推需要在GPU中儲存所有幀,當t非常大時這是不可能的。論文提出線上更新政策,每個疊代更新一幀。
實驗設定
資料集:
論文使用Vimeo-90K資料集進行訓練,它包含89800個視訊序列。使用UVG資料集和HEVC标準序列進行驗證。
評價名額:
使用PSNR和MS-SSIM評價失真,使用bpp衡量碼率。
實作細節:
使用4個lambda(256、512、1024、2048)分别訓練了4個模型,每個模型使用Adam優化器訓練,初始學習率設為0.0001,beta1設為0.9,β2設為0.999。當loss穩定後學習率除以10,mini-batch設為4。訓練圖像分辨率是256x256。使用tensorflow架構訓練,在兩張Titan X GPU上耗時7天完成訓練。
實驗結果
圖4 部分實驗結果
圖4是部分實驗結果,可以看見在大部分資料集上論文方法比H264在PSNR和MS-SSIM上都更優。和H265相比,中MS-SSIM名額上性能相近。論文使用MSE計算失真,如果MS-SSIM則品質會進一步提高。
總結
論文使用DNN模型将傳統視訊編碼架構的每個部分都進行了替換實作了端到端的編碼,進而可以整體進行訓練。關于各個模型的具體資訊可以參考論文和開源實作https://github.com/GuoLusjtu/DVC