SRCNN
(SRCNN 深度學習用於SR問題第一篇論文)
1 簡介
超分辨率(super resolution)的任務目標是將輸入的低分辨率的圖像轉換為高分辨率的圖像,與圖像去噪、圖像去模糊等一脈相承。超分辨率關注的是從小尺寸到大尺寸圖像如何填充新的像素;圖像去噪則是關注在圖像尺寸不變的情況下,將被“噪聲污染”的像素替換為正確的像素。
SRCNN是首個使用CNN結構(即基於深度學習)的端到端的超分辨率算法,這個相當於什么呢?就像faster R-CNN在目標檢測的地位一樣,將整個算法流程用深度學習的方法實現了,並且效果比傳統多模塊集成的方法好。
SRCNN流程如下:首先,輸入預處理。對輸入的低分辨率LR圖像使用bicubic算法進行放大,放大為目標尺寸。那么接下來算法的目標就是將輸入的比較模糊的LR圖像,經過卷積網絡的處理,得到超分辨率SR的圖像,使它盡可能與原圖的高分辨率HR圖像相似。
2 網絡模型
SRCNN的結構較簡單,整個卷積網絡包括三個卷積層,沒有池化和全連接層。如圖所示
- 對低分辨率的圖進行卷積操作,生成n1維的feature maps。
- 對n1維的feature map進行卷積操作生成n2維 feature maps。
- 對n2維的feature maps進行卷積生成超分辨的圖像。
3 設計思路
作者這個思路是從稀疏編碼得來的,並把上述過程分別表述為:Patch extraction, Non-linear mapping, Reconstruction。
Patch extraction: 提取圖像Patch,進行卷積提取特征,類似於稀疏編碼中的將圖像patch映射到低分辨率字典中。
Non-linear mapping: 將低分辨率的特征映射為高分辨率特征,類似於字典學習中的找到圖像patch對應的高分辨字典
Reconstruction:根據高分辨率特征進行圖像重建。類似於字典學習中的根據高分辨率字典進行圖像重建。
4 處理流程
(1)提取圖像特征:從低分辨率圖像中提取多個patch圖像塊,每個塊被卷積操作表示為多維的向量(維數等於filter的數量),所有的特征向量組成特征矩陣(feature maps)
(2)非線性映射:將n1維特征矩陣,通過卷積操作實現非線性映射,變成另一n2維特征矩陣。
(3)重構圖像:等於是個反卷積的過程,將n2的特征矩陣還原為超分辨圖像模型訓練的優化參數是三層卷積層對應的卷積核(w)和bias(b),參數P={W_1,W_2,W_3,b_1,b_2,b_3}。訓練的目標損失是最小化超分辨率圖像F(Y;P)與原高分辨率圖像X基於像素的均方誤差MSE,定義如下:
其中n是訓練樣本數量,即每次訓練的樣本數量。接下來無非就是隨機梯度下降法反向傳播,網絡訓練得到最終的參數P使損失L最小化,參數更新公式如下也是根據優化方法來確定的,比如隨機梯度下降法SGD和動量下降法優化等等。
SRCNN的3層卷積神經網絡將上述傳統方法的3個步驟全部和在一起優化參數,而不是分步驟進行,直接是端到端的映射。端到端的映射就是指,輸入到輸出直接一個管道作用,優化的參數都蘊含在了網絡的權重和偏置還有網絡結構中,然而稀疏編碼是各自優化3個過程,求出最優解在繼續。
5 和稀疏編碼之間的關系
在基於稀疏編碼的方法中,輸入圖像中提取一個f1×f1低分辨率的塊。這個塊是減去其patch內的平均值得到的結果,然后投影到(低分辨率)字典。如果低分辨率字典的尺寸是n,這相當於在輸入圖像上應用n1個線性濾波器(f1×f1),因為SRCNN模型中,有n1個特征圖。所以有n1個線性濾波器作為特征提取。
然后將稀疏編碼解碼器應用於通過低分辨率字典投影得出的n1系數。這n1個稀疏對應於SRCNN中的n1個LR特征圖。通過非線性映射得到HR的塊,在稀疏編碼中就是解碼器的輸出是n2個系數,在稀疏編碼的情況下通常是n2=n1。這些n2系數是高分辨率塊的表示。
稀疏編碼解碼器(系數表示)表現為非線性映射算子(SRCNN)。稀疏編碼解碼器不是前饋的,它是一個迭代算法。
很多文獻都提到了圖像重疊塊處理,為什么需要重疊塊求平均呢?
答:相鄰塊的重疊區域中的像素應該是完全相同的。一致性約束在處理單個估計問題時提供了先驗信息。重疊塊可以最大限度的保留這個局部的圖像信息,並且可以抑制噪聲
如上所述,這相當於n2個feature map 映射上的線性卷積。如果用於重建的高分辨率塊大小為f3×f3,則線性濾波器具有大小為f3×f3的等效空間支持。
上述類比也可以幫助我們設計超參數。例如,我們可以將最后一層的過濾器大小設置為小於第一層的過濾器大小,因此我們更多地依賴於高分辨率塊的中心部分。
5 評級指標:PSNR
原始圖像與其評估版本(噪聲強度)之間圖像(信號強度)可能的最大像素值與最大均方誤差(MSE)的對數比率。PSNR 值越大,重建效果越好:
這在python的numpy庫中很容易實現,代碼如下:
1 import numpy 2 import math 3
4 def psnr(img1, img2): 5 mse = numpy.mean( (img1 - img2) ** 2 ) 6 if mse == 0: 7 return 100
8 PIXEL_MAX = 255.0
9 return 20 * math.log10(PIXEL_MAX / math.sqrt(mse))
6 HR Reconstruction
Fig3 是稀疏編碼方法。在此方法中,預測出的重疊高分辨率塊往往取平均值得到最終的完整圖像。平均值可以看作是一組特征映射上的預定義濾波器(其中每個位置都是高分辨率塊的“平坦”向量形式)。基於此,我們定義卷積層以生成最終的高分辨率圖像:
7 實驗細節
7.1 對比卷積核大小(filter size)、卷積核數量(filter numbers)對復原效果的影響的實驗
結論:卷積核數量越多,即特征向量維數越高,實驗效果越好,但是會影響算法速度,故需要綜合考慮;另外三層卷積層的卷積核大小越大,實驗效果也會略微更好,同樣會影響算法速度。
7.2 對比網絡層數(layer numbers)對復原效果的影響的實驗
結論:並非網絡越深,效果越好,結果恰恰相反。作者也給出了解釋:因為SRCNN沒有池化層和全連接層,導致網絡對初始參數和學習率非常敏感,結果即網絡訓練的時候非常難以收斂,即使收斂了也可能停在了壞的局部最小值(bad local minimum)處,並且即使訓練了足夠的時間,學習到的filter參數的分散度也不夠好。
7.3 訓練集合標簽的尺寸關系
在訓練階段,將ground truth圖像{Xi}隨機裁剪成32×32的子圖像。所謂“子圖像”,指的是這些樣本被視為小的“圖像”,而不是“塊”,因為“塊”是重疊的,需要一些平均值作為后處理,但“sub-image”不需要。
【 注意: 32*32的子圖像是針對放大尺度為2的網絡所設置的輸入尺寸。對於放大尺度為3的系統,輸入用modcrop()函數處理到33*33。放大因子3的輸入大小為33×33,因此可以除以3 】。
sub-image從原始圖像中提取,步幅為14。
為了生成低分辨率的樣本{Yi},用適當的高斯核對子圖像進行模糊處理,用上尺度因子對其進行下采樣,並用雙三次插值對同一因子進行上采樣。得到退化的LR子圖像。91幅訓練圖像提供了大約24800副圖像。
為了避免訓練過程中的邊界效應,所有卷積層都沒有填充(valid),網絡產生較小的輸出(20×20)。
那么問題是:輸入是32*32的sub-image。由於卷積過程中沒有填充,網絡輸出是20*20,怎么進行MSE的計算呢?
答案:MSE損失函數僅由高分辨率訓練數據集{Xi}中心像素點20×20的子圖像與網絡輸出(預測的HR圖像)(20*20)來計算。
所以SRCNN模型中
訓練集是:由HR退化后的LR圖像的子圖像(32*32),一共是24800副子圖像。這些子圖像由步長為14,從每一幅完整全局圖像中抽取得來的。
標簽集是:HR的32*32的sub-image。計算MSE得時候只使用的是其中心像素區域20*20的子圖像
7.4 測試集
在處理測試圖像時,卷積神經網絡可以應用於任意大小的圖像。在測試圖像處理中,卷積神經網絡可以應用於任意大小的圖像。在測試過程中,所有卷積層都有足夠的零填充,使得輸出圖像與輸入圖像大小相同。
7.5 訓練彩色圖像的Ycbcr通道
實驗中,只考慮亮度通道(在YCrCb顏色空間中)也就是Y分量做SR處理,其余的Cb,Cr分量不做處理。那么問題是:最后的彩色圖像怎么得來呢?
答案是:對Y分量做SR處理后得到高分辨率的Y分量,低分辨率的Cb和Cr分量是通過雙三次插值直接變換到高分辨率空間的。最后通過3個通道的拼接【利用concat()函數】就可以顯示出最終的彩色高分辨率圖像。
7.6 Scale
SRCNN對於每個上尺度因子為{2,3,4},為每一個因子訓練一個特定的網絡,而不是整個網絡適用於所有的尺度。Scale和大多數現有的SR方法一樣,SRCNN是針對一個單一的比例因子進行訓練的,並且應該只使用指定的比例。因此,如果需要一個新的比例尺,就必須訓練一個新的模型。為了應對多尺度SR(可能包括分數因子),我們需要為每個感興趣的尺度構造單獨的單尺度SR系統。
8 SRCNN的局限性
SRCNN但它的局限性主要體現在三個方面:一是依賴於小圖像區域的context;二是訓練收斂速度太慢;三是網絡只適用於單一尺度。
后記:針對SRCNN的問題,后續論文提出了一些改進。下次在更新