Caffe源文件解释和依赖项

目录结构

caffe文件夹下全部文件: 从Caffe-Master中解压缩出所有文件夹


主要文件夹

data 用于图像LMDB和LEVELDB 文件存储下载
docs 帮助文档
example 一些代码样例 ,比如SSD,Squeeze,一般使用DeMO文件运行,将模型和图像文件LMDB放在MODEL和DATA制定路径并编译通过后,运行python demo.py测试。
src 实现Caffe的源文件

include Caffe的实现代码的头文件


后面的学习主要围绕后面两个文件目录(include和src)下的代码展开

源码结构

父目录:

由于include和src两个目录在层次上基本一一对应因此主要分析src即可了解文件结构。下图是src下的源码结构:




gtest google test一个用于测试的库你make runtest时看见的很多绿色RUN OK就是它,这个与caffe的学习无关,不过是个有用的库
caffe 关键的代码都在这里了
test 用gtest测试caffe的代码
util 数据转换时用的一些代码。caffe速度快,很大程度得益于内存设计上的优化(blob数据结构采用proto)和对卷积的优化(部分与im2col相关)[1]。
proto 即所谓的“Protobuf”[2],全称“Google Protocol Buffer”,是一种数据存储格式,用来存储Caffe网络结构和模型文件,帮助caffe提速。
layers 深度神经网络中的基本结构就是一层层互不相同的网络了,这个文件夹下的源文件以及目前位置“src/caffe”中包含的我还没有提到的所有.cpp文件就是caffe的核心目录下的核心代码了。

源码主要关系
如上所言我们现在可以知道,caffe核心中的核心是下面的文档和文件:(这部分目前不清楚的地方先参照别人的观点)

blob[.cpp .h] Blob是四维数组,是caffe基础的数据结构。
common[.cpp .h] 定义Caffe类
internal_thread[.cpp .h] 使用boost::thread线程库
net[.cpp .h] 网络结构类Net
solver[.cpp .h] 优化方法类Solver
data_transformer[.cpp .h] 输入数据的基本操作类DataTransformer
syncedmem[.cpp .h] 分配内存和释放内存类CaffeMallocHost,用于同步GPU,CPU数据
layer_factory.cpp layer.h 层类Layer
layers 此文件夹下面的代码全部至少继承了类Layer

Caffe源码(https://github.com/weiliu89/caffe/tree/ssd)中有一些重要文件,这里再介绍下caffe.proto文件。在src/caffe/proto目录下有一个caffe.proto文件。proto目录下除了caffe.proto文件外,还有caffe.pb.h和caffe.pb.cc两个文件,此两个文件是根据caffe.proto文件内容自动生成的。

$ protoc src/caffe/proto/caffe.proto --cpp_out=.
$ sudo mkdir include/caffe/proto
$ sudo mv src/caffe/proto/caffe.pb.h include/caffe/proto

在编译的时候发现会有错误提示找不到”caffe/proto/caffe.pb.h”。可通过上面方式将编译通过(首先需要进入 caffe 根目录)。

proto文件概要介绍见:http://blog.csdn.net/fengbingchun/article/details/55267162

这里顺便提到一个有意思的东西,我是在Sublime上面利用SublimeClang插件分析代码的(顺便推荐下这插件,值得花点时间装)。

完成上面概念后,再阅读一下文件:

https://www.leiphone.com/news/201612/oZUj5d437bpSl5wc.html

http://blog.csdn.net/thy_2014/article/details/52043442

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%。

依赖项调用参考下面blog:

http://www.linuxidc.com/Linux/2015-09/123603.htm

CAFFE使用请阅读下一篇文章CAFFE编译与测试训练:

http://blog.csdn.net/windfly_al/article/details/76690315

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值