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

Posted

技术标签:

【中文标题】Caffe 可以直接对图像的像素进行分类吗?【英文标题】:Can Caffe classify pixels of an image directly? 【发布时间】:2015-07-23 19:15:30 【问题描述】:

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

除了 Caffe,我解决这个问题的第一个想法是在应该分类的像素周围提供图像补丁(例如,顶部/左侧/右侧/底部 20 个像素,导致每个像素有 41×41=1681 个特征想分类。 但是,如果我可以告诉 caffe 如何使用标签,而无需手动创建这些图像补丁(并且图层类型 IMAGE_DATA 似乎表明这是可能的)我会更喜欢。

这样的 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_heightnew_width 有什么用处?

【问题讨论】:

从某种意义上说,您的问题非常大,涉及许多主题。你能把它“分解”成更小的问题吗?每个问题一个主题?您可以(并且应该?)链接问题以提供上下文。 另见:Question on Google Groups 【参考方案1】:

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

输入: 您需要两个 IMAGE_DATA 层:一个加载 RGB 图像,另一个加载 对应 标签掩码图像。请注意,如果您使用 convert_imageset 实用程序,您不能独立地打乱每个集合 - 您将无法将图像与其标签掩码匹配。

IMAGE_DATA 层有两个“顶部”,一个用于“数据”,一个用于“标签”我建议您将两个输入层的“标签”设置为图像/标签掩码的索引并添加一个验证索引 always 匹配的实用程序层,这将防止您在错误的标签掩码上进行训练;)

例子:

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 的大小。您必须将标签大小设置为相同大小。您必须仔细考虑如何处理不同形状和大小的图像。

【讨论】:

我试图解决您问题中提出的主要问题,关于IMAGE_DATA 层参数的详细信息 - 请针对它们提出不同的具体问题。 您能否更具体地解释一下为什么形状必须是 2×h×w。据我了解,EuclideanLoss 必须与标签具有相同的尺寸,即如果标签是灰度图像,则只有 1 个通道,因此预测的形状必须为 1×h×w ? 最后一个卷积层中的num_output 是什么,或者您是否使用fully connected layer 并相应地重塑输出? @Shai @Martin Thoma @thigi 如果您使用的是"Convolution" 层,那么num_output 应该等于标签的数量。如果您使用 "InnerProduct" 参数,则必须 "Reshape" 您的预测才能获得正确的损失层形状。 如果我使用 EuclideanLoss num_output 也必须与标签的数量相同?你会在损失层之后还是之前重塑? @Shai【参考方案2】:

看来你可以试试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

【讨论】:

这就是我们实际所做的。但是,要完成这项工作并不是那么简单。 还有一点应该提到,你必须使用 Caffe 的一个分支 @moose 请发布分叉链接。 github.com/longjon/caffe/tree/future - 在github.com/BVLC/caffe/wiki/…中提到

以上是关于Caffe 可以直接对图像的像素进行分类吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spark 和 Caffe 对图像进行分类

Vowpal Wabbit 模型在使用像素 RGB 值对图像进行多类分类时效果不佳

图像中颜色的分类器

用于分类的词袋 - 特征与像素

在训练之前执行图形切割或作为基于像素的分类的后处理

图像识别之初探SVM分类器