Caffe:从 Python 读取 LMDB
Caffe: Reading LMDB from Python
我已经使用生成 .mdb 文件的 caffe 提取了特征。
然后我尝试使用 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),其中 returns 以下内容:
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文件本身的问题,还是数据类型转换的问题?
这是我找到的工作代码
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
如果您在 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
我已经使用生成 .mdb 文件的 caffe 提取了特征。 然后我尝试使用 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),其中 returns 以下内容:
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文件本身的问题,还是数据类型转换的问题?
这是我找到的工作代码
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
如果您在 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