0

我正在尝试创建一个包含我所有数据库图像的 lmdb 文件(以训练 CNN)。

这是我从这里获取的“测试代码” :

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 软件)正确打开。我的问题是:

  1. 我不明白这段代码在做什么。什么是str_id?什么是X[i].tobytes?最后一行是做什么的?

  2. 运行代码后,我得到了 2 个文件:“data.mdb”和“key.mdb”。那两个是什么?也许这两个文件是我无法打开数据库的原因?

两个输出文件

非常感谢,非常感谢您的帮助!

4

2 回答 2

1

str_id 是 LMDB 内部使用的数据集(例如一张 JPG 图像)的内部名称。它来自路径和序列号i

tobytes ...在这里,让我为您搜索。这个整个过程,通过循环结束,将数据集(数据)转换为 LMDB 格式,然后将该二进制表示直接复制到文件中。 tobytesSerializeToString是按原样传输位模式的关键方法。

data.mdb是一个相对庞大的数据文件,以易于恢复的形式包含所有这些位序列。换句话说,它不会阻止您的数据库访问,因为它数据库。

lock.mdb是记录级​​锁定文件:在任何读取或写入期间,每个数据都会被适当地锁定(完全或只读)。

这应该可以解释悬而未决的问题。 lock不会阻止打开数据库;它仅在访问操作期间运行。检查您的文件权限。还要检查您的用户身份:LMDB 创建是否以root身份运行,并且没有授予您读取权限?您是否尝试过使用简单的编辑器(例如viwordpad)以只读方式打开它?

我希望这能让你走向解决方案。

于 2016-09-19T21:31:27.663 回答
0

您可以使用mdb_dump工具检查数据库的内容。

于 2016-09-21T21:54:04.417 回答