1. 程式人生 > >深度學習---影象卷積與反捲積(最完美的解釋)

深度學習---影象卷積與反捲積(最完美的解釋)

動態圖

1.前言

   傳統的CNN網路只能給出影象的LABLE,但是在很多情況下需要對識別的物體進行分割實現end to end,然後FCN出現了,給物體分割提供了一個非常重要的解決思路,其核心就是卷積與反捲積,所以這裡就詳細解釋卷積與反捲積。    對於1維的卷積,公式(離散)與計算過程(連續)如下,要記住的是其中一個函式(原函式或者卷積函式)在卷積前要翻轉180度
圖1    對於離散卷積,f的大小是n1,g的大小是n2,卷積後的大小是n1+n2-1

2.影象卷積


圖2同樣地,卷積的時候需要對卷積核進行180的旋轉,同時卷積核中心與需計算的影象畫素對齊,輸出結構為中心對齊畫素的一個新的畫素值,計算例子如下

圖3這樣計算出左上角(即第一行第一列)畫素的卷積後像素值。給出一個更直觀的例子,從左到右看,原畫素經過卷積由1變成-8。
圖4通過滑動卷積核,就可以得到整張圖片的卷積結果,
圖5    到了這裡,大致可以明白影象卷積。但是我們可以看出,通過影象卷積後,新影象的大小跟原來一樣,或者變小。圖2計算後圖像大小不變,如圖5卷積後圖像變小是因為沒有對所用畫素進行卷積計算。但是1維的卷積結果不是變大了嗎? 下面對其解釋。    在matlb中對2維卷積的計算分為了3類,1.full   2.same   3. valid   參考:https://cn.mathworks.com/help/matlab/ref/conv2.html?requestedDomain=www.mathworks.com圖2對應的卷積就是就是所謂的same,圖5對應的就是valid。那麼full又是什麼呢?如下圖

圖6

    圖6中藍色為原影象,白色為對應卷積所增加的padding,通常全部為0,綠色是卷積後圖片。圖6的卷積的滑動是從卷積核右下角與圖片左上角重疊開始進行卷積,滑動步長為1,卷積核的中心元素對應卷積後圖像的畫素點。可以看到卷積後的影象是4X4,比原圖2X2大了,我們還記1維卷積大小是n1+n2-1,這裡原圖是2X2,卷積核3X3,卷積後結果是4X4,與一維完全對應起來了。其實這才是完整的卷積計算,其他比它小的卷積結果都是省去了部分畫素的卷積。下面是WIKI對應影象卷積後多出部分的解釋:

Kernel convolution usually requires values from pixels outside of the image boundaries. There are a variety of methods for handling image edges.

意思就是多出來的部分根據實際情況可以有不同的處理方法。(其實這裡的full卷積就是後面要說的反捲積)

這裡,我們可以總結出full,same,valid三種卷積後圖像大小的計算公式:1.full: 滑動步長為1,圖片大小為N1xN1,卷積核大小為N2xN2,卷積後圖像大小:N1+N2-1 x N1+N2-1如圖6, 滑動步長為1,圖片大小為2x2,卷積核大小為3x3,卷積後圖像大小:4x42.same: 滑動步長為1,圖片大小為N1xN1,卷積核大小為N2xN2,卷積後圖像大小:N1xN13.valid:滑動步長為S,圖片大小為N1xN1,卷積核大小為N2xN2,卷積後圖像大小:(N1-N2)/S+1 x (N1-N2)/S+1如圖5,滑動步長為1,圖片大小為5x5,卷積核大小為3x3,卷積後圖像大小:3x3

3.反捲積(後卷積,轉置卷積)

    這裡提到的反捲積跟1維訊號處理的反捲積計算是很不一樣的,FCN作者稱為backwards convolution,有人稱Deconvolution layer is a very unfortunate name and should rather be called a transposed convolutional layer. 我們可以知道,在CNN中有con layer與pool layer,con layer進行對影象卷積提取特徵,pool layer對影象縮小一半篩選重要特徵,對於經典的影象識別CNN網路,如IMAGENET,最後輸出結果是1X1X1000,1000是類別種類,1x1得到的是。FCN作者,或者後來對end to end研究的人員,就是對最終1x1的結果使用反捲積(事實上FCN作者最後的輸出不是1X1,是圖片大小的32分之一,但不影響反捲積的使用)。    這裡影象的反捲積與圖6的full卷積原理是一樣的,使用了這一種反捲積手段使得影象可以變大,FCN作者使用的方法是這裡所說反捲積的一種變體,這樣就可以獲得相應的畫素值,影象可以實現end to end。
圖7    這裡說另外一種反捲積做法,假設原圖是3X3,首先使用上取樣讓影象變成7X7,可以看到影象多了很多空白的畫素點。使用一個3X3的卷積核對影象進行滑動步長為1的valid卷積,得到一個5X5的影象,我們知道的是使用上取樣擴大圖片,使用反捲積填充影象內容,使得影象內容變得豐富,這也是CNN輸出end to end結果的一種方法。韓國作者Hyeonwoo Noh使用VGG16層CNN網路後面加上對稱的16層反捲積與上取樣網路實現end to end 輸出,其不同層上取樣與反捲積變化效果如下,
                                                                                                                                                   圖8    到這裡就把影象卷積與反捲積解釋完成,如有不妥,請學者們指證。
    
    補充一個資料:
    圖6與圖7出處,https://github.com/vdumoulin/conv_arithmetic     

------------新增反捲積過程解釋----------------
經過上面的解釋與推導,對卷積有基本的瞭解,但是在影象上的deconvolution究竟是怎麼一回事,可能還是不能夠很好的理解,因此這裡再對這個過程解釋一下。
目前使用得最多的deconvolution有2種,上文都已經介紹。 
方法1:full卷積, 完整的卷積可以使得原來的定義域變大
方法2:記錄pooling index,然後擴大空間,再用卷積填充

影象的deconvolution過程如下,

輸入:2x2, 卷積核:4x4, 滑動步長:3, 輸出:7x7
即輸入為2x2的圖片經過4x4的卷積核進行步長為3的反捲積的過程
1.輸入圖片每個畫素進行一次full卷積,根據full卷積大小計算可以知道每個畫素的卷積後大小為 1+4-1=4, 即4x4大小的特徵圖,輸入有4個畫素所以4個4x4的特徵圖
2.將4個特徵圖進行步長為3的fusion(即相加); 例如紅色的特徵圖仍然是在原來輸入位置(左上角),綠色還是在原來的位置(右上角),步長為3是指每隔3個畫素進行fusion,重疊部分進行相加,即輸出的第1行第4列是由紅色特陣圖的第一行第四列與綠色特徵圖的第一行第一列相加得到,其他如此類推。

可以看出反捲積的大小是由卷積核大小與滑動步長決定, in是輸入大小, k是卷積核大小, s是滑動步長, out是輸出大小
得到 out = (in - 1) * s + k
上圖過程就是, (2 - 1) * 3 + 4 = 7