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.
其实人跟树是一样的,越是向往高处的阳光,它的根就越要伸向黑暗的地底。----尼采