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对象写入文件。