- 前言
- 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
加速訓練。