天天看點

Caffe-5.2-(GPU完整流程)訓練(依據googlenet微調)

上一篇使用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      

效果例如以下:

Caffe-5.2-(GPU完整流程)訓練(依據googlenet微調)

2.2 測試單張圖檔

以下用訓練出的模型,測試單個圖檔的準确率。

(參考model的使用)

改Debug\classfication.bat例如以下(測試單張圖F:\caffe-master170309\data\TrafficJamBigData03281545\test\du\190416357.png)

通過手動執行可知須要3:67秒。故MFC程式的延時可減少為4秒。

這樣比caffenet的11秒快得多了。

隻是效果不準:10張圖(5張堵、5張不堵)所有識别為不堵,效果例如以下:

Caffe-5.2-(GPU完整流程)訓練(依據googlenet微調)

上述我覺得是訓練的模型不好,故又一次訓練。

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\data\TrafficJamBigData03301009目錄裡有2個目錄、2個*.m,兩個空的txt。

得到标簽train_label.txt與test_label.txt

3.1.2 轉換為lmdb格式

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-TrafficJamBigData03281545-test.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/test_label.txt F:/caffe-master170309/data/TrafficJamBigData03301009/TrafficJamBigData03301009-test_lmdb -backend=lmdb
pause      

分别執行,效果例如以下。且在F:\caffe-master170309\data\TrafficJamBigData03301009 目錄内生成了TrafficJamBigData03301009-train_lmdb和TrafficJamBigData03301009-test_lmdb目錄:例如以下:(8個檔案)

3.1.3 生成均值檔案

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)

效果例如以下: 

Caffe-5.2-(GPU完整流程)訓練(依據googlenet微調)

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小時。

繼續閱讀