Protobuf Message的读写

Protobuf文件

经常有这样的需求,自定义的protobuf文件,然后需要读取protobuf的二进制文件或者是文本文件,以用来解析里面的参数,这样即可以通过protobuf文件实现。protobuf文件的解析和json解析类似。为了更加方便的进行模型的推理:我在这里定义了模型的存储路径,模型文件的名称,测试图片的存放位置,测试图像的名称。实现这一需求的步骤如下:

创建protobuf消息

syntax = "proto3";
package inference;
message DataConfig {
  string model_paths = 1;// 模型存放路径
  string test_data_path = 2;//测试图像的存放路径
  string model_name = 3;//模型文件的名称
  repeated string filenames = 4;//测试图像的名称
}

通过protoc编译生成python代码:protoc model_config.proto --python_out=.,本地将产生文件model_config_pb2.py

通过代码写入自己的消息信息

通过代码写入文本信息:

from google.protobuf import text_format
from model_config_pb2 import DataConfig
dc = DataConfig()
dc.model_paths='/home/user/models'
dc.test_data_path = '/tmp/test_data_path'
dc.model_name = 'vgg.onnx'
dc.filenames.append("demo.png")
# dc.filenames = 'demo2.png'
with open('model_config.pbtxt','w') as f:
    f.write(text_format.MessageToString(dc)) # use_short_repeated_primitives = True 用户转换格式

use_short_repeated_primitives=True 用于将

dims: -1
dims: 3
dims: 224
dims: 224

转换为:

dims: [-1, 3, 224, 224]

从文本文件获取消息

dc = DataConfig()
with open('model_config.pbtxt','rb') as f:
    text_format.Parse(f.read().decode('UTF-8'), dc)
print(dc,type(dc))

输出如下:

model_paths: "/home/user/models"
test_data_path: "/tmp/test_data_path"
model_name: "vgg.onnx"
filenames: "demo.png"
 <class 'model_config_pb2.DataConfig'>

为什么不是将消息序列化为pb文件然后以二进制形式写入?因为在我的实际应用场景中,需要用人可读的pbtxt内容配置信息,然后不使用protobuf之外的任何包解析文件。正如你使用json一样,我希望能写一个json文件,使用json包解析它而不是获取一个json对象写入文件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值