圖像上採樣upsampling的主要目的是放大圖像,主要包括:
(1)幾乎都是採用內插值法,即在原有圖像像素的基礎上,在像素點值之間採用合適的插值算法插入新的元素;
(2)反捲積方法(Deconvolution),又稱轉置卷積法(Transposed Convolution);
(3)反池化方法(Unpooling)。
1 線性插值法(linear interpolation)
這裏講解線性插值法的推導爲了給雙線性插值公式做鋪墊。線性插值法是指使用連接兩個已知量的直線來確定在這個兩個已知量之間的一個未知量的值的方法。
2 雙線性插值
雙線性插值是插值算法中的一種,是線性插值的擴展。利用原圖像中目標點四周的四個真實存在的像素值來共同決定目標圖中的一個像素值,其核心思想是在兩個方向分別進行一次線性插值。
具體的實現方式,可以直接參考fcn.berkerlyvision.org中的surgery.py如下:
def upsample_filt(size):
"""
Make a 2D bilinear kernel suitable for upsampling of the given (h, w) size.
"""
factor = (size + 1) // 2
if size % 2 == 1:
center = factor - 1
else:
center = factor - 0.5
og = np.ogrid[:size, :size]
return (1 - abs(og[0] - center) / factor) * \
(1 - abs(og[1] - center) / factor)
如果看了上面的簡單實例和具體代碼還不會使用bilinear,就看最後一個例子,這裏以FCN舉例。在FCN的berkerly官方caffe實現,以voc-fcn32/train.prototxt舉例,bilinear部分代碼如下:(此部分沒看懂,先放這)layer {
name: "score_fr"
type: "Convolution"
bottom: "fc7"
top: "score_fr"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 21
pad: 0
kernel_size: 1
}
}
layer {
name: "upscore"
type: "Deconvolution"
bottom: "score_fr"
top: "upscore"
param {
lr_mult: 0
}
convolution_param {
num_output: 21
bias_term: false
kernel_size: 64
stride: 32
}
}
其中,upscore層使用surgery.py中的upsample_filt函數進行實現(本文第一段代碼),相當於設置參數type: ‘bilinear’,這個很容易實現。通過測試可以發現,在forward-propagation過程中,score_fr層的blob shape是[1, 21, 16, 16],經過bilinear後變爲[1, 21, 544, 544]。依照代碼簡單分析就可以發現bilinear的具體計算流程如下:
(1) 64%2 == 0,所以center的座標爲(31.5, 31.5),note在python中下標從0開始;
(2) 計算出一個64x64的矩陣,每個位置根據代碼所示填數,其實就是線性規則 ;
(3) 二維來看,將score_fr層的16x16的每一個位置的座標放在31.5位置,也就是在相鄰元素之間插入32個位置,周邊補充32個位置,不同元素對插入的不同值有影響,則相互疊加,最後將原來的16x16的元素移除,也就形成了32x17 = 544,也就是具體upscore層算出來的值。
形象表示結果:
32個元素 [16x16中的(0,0)元素] 32個元素 [16x16中的(0,1)元素] 32個元素 …其中,中括號中的元素不可見。
參考:
1.FCN中反捲積、上採樣、雙線性插值之間的關係
https://blog.csdn.net/u011771047/article/details/72872742/
2.Transposed Convolution, Fractionally Strided Convolution or Deconvolution
http://buptldy.github.io/2016/10/29/2016-10-29-deconv/
https://blog.csdn.net/kekong0713/article/details/68941498
3.更多關於卷積和反捲積的可視化理解:
https://github.com/vdumoulin/conv_arithmetic