Caffe和Python,使用复杂标签结构读取LMDB

4
我有两个LMDB文件,第一个可以顺利训练我的网络,而第二个则不能正常工作(损失开始并停留在0)。因此,我认为第二个LMDB可能存在问题。我尝试编写一些Python代码(主要来自这里)来从我的LMDB中提取数据并进行检查,但到目前为止,无论哪个数据库都没有成功。这些LMDB包含图像数据和边界框信息作为标签。
做以下操作:
for key, value in lmdb_cursor:
    datum.ParseFromString(value)
    label = datum.label
    data = caffe.io.datum_to_array(datum)

在两个LMDB中的任何一个上,我得到了一个正确命名为图像名称的键,但是datum.ParseFromString函数无法从value中检索任何内容。 label始终为0,而数据是一个空的ndarray。尽管如此,数据确实存在,值是一个大约140 KB的二进制字符串,其中包括图像大小和边界框信息。

我尝试浏览几个关于在Python中从LMDB读取数据的答案和讨论,但是我找不到任何关于读取结构化信息(如边界框标签)的线索。我猜测解析函数期望一个数字标签,并将前几个字节解释为数字标签,由于二进制字符串不再有任何意义,因此剩余数据可能会丢失?

我知道至少第一个LMDB是正确的,因为我的网络在使用它进行训练和测试时表现良好。

非常感谢您的任何帮助!


你是如何编写那些LMDB的? - Shai
使用提供的脚本caffe/scripts/create_annoset.pyanno-type detection,将边界框信息以Pascal VOC格式编码为xml。 - powder
在caffe的主分支中,我没有看到这样的脚本。您使用的是哪个caffe分支? - Shai
1
哦,抱歉。我正在使用ssd caffe分支 https://github.com/weiliu89/caffe/tree/ssd - powder
1个回答

2
你的LMDB存储的基本元素不是Datum,而是AnnotatedDatum。因此,你需要小心地处理它:
datum.ParseFromString(value.datum)
value.annotation_group  # should store the annotations

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