我想将图像的像素分类为“is street”或“is not street”。我有KITTI dataset的一些训练数据,我看到Caffe有一个IMAGE_DATA
图层类型。
标签的形式与输入图像的尺寸相同。
除了Caffe之外,我解决这个问题的第一个想法是在像素周围给出应该被分类的图像补丁(例如,20个像素到顶部/左/右/底部,导致每个像素41×41 = 1681个特征I想分类。
但是,如果我可以告诉caffe如何使用标签而不必手动创建这些图像补丁(并且图层类型IMAGE_DATA
似乎表明它是可能的)我宁愿这样做。
Caffe可以直接对图像的像素进行分类吗?这样的原型文件网络定义怎么样?我如何向Caffe提供有关标签的信息?
我猜输入图层就像
layers {
name: "data"
type: IMAGE_DATA
top: "data"
top: "label"
image_data_param {
source: "path/to/file_list.txt"
mean_file: "path/to/imagenet_mean.binaryproto"
batch_size: 4
crop_size: 41
mirror: false
new_height: 256
new_width: 256
}
}
但是,我不确定crop_size
究竟意味着什么。它真的居中吗? caffe如何处理角点像素?什么是new_height
和new_width
有用?
答案 0 :(得分:8)
Caffe可以对像素进行分类吗?从理论上讲,我认为答案是肯定的。我自己没有尝试过,但我认为没有什么可以阻止你这样做。
<强>输入强>
您需要两个IMAGE_DATA
图层:一个加载RGB图像,另一个加载对应的标签 - 蒙版图像。请注意,如果使用convert_imageset
实用程序,则无法独立地对每个集进行随机播放 - 您将无法将图像与其标签掩码匹配。
IMAGE_DATA
图层有两个“顶部”,一个用于“数据”,另一个用于“标签”我建议您将两个输入图层的“标签”设置为图像/标签掩码的索引和添加一个实用程序层,用于验证索引始终是否匹配,这将阻止您对错误的标签掩码进行培训;)
示例:
layer {
name: "data"
type: "ImageData"
top: "data"
top: "data-idx"
# paramters...
}
layer {
name: "label-mask"
type: "ImageData"
top: "label-mask"
top: "label-idx"
# paramters...
}
layer {
name: "assert-idx"
type: "EuclideanLoss"
bottom: "data-idx"
bottom: "label-idx"
top: "this-must-always-be-zero"
}
损失层:
现在,您可以对输入数据执行任何您喜欢的操作,但最终要获得按像素标记,您需要逐像素丢失。因此,您必须让最后一个图层(在丢失之前)生成与<{>>相同宽度和高度的预测"label-mask"
并非所有损失图层都知道如何处理多个标签,但是{{ 1}}(例如)可以,因此你应该有一个类似
"EuclideanLoss"
我认为layer {
name: "loss"
type: "EuclideanLoss"
bottom: "prediction" # size on image
bottom: "label-mask"
top: "loss"
}
有一个可以在这种情况下使用的较新版本,但你必须自己检查一下。在这种情况下,"SoftmaxWithLoss"
应该是2-by-h-by-w的形状(因为你有2个标签)。
附加说明:
在"prediction"
的参数中设置输入大小后,您可以修复网络中所有blob的大小。您必须将标签大小设置为相同的大小。你必须仔细考虑如何处理不同形状和大小的图像。
答案 1 :(得分:7)
似乎你可以尝试fully convolutional networks for semantic segmentation
本文引用了Caffe:https://github.com/BVLC/caffe/wiki/Publications
此处还有型号: https://github.com/BVLC/caffe/wiki/Model-Zoo#fully-convolutional-semantic-segmentation-models-fcn-xs
此演示文稿也有帮助: http://tutorial.caffe.berkeleyvision.org/caffe-cvpr15-pixels.pdf