由于c++速度快,所以一般写入数据我调用c++借口,而读取数据使用c++也行,但有时候Python在某方面方便,所以通过使用python借口仅仅对lmdb文件读取,处理数据是图片
1
2
3
4
5
6
7
8
9
10
11
|
import lmdb
import numpy as np
import cv2
lmdb_file = "/home/rui/demo"
lmdb_env = lmdb. open (lmdb_file)
lmdb_txn = lmdb_env.begin()
lmdb_cursor = lmdb_txn.cursor()
for key, value in lmdb_cursor:
img = cv2.imdecode(np.fromstring(value, np.uint8), 3 );
cv2.imshow( "demo" , img)
cv2.waitKey( 0 )
|
补充知识:Python解析lmdb格式mnist数据集
背景
HDF5和LMDB都是Cafffe中常用的数据库。相对来说,HDF5的读写格式简单;LMDB采用内存-映射文件(memory-mapped files),所以拥有非常好的I/O性能,而且对于大型数据库来说,HDF5的文件常常整个写入内存。
所以HDF5的文件大小就受限于内存大小,当然也可以通过文件分割来解决问题,但其I/O性能就不如LMDB的页缓存(page cachiing)策略了。
MNIST手写数字字符识别实验在deep learning 中经常用到,这里使用Python来获取lmdb格式MNIST数据集中的图片并显示出来
Python读取LMDB
首先确认你安装了lmdb和Caffe的python包(Caffe中的pycaffe)。
pip install lmdb
LMDB采用键值对的存储格式,key就是字符形式的ID,value是Caffe中Datum类的序列化形式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# -*- coding:utf-8 -*-
import caffe
from caffe.proto import caffe_pb2
import lmdb
import cv2 as cv
env = lmdb. open ( "mnist_train_lmdb" , readonly = True ) # 打开数据文件
txn = env.begin() # 生成处理句柄
cur = txn.cursor() # 生成迭代器指针
datum = caffe_pb2.Datum() # caffe 定义的数据类型
for key, value in cur:
print ( type (key), key)
datum.ParseFromString(value) # 反序列化成datum对象
label = datum.label
data = caffe.io.datum_to_array(datum)
print data.shape
print datum.channels
image = data[ 0 ]
# image = data.transpose(1, 2, 0)
print ( type (label))
cv.imshow( str (label), image)
cv.waitKey( 0 )
cv.destroyAllWindows()
env.close()
|
运行结果:
读取LMDB数据库中的Datum数据,这里再稍微介绍一下Datum的格式:channels:图片的通道,彩色图有3个通道,灰度图只有1通道,当然也可以用通道数来表示其他意思,比如表示两张图片,每个通道一个单张的图;height:图片(即data)的高;width:图片(即data)的宽;data:图片的数据(像素值);label:图片的label。(datum.channels, datum.height, datum.width)
以上这篇使用python操作lmdb对数据读取的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_31261509/article/details/84061176