1. 程式人生 > >訓練py-faster rcnn的兩種方式以及自己模型的遷移學習

訓練py-faster rcnn的兩種方式以及自己模型的遷移學習

faster rcnn訓練方式有兩種,一種是交替優化方法(alternating optimization),即訓練兩個網路,一個是rpn,一個是fast rcnn,總計兩個stage,每個stage各訓練一次rpn和fast rcnn。另外一種訓練方式為近似聯合訓練(approximate joint training),也稱end to end的訓練方式,訓練過程中只訓練一個權重網路,訓練速度有可觀的提升,而訓練精度不變。

1. alternating optimization

alternating optimization訓練過程分如下四個小階段:

1. stage 1 RPN proposals

2. stage 1 Fast R-CNN using PRN proposals

3. stage 2 Fine tune RPN proposals of stage 1

4. stage 2 Fine tune Fast R-CNN of stage 1

每個階段求解器的超引數配置檔案在:models/資料集/預訓練模型/faster_rcnn_alt_opt下,如stage1_faste_rpn_solver60k80k.pt.

可以修改如下引數:

base_lr: 0.001
lr_policy: "step"
gamma: 0.1
stepsize: 60000
display: 20
average_loss: 100
momentum: 0.9
weight_decay: 0.0005

此外每個階段的back bone基礎網路模型也在這個路徑下,如stage1_rpn_train.pt

訓練準備工作

1. 在訓練新模型時候,為防止與之前的模型搞混,需要再訓練前完成以下三件事:

(1) output資料夾刪除,

(2)刪除py-faster-rcnn/data/cache中的檔案

(3)刪除py-faster-rcnn/data/VOCdevkit2007/annotations_cache中的檔案

2. 至於學習率等之類的設定,可在py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt中的solve檔案設定,

  迭代次數可在py-faster-rcnn\tools的train_faster_rcnn_alt_opt.py中修改:

  max_iters = [80000, 40000, 80000, 40000]  

  分別為4個階段(rpn第1階段,fast rcnn第1階段,rpn第2階段,fast rcnn第2階段)的迭代次數。可改成你希望的迭代次數。

  如果改了這些數值,最好把py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt裡對應的solver檔案(有4個)也  修改,stepsize小於上面修改的數值。

3. 在訓練自建資料集時,需要修改class name,class num引數,參考這裡

4. 資料集準備

解壓下載好的voc2007資料集

解壓後的檔案結構如下

$VOCdevkit/   # 開發工具包
$VOCdevkit/VOCcode/   # VOC實用程式碼
$VOCdevkit/VOC2007# 圖片集, 註釋, 等等
# 一些其他的目錄
將VOCdevkit改名為VOCdevkit2007,然後放到data資料夾下

5. 下載預訓練模型

cd $FRCN_ROOT
./data/scripts/fetch_imagenet_models.sh
其中$FRCN_ROOT是faster rcnn根目錄,預訓練模型中VGG16來自Caffe Mode Zoo,ZF是由MSRA訓練的結構,resnet50訓練可參考這裡。

6. 訓練資料

 使用交替優化(alternating optimization)演算法來訓練和測試Faster R-CNN

cd $FRCN_ROOT
./experiments/scripts/faster_rcnn_alt_opt.sh [GPU_ID] [NET] [--set ...]
# GPU_ID是你想要訓練的GPUID
# 你可以選擇如下的網路之一進行訓練:ZF, VGG_CNN_M_1024, VGG16
# --set ... 執行你自定義fast_rcnn.config引數,例如.
#   --set EXP_DIR seed_rng1701 RNG_SEED 1701
#例如命令
./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc
train results based on ZF :

2.  approximate joint training

approximate joint training 訓練方式的引數配置與alternating optimization方式不同。需要修改如下三個檔案(以vgg16訓練70000次為例):

1. 修改py-faster-rcnn/lib/datasets/pascal_voc.py  檔案中的第30行,  self._classes,改成自己的標籤。

2. 修改 py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_end2end下兩個檔案:

train.prototxt 和 test.prototxt。

其中test.prototxt修改:

(1)第567行:num_output:自己資料集標籤數+1,

(2)第592行:num_output:(自己資料集標籤數+1)*4,

train.prototxt修改要多一些:

(1)第11,  530,  620行 :  num_output:自己資料集標籤數+1,

 (2)第643行:num_output:(自己資料集標籤數+1)*4,


訓練時輸入下列命令:

cd $FRCN_ROOT
./experiments/scripts/faster_rcnn_end2end.sh [GPU_ID] [NET] [--set ...]

./tools/train_net.py --gpu 0 --solver models/pascal_voc/VGG16/faster_rcnn_end2end/solver.prototxt --weights data/imagenet_models/VGG16.v2.caffemodel --imdb voc_2007_trainval --iters 70000 --cfg experiments/cfgs/faster_rcnn_end2end.yml
./tools/test_net.py --gpu 0 --def models/pascal_voc/VGG16/faster_rcnn_end2end/test.prototxt --net /home/u2/py-faster-rcnn/output/faster_rcnn_end2end/voc_2007_trainval/vgg16_faster_rcnn_iter_70000.caffemodel --imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml

讀者在參考以上兩條命令時,根據自己專案需求注意修改模型型別和訓練次數等引數

demo:

1.把 output資料夾下輸出的 model 拷貝到py-faster-rcnn/data/faster_rcnn_models 下

2.修改 demo.py 裡的第28行的CLASS,下面的NETS。分別改為自己的標籤和 步驟1. 中拷貝的訓練好模型的名字。

3. 終端輸入:

./tools/demo.py


3. transfer learning fron self-train model:對自己模型的遷移學習

有時候我們訓練好一個模型A後,想要用類似的資料對模型A fine-tuning,換句話說就是把模型A當做預訓練模型再次進行微調訓練,這對於資料集風格類似,但資料數量不足的情況比較合適(vgg16,end2end為例)。

1. 首先把模型A 拷貝到py-faster-rcnn/data/imagenet_models下,記名字為a.caffemodel

2. 修改 py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_end2end下兩個檔案:

train.prototxt 和 test.prototxt。

修改bbox_pred層為bbox_pred1

     cls_score 層為cls_score1

3. 終端輸入:注意預訓練模型名字已經修改成a.caffemodel

./tools/train_net.py --gpu 0 --solver models/pascal_voc/VGG16/faster_rcnn_end2end/solver.prototxt --weights data/imagenet_models/a.caffemodel --imdb voc_2007_trainval --iters 10000 --cfg experiments/cfgs/faster_rcnn_end2end.yml

4. 修改py-faster-rcnn/lib/fast_rcnn下的test.py,將173行的bbox_pred改為bbox_pred1.

5. 終端輸入

./tools/test_net.py --gpu 0 --def models/pascal_voc/VGG16/faster_rcnn_end2end/test.prototxt --net /home/u2/py-faster-rcnn/output/faster_rcnn_end2end/voc_2007_trainval/vgg16_faster_rcnn_iter_10000.caffemodel --imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml



待續