Neural network Caffe可以直接对图像的像素进行分类吗?

Neural network Caffe可以直接对图像的像素进行分类吗?,neural-network,computer-vision,deep-learning,caffe,image-segmentation,Neural Network,Computer Vision,Deep Learning,Caffe,Image Segmentation,我想将图像的像素分类为“是街道”或“不是街道”。我有一些来自的训练数据,我看到Caffe有一个图层类型。 标签以与输入图像大小相同的图像形式存在 除了Caffe之外,我解决这个问题的第一个想法是在应该分类的像素周围提供图像补丁(例如,上/左/右/下20个像素,这样每个像素41×41=1681个我想要分类的特征。 但是,如果我可以告诉caffe如何使用标签,而不必手动创建那些图像补丁(图层类型image\u DATA似乎表明这是可能的),我更愿意这样做 Caffe能直接对图像的像素进行分类吗?这样

我想将图像的像素分类为“是街道”或“不是街道”。我有一些来自的训练数据,我看到Caffe有一个图层类型。 标签以与输入图像大小相同的图像形式存在

除了Caffe之外,我解决这个问题的第一个想法是在应该分类的像素周围提供图像补丁(例如,上/左/右/下20个像素,这样每个像素41×41=1681个我想要分类的特征。
但是,如果我可以告诉caffe如何使用标签,而不必手动创建那些图像补丁(图层类型
image\u 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
  }
}
layer {
  name: "loss"
  type: "EuclideanLoss"
  bottom: "prediction" # size on image
  bottom: "label-mask"
  top: "loss"
}

然而,我不确定裁剪尺寸的确切含义。它真的居中吗?caffe是如何处理角点像素的?新高度和新宽度有什么好处?

caffe能对像素进行分类吗?理论上我认为答案是肯定的。我自己没有尝试过,但我不认为有什么能阻止你我正在这样做

输入:
您需要两个
IMAGE\u DATA
层:一个用于加载RGB图像,另一个用于加载相应的标签掩码图像。请注意,如果使用
convert\u imageset
实用程序,则无法单独洗牌每个集-您将无法将图像与其标签掩码匹配

IMAGE\u DATA
层有两个“top”,一个用于“DATA”,一个用于“label”,我建议您将两个输入层的“label”设置为图像/标签掩码的索引,并添加一个实用程序层来验证索引始终匹配,这将防止您使用错误的标签掩码进行培训;)

例如:

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"
}
损失层:
现在,您可以对输入数据执行任何操作,但最终要获得像素级标签,您需要像素级丢失。因此,您必须让您的最后一层(丢失前)生成一个宽度和高度与
“标签掩码”
相同的预测,并非所有的丢失层都知道如何处理多个标签,但
“欧几里德罗斯”
(例如)可以,因此您应该有一个类似的丢失层

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
  }
}
layer {
  name: "loss"
  type: "EuclideanLoss"
  bottom: "prediction" # size on image
  bottom: "label-mask"
  top: "loss"
}
我认为
“SoftmaxWithLoss”
有一个更新的版本可以在这个场景中使用,但您必须自己检查它。在这种情况下,
“预测”
的形状应为2-by-h-by-w(因为您有两个标签)

附加说明:
“ImageData”
的参数中设置输入大小后,就可以固定网络中所有blob的大小。必须将标签大小设置为相同的大小。你必须仔细考虑如何处理不同形状和大小的图像。

< P>看来你可以尝试< /P> 本文引用了Caffe:

以下是模型:

此外,本演示文稿还可以提供帮助:

从某种意义上说,你的问题非常大,涉及到许多主题。你能把它分成几个小问题吗?每个问题一个主题?您可以(也应该?)将问题链接到上下文中。另请参见:我试图解决您的问题中提出的主要问题,关于
IMAGE\u DATA
层的参数细节-请问一个不同的具体问题。您能否更具体地解释为什么形状必须为2-by-h-by-w。据我所知,欧几里德洛斯必须具有与标签相同的尺寸,也就是说,如果标签是灰度图像,则只有一个通道,因此预测的形状必须为1×h×w?最后一个卷积层中的
num_输出将是什么?或者您是否使用
完全连接的层
并相应地重塑输出@Shai@MartinThoma@thigi如果您使用的是
“卷积”
层,则
num\u output
应等于标签的数量。如果您使用的是
“InnerProduct”
参数,则您必须
“重塑”
您的预测以获得损耗层的正确形状。如果我使用欧几里德损耗,则num_输出也必须与标签数量相同?你会在损失层之后还是之前重塑@我们实际上就是这么做的。然而,完成这项工作并不是那么直截了当,你还应该提到,你必须使用叉子Caffe@moose请把链接发到fork这是在