天天看点

Caffe训练MobileNet(一)前言1.Caffe的编译2.训练MobileNet

  • 前言
  • 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的编译大概是最难的一步了吧,踩了很多坑,看了好多博客才装上,装上的时候真的感动,先上一个图。

Caffe训练MobileNet(一)前言1.Caffe的编译2.训练MobileNet

然而其实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文件,每一行一个图片的路径,空一格,标签,换行。大概如下:

Caffe训练MobileNet(一)前言1.Caffe的编译2.训练MobileNet

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

加速训练。