Caffe 上的多维标签数据

Multidimensional label data on Caffe

我计划实现一个 CNN,它可以使用 NYU depth v2 数据集从单个图像估计深度。通过本教程,我了解到在 Caffe 上实现处理分类问题的 CNN 很容易。我很好奇 Caffe 是否适合涉及多维基本事实(例如深度图像)和回归(深度估计)的任务。

我想要实现的是使用深度图像作为ground truths来训练一个可以估计深度图像的CNN。我需要将标签加载为单通道图像数据。

我只能通过 Shelhamer 找到与我的问题相关的答案 https://groups.google.com/d/msg/caffe-users/JXmZrz4cCMU/mBTU1__ohg4J

我知道我应该定义两个顶层,一个用于输入,另一个用于深度数据作为地面实况。然后我可以使用损失层(如 EucledianLoss)来计算损失。我在下面添加了一个模型。

这个模型会按预期工作吗?如果不行,有没有其他方法可以在 Caffe 上实现?

layer {
  name: "data"
  type: "ImageData"
  top: "data" 
  image_data_param {
    source: "input_set.txt"
    batch_size: 50
  }
}

layer {
  name: "label"
  type: "ImageData"
  top: "label"
  image_data_param {
    source: "depth_set.txt"
    batch_size: 50
  }
  is_color: false
}

layer {
 name: "loss"
 type: "EuclideanLoss"
 bottom: "some_output_layer_name"
 bottom: "label"
 top: "loss"
}

是的,上面的模型应该按照您预期的方式工作。只需确保 some_output_layer_name blob 的尺寸与 label blob 的尺寸相同即可。

显然我的上述模型是正确的开始方式,但存在一些问题。如果你有标签作为图像,你可以使用 caffe 中提供的 ImageData 层。 ImageData 有 2 个顶层,第一个是实际的图像数据,第二个是它的 "label" 这是一个数字(用于简单的分类问题)。在您的源文件中,您可以提供标签数据的路径并放置一些任意 "label"s 并忽略它们。下面的 ignored1ignored2 对应这些被忽略的标签。

layer {
  name: "data"
  type: "ImageData"
  top: "data"
  top: "ignored1"
  image_data_param {
    source: "path/to/data/data.txt"
    batch_size: 32
    new_height: 228
    new_width: 304
  }
}

# Label data
layer {
  name: "depth"
  type: "ImageData"
  top: "depth"
  top: "ignored2"
  image_data_param {
    is_color: false
    source: "path/to/data/labels.txt"
    batch_size: 32
    new_height: 55
    new_width: 74
  }
}

data.txt 样本:

/path/to/your/data/1.png 0
/path/to/your/data/2.png 0
/path/to/your/data/3.png 0
...

labels.txt 样本:

/path/to/your/labels/1.png 0
/path/to/your/labels/2.png 0
/path/to/your/labels/3.png 0
...

或者您可以编写自己的 Python 层来读取您的图像和标签数据。这是读取 NYUDv2 数据的 example layer