【问题标题】:How to Create LMDB for Caffe Using C如何使用 C 为 Caffe 创建 LMDB
【发布时间】:2018-08-06 14:29:03
【问题描述】:

我需要动态创建可以被 Caffe 的数据层读取的 LMDB,并且限制是只有 C 可用于这样做。没有 Python。

另一个人在这里检查了 Caffe-ready LMDB 文件的字节级内容:Caffe: Understanding expected lmdb datastructure for blobs

这是一个很好的说明性示例,但显然并不全面。深入研究后,我找到了由 caffe.proto 定义的 Datum 消息类型,以及由 caffe.proto 中的 protoc 创建的随后的 caffe.pb.h 文件,但这是我遇到了死胡同的地方。

.h 文件中的 Datum 类定义了一个看起来很有前途的方法:

void SerializeWithCachedSizes(::google::protobuf::io::CodedOutputStream* output) const  

我猜这就是在发送消息之前对消息进行编码的字节级魔法。

问题:任何人都可以向我指出描述编码如何工作的文档(或任何内容),以便我可以复制它的删节版本吗?在说明性示例中,LMDB 文件包含 MNIST 数据和元数据,0x08 似乎表示下一个值是“通道数”。 0x10 和 0x18 分别表示高度和宽度。 0x28 似乎表示下一个整数标签。以此类推。

我想全面了解所有可能的字节及其含义。

【问题讨论】:

    标签: protocol-buffers caffe lmdb


    【解决方案1】:

    额外的挖掘在以下页面上产生了答案:https://developers.google.com/protocol-buffers/docs/encoding

    Caffe.proto 通过以下方式定义 Datum:

    • 可选的 int32 通道 = 1
    • 可选 int32 高度 = 2
    • 可选 int32 宽度 = 3
    • 可选字节数据 = 4
    • 可选的 int32 标签 = 5
    • 重复浮动 float_data = 6
    • 可选的布尔编码 = 7

    上述示例中的 LMDB 记录的标头是“08 01 10 1C 18 1C 22 90 06”,因此使用 Google 文档的解码器环,这些十六进制值开始有意义:

    • 08 = 字段 1,类型 = int32(因为标签的编码方式为:(field_number
    • 01 = 字段 1 的值(即通道数)为 01
    • 10 = 字段 2,类型 = int32
    • 1C = 字段 2 的值(即高度)为 28
    • 18 = 字段 3,类型 = int32
    • 1C = 字段 3 的值(即宽度)为 28
    • 22 = 字段 4,类型 = 以字节为单位的长度分隔
    • 90 06 = 使用 VarInt 编码方法,字段 4 的值(即字节数)为 1580

    鉴于此,直接使用 C 为 Caffe 数据层可读的自定义非图像数据集有效地创建 LMDB 条目变得简单。

    【讨论】:

      猜你喜欢
      • 2016-07-26
      • 2016-02-11
      • 1970-01-01
      • 2016-09-23
      • 2016-01-12
      • 2016-01-15
      • 1970-01-01
      • 2015-08-26
      • 2018-06-25
      相关资源
      最近更新 更多