【问题标题】:How should LMDB record data be organized so that Caffe's data layer can read them?LMDB 记录数据应该如何组织,以便 Caffe 的数据层可以读取它们?
【发布时间】:2019-03-21 10:56:39
【问题描述】:

我需要创建一个快速、高效、低开销的例程,用于在 LMDB 中存储键/值对,以供 Caffe 的数据层后续使用(即,不链接到一堆外部库)。

我查看了 caffe.proto、caffe.pb.h 和 caffe.pb.cc 文件以及其他一些与 Google 协议缓冲区相关的文件,以了解 Datum 类,它是LMDB 记录。

对我来说最好的选择似乎是对 datum.SerializeToString() 方法的审核,该方法采用包含 Datum 的所有数据结构和嵌套结构并将它们转换为某种字符串值。然而,在深入谷歌的protobuf之后,我一直无法找到这个方法是在哪里定义的。

有人能指出我正确的方向吗?显然,如果有一种更快/更好/更便宜的方式来理解序列化 Datum 值的结构,那么我肯定会接受它。谢谢。

【问题讨论】:

    标签: machine-learning deep-learning computer-vision caffe lmdb


    【解决方案1】:

    我认为您正在寻找 caffe.io.array_to_datum 方法:这是一个 caffe protobuf 接口的 python 包装器,将一个 numpy 数组(和一个可选的整数标签)转换为一个 Datum 对象。
    关于如何使用 python 接口here 为 caffe 读/写 LMDB 有一个更全面的示例。
    如果您只是将标记图像列表转换为 LMDB,您可以使用 caffe 附带的convert_imageset 工具。

    【讨论】:

    • 我在上游遵循 Caffe 的架构,生成数据层。在 ~/caffe/src/caffe/layers 中,您会看到 data_layer.cpp,其中包括诸如 DataLayer::DataLayerSetUp 之类的例程,其中包含“datum.ParseFromString(cursor_->value());”我一直无法找到解析和序列化字符串的方法。不幸的是 convert_imageset 不适用于我的特殊情况。
    • @PeteJanda datum.ParseFromString 是 google protobuf 自动生成函数的一部分。如果convert_imageset对你不好,你可以像this example一样使用python接口编写lmdb
    猜你喜欢
    • 2016-12-18
    • 2016-07-14
    • 2016-09-23
    • 2021-01-11
    • 2016-01-12
    • 2023-03-12
    • 1970-01-01
    • 2015-09-07
    • 2020-07-06
    相关资源
    最近更新 更多