caffe中 protobuf格式

转载 2018年04月15日 14:40:48

rotoBuf是一种灵活高效的独立于语言平台的结构化数据表示方法,可用于表示通信协议和数据存储等各方面,与XML相比,ProtoBuF更小更快更简单。你可以用定义自己ProtoBuf的数据结构,用ProtoBuf编译器生成特定语言的源代码,(如C++,Java,Python等,目前ProtoBuf对主流的编程语言都提供了支持)方便的进行序列化和反序列化。


ProtoBuf 工作机制

在一个后缀名为.pro的文件中定义你所需的任何需要序列化和反序列的结构,类似于中我们C/C++语言中的结构体定义,也类似于JSON类定义,ProtoBuf文件的每一个属性都是一个键值对,引用谷歌官方的例子说明,一个包含Person信息的.pro文件。
[plain] view plain copy
  1. message Person {  
  2.   required string name = 1;  
  3.   required int32 id = 2;  
  4.   optional string email = 3;  
  5.   
  6.   enum PhoneType {  
  7.     MOBILE = 0;  
  8.     HOME = 1;  
  9.     WORK = 2;  
  10.   }  
  11.   
  12.   message PhoneNumber {  
  13.     required string number = 1;  
  14.     optional PhoneType type = 2 [default = HOME];  
  15.   }  
  16.   
  17.   repeated PhoneNumber phone = 4;  
  18. }  
.pro文件的每一个属性都是一个包含类型和名称的对,protobuf的类型可以是string,int,bool,或者是其他ProtoBuf源文件中定位的类型等。还开元指定该属性的一些特殊字段,比l如optional表示该属性是可选的,required表示该属性是必须的,repeated表示该属性是一个list的集合(不知道用list类似形容是否合适,就差不多意思吧,包含1个或多个元素),包含了若干个相同类型的值,不过在protoBuf 3中,optional和required都不需要的了,如果配了两个,protoBuf 编译器还会报错,但是repeated的还是保留的,用来说明该字段是一个list。
.protoBuf定义完以后,就可以使用ProtoBuf编译器进行编译,编译时需要指定你需要生成的代码的语言类型。.pro文件编译成功后会生成*.pro.pb.hh 和*.pro.pb.cc两个文件,*和.pro源文件名称相同。在生成的文件中会生成一个你定义的消息类型的的类以及读取和设置该消息类型各个属性的set和Get方法等,比如上例中会生成一个Person类,和name(),set_name()这样的成员方法,以及序列化和反序列的方法,你可以用这些方法方便的读取和设置相应的属性,以及序列化和反序列化方法。
你可以像如下的方式序列化
[plain] view plain copy
  1. Person person;  
  2. person.set_name("John Doe");  
  3. person.set_id(1234);  
  4. person.set_email("jdoe@example.com");  
  5. fstream output("myfile", ios::out | ios::binary);  
  6. person.SerializeToOstream(&output);  

可以像如下方式反序列化,读取各个字段
[plain] view plain copy
  1. fstream input("myfile", ios::in | ios::binary);  
  2. Person person;  
  3. person.ParseFromIstream(&input);  
  4. cout << "Name: " << person.name() << endl;  
  5. cout << "E-mail: " << person.email() << endl;  


ProtoBuf的一个亮点是提供了向前和向后的兼容性,你可以再你定义的消息格式中增加字段或者删除字段,当消息由一个增加字段后的系统向一个老版本系统发送消息时,老版本解析该消息格式后会直接忽略新增的字段,而当消息从老版本发向新版本时,新版本解析该消息时会将新增的字段设置为默认值,所以你不需要担心在系统中增加消息字段后的兼容问题以及版本升级配套问题。


为什么不用XML

在序列化和反序列化结构化数据时,ProtoBuf拥有XML很多无可比拟的优势:
1、它比XML更为简单。这点显而易见
2、存储同样的数据比XML小3到10倍
3、运行速度比XML快20到100倍
4、更小的二义性
5、直接利用类和成员方法序列化反序列化数据更有利于编程。

比如你需要定义个结构化数据Person,包含了name和email属性,在XML中你会这样定义:
[html] view plain copy
  1. <person>  
  2.   <name>John Doe</name>  
  3.   <email>jdoe@example.com</email>  
  4. </person>  

而在ProtoBuf中的定义是这样的:
[html] view plain copy
  1. # Textual representation of a protocol buffer.  
  2. # This is *not* the binary format used on the wire.  
  3. person {  
  4.   name: "John Doe"  
  5.   email: "jdoe@example.com"  
  6. }  
