我正在尝试使用 Caffe 执行简单的语义图像分割任务(即将图像中的每个像素分类为属于 2 个类别之一)。
我遇到两个问题:1)数据准备,2)网络层定义。
我尝试阅读一些示例。
尽管这些链接很有用,但它们并不专门适用于 2D 图像的语义分割。
我非常感谢(即使是简短的)在流畅的管道中提供以下代码示例:
- 以正确的格式准备图像标签(二维数组)。使用 MemoryData 或 HDF5 作为输入的示例将是完美的!
- 正确定义网络prototxt以输入数据和上述标签。
谢谢!
最佳答案
虽然 Caffe 主线程还没有任何关于此的教程,但有不少关于在 Caffe 中进行语义分割的教程。对于初学者,您应该查看 Fully Convolutional Networks master 的教程以及 tutorial 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 中还没有一种明确的方法可以正确地做到这一点,但好处是有很多成功完成的例子。希望这有帮助
关于python - Caffe:如何加载图像数据进行语义分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38281973/