Crop_layer是在Fully Convolutional Networks for Semantic Segmentation這篇論文中接觸到的。我發現網絡配置文件中使用到了Crop層。
而Crop_layer層到底有什麼作用呢?其實它主要是針對全卷積時,在原始圖像上加了pad,致使圖像比原始圖像要大一些,最後我們利用這個crop層將pad裁剪掉。
crop層主要作用是爲了裁剪,那麼它又是怎麼進行裁剪的呢?
Caffe中發數據是以blobs形式存在的,blob是一個四維結構(Batch size, number of Channels, Height, width)是數據(在我以前的博客中有介紹).Crop_layer的輸入(bottom)有兩個,假設輸入爲A和B,輸出(top)爲C。
(1)A——要進行裁剪的bottom,A的size爲(20,50,512,512)
(2)B——裁剪的參考輸入,size爲(20,10,256,256)
(3)C——輸出top,它是在A的基礎上按照B的size裁剪而來,所以size和B是一樣的。
Crop_layer裏有兩個重要的參數:axis(決定從哪個軸開始裁剪)和offsets(給出三個維度,決定裁剪位置的偏移),裁剪的長度和B中對應的軸的長度是對應的。例如:
(1)給出axis=1,offset=(25,128,128)
(2)裁剪操作:C = A[:,25:25+B.shape[1],128:128+B.shape[2],128:128+B.shape[3]]
也就是說,對於A的軸1來說,裁剪範圍是25~35.
另外在offsets的三個維度都一樣的時候,可以設置offsets爲一個數,表示賽格維度上的偏移是一樣的。以下是一個實例:
layer {
name: "crop_layer"
type: "Crop"
bottom: "A"
bottom: "B"
top: "C"
crop_param {
axis: 1
offset: 25
offset: 128
offset: 128
}
}
大多數時候,我們是依據具體情況獲取這個偏移值的。