17

.mdb ファイルを生成する caffe を使用して特徴を抽出しました。次に、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)

これにより、判読不能で壊れた文字の非常に長い行が出力されます。

次に、次を返す int(value) を出力してみました。

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

float(value) は次のようになります。

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

これは lmdb ファイル自体の問題ですか、それともデータ型の変換に関係していますか?

4

2 に答える 2

33

これが私が理解した作業コードです

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
于 2015-10-14T10:47:24.600 に答える
17

で画像をエンコードしたlmdb場合、@ytrewq のコードを使用すると、おそらくこのエラーが表示されます。

ValueError: total size of new array must be unchanged

代わりに次の関数を使用してください。

import caffe
import lmdb
import PIL.Image
from io 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
于 2016-06-14T09:18:47.940 に答える