文件格式之lmdb

LMDB:是一种极大减少IO开销的数据管理方式,特别是对于样本多,但是都是小样本的情况特别合适。该数据格式采用的是一种字典的格式。

对于训练神经网络,数据类型复杂多样,有二进制文件,文本文件,编码后的图像文件和JPEG或PNG等等


使用caffe对数据进行处理时,需要将图片转化为lmdb格式的。

求助百度百科,无词条,求助wikipedia,成功,地址.
lmdb 是Lightning Memory-Mapped Database的缩写。
LMDB示例文件为
这里写图片描述
它包含一个数据文件和一个锁文件。

python 操作

参考教程1,教程2教程3
python module 为lmdb
直接通过pip进行安装

pip install lmdb
  • 1

读 LMDB

import caffe
import lmdb
import numpy as np
import cv2
from caffe.proto import caffe_pb2

lmdb_env = lmdb.open('lmdb_data')
lmdb_txn = lmdb_env.begin()
lmdb_cursor = lmdb_txn.cursor()
datum = caffe_pb2.Datum()

for key, value in lmdb_cursor:
    datum.ParseFromString(value)

    label = datum.label
    data = caffe.io.datum_to_array(datum)

    #CxHxW to HxWxC in cv2
    image = np.transpose(data, (1,2,0))
    cv2.imshow('cv2', image)
    cv2.waitKey(1)
    print('{},{}'.format(key, label))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

import lmdb
import numpy as np
import cv2
import caffe
from caffe.proto import caffe_pb2

#basic setting
lmdb_file = 'lmdb_data'
batch_size = 256

# create the lmdb file
lmdb_env = lmdb.open(lmdb_file, map_size=int(1e12))
lmdb_txn = lmdb_env.begin(write=True)
datum = caffe_pb2.Datum()

item_id = -1
for x in range(1000):
    item_id += 1

    #prepare the data and label
    data = np.ones((3,64,64), np.uint8) * (item_id%128 + 64) #CxHxW array, uint8 or float
    label = item_id%128 + 64

    # save in datum
    datum = caffe.io.array_to_datum(data, label)
    keystr = '{:0>8d}'.format(item_id)
    lmdb_txn.put( keystr, datum.SerializeToString() )

    # write batch
    if(item_id + 1) % batch_size == 0:
        lmdb_txn.commit()
        lmdb_txn = lmdb_env.begin(write=True)
        print (item_id + 1)

# write last batch
if (item_id+1) % batch_size != 0:
    lmdb_txn.commit()
    print 'last batch'
    print (item_id + 1)

猜你喜欢

转载自blog.csdn.net/touch_dream/article/details/80527187
今日推荐