1

我有 2 组图像补丁数据,即训练集和测试集。这两个都已写入 LMDB 文件。我正在使用 Caffe 对这些数据运行卷积神经网络。

问题是存储在硬盘上的数据占用了大量空间,这阻碍了我引入更多训练数据并故意添加噪声以使我的模型更健壮的努力。

有没有一种方法可以将图像补丁从我的程序直接发送到 CNN(在 Caffe 中)而不将它们存储在 LMDB 中?我目前正在使用 python 从训练数据集的图像中生成补丁。

4

2 回答 2

2

您可以编写自己的 python 数据层。请参阅此处的讨论和此处的视频流输入数据层的实现。

基本上,您将需要添加到您的网络描述层,例如:

layer {
  type: 'Python'
  name: 'data'
  top: 'data'
  top: 'label'
  python_param {
    # the module name -- usually the filename -- that needs to be in $PYTHONPATH
    module: 'filename'
    # the layer name -- the class name in the module
    layer: 'CustomInputDataLayer'
  }
}

并在 Python 中实现层接口:

class CustomInputDataLayer(caffe.Layer):
    def setup(self):
         ...

    def reshape(self, bottom, top)
        top[0].reshape(BATCH_SIZE, your_data.shape)
        top[1].reshape(BATCH_SIZE, your_label.shape)

    def forward(self, bottom, top):
        # assign output
        top[0].data[...] = your_data
        top[1].data[...] = your_label

    def backward(self, top, propagate_down, bottom):
        pass
于 2016-08-23T03:09:03.587 回答
2

除了定义自定义 python 层之外,您还可以使用以下选项:

  • 使用ImageData层:它有一个源参数(源:文本文件的名称,每行给出一个图像文件名和标签)

  • 使用MemoryData层:使用它,您可以使用 python 中的“setinputarrays”方法将输入图像直接从内存加载到网络。谨慎使用这一层,因为它只接受单值标签,并且不能使用图像作为标签(例如在语义分割中)

  • 使用您的网络的部署版本,如下所示:

    input: "data"
    input_shape {
    dim: n # batch size
    dim: c # number of channels
    dim: r # image size1
    dim: w # image size2
    }
    
    input: "label"
    input_shape {
    dim: n # batch size
    dim: c # number of channels
    dim: r # label image size1
    dim: w # label image size2
    }
     ... #your other layers to follow
    
  • 使用 HDF5 输入层(或多或少 ine lmdb,但 lmdb 的计算效率更高)

您可以在此处找到这些层的详细信息:http: //caffe.berkeleyvision.org/tutorial/layers.html

网上也有例子。

于 2016-08-23T09:15:38.630 回答