WDSR(NTIRE2018超解析度冠軍)【深度解析】
s超解析度(super-resolution)的通俗解釋就是:將低解析度的影象通過演算法轉換成高解析度影象。聽起來似乎很神奇,這樣是不是可以把低清電影轉換成高清了?就現在來看,基於深度學習的超解析度(簡稱SR)已經達到了amazing的效果。
當然,以木盞的習慣就是,只在博文中討論乾貨。
這篇博文要解析的演算法叫做WDSR,來自UIUC的華人學生JiaHui Yu的論文。在SR界有一個比賽,叫做NTIRE,從2016年以來也才舉辦三屆,不過自2017年開始,NTIRE就逐漸被全球學者所關注。NTIRE的冠軍基本是保送CVPR的,NTIRE成長為SR界的COCO也是指日可待的。
NTIRE2018連結:
而WDSR就恰好是NTIRE2018的冠軍,所以,目前看來WDSR就是SR界的state-of-the-art。WDSR文章目前只是掛在arxiv上,未來也許會發表在CVPR2019或ICCV2019上,所以,我們可以在論文正式發表之前瞭解到這篇優質演算法。
介於很多同學更迫切的期待是實現而不是理解,所以我會在近期出一個復現教程。而這篇博文呢,主要討論WDSR的演算法思想。本文目的在於使得各種基礎的同學看過都能有所收穫,所以,我會花不少篇幅來介紹演算法背景,有一定基礎的同學可以跳著看。
首先按照國際慣例,直接給論文地址:
八月底才掛到arxiv上的熱乎文章,越早看越賺。
前言
通常的超解析度分兩種:SISR和VSR。前者叫做單影象超解析度,後者叫做視訊超解析度。我們通常理解的超解析度都是指SISR,我們只需要輸入一張低解析度影象而獲得高解析度影象的輸出。 而VSR會利用視訊的時間關聯性來獲得對某一幀的SR。本文的演算法就是針對前者。
最早將深度學習用到SISR的居然是Kaiming大神等人在ECCV2014年提到的SRCNN,那時並沒有像NTIRE這樣相關的比賽,只有少量開源資料集可以玩玩。至此,對kaiming大神的敬仰又多了一分。
ECCV2018有一篇關於小物體目標檢測的論文讓人印象深刻,迅速引起了大家的關注,這篇文章叫SOD-MTGAN,文中巧妙利用了SR對小物體進行放大,然後得到更高的小物體檢測準確率。這也是木盞開始研究SR的原因,因為SR被證明是有利於目標檢測和跟蹤的。
SOD-MTGAN論文地址:SOD-MTGAN: Small Object Detection via Multi-Task Generative Adversarial Network
我覺得在前言裡面可以給出實現效果,這樣可能更容易激起同學們想要探索這個演算法的興致。以下是我復現的演算法效果:
一目瞭然,左圖是低解析度影象,右圖是對WDSR retrain之後,復現的效果。這裡的scale=2,就是邊長放大兩倍,即畫素密度增加4倍,在下文中我會用X2來描述這種upscale。同理,X3表示邊長放大3倍,X4表示邊長放大4倍。一般來說,X2,X3和X4這三種規模用得比較多。上圖是X2效果圖。
評價指標
如果來描述SR效果呢?業界有個約定俗成的指標,叫做PSNR,即峰值信噪比。這個指標可以比較你SR結果圖和ground truth(即原高清大圖)之間的差距;此外,還有一個指標叫做SSIM,即結構相似性。這個指標與PSNR一樣,也可以評價你SR的恢復效果。關於PSNR和SSIM兩個指標,我都寫了相關博文進行詳細描述,想了解可以點選《PSNR》和《SSIM》
資料集
SR的資料集是資料來源最容易的資料集了,沒有之一。因為你無須標註,只需準備一些高清影象,然後通過下采樣把高清變成低清影象,這樣就獲得了一一對應的counterpart。就可以用以訓練了。當然,對訓練資料不同的下采樣方法也會影響最後的演算法效能,在這裡不做重點討論。
NTIRE2018指定的訓練資料集是DIV2K,這個資料集只有1000張高清圖(2K解析度),其中800張作為訓練,100張作為驗證,再100張作為測試。DIV2K也提供了對高清圖bicubic取樣的低清影象,供以訓練,就是說,下采樣獲得低解析度影象這一步不用自己做了。
自制的資料對比樣本:
WDSR
在這裡正式對WDSR演算法進行剖析。這裡的W表示的是wide,即具有更寬泛的特徵圖。怎麼理解更寬泛的特徵圖呢?作者對啟用函式之前的特徵圖channel數增多,稱為特徵圖更寬泛。這個描述怪怪的,不過就是這麼個意思。
很多同學會認為SR演算法一般會跟生成式演算法GAN產生聯絡,然而事實並不是這樣。確實有利用GAN來做SR的,不過目前頂尖的SR演算法都是基於CNN的,WDSR也不例外。WDSR是基於CNN的SR演算法。
為什麼基於CNN能做到SR?這個疑問先留在這裡,待會兒好好解答。
基於CNN的SR演算法自2014年何愷明大神的SRCNN以來,逐漸發展成如今的SR,具有四大法寶:
1. 上取樣方法。我們從低解析度影象轉換到高解析度影象,是不是要涉及上取樣呢?100x100到400x400肯定要涉及上取樣方法的。如果研究過自編碼器等演算法的同學會知道反捲積是影象深度學習種常用的上取樣方法,在yolo v3中用到的上取樣方法也是反捲積。事實上,反捲積這種上取樣方法在目前一線的SR演算法中是遭到鄙視的(雖然SOD-MTGAN中還在用)。不用反捲積用什麼呢,有一種叫做pixel shuffle的新型卷積方法在CVPR2016年被提出來,也叫做sub-pixel convolution。這種新型卷積就是為SR量身定做的,如果想要詳細瞭解這種卷積是如何操作的,請戳《pixel shuffle》,這也解釋了為什麼目前基於CNN的SR能比基於GAN效果更好了;
2. 超級深度&迴圈神經網路。神經網路深度的重要性相比無須多言了,在不少前輩們的研究成果表現,神經網路的深度是影響SR演算法效能的關鍵因素之一。同時,利用迴圈神經網路的方法,可以增加權重的複用性。WDSR並沒有用到RNN,可以跳過這個;
3. 跳躍連線。就如果Resnet做的那樣,將前層輸出與深層輸出相加連線。一來呢,可以有效解決反向傳播的梯度彌散,二來呢,可以有效利用淺層特徵資訊。目前的一線SR演算法都會含有resblocks,WDSR也不例外。
4. 標準化層。BN層已經是說爛了的trick之一了,各種演算法似乎都離不開BN。但batch normalization也不是唯一的normalization方法。如我其他博文中提到的LN,IN還有kaiming大神提出的GN。而WDSR演算法採用了weight normalization的方法。對標準化層不熟悉的同學可以看我以前的文章《Batch Normalization》。
基於上面四個trick,作者提出了WDSR-A模型結構,我們可以看看長什麼樣子:
左邊的EDSR呢,是NTIRE2017的冠軍,自然要被2018的冠軍吊打的。我們直接看右邊,網路結構是超級簡單的, residual body就是一系列的resblock組到一起,可以看作是一個自帶啟用函式的非線性卷積模組。上圖的模組只包含三種:res模組,conv模組和pixel shuffle模組。只有pixel shuffle模組要特別注意。
WDSR在EDSR上的結構提升,一方面是去除了很多冗餘的卷積層,這樣計算更快。另一方面是改造了resblock。我們一分為二來看,去除冗餘的卷積層(如上圖陰影部分)作者認為這些層的效果是可以吸收到resbody裡面的,通過去除實驗之後,發現效果並沒有下降,所以去除冗餘卷積層可以降低計算開銷。
改造resblock的方法如下:
左圖呢就是ESDR的原始resblock,中間是WDSR-A,右邊的是WDSR-B。作者在文中提出了兩個版本的WDSR,這兩個版本的區別就是resblock不同而已。 對於EDSR中的resblock,我們成為原始resblock,relu是在兩個卷積運算中間,而且卷積核的filter數較少;而WDSR-A是在不增加計算開銷的前提下,增加relu前卷積核的filter數以增加feature map的寬度。怎麼理解這個操作呢?我們有神器neutron,用neutron分別開啟ESDR和WDSR的結構圖我們可以看到:
上圖左邊就是ESDR,右邊就是WDSR-A。我們可以從relu前卷積核的filter數看到, 後者(192)是前者(64)的3倍。不過前者在relu後的filter數是後者的2倍。作者主要提的trick就是增加啟用函式前的特徵圖的channel數。這樣效果會更好。同樣,我們可以對WDSR-B一目瞭然:
WDSR-B進一步解放了計算開銷,將relu後的大卷積核拆分成兩個小卷積核,這樣可以在同樣計算開銷的前提下獲得更寬泛的啟用函式前的特徵圖(即channel數可以更多)。
所以,對於同樣計算開銷的前提下,表現效能是:WDSR-B > WDSR-A > ESDR。
Weight Normalization vs Batch Normalization
WN應該算是WDSR的最後一個重要的trick了。WN來自openAI在NIPS2016發表的一篇文章,就是將權重進行標準化。
對於WN我只是粗略瞭解,做一個簡單的||v||表示v的歐幾里得範數,w, v都是K維向量,而g=||w||,是一個標量。w是v的次態。 g/||v||這個標量就是為了線性改變向量v,從而使得||w||更靠近g。這樣來使得權重w的值在一個規範的範圍內。注意,WN和BN的操作有很大的不同。
根據作者的實驗表明,WN可以用更高的學習率(10倍以上),而且可以獲得更好的訓練和測試準確率。
實驗結果
上表資料主要是用PSNR作為指標進行比較,同時,特別講究引數量,因為引數量直接決定計算開銷。上述結果還是有些謙虛的,我用6M引數的WDSR-A測試DIV2K的val PSNR可以達到37多。 就我目前看的所有SR文章來看,對於DIV2K資料集能達到PSNR 35+的演算法也就WDSR了。
總結
WDSR具有以下創新點:
1. 提高relu前的特徵圖channel數;
2. 將大卷積核拆分成兩個低階卷積核,節省引數,進一步在同參數的情況下提高relu前的特徵圖channel數;
3. 加入weight norm。