2015-10-14 12 views
16

私は、.mdbファイルを生成するcaffeを使って機能を抽出しました。 それから私は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(値)を試してみました:

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

ここで私はあなたがlmdbでエンコードされたイメージがある場合ytrewqのコード

ValueError: total size of new array must be unchanged 

代わりに、この機能を使って、@使用している場合、あなたはおそらく、このエラーが表示されます

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

を考え出した作業コードがあります:

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