我正在尝试创建一个包含所有数据库映像的lmdb文件(为了训练CNN)。
这是我的“测试代码”,是我从here获取的:
import numpy as np
import lmdb
import caffe
import cv2
import glob
N = 18
# Let's pretend this is interesting data
X = np.zeros((N, 1, 32, 32), dtype=np.uint8)
y = np.zeros(N, dtype=np.int64)
# We need to prepare the database for the size. We'll set it 10 times
# greater than what we theoretically need. There is little drawback to
# setting this too big. If you still run into problem after raising
# this, you might want to try saving fewer entries in a single
# transaction.
map_size = X.nbytes * 10
train_data = [img for img in glob.glob("/home/roishik/Desktop/Thesis/Code/cafe_cnn/third/code/train_images/*png")]
for i , img_path in enumerate(train_data):
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
X[i]=img
y[i]=i%2
env = lmdb.open('train', map_size=map_size)
print X
print y
with env.begin(write=True) as txn:
# txn is a Transaction object
for i in range(N):
datum = caffe.proto.caffe_pb2.Datum()
datum.channels = X.shape[1]
datum.height = X.shape[2]
datum.width = X.shape[3]
datum.data = X[i].tobytes() # or .tostring() if numpy < 1.9
print 'a ' + str(X[i])
datum.label = int(y[i])
print 'b ' + str(datum.label)
str_id = '{:08}'.format(i)
txn.put(str_id.encode('ascii'), datum.SerializeToString())
如您所见,我指定了随机二进制标签(0或1,分别为偶数或奇数)。在我创建更大的lmdb文件之前,我想确保我以正确的方式做到这一点。
创建此文件后,我想'查看文件'并检查它是否正常,但我不能。使用python,Access 2016和.mdb阅读器(linux ubunto软件)无法正常打开文件。我的问题是:
答案 0 :(得分:1)
str_id是LMDB中使用的数据集的内部名称(例如,一个JPG图像)。它来自路径和序列号 i 。
tobytes ...在这里,让我search为你。整个过程在循环结束时将数据集(datum)转换为LMDB格式,然后将该二进制表示直接复制到文件中。 tobytes 和 SerializeToString 是按原样传输位模式的关键方法。
data.mdb 是一个相对庞大的数据文件,以易于恢复的形式包含所有这些位序列。换句话说,它不会阻止您的数据库访问,因为 是数据库。
lock.mdb 是记录级锁定文件:在任何读取或写入期间,每个数据都会被适当锁定(完全或只读)。
这应该解释一些悬而未决的问题。 锁定不会阻止打开数据库;它仅在访问操作期间运行。检查您的文件权限。检查您的用户身份:LMDB创建是否可以作为 root 运行,而不是给您读取权限?您是否尝试使用简单的编辑器以只读方式打开它,例如 vi 或 wordpad ?
我希望这会让你走向解决方案。
答案 1 :(得分:0)
您可以使用mdb_dump工具检查数据库的内容。