2015-10-14 1 views
16

J'ai extrait des fonctions en utilisant caffe, ce qui génère un fichier .mdb. Ensuite, j'essaye de le lire en utilisant Python et de l'afficher comme un nombre lisible.Caffe: Lecture de LMDB à partir de 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) 

Ceci imprime une très longue ligne de caractères illisibles brisés.

Alors j'ai essayé l'impression int (valeur), qui renvoie les éléments suivants:

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

flotteur (valeur) donne les suivantes:

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

Est-ce un problème avec le fichier LMDB lui-même, ou est-ce que cela a à voir avec la conversion du type de données?

Répondre

29

est ici le code de travail que j'ai compris

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 
12

Si vous avez encodé images dans lmdb, vous verrez probablement cette erreur lors de l'utilisation du code @ ytrewq

ValueError: total size of new array must be unchanged 

Utilisez cette fonction au lieu:

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 

Exemple:

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

Est-ce que cette erreur que vous résolvez ici provient de lmdb créé avec des images encodées? – Shai

+1

@Shai Oui, voir la [discussion ici] (https://groups.google.com/d/msg/digits-users/CzHG1aHizsw/QYE3qWpxBgAJ) –

+0

Merci d'avoir créé un lien vers le fil de discussion correspondant. ajoute un contexte approprié ici. Pouvez-vous s'il vous plaît modifier votre réponse pour refléter sa pertinence pour codé 'lmdb's? Il est très bon d'indiquer à la fois le message d'erreur et la cause première: les images encodées dans lmdb. Merci! – Shai