環境:
首先,環境搭建.
- 預設已裝好cuda8.0+cuDNN6.0.
- caffe的安裝參考我上一篇博文.
第二,資料準備.
- 準備好trainlmg和testlmg檔案.
- 計算均值
第三,微調網絡結構
- github上https://github.com/shicai/MobileNet-Caffe下載下傳模型和.protutxt.
windows環境下,利用caffe架構,采用MoblieNet的圖像識别 - 複制mobilenet_deploy.prototxt,命名為train.prototxt,修改如下
- 這裡把第一層給換為了兩層,
name: "MOBILENET"
layer {
name: "data_train"
type: "ImageData"
top: "data"
top: "label"
include {
phase: TRAIN # TRAIN,表示訓練時使用
}
transform_param {
scale: 0.00390625 # 1/255,圖像歸一化
mirror: true # 是否鏡像,視情況而定
crop_size: 224 # 輸入到網絡的圖像的尺寸
mean_value: [112.24, 115.46, 117.84] # 訓練集的圖像的三個通道的均值
}
image_data_param {
source: "train_txt.txt" # 你的trainImg.txt,形如 0\0.jpg 0
0\1.jpg 0
0\10.jpg 0
0\100.jpg 0
0\1000.jpg 0
0\1001.jpg 0
batch_size: 10 # 你的batc size
new_height: 224 # 如果設定了,就是把原始的輸入圖像resize成new_*的尺寸,前面的crop_size是随機采集的尺寸
new_width: 224
shuffle:true # 是否打散資料
root_folder: "D:\\work\\data-backandcard\\trainImg\\" # 你訓練圖像的位址的前半段,
# 其實某個圖像的位址就是 root_folder + trainImg.txt,
# 注意兩個\\,或者一個/
}
}
layer {
name: "data_test"
type: "ImageData"
top: "data"
top: "label"
include {
phase: TEST # TEST,表示測試時使用
}
transform_param {
scale: 0.00390625
mirror: true
crop_size: 224
mean_value: [112.24, 115.46, 117.84]
}
image_data_param {
source: "test_txt.txt"
batch_size: 10
new_height: 224
new_width: 224
shuffle:true
root_folder: "D:\\work\\data-backandcard\\testImg\\"
}
}
- 針對最後一層
layer {
name: "myfc7" # 原本是"fc7",最好改一下新的,有人說如果不改,可能不會改變模型結構
type: "Convolution"
bottom: "pool6"
top: "myfc7" # 所有的"fc7"均改為新的,例如我的"myfc7"
param {
lr_mult: 10 # 把學習率調高,加速收斂
decay_mult: 1
}
param {
lr_mult: 20 # 把學習率調高,加速收斂
decay_mult: 0
}
convolution_param {
num_output: 13 # 修改你的輸出類别數
kernel_size: 1
weight_filler {
type: "msra"
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "myfc7" # 這裡改
bottom: "label"
top: "loss"
}
layer {
name: "top1/acc"
type: "Accuracy"
bottom: "myfc7" # 這裡
bottom: "label"
top: "top1/acc"
include {
phase: TEST
}
accuracy_param {
top_k: 1
}
}
layer {
name: "top5/acc"
type: "Accuracy"
bottom: "myfc7" # 這裡
bottom: "label"
top: "top5/acc"
include {
phase: TEST
}
accuracy_param {
top_k: 5
}
}
- 修改solver.prototxt, 用于定義訓練的參數
net: "train.prototxt" # train.prototxt的路徑,最好寫絕對路徑
test_iter: 170 # 你的 總測試樣本數 / batchsize ,大約是這樣,一個整數
test_interval: 2000 # 你的 總訓練樣本數 /batchsize
base_lr: 0.0001 # 初試學習率,對訓練影響巨大,如果你的loss一直=87.3...,很可能是這個原因
lr_policy: "step" # 梯度下降的方式
gamma: 0.1 # 一般是這個值
stepsize: 1999 # 每多少的iter下降一次學習率
display: 10 # 每多少iter列印一下loss
max_iter: 10000 # 最大疊代次數,一般是test_interval的3-6倍
momentum: 0.9 # 一般是這個
weight_decay: 0.0005 # 一般是這個
snapshot: 5000 # 每多少次iter儲存一下caffe的model,同時也會列印top1 和 top5 準确率,如果你的硬碟空間充足可以設小一點,反正MobileNet很小,20M不到
snapshot_prefix: "./model/mobilenet" # caffemodel的儲存路徑和儲存名稱,如"model"檔案夾下記得要建立,他的名字是mobilenet_iter_1000.caffemodel
solver_mode: GPU # 使用GPU訓練
- 訓練,cmd下輸入如下,回車
具體的路徑依自己的而定D:\caffe\bin\caffe.exe train -solver .\solver.prototxt -weights D:\caffe\models\MobileNet\Mobilenet.caffemodel -gpu all
- 下一篇将介紹如何将caffe的模型與Opencv的Dnn子產品結合起來使用