我想将图像的像素分类为“是街道”或“不是街道”。我有一些来自 KITTI dataset 的训练数据我看到 Caffe 有一个 IMAGE_DATA
层类型。
标签以与输入图像大小相同的图像形式存在。
除了 Caffe,我解决这个问题的第一个想法是在应该分类的像素周围提供图像补丁(例如,顶部/左侧/右侧/底部 20 个像素,导致每个像素有 41×41=1681 个我想要分类的特征.
但是,如果我可以告诉 caffe 如何使用标签而不必手动创建这些图像补丁(并且图层类型 IMAGE_DATA
似乎表明这是可能的)我更喜欢那样。
Caffe 可以直接对图像的像素进行分类吗?这样的 prototxt 网络定义会是什么样子?如何向 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
适合吗?
最佳答案
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"
并非所有损失层都知道如何处理多个标签,但 "EuclideanLoss"
(例如)可以,因此您应该有一个损失层,例如layer {
name: "loss"
type: "EuclideanLoss"
bottom: "prediction" # size on image
bottom: "label-mask"
top: "loss"
}
我认为
"SoftmaxWithLoss"
有一个可以在这种情况下使用的较新版本,但您必须自己检查它。在那种情况下 "prediction"
应该是 2×h×w 的形状(因为你有 2 个标签)。附加说明:
在
"ImageData"
的参数中设置输入大小后,您修复了网络中所有 blob 的大小。您必须将标签大小设置为相同大小。您必须仔细考虑如何处理不同形状和大小的图像。
关于computer-vision - Caffe 可以直接对图像的像素进行分类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30198926/