如何将任意数据集转换为caffe中的siamese网络数据集格式?

时间:2017-01-27 23:11:31

标签: dataset deep-learning caffe conv-neural-network mnist

我有一个我用灰度图像创建的数据集,我想用caffe中的暹罗网络示例,其中文档使用mnist数据集。我想用我自己的数据集

替换mnist数据集

我知道为了做到这一点,我需要我的数据集采用siamese netwrk所需的格式。这可以使用'create_mnist_siamese.sh'创建,它以idx3-ubyte格式加载mnist数据集,并在lmdb数据库的每个位置创建一个数据集lmdb数据库,其中包含两个图像和一个匹配/非匹配标签。

所以我想让我使用'create_mnist_siamese.sh'脚本,我的数据集也需要采用idx-ubyte格式。我尝试使用'mnisten'将我的数据集转换为idx-ubyte格式。但是我收到错误'错误:总图像小于num_tests'。我猜剧本并没有识别我的图像。数据集的文件夹结构如下:

parent-directory
  - subfolder
  - subfolder 
  .
  .
  .
  -txt file

父目录名称 - '生成的数据集'
子文件夹 - 1,2,3 ...(子文件夹标题为1 - 30,因为我想用子文件夹的名称标记每个子文件夹中的数据)
txt文件在每行上都包含带有类标签的图像标题。

如何使用caffe中的siamese网络上的数据集?有没有直接的方法将我的数据集转换为暹罗网络的lmdb格式?或者我必须使用mnisten?如果我这样做,我该如何解决我的错误? Anu帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:3)

您不需要使用完全相同的格式 - 这只是一个教程....您需要做的就是提供一个或多个数据层,总共有三个顶级Blob:datadata_psim。你可以用你想要的任何方式做到这一点,例如LMDB(如在MNIST示例中),HDF5或其他任何内容。

一般说明

在本教程中,他们进一步展示了加载图像对的简便方法:在通道维度中连接两个图像。对于灰度,您可以拍摄两个输入图像,其中每个图像都具有尺寸[1, 1, 28, 28](即1个图像,1个通道,28x28分辨率)。然后将它们连接成一个大小为[1, 2, 28, 28]的图像并保存它们,例如到LMDB。

在网络中,加载数据后的第一步是“切片”图层,它采用此图像,并沿着该轴切割它(即将其分开),从而创建两个顶部斑点,{{1} }和data

如何创建数据文件?

没有一种正确的方法可以做到这一点。本教程中的code仅适用于MNIST集,因此除非您具有完全相同的格式,否则无法在不进行更改的情况下使用它。你有几种可能性:

  1. 将图像转换为MNIST格式。然后,Caffe教程中的代码开箱即用。您似乎正在尝试这一点 - 如果您需要帮助,请具体说明:什么是“mnisten”,包括您的代码,等等。

  2. 编写自己的脚本来转换图像。 这实际上非常简单:您需要做的就是用您喜欢的编程语言读取图像,选择对,计算标签,然后重新保存为LMDB。 这绝对是更灵活的方式。

  3. 使用多个Top blob创建HDF5文件。这很简单,但可能比使用LMDB慢一点。

  4. 你使用的是你自己 - 我可能会选择HDF5,因为这是一种简单而灵活的开始方式。

    如何生成对?

    现在,这是一个棘手的问题。本教程中的代码只选择随机对,这不是最佳选择,并且会使学习变得相当慢。你不仅需要随机对,你需要有意义的,困难的,但仍然可以解决。如何做到这完全取决于您的数据集。

    在(Radenović,2016)中提出了一个非常复杂的例子:他们使用暹罗网络来学习建筑物图像检索的表示。他们使用Structure-from-Motion(SfM)算法创建建筑物的三维重建,然后从这些重建中采样图像对。

    你如何创建对子取决于你的数据 - 也许你对随机对很好 - 也许你需要一个复杂的方法。

    文献:

    F。 Radenović,G。Tolias和O. Chum。 “CNW图像检索从BoW学习:无监督的微调与硬实例”。在:欧洲计算机视觉会议(ECCV),2016年.arXiv:1604.02426

答案 1 :(得分:0)

生成对是暹罗网络中最重要的一步。但是,使用caffe有一种简单的方法可以做到这一点。

将数据加载为单独的lmdbs

使用Gensimdata_1脚本创建2个lmdbs data_2create_imagenet.sh。对于除convert_imageset.cpp之外的所有集合使用相同的数据,其中包含少于data_2的一个图像。

这将确保在每个epoc中,将比较不同的一对图像,从而允许我们覆盖所有data_1组合(实际为nC2

n^2

在原型文本中引入相似性层

layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  data_param{
      source: "/home/subho/SSD2/data_1/"
      batch_size: 8
      backend: LMDB
     }
  }
layer {
name: "data_p"
type: "Data"
top: "data_p"
top: "label_p"
data_param {
    source: "/home/subho/SSD2/data_2/"
    batch_size: 8
    backend: LMDB
   }
}

为相似性图层创建文件

Download files for similarity layer

layer { name: "sim_check" type: "Similarity" bottom: "label" bottom: "label_p" top: "sim_check" propagate_down: false # for each bottom_blob propagate_down: false } layer { name: "loss" type: "ContrastiveLoss" contrastive_loss_param { margin: 1.0 } bottom: "feat" bottom: "feat_p" bottom: "sim_check" top: "loss" } 置于similarity_layer.cppcaffe/src/caffe/layers/ similarity_layers.hpp并重建caffe。

caffe/include/caffe/layers/

注意 如果您的网络没有使用上述技术收敛,那么您应该看看以下内容:

  • 使用硬阴影选择图像对
  • 确保正负对(不同对)的平衡