带有多标签图像的咖啡

Posted

技术标签:

【中文标题】带有多标签图像的咖啡【英文标题】:caffe with multi-label images 【发布时间】:2015-12-17 07:19:54 【问题描述】:

我有一个包含多个标签的图像数据集;数据集中有 100 个类,每个图像有 1 到 5 个与之关联的标签。

我正在按照以下 URL 中的说明进行操作:

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 的过程中,我应该在什么步骤以及如何整合数据集的多标签性?

【问题讨论】:

【参考方案1】:

我相信 Shai 的答案不再是最新的。 Caffe supports multi-label/matrix ground truth 适用于 HDF5 和 LMDB 格式。 this github 评论中的 python sn-p 演示了如何构造多标签 LMDB 基本事实(请参阅 Shai's answer 了解 HDF5 格式)。 与单标签图像数据集的构建不同,为图像构建了一个 lmdb,而为多标签地面实况数据构建了第二个单独的 lmdb。 sn-p 处理空间多标签地面实况,可用于图像的像素级标签。

数据写入 lmdb 的顺序至关重要。基本事实的顺序必须与图像的顺序相匹配。

SOFTMAX_LOSS、EUCLIDEAN_LOSS、SIGMOID_CROSS_ENTROPY_LOSS 等损失层也支持多标签数据。 但是,Accuracy 层仍然仅限于单标签数据。您可能需要关注 this github issue 以跟踪何时将此功能添加到 Caffe。

【讨论】:

由于我有 100 个类,并且每个图像都标记为这 100 个类中的 1 到 5 个类,如果图像将该类作为其标签,我可能需要一个 1x100 矩阵,其中条目为 1,否则为 0,例如。您的代码中的 Python sn-p 处理逐像素标记,但如果您希望每个图像作为一个整体有多个标签怎么办? 准确性层有什么更新吗?他们关闭了问题。【参考方案2】:

caffe 支持多标签。您可以将标签放入 n-hot 向量中,例如[0,1,1,0,0,1,...] 。您需要将标签重塑为 n*k*1*1 张量并使用 sigmoid 交叉熵或欧几里得,而不是 softmax(强制 sum(outputs)=1 )

【讨论】:

实际上重铸为 nk*1*1 是不必要的,我的错。 nk 就足够了(标签和净输出应该在维度上一致) 我试试这个,但是当我尝试使用 caffe 示例脚本从数据创建 IMDB 时,在我有每个图像的地址和一个矢量作为标签的文本文件中,它无法正确解析文本文件,所以提出一个无法找到或打开文件的错误。有什么建议吗?? 如果您提供相对路径,请确保它们相对于 caffe 的运行位置 - 或者,提供绝对路径。如果您从文本文件中给出一些示例错误和行,则可能更容易看到发生了什么。如果您使用的是 LMDB,那么所有数据都应该在这些文件中,并且不需要文本文件 谢谢,但我尝试用数字替换标签的向量,一切顺利,所以我确定向量作为标签存在问题 您是否将标签尺寸重铸为 n*k ? (其中n是batchsize,k是向量的维度)【参考方案3】:

AFAIK,当前的 Caffe 版本不支持多标签图像的 lmdb/leveldb 数据集。但是,您可以(并且可能应该)准备 HDF5 格式的输入。 Caffe HDF5 输入层更加灵活,允许每个输入有多个标签。This answer 简要说明了如何为 caffe 创建 HDF5 输入。

您必须解决的另一个问题是,您不仅对每张图片的标签感兴趣,而且还对每张图片的可变标签数量感兴趣。你如何定义每个图像、每个标签的损失?可能是您必须编写自己的损失层。 有一些损失层支持“忽略标签”:也就是说,如果将特定的输入标签分配给图像,则不会为相应的图像计算损失。见,例如AccuracyLayerSoftmaxWithLossLayer

【讨论】:

可能是过时的答案。 Caffe supports multi-label data 用于多种格式。损失层还支持多标签数据。但是,准确性仍然仅限于单标签数据。 @ypx convert_imageset 不支持浮点标签。见here。 确实没有。 Caffe 支持从通过 python 生成的 lmdb、leveldb、hdf5 加载浮点标签。不需要 convert_imageset。 这里有一个参考,Evan Shelhamer 在多标签输出上提出了this tutorial。如果你在命令行中避免使用 pycaffe,当然它在 python 中会很痛苦,但它至少为示例提供了层结构和求解器

以上是关于带有多标签图像的咖啡的主要内容,如果未能解决你的问题,请参考以下文章

在多标签图像分类任务中,哪个损失函数会收敛得很好?

Keras中具有二进制分类的多标签

TensorFlow中具有稀疏标签的多标签图像分类?

【技术综述】多标签图像分类综述

Keras - 带权重的多标签分类

Keras CNN:图像的多标签分类