Caffe笔记(三) Caffe源码解析(资料汇总)

引言

之前对caffe进行了基本的了解,也跑了一些例程,仍觉得虽然自己对大体结构了解,但是终究是要自己动手写代码的,所以还是决定看一下caffe源码。网络上资源已经很多,所以这篇博客主要是资料的汇总,以及记录一些新的角度。

调试工具和环境

可以使用Qt creator IDE对caffe源码进行调试,环境搭建教程CSDN

注意:由于一般默认单独编译caffe的时候按官网步骤都有安装一个libopencv-dev,该包为2.4.X版本,如果你又自行安装了opencv3.x.x,编译时会出现一些问题,常见的显示opencv_xxx未定义。如果你的opencv3.x.x是用cmake默认编译,则可在build-seting界面里将OpenCV_DIR改为默认安装目录/usr/local/share/OpenCV,如果自己安装到了其他目录,可改为相应目录即可。

流程

函数起点:/caffe_root/tools/caffe.cpp中的 int main(**) 主函数 其中GlobalInit()主要负责解析命令行,GetBrewFunction()根据解析结果调用相应的函数,如train

int train() :首先读取solver.prototxt文件中的solver_parameter;分配使用GPU或CPU;对snapshot等信号进行判断;调用solver_factory中的CreateSolver(solver_param)类来创建并注册一个solver,随后进入solver.cpp中的Init()。
solver.cpp:在Init()中首先打印了solver_parameter,然后调用InitTrainNet(),在里面new了个Net<Dtype>(net_param),随即转入net.cpp;
net.cpp:进入Net类之后,其中有一个Init(param)进行网络的初始化,首先调用FilterNet读取网络定义并输出该信息;

其次建立所有层及其联系,采用类似于solver_factory的方式,用LayerRegistry<Dtype>::CreateLayer(layer_param)来构建层(注册);

接下来找出层的输入和输出,并调用相对于层的函数来返回输入的数据尺寸,还包括读取训练数据并返回过程信息;
构建层结束之后,开始初始化层,包括(输出)数据尺寸,需要的存储空间。通过多次循环的构建/初始化层来搭建整个网络。
通过初始化完成之后回到solver.cpp的InitTrainNet()中的NetState net_state;位置。紧接着执行InitTestNets();
负责调用一个由caffe.proto生成的一个caffe.pb.h文件中的caffe::SolverParameter,未完待续.....

资料汇总

说明:以下参考资料有些博主有系列文章,很值得点进去一看!!!

caffe.proto

这个文件使用了Google 公司内部的混合语言数据标准Google Protocol Buffer( 简称 Protobuf) ,Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。(摘自

所以阅读这一部分不可避免的要知晓它的基本使用规则,附上我查到的比较好的参考链接Protobuf学习 - 入门 - Aut - 博客园

参考资料:

MgLiu的专栏 - CSDN博客

video_data_layer

参考链接:

【caffe源码笔记】VideoDataLayer解析 - CSDN博客

caffe源码之VideoDataLayer - CSDN博客

其他层

Caffe学习系列(5):其它常用层及参数 - denny402 - 博客园

猜你喜欢

转载自blog.csdn.net/qq_38156052/article/details/78459410