2015-10-14 16 views
16

Wyodrębniłem funkcje za pomocą caffe, która generuje plik .mdb. Następnie próbuję odczytać go za pomocą Pythona i wyświetlić go jako czytelny numer.Caffe: Czytanie LMDB z Pythona

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) 

To wypisuje bardzo długą linię nieczytelnych, zepsutych znaków.

Potem próbowałem druk int (value), która zwraca następujące:

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

pływaka (wartość) daje następujące:

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

Czy to problem z samym plikiem lmdb, czy ma to związek z konwersją typu danych?

Odpowiedz

29

Oto kod roboczych zorientowali się

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

Jeśli zakodowane obrazy w lmdb, prawdopodobnie zobaczysz ten błąd przy użyciu kodu @ ytrewq za

ValueError: total size of new array must be unchanged 

użyć tej funkcji zamiast:

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 

Przykład:

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

Czy ten błąd, który tutaj rozwiązujesz, wynika z lmdb utworzonego z kodowanymi obrazami? – Shai

+1

@Shai Tak, patrz [dyskusja tutaj] (https://groups.google.com/d/msg/digits-users/CzHG1aHizsw/QYE3qWpxBgAJ) –

+0

Dziękujemy za połączenie z odpowiednim wątkiem. dodaje tutaj właściwy kontekst. Czy możesz edytować odpowiedź, aby odzwierciedlić jej znaczenie dla zakodowanych 'lmdb's? Bardzo dobrze jest podać zarówno komunikat o błędzie, jak i główną przyczynę: kodowane obrazy w pliku lmdb. Dzięki! – Shai