数据格式
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