訓練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.001lr_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]
如果改了這些數值,最好把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
待續