最近需要用Caffe跑一个车辆检测模型,由于博主之前一直在TensorFlow+Keras下做视觉任务,需要系统学习Caffe框架。现以此系列博客记录Caffe的学习历程,下面从Caffe的优势、架构、网络定义、各层定义、Caffe的安装配置、训练模型等方面介绍Caffe。
学习Caffe,必看的一个地方就是它的官网,地址为http://caffe.berkeleyvision.org/。
Caffe简介
当前投身到计算机视觉研究方向的人越来越多,深度学习作为计算机视觉的一种研究方法受到人们的热捧,但要靠自己完全实现DNN是一个很困难的过程,一个好的框架显得至关重要。谷歌有TensorFlow,微软有CNTK,亚马逊有MxNet, 百度有Paddle,而BVLC(Berkeley Vision and Learning Center)发布的Caffe框架作为一个清晰高效的深度学习框架,因其上手简单,速度快,应用场景广,很多时候都会选用它来完成工程项目,作者是博士毕业于UC Berkeley的贾扬清,社区贡献者共同开发,开源license为BSD 2-Clause。
Caffe,全称为Convolutional Architecture for Fast Feature Embedding,基于服务器端,如果在终端做深度学习,目前很多场景都应用不了,比如说,手机端、嵌入式端。Caffe2Go框架定位在手机端,但目前还未开源。Caffe-jacinto框架致力于嵌入式端,且github开源。
Caffe框架相关开源地址如下:
BVLC: https://github.com/BVLC/caffe
NVIDIA: https://github.com/NVIDIA/caffe
Caffe是纯粹的C++/CUDA架构,底层完全用C++编写,支持命令行、Python和MATLAB接口;可以在CPU和GPU直接无缝切换:
Caffe::set_model(Caffe::GPU)
Caffe的优势
- 上手快:模型与相应优化都是以文本形式而非代码形式给出。Caffe给出了模型的定义、最优化设置以及预训练的权重,方便立即上手;
- 速度快:能运行最棒的模型和海量数据。Caffe与cuDNN结合使用,测试AlexNet模型,在K40上处理每张图片只需要1.17ms;
- 模块化:方便扩展到新的任务和设置上。可以使用Caffe提供的各层类型来定义自己的模型;
- 开放性:公开的代码和参考模型用于再现;
- 社区好:可以通过BSD-2参与开发与讨论。
Caffe的安装与配置
Caffe的网络定义
Caffe中的网络都是有向无环图的集合,可以直接定义:
name: "dummy-net" layers {<span><span>name: <span>"data" …</span></span></span>} layers {<span><span>name: <span>"conv" …</span></span></span>} layers {<span><span>name: <span>"pool" …</span></span></span>} layers {<span><span>name: <span>"loss" …</span></span></span>}
数据及其导数以blobs的形式在层间流动。
Caffe的各层定义
Caffe层的定义由2部分组成:层属性与层参数,例如
name:"conv1" type:CONVOLUTION bottom:"data" top:"conv1" convolution_param{ num_output:<span>20 kernel_size:5 stride:1 weight_filler{ type: "<span style="color: #c0504d;">xavier</span>" } }
这段配置文件的前4行是层属性,定义了层名称、层类型以及层连接结构(输入blob和输出blob);而后半部分是各种层参数。
Blob是用以存储数据的4维数组,例如
- 对于数据,NCHW(Number * Channel * Height * Width)
- 对于卷积权重,Output * Input * Height * Width
- 对于卷积偏置,Output * 1 * 1 * 1
训练网络
网络参数的定义也很方便,可以随意设置相应参数。甚至调用GPU运算只需要写一句话:
solver_mode:GPU
训练网络的例子见Caffe训练示例。
Caffe(CNN,Deep Learning)
Caffe,Convolution Architecture For Feature Embedding (Extraction)
Caffe是什么?
- CNN(Deep Learning)工具箱;
- C++语言架构;
- CPU和GPU无缝交换;
- Python和Matlab的封装;
- 但是,Decaf只是CPU版本。
为什么用Caffe?
- 运算速度快,简单、友好的架构,用到的一些库;
- Google Logging library(Glog):一个C++语言的应用级日志记录框架,提供了C++风格的流操作和各种助手宏;
- leveldb(数据存储):是一个google实现的非常高效的kv数据库,单进程操作;
- CBLAS library(CPU版本的矩阵操作);
- CUBLAS library(GPU版本的矩阵操作)。
Caffe架构
深挖代码,Caffe主要包括四个部分,分别是Blob、Layer、Net和Solver。(重点研究下caffe.proto文件)
Blob:Store data and derivatives(存储数据和导数);
Layer:Transforms bottom blobs to top blobs(网络由层构成);
Net:Many layers; computes gradients via forward/ backward(层次结构组成网络);
Solver:Uses grandients to update weights(网络是靠Solver文件来支配的,超参数如学习率、衰减率等等都是通过Solver文件来支配的)。
1. 预处理图像的LevelDB/LMDB构建
输入:一批图像和label(2和3)
输出:LevelDB/LMDB(4)
指令里包含如下信息:
conver_imageset (构建LevelDB的可运行程序)
train/ (此目录放处理的jpg或者其他格式的图像)
label.txt (图像文件名及其label信息)
输出的LevelDB文件夹的名字
CPU/GPU (指定是在CPU上还是在GPU上运行code)
注:LevelDB/LMDB的介绍参见关于LevelDB和LMDB的介绍
2. CNN网络配置文件
Imagenet_solver.prototxt (包含全局参数的配置文件)
Imagenet_train.prototxt (包含训练网络的配置文件)
Imagenet_val.prototxt (包含测试网络的配置文件)
注:推荐一本不错的书:深度学习——21天实战Caffe 赵永科 著 电子工业出版社
附上两个个有趣的网站:JYQ的Caffe model zoo和SnailTyan的Caffe model zoo。
不错的初学者参考链接,高手请绕过:
https://blog.csdn.net/qq_26898461/article/details/50427778
https://dirtysalt.github.io/html/caffe.html
https://blog.csdn.net/cham_3/article/details/72141753
https://blog.csdn.net/xygl2009/article/details/77829178
https://www.open-open.com/lib/view/open1421995285109.html
https://blog.csdn.net/xjz18298268521/article/details/52190058