protobuf、prototxt的使用/Windows/VS
博客已转移至个人网站(http://www.p-chao.com)
分为:
一、配置protobuf
二、使用prototxt
下载源码,编译出protoc.exe文件和libprotobuf.lib libprotoc.lib库文件
注意版本一致,debug出来的给debug用...
使用方法:
protoc.exe 用来根据 proto文件 生成对应的 头文件 和 信息源文件
用法: protoc --cpp_out=./ person.proto
注意命令行中的空格
libproto ..lib在自己的程序中,配合生成的头和源文件
#pragma(lib,...) ...
然后还要注意,需要将源中extract_includes.bat提取的头文件置于工程根目录下,并设置包含
protobuf具体的生成方法见博客 http://www.2cto.com/kf/201401/270281.html
不谢!
关于配置文件,prototxt(caffe中的格式,事实上可以是任何文本文件,二进制格式或者文本格式都可以)
读写prototxt的配置文件需要以下头,用到了google的glogs,自行下载编译,linux下直接使用apt-get 就可以
下面是windows的头(linux稍微修改下include),不多废话,上代码
#include <fcntl.h> #include <google/protobuf/io/coded_stream.h> #include <google/protobuf/io/zero_copy_stream_impl.h> #include <google/protobuf/text_format.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/highgui/highgui_c.h> #include <opencv2/imgproc/imgproc.hpp> #include <stdint.h> #include <stdio.h> #include <algorithm> #include <fstream> // NOLINT(readability/streams) #include <string> #include <vector> #include <fcntl.h> #include <Windows.h> #ifdef USE_LEVELDB #include <leveldb/db.h> #endif //#include "caffe/common.hpp" #include "glog\logging.h" #include "acf.pb.h" #include "io.hpp" using namespace std; // port for Win32 #ifdef _MSC_VER #define open _open #define close _close #endif namespace acf { using google::protobuf::io::FileInputStream; using google::protobuf::io::FileOutputStream; using google::protobuf::io::ZeroCopyInputStream; using google::protobuf::io::CodedInputStream; using google::protobuf::io::ZeroCopyOutputStream; using google::protobuf::io::CodedOutputStream; using google::protobuf::Message; bool ReadProtoFromTextFile(const char* filename, Message* proto) { int fd = open(filename, O_RDONLY); CHECK_NE(fd, -1) << "File not found: " << filename; FileInputStream* input = new FileInputStream(fd); bool success = google::protobuf::TextFormat::Parse(input, proto); delete input; close(fd); return success; } void WriteProtoToTextFile(const Message& proto, const char* filename) { int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644); FileOutputStream* output = new FileOutputStream(fd); CHECK(google::protobuf::TextFormat::Print(proto, output)); delete output; close(fd); } bool ReadProtoFromBinaryFile(const char* filename, Message* proto) { int fd = open(filename, O_RDONLY | O_BINARY); CHECK_NE(fd, -1) << "File not found: " << filename; ZeroCopyInputStream* raw_input = new FileInputStream(fd); CodedInputStream* coded_input = new CodedInputStream(raw_input); coded_input->SetTotalBytesLimit(1073741824, 536870912); bool success = proto->ParseFromCodedStream(coded_input); delete coded_input; delete raw_input; close(fd); return success; } void WriteProtoToBinaryFile(const Message& proto, const char* filename) { fstream output(filename, ios::out | ios::trunc | ios::binary); CHECK(proto.SerializeToOstream(&output)); } } // namespace caffe
然后读取prototxt中的配置来初始化参数
Opt opt; string filename = "./default.prototxt"; ReadProtoFromTextFileOrDie(filename, &opt);
这里解释一下,proto文件只是帮助生成一个类、而prototxt文件中存储有配置信息
例如本例中
proto文件
// global configuration of the afc package acf; message Opt{ optional string name = 1; optional string posGtDir = 2; optional string posImgDir = 3; optional string negImgDir = 4; optional string posWinDir = 5; optional string negWinDir = 6; optional int32 nWeak = 7; optional int32 modelDs = 8; optional int32 modelDsPad = 9; optional int32 stride = 10; } // it's a size type message Size{ optional int32 height = 1; optional int32 weidth = 2; }
prototxt文件
# configure text #the name of saved detector name: "models/AcfDetector" #the director of the database posGtDir: "database/posGt" posImgDir: "database/positive" negImgDir: "database/negative" posWinDir: "1" negWinDir: "1" #the number of weak classifier nWeak: 32 nWeak: 128 nWeak: 512 nWeak: 2048 #the size of windows modelDs{ height: 48 weidth: 48 } modelDs{ height: 50 weidth: 50 } #the stride in image stride: 4
Tips:注释可以使用 // 也可以使用 #
文件也可以选择成二进制,效率会高许多,如果还不明白,参见google的指导和API文档。
每一个不曾起舞的日子,都是对生命的辜负。
But it is the same with man as with the tree. The more he seeks to rise into the height and light, the more vigorously do his roots struggle earthward, downward, into the dark, the deep - into evil.
其实人跟树是一样的,越是向往高处的阳光,它的根就越要伸向黑暗的地底。----尼采
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话