LMDB 文件的全称是 Lightning Memory-Mapped Database,也就是闪电内存映射数据库,用这种数据可以省去大量读取小文件的时间花费和 IO 花费,可以提高训练的速度。
如果你好奇 LMDB 文件里面存储了什么东西,这篇博客会带你一起看看里面的内容。
查看 LMDB 的内容
1. lmdb 文件的格式
LMDB 文件里面存储的内容很简单,就是一堆字符串。像是 Python 中的 dictionary 数据那样,它是一个 key 对应一个 value 的。key 是图片的名字,value 是图片的像素数值和标签。
2. 使用 lmdb 库读取
lmdb 文件的读取可以使用 Python 的 lmdb 库。直接使用 pip install lmdb
就可以安装 lmdb 库了。
既然我们知道了 lmdb 里面就是一堆数据集中的图片的名字和像素与标签,并且以 key 和 value 来表示,那我们就可以看看 key 和 value 的值了。
我们导入 lmdb 库,打开文件看看:
import lmdb
env = lmdb.open("csdn_train_lmdb", readonly=True) # 打开文件
txn = env.begin() # 生成处理句柄
cur = txn.cursor() # 生成迭代器指针
for key, value in cur:
print('the key:', key)
print(str(value[0:10]))
print('...' + value[-5:])
break
env.close()
输出后里面的内容为这样,两个值都是字符串类型:
key: '00000000_014.jpg' # '_' 前面的数字是图片的引索值
value: \x08\x03\x10\x80\x02\x18\x80\x02...\x018\x00 # value 是一堆特殊编码的字符,最后面的存放了这张图片的标签
3. 可视化 lmdb
代码:
import lmdb
import caffe
from caffe.proto import caffe_pb2
import cv2 as cv
env = lmdb.open("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]
print(type(label))
cv.imshow(str(label), image)
cv.waitKey(0)
cv.destoyAllWindows()
env.close()
效果如下,窗口上显示的数字为标签:
可见,生成 lmdb 文件时,图片会被变成三个通道的灰色图片。
参考博客: