我想将图像的像素分类为“是街道”或“不是街道”。我有一些训练数据KITTI数据集我看到 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
and new_width
适合什么?
Caffe可以对像素进行分类吗?理论上我认为答案是肯定的。我自己没有尝试过,但我认为没有什么可以阻止你这样做。
Inputs:
你需要两个IMAGE_DATA
层:一层加载 RGB 图像,另一层加载相应的标签掩模图像。请注意,如果您使用convert_imageset
实用程序中,您无法独立地对每个集合进行洗牌 - 您将无法将图像与其标签蒙版相匹配。
An IMAGE_DATA
图层有两个“顶部”,一个用于“数据”,一个用于“标签”我建议您将两个输入层的“标签”设置为图像/标签蒙版的索引,并添加一个实用程序层来验证索引always匹配,这将防止您在错误的标签掩码上进行训练;)
Example:
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"
}
损失层:
现在,您可以对输入数据执行任何您喜欢的操作,但最终要获得逐像素标记,您需要逐像素损失。因此,您必须让最后一层(损失之前)产生一个预测same宽度和高度为"label-mask"
并非所有损失层都知道如何处理多个标签,但是"EuclideanLoss"
(例如)可以,因此你应该有一个损失层,例如
layer {
name: "loss"
type: "EuclideanLoss"
bottom: "prediction" # size on image
bottom: "label-mask"
top: "loss"
}
I think "SoftmaxWithLoss"
有一个较新的版本可以在这种情况下使用,但您必须自己检查。在这种情况下"prediction"
形状应为 2×h×w(因为您有 2 个标签)。
补充笔记:
一旦你在参数中设置了输入大小"ImageData"
您可以修复网络中所有斑点的大小。您必须将标签尺寸设置为相同尺寸。您必须仔细考虑如何处理不同形状和大小的图像。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)