【问题标题】:How to write or convert float-type data to leveldb in caffe如何在caffe中将浮点型数据写入或转换为leveldb
【发布时间】:2016-04-08 02:46:53
【问题描述】:

现在我正在制作 leveldb 来训练 caffe 框架。所以我使用“convert_imageset.cpp”。这个 cpp 文件只将 char 类型的数据写入 leveldb。 但我有浮动数据将其写入 leveldb。该数据是前处理图像数据,因此它是浮点型数据。 如何将此浮点数据写入或转换为 leveldb。 这个浮点数据是一组 4096 维的向量。 请帮我。 还是不怎么转成HDF5Data?

【问题讨论】:

  • 你为什么不用"HDF5Data"
  • 什么是“HDF5Data”?以及如何转换为它们?
  • 怎么用?我从来没有用过。请告诉我如何使用它。
  • 您可以查看python 示例,了解如何为 caffe 准备 hdf5 格式的数据集,以及如何设置适当的数据层。

标签: c++ machine-learning deep-learning caffe leveldb


【解决方案1】:

HDF5 代表分层数据格式。您可以使用例如R (RHDF5 documentation) 来操作这种数据格式

其他可以处理HDF5的软件有MatlabMathematica

编辑

最近发布了一组名为 HDFql 的新工具,用于简化“通过 C/C++ 等高级语言管理 HDF 文件”。你可以去看看here

【讨论】:

  • 其实我找到了this这样的代码。但它有一部分我不明白。什么是 datum.add_float_data(0) 和 datum.set_float_data(...)。 label和key有什么区别?
【解决方案2】:
def del_and_create(dname):
    if os.path.exists(dname):
        shutil.rmtree(dname)
    os.makedirs(dname)

def get_img_datum(image_fn):
    img = cv.imread(image_fn, cv.IMREAD_COLOR)
    img = img.swapaxes(0, 2).swapaxes(1, 2)
    datum = caffe.io.array_to_datum(img, 0)
    return datum

def get_jnt_datum(joint_fn):
    joint = np.load(joint_fn)
    datum = caffe.io.caffe_pb2.Datum()
    datum.channels = len(joint)
    datum.height = 1
    datum.width = 1
    datum.float_data.extend(joint.tolist())

    return datum

def create_dataset():
    img_db_fn = 'img.lmdb'
    del_and_create(img_db_fn)
    img_env = lmdb.Environment(img_db_fn, map_size=1099511627776)
    img_txn = img_env.begin(write=True, buffers=True)

    jnt_db_fn = 'joint.lmdb'
    del_and_create(jnt_db_fn)
    jnt_env = lmdb.Environment(jnt_db_fn, map_size=1099511627776)
    jnt_txn = jnt_env.begin(write=True, buffers=True)

    img_fns = glob.glob('imageData/*.jpg')
    fileCount = len(img_fns)
    print 'A total of ', fileCount, ' images.'
    jnt_fns = glob.glob('jointData/*.npy')
    jointCount = len(jnt_fns)
    if(fileCount != jointCount):
        print 'The file counts doesnot match'
        exit()

    keys = np.arange(fileCount)
    np.random.shuffle(keys)

    for i, (img_fn, jnt_fn) in enumerate( zip(sorted(img_fns), sorted(jnt_fns)) ):
        img_datum = get_img_datum(img_fn)
        jnt_datum = get_jnt_datum(jnt_fn)
        key = '%010d' % keys[i]

        img_txn.put(key, img_datum.SerializeToString())
        jnt_txn.put(key, jnt_datum.SerializeToString())

        if i % 10000 == 0:
            img_txn.commit()
            jnt_txn.commit()
            jnt_txn = jnt_env.begin(write=True, buffers=True)
            img_txn = img_env.begin(write=True, buffers=True)

        print '%d'%(i), os.path.basename(img_fn), os.path.basename(jnt_fn)

    img_txn.commit()
    jnt_txn.commit()
    img_env.close()
    jnt_env.close()

上面的代码需要来自给定路径的图像,并且每个图像的标签为 .npy 文件。

致谢:https://github.com/mitmul/deeppose/blob/caffe/scripts/dataset.py

注意:我看过Shaianswer 的一个问题,它声称 lmdb 不支持浮点型数据。但是,它确实适用于最新版本的 Caffe 和 LMDB 并使用此代码 sn-p。由于他的回答太老了,很可能是旧版本不支持浮点型数据。

【讨论】:

  • 你叫我“老”!? ;)
  • 哈哈! :D 事实上,你的回复才 5 个月大,但以目前深度学习的速度,即使是这个数字也必须被称为“太老了”.. 这很难但很棒! :)
  • 谢谢,不过我不懂python。所以我无法理解 python 并且正在使用 c++。你有一个 c++ 代码而不是 python。我需要它。
  • 一个月前我还在使用 C++,而我完全不知道 Python。现在我在 python 中完成了几乎所有的预处理并提供给 lmdb 或 hdf5。上面的代码几乎是即插即用的类型。毕竟,SO 不适合用勺子喂食。 SO的目的是在程序员遇到困难时提供输入:)
  • 谢谢,不过我不懂python。所以我无法理解 python 并且正在使用 c++。你有一个 c++ 代码而不是 python。我需要它。事实上,我找到了类似this 的代码。但它有一部分我不明白。什么是 datum.add_float_data(0) 和 datum.set_float_data(...)。 label和key有什么区别?
猜你喜欢
  • 2015-08-20
  • 2011-07-17
  • 1970-01-01
  • 2014-02-04
  • 2022-01-26
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
相关资源
最近更新 更多