FasterRCNN增刪類別及訓練需要修改地方
FasterRCNN增刪類別及訓練需要修改地方,有些零碎,必須每一個地方都要修改到位才能訓練,在此過程中查了好些資料,結合自己的經歷特此完整全面的整理了一下,以備後續使用。
在此過程中有個blog寫的還不錯在此:https://www.cnblogs.com/hansjorn/p/7724852.html
一、配置檔案的修改
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
py-faster-rcnn/models/fab/ZF/faster_rcnn_alt_opt資料夾下需要修改的檔案如下:
(注:lineNum表示第幾行)
##############################################################
1、stage1_fast_rcnn_train_defect.pt
**********1 lineNum=14 param_str: "'num_classes': 4"**********
layer {
name: 'data'
type: 'Python'
top: 'data'
top: 'rois'
top: 'labels'
top: 'bbox_targets'
top: 'bbox_inside_weights'
top: 'bbox_outside_weights'
python_param {
module: 'roi_data_layer.layer'
layer: 'RoIDataLayer'
param_str: "'num_classes': 4" #按訓練集類別改,該值為類別數+1
}
}
**********2 lineNum=247 num_output: 4**********
layer {
name: "cls_score"
type: "InnerProduct"
bottom: "fc7"
top: "cls_score"
param { lr_mult: 1.0 }
param { lr_mult: 2.0 }
inner_product_param {
num_output: 4 #按訓練集類別改,該值為類別數+1
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
**********3 lineNum=266 num_output: 16**********
layer {
name: "bbox_pred"
type: "InnerProduct"
bottom: "fc7"
top: "bbox_pred"
param { lr_mult: 1.0 }
param { lr_mult: 2.0 }
inner_product_param {
num_output: 16 #按訓練集類別改,該值為(類別數+1)*4
weight_filler {
type: "gaussian"
std: 0.001
}
bias_filler {
type: "constant"
value: 0
}
}
}
##############################################################
2、stage1_rpn_train_defect.pt
**********1 lineNum=11 param_str: "'num_classes': 4"**********
name: "ZF"
layer {
name: 'input-data'
type: 'Python'
top: 'data'
top: 'im_info'
top: 'gt_boxes'
python_param {
module: 'roi_data_layer.layer'
layer: 'RoIDataLayer'
param_str: "'num_classes': 4"
}
}
##############################################################
3、stage2_fast_rcnn_train_defect.pt
**********1 lineNum=14 param_str: "'num_classes': 4"**********
name: "ZF"
layer {
name: 'data'
type: 'Python'
top: 'data'
top: 'rois'
top: 'labels'
top: 'bbox_targets'
top: 'bbox_inside_weights'
top: 'bbox_outside_weights'
python_param {
module: 'roi_data_layer.layer'
layer: 'RoIDataLayer'
param_str: "'num_classes': 4"
}
}
**********2 lineNum=247 num_output: 4**********
layer {
name: "cls_score"
type: "InnerProduct"
bottom: "fc7"
top: "cls_score"
param { lr_mult: 1.0 }
param { lr_mult: 2.0 }
inner_product_param {
num_output: 4
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
**********3 lineNum=266 num_output: 16**********
layer {
name: "bbox_pred"
type: "InnerProduct"
bottom: "fc7"
top: "bbox_pred"
param { lr_mult: 1.0 }
param { lr_mult: 2.0 }
inner_product_param {
num_output: 16
weight_filler {
type: "gaussian"
std: 0.001
}
bias_filler {
type: "constant"
value: 0
}
}
}
##############################################################
4、stage2_rpn_train_defect.pt
**********1 lineNum=11 param_str: "'num_classes': 4"**********
name: "ZF"
layer {
name: 'input-data'
type: 'Python'
top: 'data'
top: 'im_info'
top: 'gt_boxes'
python_param {
module: 'roi_data_layer.layer'
layer: 'RoIDataLayer'
param_str: "'num_classes': 4"
}
}
##############################################################
5、faster_rcnn_test_defect.pt
**********1 lineNum=306 num_output: 4**********
layer {
name: "cls_score"
type: "InnerProduct"
bottom: "fc7"
top: "cls_score"
inner_product_param {
num_output: 4 #按訓練集類別改,該值為類別數+1
}
}
**********2 lineNum=315 num_output: 16**********
layer {
name: "bbox_pred"
type: "InnerProduct"
bottom: "fc7"
top: "bbox_pred"
inner_product_param {
num_output: 16 #按訓練集類別改,該值為(類別數+1)*4
}
}
二、×.py檔案的修改:
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
py-faster-rcnn/lib/datasets 資料夾下需要修改的檔案如下:
##############################################################
1、fab_defect.py (原始檔案為:pascal_voc.py)
**********1 lineNum=30 self._classes =類別1,類別2,.....**********
class pascal_voc(imdb):
def __init__(self, image_set, year, devkit_path=None):
imdb.__init__(self, 'voc_' + year + '_' + image_set)
self._year = year
self._image_set = image_set
self._devkit_path = self._get_default_path() if devkit_path is None \
else devkit_path
self._data_path = os.path.join(self._devkit_path, 'VOC' + self._year)
self._classes = ('__background__', # always index 0
'aeroplane', 'bicycle', 'bird', 'boat',
'bottle', 'bus', 'car', 'cat', 'chair',
'cow', 'diningtable', 'dog', 'horse',
'motorbike', 'person', 'pottedplant',
'sheep', 'sofa', 'train', 'tvmonitor')
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
檔案路徑:py-faster-rcnn/tools 資料夾下需要修改的檔案如下:
##############################################################
1、demo_defect.py (原始檔案為:demo.py.py 約第79行)
CLASSES = ('__background__',
'bl',
'nak',
'break')
三、×.xml檔案的修改
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
如果你原來標註檔案中含有A,B,C,D四個類別,但現在需要去掉D類,那麼標註檔案中需要刪掉D標註,否則會發生:
fab_defect.py (原始檔案為:pascal_voc.py約第238行)
cls = self._class_to_ind[obj.find('name').text.lower().strip()]這條語句會報錯
四、刪除以前的訓練預處理×.pkl和*.txt檔案
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
1、刪除py-faster-rcnn/data/cache 下的*.pkl檔案
2、刪除py-faster-rcnn//data/FABdevkit2017/annotations_cache 下的*.txt檔案