1. 程式人生 > >SSD+caffe︱Single Shot MultiBox Detector 目標檢測+fine-tuning(二)

SSD+caffe︱Single Shot MultiBox Detector 目標檢測+fine-tuning(二)

承接上一篇SSD介紹:SSD+caffe︱Single Shot MultiBox Detector 目標檢測(一)
如果自己要訓練SSD模型呢,關鍵的就是LMDB格式生成,從官方教程weiliu89/caffe來看,寥寥幾行code,但是前面的資料整理真實要了老命。
教程其實就是一種fine-tuning,在VGG基礎上進行訓練SSD框架。

公眾號“素質雲筆記”定期更新部落格內容:

這裡寫圖片描述

.

0 官方教程訓練過程:

(1)下載VGGNet.caffemodel, fully convolutional reduced (atrous) VGGNet
(2)下載VOC2007 and VOC2012兩個資料集,放在/caffe/data目錄下
(3)建立LMDB檔案:

./data/VOC0712/create_list.sh
./data/VOC0712/create_data.sh

(4)訓練

python examples/ssd/ssd_pascal.py

以上是官方教程常規訓練步驟,並不難。但是自己訓練時候的資料處理,比較麻煩。

.

1 資料集準備與形成

1.1 所需準備檔案介紹

其中訓練所需的資料夾包括三大類:
這裡寫圖片描述

筆者自己改寫了一份純python版本的,並上傳到github:https://github.com/mattzheng/umdfaces2VOC2007/
該份程式碼可以直接把下面三個資料夾填滿:Annotations、JPEGImages、ImageSets
另外的ImageSets簡單的用Python來隨機抽樣即可。

  • Annotations

    *.xml (所有的標註的物體資訊檔案)
    其中.py程式碼會生成以下首行內容,是沒有關係的

<?xml version="1.0" encoding="utf-8"?>
  • JPEGImages

    *.jpg (所有的圖片集)

  • ImageSets
    儲存格式為檔名,這裡不帶副檔名

00001
00002

訓練驗證集: trainval.txt,整個資料集的50%
測試集: test.txt,整個資料集的50%
訓練集: train.txt,大概是trainval的50%
驗證集: val.txt,大概是trainval的50%

1.2 訓練檔案介紹

(1) create_list.sh:用於生成三類檔案列表
- test_name_size:測試集影象大小
- test:測試集影象-標籤一一對應
- trainval:訓練集影象-標籤一一對應

這是將資料集做成方便之後生成lmdb的路徑資訊檔案,注意三點:

  • 1、root_dir路徑,資料夾名稱的上一級,譬如:/home/caffe-master/ssd/data
  • 2、資料夾名稱,VOC2007,本來預設這邊填了兩個資料夾。
  • 3、get_image_size.cpp
    工具位置,在41行左右。筆者在自己改了路徑之後,一直找不到於是就自己定義了絕對路徑。一般在:/home/caffe-master/ssd、build/tools/get_image_size

其餘輸出檔案的示例:
影象-標籤一一對應:

Images/000112.png Labels/000112.xml
Images/001365.png Labels/001365.xml

同時注意名稱的一致。

000800 1241 376
006206 1242 375

test_name_size裡面,000800就是圖片名稱,1241*376就是圖片尺寸,高 長。

(2)labelmap_voc.prototxt:
目標檢測的標籤檔案
該檔案主要記錄需要訓練識別的n種物件的資訊,第一類是background,是不變的,對於Pascal VOC資料集來說,需要識別20種物件,所以後面還有20個label。與傳統的機器學習不太一樣的是,以前需要輸入正負樣本,在caffe種,不管是faster rcnn還是ssd,都是隻用對訓練影象將識別物件的座標資訊標註即可,除了標註資訊以外的部分都會當做background去處理。
所以,此時只能填一個:

item {
  name: "none_of_the_above"
  label: 0
  display_name: "background"
}
item {
  name: "face"
  label: 1
  display_name: "face"
}

這裡為什麼要填face,這裡是有講究的。要跟xml裡面的類別一直,github裡面類別寫的是臉,所以必須寫”face”。另外一個案例label可見:SSD框架訓練自己的資料集

(3)create_data.sh:
生成LMDB檔案,以上的create_list準備好之後即可。
最麻煩還是路徑填寫。

2 資料集生成方案

訓練的資料集三種方案:

  • 第一:保持原來的檔案目錄結構及檔名不變, 只替換裡面的資料,通用。
  • 第二:重新新建一個與之前類似的目錄結構,改成自己命名的資料夾,第二種方法,有一定的風險性,需要修改程式裡涉及資料路徑的程式碼。
  • 第三種是直接用txt格式儲存,就可以生成LMDB的辦法,我覺得這個比較好,但是筆者最終沒有實驗成功…譬如:
class_index xmin ymin xmax ymax

2.1 訓練流程

本節參考:SSD框架訓練自己的資料集
- 第一步:create_list.sh:生成test_name_size.txt、test.txt、trainval.txt
- 第二步:修改labelmap_voc.prototxt,標籤檔案,同時需要注意標籤檔案必須多一個background的標籤,作為編號0
- 第三步:create_data.sh:生成LMDB
- 第四步:修改ssd_pascal.py:參考: Ubuntu上用caffe的SSD方法訓練umdfaces資料集

  • 第五步訓練:
    python examples/ssd/ssd_pascal.py

2.2 訓練指令碼內容儲存

會在相應的路徑下生成jobs資料夾,其中包含了這一次訓練的指令碼檔案,並且會記錄caffe執行只一次訓練的日誌資訊。
參考:Ubuntu上用caffe的SSD方法訓練Pascal VOC資料集

jobs資料夾下有:
.log檔案:執行記錄,時間,迭代次數等資訊;
.caffemodel檔案,權重檔案
deploy.prototxt、train_val.prototxt等
.

2.3 一些實驗資料

來源於:Ubuntu上用caffe的SSD方法訓練Pascal VOC資料集
計劃訓練的迭代次數是12w次,但是在K80上只開了一個核來進行計算,差不多一天可以迭代1w+次吧,跑了6天將近7w次,打斷來測試,在K80上,檢測單張人臉圖片,解析度在300X300左右,速度為40ms左右,也就是說幀率可以達到25fps,速度還是很快的。至於準確度,在log檔案裡面,每1w次迭代之後會計算一個mAP,第6w次的時候計算了一下mAP(作者自定義過,跟mAP比較像)為0.965:
這裡寫圖片描述
.

.

報錯一:

cudasucess(10vs0)

解決:修改pythonssd_pascal.py檔案gpus=’0,1,2,3’,如果有一塊GPU,則刪除123,有兩塊則刪除23

.

延伸一:大致的運算效率

K80-單GPU-一天可以迭代1w+次
6天將近7w次
每1w次迭代之後會計算一個mAP
(資料來源:Ubuntu上用caffe的SSD方法訓練umdfaces資料集

TX.P,筆者自己訓練,大概的運算效率是5千/小時(執行官方教程時)
.

延伸二:SSD額外的功能——視訊檢測 + 實時攝像頭物體檢測

python examples/ssd/ssd_pascal_webcam.py
  • 視訊檢測
python examples/ssd/ssd_pascal_video.py