设为首页 加入收藏

TOP

Caffe源码中各种依赖库的作用及简单使用(一)
2015-11-10 13:45:44 来源: 作者: 【 】 浏览:29
Tags:Caffe 源码 各种 依赖 作用 简单 使用

1.?Boost库:它是一个可移植、跨平台,提供源代码的C++库,作为标准库的后备。


在Caffe中用到的Boost头文件包括:


(1)、shared_ptr.hpp:智能指针,使用它可以不需要考虑内存释放的问题;


(2)、date_time/posix_time/posix_time.hpp:时间操作函数;


(3)、python.hpp:C++/Python互操作;


(4)、make_shared.hpp:make_shared工厂函数代替new操作符;


(5)、python/raw_function.hpp:C++/Python互操作;


(6)、python/suite/indexing/vector_indexing_suite.hpp:C++/Python互操作;


(7)、thread.hpp:线程操作;


(8)、math/special_functions/next.hpp:数学函数;


2.GFlags库:它是google的一个开源的处理命令行参数的库,使用C++开发,可以替代getopt函数。GFlags与getopt函数不同,在GFlags中,标记的定义分散在源代码中,不需要列举在一个地方。


3.?GLog库:它是一个应用程序的日志库,提供基于C++风格的流的日志API,以及各种辅助的宏。它的使用方式与C++的stream操作类似。


4.?LevelDB库:它是google实现的一个非常高效的Key-Value数据库。它是单进程的服务,性能非常高。它只是一个C/C++编程语言的库,不包含网络服务封装。


LevelDB特点:(1)、LevelDB是一个持久化存储的KV系统,它将大部分数据存储到磁盘上;(2)、LevelDB在存储数据时,是根据记录的Key值有序存储的;(3)、像大多数KV系统一样,LevelDB的操作接口很简单,基本操作包括写记录,读记录以及删除记录,也支持针对多条操作的原子批量操作;(4)、LevelDB支持数据快照(snapshot)功能,使得读取操作不受写操作影响,可以在读操作过程中始终看到一致的数据;(5)、LevelDB支持数据压缩(Snappy)等操作。


5.?LMDB库:它是一个超级快、超级小的Key-Value数据存储服务,是由OpenLDAP项目的Symas开发的。使用内存映射文件,因此读取的性能跟内存数据库一样,其大小受限于虚拟地址空间的大小。


6.ProtoBuf库:GoogleProtocol Buffer(简称ProtoBuf),它是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或RPC数据交换格式。可用于通信协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。


要使用ProtoBuf库,首先需要自己编写一个.proto文件,定义我们程序中需要处理的结构化数据,在protobuf中,结构化数据被称为Message。在一个.proto文件中可以定义多个消息类型。用Protobuf编译器(protoc.exe)将.proto文件编译成目标语言,会生成对应的.h文件和.cc文件,.proto文件中的每一个消息有一个对应的类。


7.HDF5库:HDF(HierarchicalData File)是美国国家高级计算应用中心(NCSA)为了满足各种领域研究需求而研制的一种能高效存储和分发科学数据的新型数据格式。它可以存储不同类型的图像和数码数据的文件格式,并且可以在不同类型的机器上传输,同时还有统一处理这种文件格式的函数库。HDF5推出于1998年,相较于以前的HDF文件,可以说是一种全新的文件格式。HDF5是用于存储科学数据的一种文件格式和库文件。


HDF5是分层式数据管理结构。HDF5不但能处理更多的对象,存储更大的文件,支持并行I/O,线程和具备现代操作系统与应用程序所要求的其它特性,而且数据模型变得更简单,概括性更强。


HDF5只有两种基本结构,组(group)和数据集(dataset)。组,包含0个或多个HDF5对象以及支持元数据(metadata)的一个群组结构。数据集,数据元素的一个多维数组以及支持元数据。


8.?snappy库:它是一个C++库,用来压缩和解压缩的开发包。它旨在提供高速压缩速度和合理的压缩率。Snappy比zlib更快,但文件相对要大20%到100%。


下面为各个库的简单使用举例:


#include "stdafx.h"
#include
#include
#include
#include


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


#include


#include "ml.helloworld.pb.h"


int test_Boost();
int test_GFlags(int argc, char* argv[]);
int test_GLog();
int test_LevelDB();
int test_LMDB();
int test_ProtoBuf();
int test_HDF5();
int test_Snappy();



int main(int argc, char* argv[])
{
?//std::cout << argv[0] << std::endl;//E:\GitCode\Caffe\lib\dbg\x86_vc12\testThridLibrary[dbg_x86_vc12].exe
?//test_Boost();
?//test_GFlags(argc, argv);
?//test_GLog();
?//test_LevelDB();
?//test_LMDB();
?//test_ProtoBuf();
?//test_HDF5();
?test_Snappy();


?std::cout << "ok!!!" << std::endl;
?return 0;
}


class implementation {
public:
?~implementation() { std::cout << "destroying implementation\n"; }
?void do_something() { std::cout << "did something\n"; }
};


int test_Boost()
{
?//http://www.cnblogs.com/tianfang/archive/2008/09/19/1294521.html
?boost::shared_ptr sp1(new implementation());
?std::cout << "The Sample now has " << sp1.use_count() << " references\n";


?boost::shared_ptr sp2 = sp1;
?std::cout << "The Sample now has " << sp2.use_count() << " references\n";


?sp1.reset();
?std::cout << "After Reset sp1. The Sample now has " << sp2.use_count() << " references\n";


?sp2.reset();
?std::cout << "After Reset sp2.\n";


?return 0;
}


DEFINE_bool(big_menu, true, "Include 'advanced' options in the menu listing");
DEFINE_string(languages, "english,french,german", "comma-separated list of languages to offer in the 'lang' menu");


int test_GFlags(int argc, char* argv[])
{
?//http://dreamrunner.org/blog/2014/03/09/gflags-jian-ming-shi-yong/
?//http://www.leoox.com/?p=270
?int tmp_argc = 3;
?char** tmp_argv = NULL;
?tmp_ar

首页 上一页 1 2 3 4 5 6 下一页 尾页 1/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇AngularJS 的异步服务测试与Mocki.. 下一篇Linux下多线程编程互斥锁和条件变..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: