数据格式——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 @   辰令  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
历史上的今天:
2023-02-13 Pytorch_人脸检测
点击右上角即可分享
微信分享提示