Caffe:从Python读取LMDB

时间:2015-10-14 05:53:30

标签: python caffe lmdb

我使用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 个答案:

答案 0 :(得分:32)

这是我想出的工作代码

      public void clearText() {
    runOnUiThread(new Runnable() {
        public void run() {
          readText.setText("");
        }
    });
}

答案 1 :(得分:16)

如果您在lmdb中编码了图像,则在使用@ ytrewq代码时可能会看到此错误

ValueError: total size of new array must be unchanged

请改用此功能:

import caffe
import lmdb
import PIL.Image
from StringIO 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