2015-10-14 16 views
16

Tôi đã trích xuất các tính năng sử dụng caffe, tạo ra tệp .mdb. Sau đó, tôi đang cố đọc nó bằng Python và hiển thị nó dưới dạng một số có thể đọc được.Caffe: Đọc LMDB từ 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) 

Điều này in ra một dòng rất dài các ký tự không đọc được, bị hỏng.

Sau đó, tôi đã cố gắng in int (giá trị), mà trả về như sau:

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

float (giá trị) cho phép như sau:

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

Đây có phải là một vấn đề với các tập tin lmdb chính nó, hoặc nó có liên quan đến việc chuyển đổi kiểu dữ liệu không?

Trả lời

29

Dưới đây là đoạn code làm việc tôi đã tìm ra

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

Nếu bạn đã mã hóa hình ảnh trong lmdb, có thể bạn sẽ gặp phải lỗi này khi sử dụng mã @ ytrewq của

ValueError: total size of new array must be unchanged 

Sử dụng chức năng này để thay thế:

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 

Ví dụ:

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

Lỗi này bạn đang giải quyết ở đây có xuất phát từ lmdb được tạo bằng hình ảnh được mã hóa không? – Shai

+1

@Shai Có, xem [thảo luận tại đây] (https://groups.google.com/d/msg/digits-users/CzHG1aHizsw/QYE3qWpxBgAJ) –

+0

Cảm ơn bạn đã liên kết đến chuỗi liên quan. thêm một ngữ cảnh thích hợp ở đây. Bạn có thể vui lòng chỉnh sửa câu trả lời của mình để phản ánh sự liên quan của nó với mã hoá 'lmdb' không? Nó là rất tốt để nhà nước cả thông báo lỗi cũng như nguyên nhân gốc: hình ảnh được mã hóa trong lmdb. Cảm ơn! – Shai

Các vấn đề liên quan