2015-10-14 134 views
16

我已經使用caffe提取了一些功能,它會生成一個.mdb文件。 然後我試圖用Python讀取它並將其顯示爲可讀的數字。Caffe:從Python中讀取LMDB

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),它返回如下:

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

浮動(值)給出了以下幾點:

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

這是一個與lmdb文件本身的問題,還是它與數據類型的轉換有關?

回答

29

這裏是工作的代碼我想通了

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

如果您在lmdb編碼的圖像,你會使用@ ytrewq代碼

ValueError: total size of new array must be unchanged 

使用此功能時,反而可能會看到這樣的錯誤:

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 

例如:

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

您在這裏解決的這個錯誤是否源自用編碼圖像創建的lmdb? – Shai

+1

@Shai是的,請參閱[討論](https://groups.google.com/d/msg/digits-users/CzHG1aHizsw/QYE3qWpxBgAJ) –

+0

謝謝您鏈接到相關主題。在此添加適當的上下文。你能編輯你的答案,以反映它與編碼lmdb的相關性嗎?聲明錯誤消息以及根本原因是非常好的:lmdb中的編碼圖像。謝謝! – Shai