1. caffe目录结构
在caffe根目录下执行tree命令可以查看caffe目录结构:
root@cl-Lenovo-G480:/home/cl/caffe# tree -d
.
├── build -> .build_release //编译结果存放处,子目录结构与主目录类似
├── cmake //使用Cmake编译时会用到,不关注
│ ├── External
│ ├── Modules
│ └── Templates
├── data //用于存放原始数据及数据获取脚本
│ ├── cifar10 //存放CIFAR10小图片原始数据
│ ├── ilsvrc12 //存放ImageNet Meta数据,原始数据需要下载
│ └── mnist //存放MNIST手写体数字数据
├── distribute //编译后生成发布包的位置,用于迁移
│ ├── bin
│ └── lib
├── docker //同样是为了便于迁移,使用了Docker工具
│ ├── standalone
│ │ ├── cpu
│ │ └── gpu
│ └── templates
├── docs //doxygen工程文件放在这里,可生成caffe ref_man.pdf
│ ├── images
│ ├── _layouts
│ ├── stylesheets
│ └── tutorial
│ └── fig
├── examples //存放简单例程
│ ├── cifar10 //CIFAR10例程
│ │ ├── cifar10_test_lmdb
│ │ └── cifar10_train_lmdb
│ ├── cpp_classification //图像分类例程
│ ├── feature_extraction //特征提取例程
│ ├── finetune_flickr_style //finetune例程
│ ├── finetune_pascal_detection //finetune例程
│ ├── hdf5_classification //使用HDF5数据源的分类例程
│ ├── imagenet //ImageNet例程,使用bvlc_reference_caffenet模型
│ ├── images
│ ├── mnist //MNIST手写体数字识别例程
│ │ ├── mnist_test_lmdb
│ │ └── mnist_train_lmdb
│ ├── net_surgery
│ ├── pycaffe
│ │ └── layers
│ ├── siamese
│ └── web_demo
│ └── templates
├── include //caffe头文件集中存放于此目录
│ └── caffe
│ ├── layers
│ ├── test
│ └── util
├── matlab //适用于MATLAB做Wrapper,具体可以参考RCNN源码
│ ├── +caffe
│ │ ├── imagenet
│ │ ├── private
│ │ └── +test
│ ├── demo
│ └── hdf5creation
├── models //存放示例模型
│ ├── bvlc_alexnet //经典的AlexNet
│ ├── bvlc_googlenet //GoogleNet
│ ├── bvlc_reference_caffenet //caffe模拟的AlexNet
│ ├── bvlc_reference_rcnn_ilsvrc13 //RCNN模型
│ └── finetune_flickr_style
├── python //用于Python Wrapper
│ └── caffe
│ ├── imagenet
│ ├── proto
│ └── test
├── scripts //存放脚本
│ └── travis
├── src //caffe源码
│ ├── caffe
│ │ ├── layers //各个层的具体实现
│ │ ├── proto //proto描述文件,学习数据结构先从这开始
│ │ ├── solvers
│ │ ├── test
│ │ │ └── test_data
│ │ └── util
│ └── gtest
└── tools //常用工具源码
└── extra
79 directories
2. 如何有效阅读Caffe代码
1.从src/caffe/proto/caffe.proto开始,了解基本数据结构内存对象和磁盘文件的一一映射关系(ProtoBuffer工具自动完成);
2.看头文件;
3.有针对性的看cpp和cu文件;
4.可以编写各类工具,集成在Caffe内部。
tips:使用Linux grep命令快速追踪某个关键词:
root@cl-Lenovo-G480:/home/cl/caffe# grep -n -H -R "REGISTER_LAYER_CREATOR" *
include/caffe/layer_factory.hpp:34: * REGISTER_LAYER_CREATOR(MyAwesome, GetMyAwesomeLayer)
include/caffe/layer_factory.hpp:127:#define REGISTER_LAYER_CREATOR(type, creator) \
include/caffe/layer_factory.hpp:137: REGISTER_LAYER_CREATOR(type, Creator_##type##Layer)
src/caffe/layer_factory.cpp:74:REGISTER_LAYER_CREATOR(Convolution, GetConvolutionLayer);
src/caffe/layer_factory.cpp:112:REGISTER_LAYER_CREATOR(Pooling, GetPoolingLayer);
src/caffe/layer_factory.cpp:150:REGISTER_LAYER_CREATOR(LRN, GetLRNLayer);
src/caffe/layer_factory.cpp:174:REGISTER_LAYER_CREATOR(ReLU, GetReLULayer);
src/caffe/layer_factory.cpp:198:REGISTER_LAYER_CREATOR(Sigmoid, GetSigmoidLayer);
src/caffe/layer_factory.cpp:222:REGISTER_LAYER_CREATOR(Softmax, GetSoftmaxLayer);
src/caffe/layer_factory.cpp:246:REGISTER_LAYER_CREATOR(TanH, GetTanHLayer);
src/caffe/layer_factory.cpp:262:REGISTER_LAYER_CREATOR(Python, GetPythonLayer);
命令行参数解释:
-n -显示行号,便于定位
-H -显示文件名,便于定位
-R -递归查找每个子目录,适合工程较大,分多个目录存放的场景
在caffe.hpp中的内容如下:(caffe.hpp中包含了caffe中所有核心头文件)
// caffe.hpp is the header file that you need to include in your code. It wraps
// all the internal caffe header files into one for simpler inclusion.
#ifndef CAFFE_CAFFE_HPP_
#define CAFFE_CAFFE_HPP_
#include "caffe/blob.hpp"
#include "caffe/common.hpp"
#include "caffe/filler.hpp"
#include "caffe/layer.hpp"
#include "caffe/layer_factory.hpp"
#include "caffe/net.hpp"
#include "caffe/parallel.hpp"
#include "caffe/proto/caffe.pb.h"
#include "caffe/solver.hpp"
#include "caffe/solver_factory.hpp"
#include "caffe/util/benchmark.hpp"
#include "caffe/util/io.hpp"
#include "caffe/util/upgrade_proto.hpp"
#endif // CAFFE_CAFFE_HPP_