2017-05-31 32 views
-1

私はnumpの配列をlmdbに書き込むことができました。solutionは完璧ではありませんが、実際にはXはjpg画像ですので、直接lmdbにjpegファイルを書き込む方法です。jpegファイルをlmdbに直接書き込む

pycaffeと同様のことをしているようですが、それは特定のDatumのcaffeを使用しており、依存関係のない一般的な解決策が必要です。

答えて

0

ここでは、イメージをnumpy配列として、直接エンコードされたjpgとして書き込む例を示します。

私たちが見ることができるように、店舗jpgは直接的にストレージの点で効率的です。

du -sh * 
184K temp.db 
120K temp_jpg.db 
import numpy as np 
import lmdb 
import cv2 

n_samples= 2 

def create_random_image(filename): 
    img= (np.random.rand(100,120,3)*255).astype(np.uint8) 

    cv2.imwrite(filename,img) 

def write_lmdb(filename): 
    print 'Write lmdb' 

    lmdb_env = lmdb.open(filename, map_size=int(1e9)) 

    X= cv2.imread('random_img.jpg') 
    y= np.random.rand(1).astype(np.float32)*10.0 

    for i in range(n_samples): 
     with lmdb_env.begin(write=True) as lmdb_txn: 
      lmdb_txn.put('X_'+str(i), X) 
      lmdb_txn.put('y_'+str(i), y) 

      print 'X.shape:',X.shape 
      print 'y:',y 

def read_lmdb(filename): 
    print 'Read lmdb' 

    lmdb_env = lmdb.open(filename) 
    lmdb_txn = lmdb_env.begin() 
    lmdb_cursor = lmdb_txn.cursor() 

    #also can do it without iteration via txn.get('key1')? 

    n_counter=0 
    with lmdb_env.begin() as lmdb_txn: 
     with lmdb_txn.cursor() as lmdb_cursor: 
      for key, value in lmdb_cursor: 
       print key 
       if('X' in key): 
        print 'X.shape', np.fromstring(value, dtype=np.uint8).shape 
       if('y' in key): 
        print np.fromstring(value, dtype=np.float32) 

       n_counter=n_counter+1 

    print 'n_samples',n_counter 

def write_lmdb_jpg(filename): 
    print 'Write lmdb' 

    lmdb_env = lmdb.open(filename, map_size=int(1e9)) 

    X= cv2.imread('random_img.jpg') 
    y= np.random.rand(1).astype(np.float32)*10.0 

    for i in range(n_samples): 
     with lmdb_env.begin(write=True) as lmdb_txn: 
      lmdb_txn.put('X_'+str(i), cv2.imencode('.jpg', X)[1]) 
      lmdb_txn.put('y_'+str(i), y) 

      print 'X.shape', cv2.imencode('.jpg', X)[1].shape 
      print 'y:',y 

def read_lmdb_jpg(filename): 
    print 'Read lmdb' 

    lmdb_env = lmdb.open(filename) 
    lmdb_txn = lmdb_env.begin() 
    lmdb_cursor = lmdb_txn.cursor() 

    #also can do it without iteration via txn.get('key1')? 

    n_counter=0 
    with lmdb_env.begin() as lmdb_txn: 
     with lmdb_txn.cursor() as lmdb_cursor: 
      for key, value in lmdb_cursor: 
       print key 
       if('X' in key): 
        X_str= np.fromstring(value, dtype=np.uint8) 
        print 'X_str.shape', X_str.shape 
        X= cv2.imdecode(X_str, cv2.CV_LOAD_IMAGE_COLOR) 
        print 'X.shape', X.shape 
       if('y' in key): 
        print np.fromstring(value, dtype=np.float32) 

       n_counter=n_counter+1 

    print 'n_samples',n_counter 

create_random_image('random_img.jpg') 

#Write as numpy array  
write_lmdb('temp.db') 
read_lmdb('temp.db') 

#Write as encoded jpg 
write_lmdb_jpg('temp_jpg.db') 
read_lmdb_jpg('temp_jpg.db') 
関連する問題