Python读取LMDB数据:原理与MNIST实例解析
本文介绍如何使用Python通过Caffe接口读取LMDB格式数据。LMDB凭借内存映射文件机制,在I/O性能上优于HDF5,特别适合大型数据库。文章详细解析了LMDB的键值对存储结构及Datum对象字段(channels、height、width、data、label),并提供基于MNIST手写数字数据集的Python读取与图像显示完整代码示例,帮助开发者高效处理深度学习数据。
Python读取LMDB数据:原理与MNIST实例解析
鉴于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数据集
LMDB与HDF5的性能对比
背景
HDF5和LMDB均为Caffe中常用的数据库格式。相比之下,HDF5的读写格式较为简单;而LMDB采用内存-映射文件(memory-mapped files)机制,因此具备卓越的I/O性能。
HDF5文件的大小受限于可用内存,尽管可通过文件分割来缓解此问题,但其I/O性能仍不及LMDB的页缓存(page caching)策略。
MNIST手写数字字符识别实验在深度学习领域应用广泛,本文旨在演示如何使用Python获取lmdb格式MNIST数据集中的图片并将其显示出来。
Python读取LMDB的实现步骤
Python读取LMDB
首先需确认已安装lmdb库及Caffe的Python包(即Caffe中的pycaffe)。
pip install lmdb
LMDB存储结构与Datum对象解析
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为图片标签。(datum.channels, datum.height, datum.width)
以上即为使用Python操作lmdb进行数据读取的完整实例,供读者参考。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









