Caffe:如何加载图像数据进行语义分割
Caffe: How to load image data for semantic segmentation
我正在尝试将 Caffe 用于简单的语义图像分割任务(即将图像中的每个像素分类为属于 2 个 类 之一)。
我遇到了两个问题:1) 数据准备,以及 2) 网络层定义。
我尝试阅读了一些示例。
虽然这些链接很有用,但它们并不特别适用于 2D 图像的语义分割。
我非常感谢(即使是简短的)以下流畅管道中的代码示例:
- 准备格式正确的图片标签(二维数组)。使用 MemoryData 或 HDF5 作为输入的示例将是完美的!
- 正确定义网络prototxt以输入数据和上述标签。
谢谢!
虽然在 Caffe 主线程上还没有任何教程,但是有很多关于在 Caffe 中进行语义分割的教程。对于初学者,您应该查看 Fully Convolutional Networks master as well as the tutorial on using SegNet (GitHub separately here) or using DeepLab 的教程。这些都是使用 Caffe 进行语义分割的最先进方法。
为了更直接地回答您的问题,
1)资料准备:
作为对最近的深度学习方法表现出兴趣的人,您可能会发现没有一种方法可以进行数据准备。它们既取决于数学上的可能性(末端具有完全连接层的网络需要相同比例的图像,通常大小相同),也取决于提高性能的方法(均值减法)。也就是说,有一些常见的技术(为了简单起见,我假设在这一点上你可以使用不同比例的图像,就像完全卷积网络一样。如果你想看看裁剪是如何工作的,有一个很好的在 Caffe 上的 ImageNet 教程中解释了这种类型的数据准备)。使用 Transformer
class,大多数人会执行以下操作:
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 which does this. SegNet on the other hand wrote an "Upsample" layer type, which they use before the softmax to make the network output the same size as the label, and then simply use a Softmax
我想所有这一切的不利之处在于,在 Caffe 中还没有一种明确的方法可以正确地做到这一点,但好处是有很多成功的例子。希望这对您有所帮助
我正在尝试将 Caffe 用于简单的语义图像分割任务(即将图像中的每个像素分类为属于 2 个 类 之一)。
我遇到了两个问题:1) 数据准备,以及 2) 网络层定义。
我尝试阅读了一些示例。
虽然这些链接很有用,但它们并不特别适用于 2D 图像的语义分割。
我非常感谢(即使是简短的)以下流畅管道中的代码示例:
- 准备格式正确的图片标签(二维数组)。使用 MemoryData 或 HDF5 作为输入的示例将是完美的!
- 正确定义网络prototxt以输入数据和上述标签。
谢谢!
虽然在 Caffe 主线程上还没有任何教程,但是有很多关于在 Caffe 中进行语义分割的教程。对于初学者,您应该查看 Fully Convolutional Networks master as well as the tutorial on using SegNet (GitHub separately here) or using DeepLab 的教程。这些都是使用 Caffe 进行语义分割的最先进方法。
为了更直接地回答您的问题,
1)资料准备:
作为对最近的深度学习方法表现出兴趣的人,您可能会发现没有一种方法可以进行数据准备。它们既取决于数学上的可能性(末端具有完全连接层的网络需要相同比例的图像,通常大小相同),也取决于提高性能的方法(均值减法)。也就是说,有一些常见的技术(为了简单起见,我假设在这一点上你可以使用不同比例的图像,就像完全卷积网络一样。如果你想看看裁剪是如何工作的,有一个很好的在 Caffe 上的 ImageNet 教程中解释了这种类型的数据准备)。使用 Transformer
class,大多数人会执行以下操作:
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 which does this. SegNet on the other hand wrote an "Upsample" layer type, which they use before the softmax to make the network output the same size as the label, and then simply use a Softmax
我想所有这一切的不利之处在于,在 Caffe 中还没有一种明确的方法可以正确地做到这一点,但好处是有很多成功的例子。希望这对您有所帮助