关于深度学习:如何在caffe中将任意数据集转换为暹罗网络数据集格式?

How to convert an arbitrary dataset to the siamese network dataset format in caffe?

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

替换mnist数据集

我看到要执行此操作,我需要我的数据集采用暹罗netwrk所需的格式。可以使用'create_mnist_siamese.sh'创建该文件,该文件以idx3-ubyte格式加载mnist数据集,并在lmdb数据库的每个位置创建一个包含两个图像和一个匹配/不匹配标签的数据集lmdb数据库。

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

1
2
3
4
5
6
7
parent-directory
  - subfolder
  - subfolder
  .
  .
  .
  -txt file

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

如何在caffe的暹罗网络上处理我的数据集?是否有直接方法将我的数据集转换为适用于暹罗网络的lmdb格式?还是我必须使用mnisten?如果可以,该如何解决我的错误? Anu的帮助将不胜感激。谢谢。


您不需要使用完全相同的格式-这只是一个教程...。您所需要做的就是提供一个或多个数据层,总共三个顶级Blob:datadata_psim。您可以按照自己喜欢的任何方式进行操作,例如LMDB(类似于MNIST示例),HDF5或其他任何内容。
一般说明

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

在网络中,加载数据后的第一步是" Slice "层,该层将获取此图像并将其沿该轴切片(即,将其拆分),从而创建两个Top blob,data_p

?如何创建数据文件?

没有唯一正确的方法可以做到这一点。本教程中的代码仅适用于MNIST集,因此,除非您使用完全相同的格式,否则您将无法使用它而无需进行任何更改。您有两种可能:

  • 将图像转换为MNIST格式。然后,Caffe教程中的代码即开即用。看来您正在尝试-如果需要帮助,请具体说明:什么是" mnisten",包含您的代码,等等。

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

  • 创建具有多个Top Blob的HDF5文件。这非常简单,但是可能会比使用LMDB慢一些。

  • 您所使用的取决于您自己-我可能会选择HDF5,因为这是一种简单且非常灵活的开始方式。

    如何生成对?

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

    在(Radenovi ??,2016)中提供了一个非常复杂的示例:他们使用暹罗网络来学习建筑物图像检索的表示形式。他们使用运动结构(SfM)算法创建建筑物的3-D重建,然后从这些重建中采样图像对。

    创建对的精确度取决于您的数据-也许您对随机对还好-也许您需要一种复杂的方法。

    文献:

    F。 Radenovi ??,G。Tolias和O. Chum。 " CNN图像检索向BoW学习:无监督的微调,并附有困难的示例"。于:2016年欧洲计算机视觉会议(ECCV).arXiv:1604.02426。


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

    将数据加载为单独的lmdbs

    使用create_imagenet.shconvert_imageset.cpp脚本创建2个lmdbs data_1data_2。两组数据均使用相同的数据,但data_2包含的图像少于data_1的图像。

    这将确保在每次epoc时,将比较不同的图像对,从而使我们能够覆盖所有nC2组合(实际上是n^2)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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
       }
    }

    在prototxt

    中引入相似性层

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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.cpp放置在caffe/src/caffe/layers/中并将similarity_layers.hpp放置在caffe/include/caffe/layers/中并重建caffe。

    1
    2
    3
    cd build
    cmake ..
    make -j12

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

    • 使用硬底片选择图像对
    • 确保正负对(不相似对)的平衡