1. 程式人生 > >FasterRCNN增刪類別及訓練需要修改地方

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檔案