python caffe lmdb

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