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
}
}
大多数时候,我们是依据具体情况获取这个偏移值的。