Caffe:用Python读取LMDB

17

我使用caffe提取特征,生成了一个.mdb文件。然后我尝试使用Python读取它,并将其显示为可读的数字。

import lmdb

lmdb_env = lmdb.open('caffefeat')
lmdb_txn = lmdb_env.begin()
lmdb_cursor = lmdb_txn.cursor()

for key, value in lmdb_cursor:
    print str(value)

这将会打印出一行非常长、无法读取、破碎的字符。

然后我尝试打印 int(value),它返回了以下内容:

ValueError: invalid literal for int() with base 10: '\x08\x80 \x10\x01\x18\x015\x8d\x80\xad?5'

调用float(value)会得到以下结果:

ValueError: could not convert string to float:? 5????5

这是lmdb文件本身的问题,还是与数据类型转换有关?

2个回答

34

这是我想出来的能正常工作的代码

import caffe
import lmdb

lmdb_env = lmdb.open('directory_containing_mdb')
lmdb_txn = lmdb_env.begin()
lmdb_cursor = lmdb_txn.cursor()
datum = caffe.proto.caffe_pb2.Datum()

for key, value in lmdb_cursor:
    datum.ParseFromString(value)
    label = datum.label
    data = caffe.io.datum_to_array(datum)
    for l, d in zip(label, data):
            print l, d

1
我遇到了错误 ValueError: cannot reshape array of size 29367 into shape (0,0,0)。我正在 anaconda2 的 python2 环境下工作,并使用 conda install caffe 安装了 caffe。 - skyuuka
我可以只提供mdb文件的路径而不是它所在的文件夹吗? - alper

17
如果您在lmdb中编码了图片,在使用@ytrewq的代码时可能会看到这个错误。
ValueError: total size of new array must be unchanged

请使用这个函数代替:

import caffe
import lmdb
import PIL.Image
from io import StringIO
import numpy as np

def read_lmdb(lmdb_file):
    cursor = lmdb.open(lmdb_file, readonly=True).begin().cursor()
    datum = caffe.proto.caffe_pb2.Datum()
    for _, value in cursor:
        datum.ParseFromString(value)
        s = StringIO()
        s.write(datum.data)
        s.seek(0)

        yield np.array(PIL.Image.open(s)), datum.label

例子:

lmdb_dir = '/save/jobs/20160613-125532-958f/train_db/'
for im, label in read_lmdb(lmdb_dir):
    print label, im

你正在解决的这个错误是否源于使用编码图像创建的lmdb? - Shai
1
@Shai 是的,请查看此处的讨论 - Ghilas BELHADJ
感谢您链接到相关的线程,这里增加了适当的上下文。您能否编辑您的答案以反映它与编码的lmdb的相关性?同时说明错误消息和根本原因是非常好的:lmdb中的编码图像。谢谢! - Shai
完成!谢谢你的建议。 - Ghilas BELHADJ
1
尝试运行时出现错误 google.protobuf.message.DecodeError: Unexpected end-group tag. 有什么办法可以修复吗? - Austin
这个答案救了我,我得到了错误信息 ValueError: cannot reshape array of size 29367 into shape (0,0,0) - skyuuka

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