我有一个我用灰度图像创建的数据集,我想用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帮助将不胜感激。感谢。
答案 0 :(得分:3)
您不需要使用完全相同的格式 - 这只是一个教程....您需要做的就是提供一个或多个数据层,总共有三个顶级Blob:data
,data_p
和sim
。你可以用你想要的任何方式做到这一点,例如LMDB(如在MNIST示例中),HDF5或其他任何内容。
在本教程中,他们进一步展示了加载图像对的简便方法:在通道维度中连接两个图像。对于灰度,您可以拍摄两个输入图像,其中每个图像都具有尺寸[1, 1, 28, 28]
(即1个图像,1个通道,28x28分辨率)。然后将它们连接成一个大小为[1, 2, 28, 28]
的图像并保存它们,例如到LMDB。
在网络中,加载数据后的第一步是“切片”图层,它采用此图像,并沿着该轴切割它(即将其分开),从而创建两个顶部斑点,{{1} }和data
。
没有一种正确的方法可以做到这一点。本教程中的code仅适用于MNIST集,因此除非您具有完全相同的格式,否则无法在不进行更改的情况下使用它。你有几种可能性:
将图像转换为MNIST格式。然后,Caffe教程中的代码开箱即用。您似乎正在尝试这一点 - 如果您需要帮助,请具体说明:什么是“mnisten”,包括您的代码,等等。
编写自己的脚本来转换图像。 这实际上非常简单:您需要做的就是用您喜欢的编程语言读取图像,选择对,计算标签,然后重新保存为LMDB。 这绝对是更灵活的方式。
使用多个Top blob创建HDF5文件。这很简单,但可能比使用LMDB慢一点。
你使用的是你自己 - 我可能会选择HDF5,因为这是一种简单而灵活的开始方式。
现在,这是一个棘手的问题。本教程中的代码只选择随机对,这不是最佳选择,并且会使学习变得相当慢。你不仅需要随机对,你需要有意义的,困难的,但仍然可以解决。如何做到这完全取决于您的数据集。
在(Radenović,2016)中提出了一个非常复杂的例子:他们使用暹罗网络来学习建筑物图像检索的表示。他们使用Structure-from-Motion(SfM)算法创建建筑物的三维重建,然后从这些重建中采样图像对。
你如何创建对子取决于你的数据 - 也许你对随机对很好 - 也许你需要一个复杂的方法。
文献:
F。 Radenović,G。Tolias和O. Chum。 “CNW图像检索从BoW学习:无监督的微调与硬实例”。在:欧洲计算机视觉会议(ECCV),2016年.arXiv:1604.02426。
答案 1 :(得分:0)
生成对是暹罗网络中最重要的一步。但是,使用caffe有一种简单的方法可以做到这一点。
将数据加载为单独的lmdbs
使用Gensim
或data_1
脚本创建2个lmdbs data_2
和create_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.cpp
和caffe/src/caffe/layers/
similarity_layers.hpp
并重建caffe。
caffe/include/caffe/layers/
注意强> 如果您的网络没有使用上述技术收敛,那么您应该看看以下内容: