用Faster RCNN訓練自己的資料集
Faster RCNN(py caffe)工程各個目錄的作用:
- caffe-fast-rcnn:caffe框架目錄;
- data:用來存放pretrained(預訓練)模型以及讀取檔案的cache快取,還有一些下載模型的指令碼;
- experiments:存放配置檔案以及執行的log檔案,另外這個目錄下有scripts,裡面存放end2end和alt_opt兩種訓練方式的指令碼;
- lib:用來存放一些python介面檔案,如其下的datasets主要負責資料庫讀取,config負責一些訓練的配置選項;
- models:裡面存放了三個模型檔案,小型網路ZF,中型網路VGG_CNN_M_1024以及大型網路VGG16,根據你的硬體條件來選擇使用哪種網路,ZF和VGG_CNN_M_1024需要至少3G記憶體
- output:這裡存放的是訓練完成後的輸出目錄,這是運行了訓練後才會出現的目錄;
- tools:裡面存放的是訓練和測試的Python檔案;
一、簡單修改,用Pascal Voc 2007 格式,僅替換其中的XML檔案及圖片等
用自己資料集圖片標籤等替換原來的pascal voc
- 用自己要訓練的圖片/資料集替換
FRCN_ROOT/data/VOCdevkit2007/VOC2007/JPEGImages/
下的圖片; - 用自己資料集對應的標籤替換
FRCN_ROOT/data/VOCdevkit2007/VOC2007/Annotations/
目錄下的XML檔案; - 用自己做的train.txt、val.txt、trainval.txt、待檢測目標_train.txt、待檢測目標_val.txt、待檢測目標_trainval.txt(如:insulator_train.txt)等txt檔案替換
FRCN_ROOT/data/VOCdevkit2007/VOC2007/ImageSets/Main/
修改prototxt配置檔案
這些配置檔案都在FRCN_ROOT/models/pascal_voc/
下。裡面有三種網路結構:VGG16、VGG_CNN_M_1024、ZF,本文選擇的是ZF 。每個網路結構中都有三個資料夾,分別是faster_rcnn_alt_opt、faster_rcnn_end2end、faster_rcnn;
(網上說:使用近似聯合訓練,比交替優化快1.5倍,但是準確率相近,所以推薦使用這種方法)所以,更改faster_rcnn_end2end資料夾下的train.prototxt和test.prototxt:
- train.prototxt(所在目錄:
/home/xu/FRCN_ROOT/models/pascal_voc/ZF/faster_rcnn_end2end/test.prototxt
num_output
原來的21(目標20種+背景1種=21)改為:資料集目標類別數+1:
第二處是cls_score層:
num_output
修改原理同第一處:
第三處是bbox_pred層,在這裡需將num_output
原來的84改為:(目標類別數+1)×4,原來的是(20+1)*4=84:
- test.prototxt中沒有input-data層,所以只需按照train中的修改cls_score層以及bbox_pred層即可:
修改lib/datasets/pascal_voc.py,將類別改成自己的類別
進入RCN_ROOT/lib/datasets/
,找到pascal_voc.py檔案,將類別修改為自己資料集的目標類別:
datasets目錄下主要有三個檔案,分別是 (1) factory.py:這是一個工廠類,用類生成imdb類並且返回資料庫供網路訓練和測試使用; (2) imdb.py:是資料庫讀寫類的基類,封裝了許多db的操作; (3) pascl_voc.pyRoss用這個類來操作;
開始訓練
cd FRCN_ROOT
./experiments/scripts/faster_rcnn_end2end.sh 0 ZF pascal_voc
由於訓練過程太長,可以將訓練過程產生的輸出定向輸入到log檔案中,這樣可方便檢視。只需在上述命令中加入定向輸入的命令即可,如下:
./experiments/scripts/faster_rcnn_end2end.sh 0 ZF pascal_voc > /home/xu/log/clothdirector.log 2>&1
!!!訓練前需要將cache中的pki檔案以及VOCdevkit2007中annotations_cache的快取刪掉。