数据格式——lmdb

数据格式

lmdb是caffe训练网络用的数据格式,需要将原始的图片数据转换成lmdb
(caffe中也可以直接用jpg进行训练)
  零拷贝(Zero Copy)  事务支持  单一层次结构
   数据格式转换时间 读写锁限制 存储空间需求

    LMDB数据库和索引文件
	   数据索引文件(如db.idx),记录每个图像在LMDB数据库中的位置信息
 在Python中,我们可以使用lmdb库来完成这个任务。

格式

import lmdb

image_path='D:/hjb.jpg'
label='hjb'

env=lmdb.open('../data/hjb')

cache={} #存储{key,value}

#读取图像文件的二进制格式数据bytes
with open(image_path,'rb') as f:
    image_bin=f.read()

#用两个键值对表示一个数据样本
cache['image_000']=image_bin
cache['label_000']=label

with env.begin(write=True) as txn:
    for k,v in cache.items():
        if isinstance(v,bytes):
            #图片类型为bytes
            txn.put(k.encode(),v)
        else:
            #图片类型为str,转化为bytes
            txn.put(k.encode(),v.encode())

env.close()

Datum数据

Datum数据,这里再稍微介绍一下Datum的格式:
   channels:图片的通道;
   height:图片(即data)的高;
   width:图片(即data)的宽;
   data:图片的数据(像素值);
   label:图片的label

代码

env = lmdb.open():创建 lmdb 环境
txn = env.begin():建立事务
txn.put(key, value):进行插入和修改

env=lmdb.open("../data/hjb",map_size=1099511627776)
for i in range(N):
    datum = caffe.proto.caffe_pb2.Datum()
    #set channels=3
    datum.channels = X.shape[1]
    #set height =32
    datum.height = X.shape[2]
    #set width = 32
    datum.width = X.shape[3]
    datum.data = X[i].tobytes()  # or .tostring() if numpy < 1.9
    datum.label = int(y[i])

数据转换

caffe要使用lmdb数据库的原因有:1、性能高;2、安全性好;3、空间利用率高。
LMDB采用内存映射(Memory-Mapped)的方式,可以快速读取和写入大量数据。Caffe选择LMDB作为数据存储的方式

数据转换:将原始数据转换为Caffe可以处理的格式。
    如果是图片数据,可能需要转换为LMDB或HDF5格式;
	如果是文本数据,可能需要转换为bag-of-words或TF-IDF等特征表示
LMDB采用内存-映射文件(memory-mapped files),所以拥有非常好的I/O性能
    key就是字符形式的ID,value是Caffe中Datum类的序列化形式

从硬盘读取图像数据并存入到LMDB数据库,或者读取LMDB数据Datum并还原图像。

参考

lmdb https://www.jianshu.com/p/ce2ca99c8f18		
posted @ 2025-02-13 17:12  辰令  阅读(288)  评论(0)    收藏  举报