上一篇使用caffenet的模型微调。但由于caffenet有220M太大,測试速度太慢。因此换为googlenet.
1. 训练
迭代了2800次时死机,大概20分钟。
使用的是2000次的模型。
2. 測试
2.1 測试批处理
在F:\caffe-master170309新建例如以下图文件test-TrafficJamBigData03292057.bat。
.\Build\x64\Debug\caffe.exe test --model=models/bvlc_googlenet0329_1/train_val.prototxt -weights=models/bvlc_googlenet0329_1/bvlc_googlenet_iter_2000.caffemodel -gpu=0
pause
效果例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFza2ExMTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
2.2 測试单张图片
以下用训练出的模型,測试单个图片的准确率。
(參考model的使用)
改Debug\classfication.bat例如以下(測试单张图F:\caffe-master170309\data\TrafficJamBigData03281545\test\du\190416357.png)
通过手动执行可知须要3:67秒。故MFC程序的延时可减少为4秒。
这样比caffenet的11秒快得多了。
只是效果不准:10张图(5张堵、5张不堵)所有识别为不堵,效果例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFza2ExMTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
上述我觉得是训练的模型不好,故又一次训练。
3. 又一次训练 (參考)
以下又一次训练googlenet模型。主要添加迭代次数和batch_size。
3.1 训练数据转lmdb格式和mean文件
因为之前用caffenet时。是以227*227的图片训练的(将crop_size设为227)。用227*227的图片測试的(直接将图由480*480转为了227*227)
此须要用480*480大小的又一次训练。
3.1.1 读取图片的标签,并将图片名+标签写入train_label.txt与test_label.txt里
F:\caffe-master170309\Build\x64\Debug下新建convert-TrafficJamBigData03301009-train.bat,内容例如以下:
F:/caffe-master170309/Build/x64/Debug/convert_imageset.exe --shuffle --resize_width=480 --resize_height=480 F:/caffe-master170309/data/TrafficJamBigData03301009/ F:/caffe-master170309/data/TrafficJamBigData03301009/train_label.txt F:/caffe-master170309/data/TrafficJamBigData03301009/TrafficJamBigData03301009-train_lmdb -backend=lmdb
pause
F:/caffe-master170309/Build/x64/Debug/convert_imageset.exe --shuffle --resize_width=480 --resize_height=480 F:/caffe-master170309/data/TrafficJamBigData03301009/ F:/caffe-master170309/data/TrafficJamBigData03301009/test_label.txt F:/caffe-master170309/data/TrafficJamBigData03301009/TrafficJamBigData03301009-test_lmdb -backend=lmdb
pause
F:\caffe-master170309\Build\x64\Debug下新建mean-TrafficJamBigData03301009.bat,内容例如以下:
compute_image_mean.exe F:/caffe-master170309/data/TrafficJamBigData03301009/TrafficJamBigData03301009-train_lmdb mean.binaryproto --backend=lmdb
pause
3.1.4 复制文件
在caffe-master170309/examples下新建TrafficJamBigData03301009目录。
把刚才生成的Debug/mean.binaryproto和F:\caffe-master170309\data\TrafficJamBigData03301009\TrafficJamBigData03301009-train_lmdb和F:\caffe-master170309\data\TrafficJamBigData03301009\TrafficJamBigData03301009-test_lmdb复制到caffe-master170309/examples/TrafficJamBigData03301009里。
改动F:\caffe-master170309\examples\TrafficJamBigData03301009\synset_words.txt为堵与不堵两类(注意budu在第一行,du在第二行,由于要和前面的label.txt相应)
3.1.5 新建文件
在caffe-master170309/examples/TrafficJamBigData03301009里新建
空的RecognizeResultRecordFromCmdTxt.txt
和 空的AnalysisOfRecognitionfromCmdTxt.txt
和 synset_words.txt(里面第一行是budu。第二行是du)
效果例如以下:
3.2 改动训练的“參数文件” & “模型结构”
3.2.1 编写训练bat(别急着执行) 參考1,參考2,參考我的微调笔记
在F:\caffe-master170309目录下新建一个train-TrafficJamBigData03301009.bat文件。用于训练模型内容例如以下:
.\Build\x64\Debug\caffe.exe train --solver=models/bvlc_googlenet0329_1/solver.prototxt --weights=models/bvlc_googlenet0329_1/bvlc_googlenet.caffemodel --gpu 0
pause
3.2.2 參数文件solver.prototxt 參考我的微调笔记
test_iter: 100 #原来1000。改为100
test_interval: 1000 #test_interval: 4000->1000
test_initialization: false
display: 40
average_loss: 40
base_lr: 0.01 #原来base_lr: 0.01
#来自quick_solver的是 lr_policy: "poly"
#来自quick_solver的是 power: 0.5
lr_policy: "step"
stepsize: 320000
gamma: 0.96
max_iter: 50000 #max_iter: 10000000->10000
momentum: 0.9
weight_decay: 0.0002
snapshot: 1000 #snapshot: 40000->1000
snapshot_prefix: "models/bvlc_googlenet0329_1/bvlc_googlenet"
solver_mode: GPU
3.2.3 网络模型文件train_val.prototxt 參考我的微调笔记
当中finetune出现error=cudaSuccess(2 vs. 0) out of memory?网上意思是:batch_size改小,将batch_size由原来的32改为2,由原来的50改为2.
(整个网络结构有2000行,仅仅改了前面2层和最后1层),改的部分截取例如以下:
前2层是:
name: "GoogleNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true #原来也是true
crop_size: 480 #原来是224
mean_value: 104
mean_value: 117
mean_value: 123
}
data_param {
source: "data/TrafficJamBigData03281545/TrafficJamBigData03281545-train_lmdb"
batch_size: 2 #原来是32
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 480 #原来是224
mean_value: 104
mean_value: 117
mean_value: 123
}
data_param {
source: "data/TrafficJamBigData03281545/TrafficJamBigData03281545-test_lmdb"
batch_size: 2 #原来是50
backend: LMDB
}
}
最后1层是:
layer {
name: "loss3/top-5"
type: "Accuracy"
bottom: "loss3/classifier123" #原来是(3个):loss3/classifier loss2/classifier loss1/classifier
bottom: "label"
top: "loss3/top-5"
include {
phase: TEST
}
accuracy_param {
top_k: 2 #原来是5
}
}
3.2.4 測试模型文件deploy.prototxt參考我的微调笔记
改的第1层和倒数第2层。例如以下:
第1层例如以下:
name: "GoogleNet"
layer {
name: "data"
type: "Input"
top: "data"
input_param { shape: { dim: 10 dim: 3 dim: 480 dim: 480 } } # input_param { shape: { dim: 10 dim: 3 dim: 224 dim: 224 } }
}
倒数第二层例如以下:
layer {
name: "loss3/classifier123"
type: "InnerProduct"
bottom: "pool5/7x7_s1"
top: "loss3/classifier123"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 2 #原来是1000
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "prob"
type: "Softmax"
bottom: "loss3/classifier123"
top: "prob"
}
3.2.5 执行F:\caffe-master170309\train-TrafficJamBigData03301009.bat文件,開始训练
1200张图(1200张训练+200张測试),迭代50000次,batch_size由“32和50”改为“2和2”
训练记录例如以下:
11:54開始。
iter40次,14秒。
推算的话
iter50000次,5小时。