首页 文章

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

提问于
浏览
1

我有一个我创建的灰度图像的数据集,我想用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

父目录名称 - 'generated dataset'
子文件夹 - 1,2,3 ...(子文件夹 Headers 为1 - 30,因为我想用子文件夹的名称标记每个子文件夹中的数据)
txt文件包含带有类标签的每一行的图像 Headers .

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

2 回答

  • 3

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

    一般说明

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

    在网络中,加载数据后的第一步是"Slice"图层,该图层采用此图像,并沿着该轴对其进行切片(即将其分割),从而创建两个Top blob, datadata_p .

    如何创建数据文件?

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

    • 将图像转换为MNIST格式 . 然后,Caffe教程中的代码开箱即用 . 看来你正在尝试这个 - 如果你需要帮助,请具体说:什么是“mnisten”,包括你的代码,等等 .

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

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

    您使用的是由您决定的 - 我可能会使用HDF5,因为这是一种简单且非常灵活的方式 .

    如何生成对?

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

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

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

    Literature:

    F.Radenović,G . Tolias和O. Chum . "CNN Image Retrieval Learns from BoW: Unsupervised Fine-Tuning with Hard Examples" . 在:欧洲计算机视觉 Session (ECCV),2016年.arXiv:1604.02426 .

  • 0

    生成对是暹罗网络中最重要的一步 . 但是,有一种简单的方法可以使用咖啡 .

    Load the data as separate lmdbs

    使用 create_imagenet.shconvert_imageset.cpp 脚本创建2 lmdbs data_1data_2 . 对于两个集合使用相同的数据,除了 data_2 包含一个少于 data_1 的图像 .

    这将确保在每个epoc中,将比较不同的图像对,从而允许我们覆盖所有 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
       }
    }
    

    Introduce a Similarity layer in the prototxt

    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"
      }
    

    Create files for Similarity layer

    Download files for similarity layer

    similarity_layer.cpp 放在 caffe/src/caffe/layers/ 中,将 similarity_layers.hpp 放在 caffe/include/caffe/layers/ 中并重建caffe .

    cd build
    cmake ..
    make -j12
    

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

    • 使用硬阴影选择图像对

    • 确保正负对(不同对)的 balancer

相关问题