Caffe与多标签图像

20

我有一个包含多个标签的图像数据集;该数据集共有100个类别,并且每个图像都与1到5个标签相关联。

我正在遵循以下网址中的指示:

https://github.com/BVLC/caffe/issues/550

它说我需要生成一个文本文件,列出图像及其标签,如下所示:

/home/my_test_dir/picture-foo.jpg 0
/home/my_test_dir/picture-foo1.jpg 1
在我的情况下,由于我有多标签图像,那么是否可以像下面这样简单地添加标签?
/home/my_test_dir/picture-foo.jpg 0 2 5
/home/my_test_dir/picture-foo1.jpg 1 4
我有一种感觉,这可能不会那么简单。如果我是对的,在设置Caffe过程中,我应该在哪个步骤以及如何整合数据集的多标签属性?
3个回答

21

我认为Shai的回答已经不再适用了。Caffe支持HDF5和LMDB格式的多标签/矩阵真值。这个Github评论中的Python代码片段演示了如何构建多标签LMDB真值(有关HDF5格式,请参见Shai的答案)。与构建单标签图像数据集不同,一个lmdb用于图像,而第二个单独的lmdb用于多标签真值数据。这个片段处理了空间多标签真值,有助于对图像进行像素级标记。

写入lmdb的数据顺序至关重要。真值的顺序必须与图像的顺序相匹配。

Loss层,如SOFTMAX_LOSS、EUCLIDEAN_LOSS、SIGMOID_CROSS_ENTROPY_LOSS也支持多标签数据。然而,Accuracy层仍然局限于单标签数据。你可能想关注这个Github问题,以跟踪该功能何时添加到Caffe。


5
由于我有100个类别,每个图像从这些100个类别中标记了1到5个类别,因此我可能需要一个1x100的矩阵,如果该图像具有该类别作为其标签,则该矩阵的项为1,否则为0。例如,您代码中的Python片段处理像素级标记,但是如果您想要整个图像上的多个标签,怎么办? - ytrewq
准确度层有任何更新吗?他们已经关闭了这个问题。 - Rafael Ruiz Muñoz

5

caffe支持多标签分类。你可以将标签放入n-hot向量中,例如[0,1,1,0,0,1,...]。你需要将标签重塑为n*k*1*1张量,并使用sigmoid交叉熵或欧几里得距离,而不是softmax(softmax强制使输出总和等于1)。


实际上将其重塑为 nk11 是不必要的,我的错。nk 就足够了(标签和网络输出应该在维度上一致)。 - jeremy_rutman
我尝试了这个,但是当我尝试使用caffe示例脚本从数据创建IMDB时,在文本文件中,我有每个图像的地址和一个向量作为标签,它无法正确解析文本文件,因此会引发找不到或打开文件的错误。有什么建议吗? - Somayyeh Ataei
如果您正在提供相对路径,请确保它们是相对于caffe运行的位置,或者可以提供绝对路径。如果您提供一些文本文件中的示例错误和行,则可能更容易看出发生了什么。如果您使用LMDB,则所有数据都应该在这些文件中,不需要文本文件。 - jeremy_rutman
谢谢,但我尝试用数字替换标签向量,一切都很顺利,所以我确定问题是由于标签向量引起的。 - Somayyeh Ataei
你是否将标签的维度重塑为n*k?(其中n是批处理大小,k是向量的维数) - jeremy_rutman
显示剩余2条评论

3
据我所知,当前的Caffe版本不支持lmdb/leveldb格式的多标签图片数据集。然而,你可以(并且可能应该)将输入准备成HDF5格式。Caffe HDF5输入层更加灵活,可以让你在一个输入中拥有多个标签。
这个答案简要描述了如何为caffe创建HDF5输入。
另一个问题是,你不仅对每张图片感兴趣的是多个标签,而且标签数量还会变化。你如何定义每张图片、每个标签的损失?也许你需要编写自己的损失层。
有一些损失层支持“忽略标签”:也就是说,如果某个特定的输入标签被分配给图片,那么对于相应的图片不会计算损失。例如,可以看看AccuracyLayerSoftmaxWithLossLayer

2
可能已过时的答案。Caffe 支持多标签数据,适用于多种格式。损失层也支持多标签数据。然而,准确率仍然受限于单标签数据。 - ypx
1
@ypx convert_imageset 不支持浮点数标签。请参考这里 - Shai
1
True表示不需要使用convert_imageset,Caffe支持从Python生成的lmdb、leveldb、hdf5加载浮点标签。 - ypx
2
这里提供一个参考,Evan Shelhamer发布了关于多标签输出的教程。虽然它是用Python编写的,如果您一直避免使用pycaffe命令行可能会有些麻烦,但至少它提供了一个示例的层结构和求解器。 - marcman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接