上次使用 Faster R-CNN 訓練了一個 VGG-16 的網絡,為了再提升識别的準确率,利用 ResNet 網絡在同樣的資料上面訓練了多一次。
基本的過程和在訓練 VGG-16 網絡時差不多,可參照 使用自己的資料訓練 Faster R-CNN 的 VGG-16 模型
一、訓練網絡
(一)下載下傳 ResNet-50 的 prototxt 檔案
在我的 Github 上面可以下載下傳我使用的檔案,當然你也可以使用不同的 ResNet 網絡結構。
(二)相關檔案修改
1.
cd $FRCN_ROOT/lib/rpn/generate_anchors.py
# 在 37 行:
def generate_anchors(base_size=16, ratios=[0.5, 1, 2],
scales=2**np.arange(3, 6)):
# 修改為:
def generate_anchors(base_size=16, ratios=[0.5, 1, 2],
scales=2**np.arange(1, 6)):
2.
cd $FRCN_ROOT/lib/rpn/anchor_target_layer.py
# 在 28 行:
anchor_scales = layer_params.get('scales', (8, 16, 32))
# 修改為:
anchor_scales = layer_params.get('scales', (2, 4, 8, 16, 32))
3.
cd $FRCN_ROOT/lib/rpn/proposal_layer.py
# 在 29 行:
anchor_scales = layer_params.get('scales', (8, 16, 32))
# 修改為:
anchor_scales = layer_params.get('scales', (2, 4, 8, 16, 32))
4.
pascal_voc.py、imdb.py、train.prototxt、test.prototxt、.pt檔案
的修改參考 使用自己的資料訓練 Faster R-CNN 的 VGG-16 模型 。
5. 因為我們使用了 5 個尺度的 anchors,是以之前的 9 個 anchors 變成了 3*5=15 個。
修改
prototxt 和 pt檔案
,将其中的 18 換成 30。
layer {
name: "rpn_cls_score"
type: "Convolution"
bottom: "rpn/output"
top: "rpn_cls_score"
param { lr_mult: 1.0 }
param { lr_mult: 2.0 }
convolution_param {
num_output: 30 # 2(bg/fg) * 9(anchors) ///将 18 換成 30
kernel_size: 1 pad: 0 stride: 1
weight_filler { type: "gaussian" std: 0.01 }
bias_filler { type: "constant" value: 0 }
}
(三)下載下傳 ImageNet 模型
下載下傳 ImageNet 預訓練檔案:
ResNet-50.v2.caffemodel
(四)清除緩存
删除緩存檔案:
$FRCN_ROOT/data/VOCdevkit2007/annotations_cache/annots.pkl
和
$FRCN_ROOT/data/cache
下的
pkl
檔案
如果不清除緩存可能會報錯。
(五)開始訓練
參照 VGG16 的訓練指令:
cd $FRCN_ROOT
./experiments/scripts/faster_rcnn_end2end.sh 0 ResNet-50 pascal_voc
注意:第三個參數 ‘ResNet-50’,一定要和你的檔案夾名字對應,比如我的檔案放在
$FRCN_ROOT/models/pascal_voc/ResNet-50
裡面,是以我的第三個參數就為我目錄的名稱。
由于 ResNet-50 的網絡更深,訓練的時間也需要更久,每一次疊代大約需要 0.5s ,訓練這個網絡我用了大概 10 個小時,但效果會比用 VGG 16 的好,主要是對小尺度的物體檢測更加準确了。
這是我訓練時各類的 AP :
