如何在python中利用lmdb对数据进行读取?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
由于c++速度快,所以一般写入数据我调用c++借口,而读取数据使用c++也行,但有时候Python在某方面方便,所以通过使用python借口仅仅对lmdb文件读取,处理数据是图片
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类的序列化形式。
# -*- 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对数据进行读取问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。