我有一个由灰度图像创建的数据集,我想将其与 caffe 中的暹罗网络示例一起使用,其中文档使用 mnist 数据集。我想用我自己的数据集替换 mnist 数据集
我发现为了做到这一点,我需要我的数据集采用暹罗网络所需的格式。这可以使用“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 吗?如果我这样做了,我该如何修复我的错误?非常感谢阿努的帮助。谢谢。
最佳答案
您不需要使用完全相同的格式 - 这只是一个教程......您所需要做的就是提供一个或多个数据层,总共三个顶级 Blob:data
、data_p
和 sim
。您可以用任何您喜欢的方式来做到这一点,例如LMDB(如 MNIST 示例)、HDF5 或其他。
一般说明
在本教程中,他们进一步展示了加载图像对的简单方法:在 channel 维度中连接两个图像。对于灰度,您获取两个输入图像,其中每个图像的尺寸例如为 [1, 1, 28, 28]
(即 1 个图像、1 个 channel 、28x28 分辨率)。然后将它们连接成一张大小为 [1, 2, 28, 28]
的图像并保存它们,例如到 LMDB。
在网络中,加载数据后的第一步是“切片”层,它获取该图像,并沿该轴对其进行切片(即将其分割),从而创建两个顶部 blob,data
和 data_p
。
如何创建数据文件?
没有单一正确的方法可以做到这一点。 code本教程中的内容仅适用于 MNIST 集,因此除非您具有完全相同的格式,否则您无法在不进行更改的情况下使用它。您有几种可能性:
将图像转换为 MNIST 格式。然后,Caffe 教程中的代码就可以开箱即用。您似乎正在尝试此操作 - 如果您需要这方面的帮助,请具体说明:什么是“mnisten”,包括您的代码等等。
编写您自己的脚本来转换图像。 这实际上非常简单:您所需要做的就是用您最喜欢的编程语言读取图像,选择图像对,计算标签,然后重新保存为 LMDB。 这绝对是更灵活的方式。
创建具有多个顶级 blob 的 HDF5 文件。这很简单,但可能会比使用 LMDB 慢一点。
您使用什么取决于您 - 我可能会选择 HDF5,因为这是一种简单且非常灵活的开始方式。
如何生成对?
现在,这是一个难题。本教程中的代码只是选择随机对,这并不是真正的最佳选择,并且会使学习速度相当慢。你不仅需要随机对,还需要有意义、困难但仍然可解决的对。如何做到这一点完全取决于您的数据集。
(Radenović,2016)中提出了一个非常复杂的示例:他们使用 Siamese 网络来学习建筑物图像检索的表示。他们使用运动结构 (SfM) 算法创建建筑物的 3D 重建,然后从这些重建中采样图像对。
创建配对的具体方式取决于您的数据 - 也许您可以接受随机配对 - 也许您需要一种复杂的方法。
文献:
F. Radenovic、G. Tolias 和 O. Chum。 “CNN 图像检索从 BoW 中学习:通过硬示例进行无监督微调”。见:欧洲计算机视觉 session (ECCV),2016。arXiv:1604.02426 .
关于dataset - 如何在caffe中将任意数据集转换为siamese网络数据集格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41904521/