首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Caffe:如何加载图像数据进行语义分割

Caffe:如何加载图像数据进行语义分割
EN

Stack Overflow用户
提问于 2016-07-09 12:49:18
回答 1查看 3.2K关注 0票数 2

我试图使用Caffe来完成一个简单的语义图像分割任务(即将图像中的每个像素分类为属于两个类中的一个)。

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

我试着读了一些例子。

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

我将非常感谢(甚至是简短的)代码示例,以便在一个流畅的过程中提供以下内容:

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-28 23:35:23

虽然还没有关于Caffe主线程的任何教程,但是在Caffe中进行语义分段的教程还很多。首先,您应该查看全卷积网络主电路关于使用SegNet的教程 (GitHub分别为这里)或使用DeepLab的教程。这些都是使用Caffe进行语义分割的最新方法。

更直接地回答你的问题,

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

代码语言:javascript
复制
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示例中,您在标签中将

代码语言:javascript
复制
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中还没有一种明确的方法来正确地做到这一点,但好的是,有很多成功的例子。希望这能帮上忙

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38281973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档