【问题标题】:Creating lmdb file in the right way以正确的方式创建 lmdb 文件
【发布时间】:2016-09-22 05:54:04
【问题描述】:

我正在尝试创建一个包含我所有数据库图像的 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 软件)正确打开。我的问题是:

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

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

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

【问题讨论】:

  • “文件未正确打开”是什么意思?你能打开它,但你看到“垃圾”?
  • 文件无法打开。不在microsoft access中,也不在python中

标签: python database neural-network caffe lmdb


【解决方案1】:

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

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

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

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

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

我希望这能让您找到解决方案。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 2014-12-27
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 2014-07-04
      相关资源
      最近更新 更多