卷積神經網絡--圖像卷積與反捲積(後卷積,轉置卷積)

在這裏插入圖片描述

1.前言

傳統的CNN網絡只能給出圖像的LABLE,但是在很多情況下需要對識別的物體進行分割實現end to end,然後FCN出現了,給物體分割提供了一個非常重要的解決思路,其核心就是卷積與反捲積,所以這裏就詳細解釋卷積與反捲積。

對於1維的卷積,公式(離散)與計算過程(連續)如下,要記住的是其中一個函數(原函數或者卷積函數)在卷積前要翻轉180度

在這裏插入圖片描述
在這裏插入圖片描述
圖一

對於離散卷積,f的大小是n1,g的大小是n2,卷積後的大小是n1+n2-1

2.圖像卷積

圖2
圖二
同樣地,卷積的時候需要對卷積核進行180的旋轉,同時卷積核中心與需計算的圖像像素對齊,輸出結構爲中心對齊像素的一個新的像素值,計算例子如下
在這裏插入圖片描述
圖三

這樣計算出左上角(即第一行第一列)像素的卷積後像素值。

給出一個更直觀的例子,從左到右看,原像素經過卷積由1變成-8。

圖4
圖四
在信號處理上,反轉180度稱作卷積,直接滑動計算稱作自相關,在大部分深度學習框架上都沒有反轉180度的操作。

通過滑動卷積核,就可以得到整張圖片的卷積結果,

圖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
圖六
上圖中藍色爲原圖像,白色爲對應卷積所增加的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,卷積後圖像大小:4x4

2.same: 滑動步長爲1,圖片大小爲N1xN1,卷積核大小爲N2xN2,卷積後圖像大小:N1xN1

3.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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章