天天看點

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

加速訓練。