虽然在 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 中还没有一种明确的方法可以正确地做到这一点,但好在有很多成功的例子。希望这有帮助