【问题标题】:Caffe: Reading LMDB from PythonCaffe:从 Python 读取 LMDB
【发布时间】:2016-01-12 02:03:24
【问题描述】:

我使用 caffe 提取了特征,它会生成一个 .mdb 文件。 然后我尝试使用 Python 读取它并将其显示为可读数字。

import lmdb

lmdb_env = lmdb.open('caffefeat')
lmdb_txn = lmdb_env.begin()
lmdb_cursor = lmdb_txn.cursor()

for key, value in lmdb_cursor:
    print str(value)

这会打印出很长的一行不可读的损坏字符。

然后我尝试打印 int(value),它返回以下内容:

ValueError: invalid literal for int() with base 10: '\x08\x80 \x10\x01\x18\x015\x8d\x80\xad?5'

float(value) 给出以下结果:

ValueError: could not convert string to float:? 5????5

这是lmdb文件本身的问题,还是与数据类型的转换有关?

【问题讨论】:

    标签: python caffe lmdb


    【解决方案1】:

    如果您在lmdb 中编码了图像,则在使用@ytrewq 的代码时可能会看到此错误

    ValueError: total size of new array must be unchanged
    

    改用这个函数:

    import caffe
    import lmdb
    import PIL.Image
    from io import StringIO
    import numpy as np
    
    def read_lmdb(lmdb_file):
        cursor = lmdb.open(lmdb_file, readonly=True).begin().cursor()
        datum = caffe.proto.caffe_pb2.Datum()
        for _, value in cursor:
            datum.ParseFromString(value)
            s = StringIO()
            s.write(datum.data)
            s.seek(0)
    
            yield np.array(PIL.Image.open(s)), datum.label
    

    例子:

    lmdb_dir = '/save/jobs/20160613-125532-958f/train_db/'
    for im, label in read_lmdb(lmdb_dir):
        print label, im
    

    【讨论】:

    • 您在此处解决的此错误是否源于使用编码图像创建的 lmdb?
    • @Shai 是的,见discussion here
    • 感谢您链接到相关主题。在此处添加适当的上下文。您能否编辑您的答案以反映它与编码lmdbs 的相关性?最好同时说明错误消息和根本原因:lmdb 中的编码图像。谢谢!
    • 完成!谢谢你的建议
    • 尝试运行并得到错误google.protobuf.message.DecodeError: Unexpected end-group tag. 知道如何解决这个问题吗?
    【解决方案2】:

    这是我想出的工作代码

    import caffe
    import lmdb
    
    lmdb_env = lmdb.open('directory_containing_mdb')
    lmdb_txn = lmdb_env.begin()
    lmdb_cursor = lmdb_txn.cursor()
    datum = caffe.proto.caffe_pb2.Datum()
    
    for key, value in lmdb_cursor:
        datum.ParseFromString(value)
        label = datum.label
        data = caffe.io.datum_to_array(datum)
        for l, d in zip(label, data):
                print l, d
    

    【讨论】:

    • 我收到错误ValueError: cannot reshape array of size 29367 into shape (0,0,0)。我在anaconda2下使用python2,安装caffe使用conda install caffe
    • 我可以只提供mdb文件所在文件夹的路径吗?
    猜你喜欢
    • 2018-07-09
    • 2016-09-29
    • 2016-12-18
    • 2016-02-11
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 2016-10-30
    • 2016-03-24
    相关资源
    最近更新 更多