- 前言
- 1.Caffe的编译
- 2.训练MobileNet
- 2.1生成数据txt文件
- 2.2转成lmdb
- 2.3计算均值
- 2.4编写网络配置文件
- 2.5编写训练配置文件
- 2.6训练
前言
之前一直用的是tensorflow,但是部署在移动端用到ncnn的时候,由于ncnn是基于caffe开发的,因此有很多坑,虽然还是成功在ncnn上跑通,并且准确率基本一致,(tensorflow如何转ncnn的有时间再开一贴)但是
int8
量化仍然有一些问题,具体就是
tensorflow自带的量化工具虽然效果很好,基本准确率不变,参数减少大约75%,但是反量化层无法转成ncnn;
ncnn自带的量化工具,由于不支持tensorflow,强行转过来的模型会出现一些bug,
大佬也遇到了过,暂时没办法解决。
nihui
因此只能用caffe再训练一下,正好了解一下别的框架。
代码和配置文件上传到了我的Github了,链接。
1.Caffe的编译
Caffe的编译大概是最难的一步了吧,踩了很多坑,看了好多博客才装上,装上的时候真的感动,先上一个图。
然而其实python并不怎么用的到,哈哈哈。
稍微简单说一下安装过程吧,比较推荐的是这篇博客
因为有很多第三方库,所以照着这篇博客给的网盘下载下来会快很多。
需要的一些例如
CUDA
,
cudnn
,
protobuf
,
cmake
,
vs
这些之前都装过了,所以也不太记得了,简单总结一下几个坑的解决方法。
1.尽量下载第三库,因为vs自带的
NuGet
下载还是相当慢的;
2.用
Nuget
把更新opencv到2.4.11;
3.将警告视为错误,改为否;
4.
,
libcaffe
test_all
项目属性->生成事件->预期和后期生成事件改为否;
5.重新清理生成看看,说不定就成功了。。。
2.训练MobileNet
2.1生成数据txt文件
caffe一般是将数据转成
lmdb
格式读取的,而转格式首先需要训练的图片路径和标签的清单
train.txt
,好像有linux下的脚步文件,但是我是window,就用
python
写了一下,在之前的csv的文件稍加修改,主要就是写一个txt文件,每一行一个图片的路径,空一格,标签,换行。大概如下:
2.2转成lmdb
caffe有个工具
convert imagenet
,直接运行就可以,cmd指令如下
···
convert_imageset --shuffle --resize_height=256 --resize_width=256 D:/train4/ D:/project/caffe/data/train.txt D:/project/caffe/data/lmdb
···
2.3计算均值
利用
computer_image_mean
计算均值,cmd指令如下
compute_image_mean D:/project/caffe/data/train1/train_lmdb D:/project/caffe/data/train1/train_mean.binaryproto
2.4编写网络配置文件
主要参考了某位大佬的github:MobileNet-Caffe
训练主要将
mobilenet_deploy.prototxt
几个地方修改一下,
输入层
layer {
name: "Cat"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
crop_size: 224
mean_value: [103.94,116.78,123.68]
#mean_file: "D:/project/caffe/data/train_mean.binaryproto"
}
data_param {
source: "D:/project/caffe/data/train1/train_lmdb"
batch_size: 32
backend: LMDB
}
}
BN层
batch_norm_param {
use_global_stats: false
eps: 1e-5
}
global_stats在训练时应该关闭
FC层
layer {
name: "fc7"
type: "Convolution"
bottom: "pool6"
top: "fc7"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 3
kernel_size: 1
weight_filler {
type: "msra"
}
bias_filler {
type: "constant"
value: 0
}
}
}
num_out改为自己的类别数
Loss层
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "fc7"
bottom: "label"
top: "loss"
}
Accuracy层
layer {
name: "top1/acc"
type: "Accuracy"
bottom: "fc7"
bottom: "label"
top: "top1/acc"
include {
phase: TEST
}
}
修改后的文件可以参考我的github。
2.5编写训练配置文件
训练还需要一个
solver
配置文件,主要放一些训练的超参数,比如迭代次数,学习率等等,这里给大家一个简单的配置,可以快速开启训练。
net: "D:/project/caffe/model/mobilenetv11_dw.prototxt"
test_iter: 100
test_interval: 3000
base_lr: 0.0001
momentum: 0.9
weight_decay: 0.004
lr_policy: "multistep"
gamma: 0.9
stepvalue: 30000
stepvalue: 50000
stepvalue: 70000
stepvalue: 90000
display: 50
max_iter: 100000
snapshot: 10000
snapshot_prefix: "D:/project/caffe/model/save/train1/mobilenetv1"
solver_mode: GPU
2.6训练
利用编译好的
caffe.exe
就可以开始训练了,cmd指令如下,
从零开始训练
caffe train --solver=D:/project/caffe/model/mobilenet_solver_lr1.prototxt
继续训练
caffe train --solver=D:/project/caffe/model/mobilenet_solver_lr1.prototxt --snapshot=D:/project/caffe/model/save/train1/mobilenetv1_iter_100000.solverstate
根据一定权重微调
caffe train --solver=D:/project/caffe/model/mobilenet_solver_lr1.prototxt --weights=D:/project/caffe/model/save/train1/mobilenetv1_iter_100000.caffemodel
下一节讲一下如何添加
Depthwise Convolution
加速训练。