我试图使用Caffe来完成一个简单的语义图像分割任务(即将图像中的每个像素分类为属于两个类中的一个)。
我遇到了两个问题: 1)数据准备;2)网络层定义。
我试着读了一些例子。
虽然链接是有用的,但它们并不特别适用于二维图像的语义分割。
我将非常感谢(甚至是简短的)代码示例,以便在一个流畅的过程中提供以下内容:
谢谢!
发布于 2017-03-28 23:35:23
虽然还没有关于Caffe主线程的任何教程,但是在Caffe中进行语义分段的教程还很多。首先,您应该查看全卷积网络主电路和关于使用SegNet的教程 (GitHub分别为这里)或使用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“层。另一方面,SegNet编写了一个“上样”层类型,在softmax之前使用它使网络输出与标签大小相同,然后使用只需使用Softmax
我想所有这一切的缺点是,在Caffe中还没有一种明确的方法来正确地做到这一点,但好的是,有很多成功的例子。希望这能帮上忙
https://stackoverflow.com/questions/38281973
复制相似问题