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:
一般说明
在本教程中,它们进一步显示了加载图像对的简便方法:您可以在通道维度中串联两个图像。对于灰度,您需要拍摄两个输入图像,每个输入图像都具有例如尺寸
在网络中,加载数据后的第一步是" Slice "层,该层将获取此图像并将其沿该轴切片(即,将其拆分),从而创建两个Top blob,
?如何创建数据文件?
没有唯一正确的方法可以做到这一点。本教程中的代码仅适用于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
使用
这将确保在每次epoc时,将比较不同的图像对,从而使我们能够覆盖所有
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" } |
为相似性图层创建文件
下载相似层文件
将
1 2 3 | cd build cmake .. make -j12 |
注意
如果您的网络没有使用上述技术收敛,那么您应该查看以下内容:
- 使用硬底片选择图像对
- 确保正负对(不相似对)的平衡