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