Caffe: Leyendo LMDB desde Python
(2)
Aquí está el código de trabajo que descubrí
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
He extraído características usando caffe, que genera un archivo .mdb. Entonces estoy intentando leerlo usando Python y mostrarlo como un número legible.
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)
Esto imprime una línea muy larga de caracteres rotos ilegibles.
Luego intenté imprimir int (valor), que devuelve lo siguiente:
ValueError: invalid literal for int() with base 10: ''/x08/x80 /x10/x01/x18/x015/x8d/x80/xad?5''
float (valor) da lo siguiente:
ValueError: could not convert string to float:? 5????5
¿Se trata de un problema con el archivo lmdb en sí, o tiene que ver con la conversión del tipo de datos?
Si ha codificado imágenes en lmdb
, probablemente verá este error cuando use el código de @ytrewq
ValueError: total size of new array must be unchanged
Utilice esta función en su lugar:
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
Ejemplo:
lmdb_dir = ''/save/jobs/20160613-125532-958f/train_db/''
for im, label in read_lmdb(lmdb_dir):
print label, im