我不是 and 方面的专家caffe
,Python
但我正在尝试逐步学习。我有点困惑,所以如果专家能看看我的问题,我将不胜感激。
我正在研究图像分割。我正在尝试on-the-fly
通过添加 python 层来进行数据扩充。对于我的数据集,我想在 x 轴和 y 轴(另外 4 个平移)上进行 (+10,-10) 的平移,添加高斯噪声和水平翻转。
我的问题是:
caffe 是如何将图片与标签同步的?例如,如果我将图像
data
逐层发送到网络并在侧面label
发送到SoftmaxWithLoss
(例如)。我已经(手动)绘制了数据增强和正常流动的示意图,我不确定我的理解是否正确!从图中可以看出,对于翻译,我们必须以同步的方式翻译图像和ground truth(或者对于翻转,我们也必须翻转标签);例如,如果我将图像分别在 x 轴和 y 轴上移动 -10 和 -10 像素,则地面真实图像也需要相应地重新定位。如何在 caffe Python 层中做到这一点。我的理解是否正确(基于该图)?我编写的python层如下:
import caffe
import numpy as np
from skimage import transform as tf
from skimage.transform import AffineTransform
class ShiftLayer(caffe.Layer):
def setup(self,bottom,top):
assert len(bottom)==2, #requires two inputs bottom(1:image, 2:label)
assert len(top)==2 #requires two layer top
def reshape(self,bottom,top):
top[0].reshape(*bottom[0].data.shape) #HOW CAN WE KNOW LABEL or DATA is GOING TO "bottom[0]" or "bottom[1]"?????
top[1].reshape(*bottom[1].data.shape)
def forward(self,bottom,top):
x_trans=-10
y_trans=-10
top[0].data[...]=tf.warp(bottom[0].data, AffineTransform(translation=(x_trans,y_trans)))
top[1].data[...]=tf.warp(bottom[1].data, AffineTransform(translation=(x_trans,y_trans)))
def backward(self,top,propagate_down,bottom):
pass
这是层定义:
layer {
name: "shift_layer"
type: "Python"
bottom: "data"
bottom: "label"
top: "data"
top: "label"
include {
phase: TRAIN
}
python_param {
module: "myshift_layer"
layer: "ShiftLayer"
}
}
如果我要向网络添加其他增强技术,我应该为它们中的每一个编写单独的模块吗?或者我可以编写一个包含许多
bottoms
和相应的python 层tops
吗?如果是,我怎么知道哪个顶部与哪个底部相关?在添加高斯噪声的情况下,我们确实有与输入图像相同的标签,这个层的定义如何?