【问题标题】:Caffe: How to load image data for semantic segmentationCaffe:如何加载图像数据进行语义分割
【发布时间】:2016-11-11 22:14:30
【问题描述】:

我正在尝试将 Caffe 用于简单的语义图像分割任务(即将图像中的每个像素分类为属于 2 个类别之一)。

我遇到了两个问题:1) 数据准备,2) 网络层定义。

我试图阅读一些例子。

虽然链接很有用,但它们并不特别适用于二维图像的语义分割。

我将非常感谢(甚至是简短的)在流畅的管道中的以下代码示例:

  1. 以正确的格式准备图像标签(二维数组)。使用 MemoryData 或 HDF5 作为输入的示例将是完美的!
  2. 正确定义网络prototxt以输入数据和上述标签。

谢谢!

【问题讨论】:

    标签: python deep-learning caffe conv-neural-network pycaffe


    【解决方案1】:

    虽然在 Caffe 主线程上还没有任何教程,但有很多关于在 Caffe 中进行语义分割的教程。对于初学者,您应该查看Fully Convolutional Networks mastertutorial on using SegNet 的教程(GitHub 分别为here)或使用DeepLab。这些都是使用 Caffe 进行语义分割的最先进的方法。

    为了更直接地回答您的问题,

    1) 数据准备: 作为对最近的深度学习方法表现出兴趣的人,您可能会发现没有一种方法可以进行数据准备。它们既取决于数学上的可能性(最终具有完全连接层的网络需要相同比例的图像,通常大小相同),也取决于提高性能的因素(平均减法)。话虽如此,有一些技术很常见(为了简单起见,我现在假设你可以使用不同尺度的图像,就像完全卷积网络一样。如果你想看看裁剪是如何工作的,有一个很好的在关于 Caffe 的 ImageNet 教程中解释了这种类型的数据准备)。使用Transformer 类,大多数人执行以下操作:

    transformer.set_transpose('data', (2,0,1))  # move image channels to outermost dimension
    transformer.set_mean('data', mu)            # subtract the dataset-mean value in each channel
    transformer.set_raw_scale('data', 255)      # rescale from [0, 1] to [0, 255]
    transformer.set_channel_swap('data', (2,1,0))  # swap channels from RGB to BGR
    

    在细分的上下文中,这就是您需要做的所有事情。语义标签(通常)采用图像本身的形式。例如,在 Pascal VOC Caffe 示例中,您在标签中读取为

    n.data, n.label = L.Python(module = 'pascal_multilabel_datalayers', layer = datalayer, ntop = 2, param_str=str(data_layer_params))
    

    **2) 网络层定义**

    对于网络层定义,请记住,神经网络的一大优点是除了输入和输出之外,它们还可以处理多种数据类型。因此,您的所有中间层都是相同的,实际上在您的情况下,输入也是相同的。最后你需要的是用来评估相对于图像的交叉熵损失的东西。对于 DeepLab,他们写了一个 "Interp" layer 来做这件事。另一方面,SegNet 写了一个"Upsample" layer type,他们在softmax之前使用它来使网络输出与标签相同的大小,然后simply use a Softmax

    我想所有这一切的缺点是,在 Caffe 中还没有一种明确的方法可以正确地做到这一点,但好在有很多成功的例子。希望这有帮助

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 1970-01-01
      • 2017-07-03
      • 2018-11-10
      • 2017-07-24
      • 2016-11-04
      • 1970-01-01
      • 2019-04-24
      • 2022-01-04
      相关资源
      最近更新 更多