1.圖像卷積

圖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,卷積后圖像大小: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
2.轉置卷積(一般叫反卷積,但是不是很准確)
這里提到的反卷積跟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。

不說一些理論的了,下面是一些推導:

這里的 c 中的第一行對應卷積核首次卷積的位置( 卷積核未涉及到的位置為0 , 所以從左往右出現 )