如果将上述的ProtoBuf文件序列化,它仅仅占据28个字节的空间,解析该文件也仅仅需要100到200纳秒,而相同的XML文件至少需要69个字节存储数据(除去空白),解析该XML文件至少需要10000纳秒,而在对数据的操作方面ProtoBuf的操作也更加简单:
  1. cout << "Name: " << person.name() << endl;  
  2. cout << "E-mail: " << person.email() << endl;  

而XML将会做如下动作:
  1. cout << "Name: "  
  2.      << person.getElementsByTagName("name")->item(0)->innerText()  
  3.      << endl;  
  4. cout << "E-mail: "  
  5.      << person.getElementsByTagName("email")->item(0)->innerText()  
  6.      << endl;  


然而,ProtoBuf与XML相比,有某些用途下并不是一个很好的解决方案,如ProtoBuf,并不适合用于给基本标签的文本文档建模,此外XML是易读的,自描述的,而ProtoBuf的二进制文档并不是自描述的,除非拥有数据的源文件,否则你很难理解序列化后的文件中的内容,它是一个二进制文件。



该篇文章对ProtoBuf作了一个简短的介绍,简单来说可按如下步骤使用ProtoBuf:
1、定义你自己的数据结构格式(.pro)源文件。
2、利用protoBuf提供的编译器编译源文件。
3、使用ProtoBuf C++的API 读写消息。

Caffe代码导读(1):Protobuf例子

Protobuf是一种可以实现内存与外存交换的协议接口。j
  • kkk584520
  • kkk584520
  • 2014年11月12日 22:06
  • 10137

【神经网络与深度学习】【Python开发】Caffe配置 windows下怎么安装protobuf for python

首先从google上下载protobuf-2.5.0.zip和protoc-2.5.0-win32.zip,然后把protoc-2.5.0-win32.zip里的protoc.exe放到protobu...
  • LG1259156776
  • LG1259156776
  • 2016年09月17日 15:34
  • 887

caffe 编译出现protobuf的坑.....

prptpbuf的坑差不多填了我一天半的时间吧....简直了。。报错如下:在函数‘caffe::UpgradeV0LayerParameter(caffe::V1LayerParameter cons...
  • jiachen0212
  • jiachen0212
  • 2018年03月16日 11:15
  • 237

caffe安装中protobuf的版本问题

最近想换个版本的caffe安装,结果总出现问题,不是报caffe.pb.h的错就是报caffe.pb.o的错。 去某歌上一查,是protobuf版本的问题。github上最新版本的protobuf至...
  • missdaddio
  • missdaddio
  • 2017年03月28日 09:15
  • 8187

Caffe代码解读:Protobuf

转载:http://blog.csdn.net/kkk584520/article/details/41046827 protobuf下载地址:http://pan.baidu.com/s/1p...
  • liuyue2046
  • liuyue2046
  • 2015年11月06日 15:18
  • 990

caffe protobuf介绍

caffe中的参数管理是通过google于2008年开源的一款非常优秀的序列化反序列化工具——prtotocol buffer实现的。 一、Protobuf消息定义 ...
  • u014114990
  • u014114990
  • 2015年08月12日 10:41
  • 1553

Caffe番外:Protobuf3.1.0 VS2013配置问题

Protobuf3.1.0版本在VS2013上配置遇到的问题: error LNK2038 LNK2005 LNK1112
  • u011185952
  • u011185952
  • 2016年10月08日 21:39
  • 1004

ubuntu14.04下caffe protobuf问题的解决和安装方式

1 >在网站 http://code.google.com/p/protobuf/downloads/list上可以下载 Protobuf 的源代码。然后解压编译安装便可以使用它了。 安装步骤如...
  • u011534057
  • u011534057
  • 2016年06月12日 21:08
  • 2117

caffe源码学习——1.熟悉protobuf,会读caffe.proto

要想学习caffe源码,首当其冲的要阅读的,就是caffe.proto这个文件。它定义了caffe中用到的许多结构化数据。caffe采用了Protocol Buffers的数据格式。那么,Protoc...
  • qiusuoxiaozi
  • qiusuoxiaozi
  • 2017年03月10日 16:38
  • 2384

Caffe安装中多版本protobuf选择问题

在ubuntu下安装caffe时,使用make all命令后,经常会报出protobuf版本冲突的问题,如下: In file included from .build_release/src/caf...
  • feimengjuan
  • feimengjuan
  • 2017年12月01日 09:42
  • 668
收藏助手
不良信息举报
您举报文章:caffe中 protobuf格式
举报原因:
原因补充:

(最多只允许输入30个字)