RCNN_PARAMS_DOC.md 11.8 KB
Newer Older
F
FDInSky 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
# RCNN系列模型参数配置教程

标签: 模型参数配置

---
```yaml

#####################################基础配置#####################################

# 检测模型的名称
architecture: MaskRCNN
# 默认使用GPU运行,设为False时使用CPU运行
use_gpu: true
# 最大迭代次数,而一个iter会运行batch_size * device_num张图片
# 一般batch_size为1时,1x迭代18万次,2x迭代36万次
max_iters: 180000
# 模型保存间隔,如果训练时eval设置为True,会在保存后进行验证
snapshot_iter: 10000
# 输出指定区间的平均结果,默认20,即输出20次的平均结果
log_smooth_window: 20
# 默认打印log的间隔,默认20
log_iter: 20
# 训练权重的保存路径
save_dir: output
# 模型的预训练权重,默认是从指定url下载
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_cos_pretrained.tar
# 验证模型的评测标准,可以选择COCO或者VOC
metric: COCO
# 用于模型验证或测试的训练好的权重
weights: output/mask_rcnn_r50_fpn_1x/model_final/
# 用于训练或验证的数据集的类别数目
# **其中包含背景类,即81=80 + 1(背景类)**
num_classes: 81

#####################################模型配置#####################################

# Mask RCNN元结构,包括了以下主要组件, 具体细节可以参考[论文]( https://arxiv.org/abs/1703.06870)
MaskRCNN:
  backbone: ResNet
  fpn: FPN
  rpn_head: FPNRPNHead
F
FDInSky 已提交
42
  roi_extractor: FPNRoIAlign
F
FDInSky 已提交
43 44 45 46 47 48 49 50 51 52 53 54 55 56
  bbox_assigner: BBoxAssigner
  bbox_head: BBoxHead
  mask_assigner: MaskAssigner
  mask_head: MaskHead
  rpn_only: false

# 主干网络
ResNet:
  # 配置在哪些阶段加入可变性卷积,默认不添加
  dcn_v2_stages: []
  # ResNet深度,默认50
  depth: 50
  # 主干网络返回的主要阶段特征用于FPN作进一步的特征融合
  # 默认从[2,3,4,5]返回特征
F
FDInSky 已提交
57 58
  feature_maps: [2,3,4,5]
  # 是否在训练中固定某些权重,默认从第2阶段开始固定,即resnet的stage 1
F
FDInSky 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
  freeze_at: 2
  # 是否停止norm layer的梯度回传,默认是
  freeze_norm: true
  # norm layer的权重衰退值
  norm_decay: 0.0
  # norm layer的类型, 可以选择bn/sync_bn/affine_channel, 默认为affine_channel
  norm_type: affine_channel
  # ResNet模型的类型, 分为'a', 'b', 'c', 'd'四种, 默认使用'b'类型
  variant: b

# FPN多特征融合
FPN:
  # FPN使用的最高层特征后是否添加额外conv,默认false
  has_extra_convs: false
  # FPN使用主干网络最高层特征,默认是resnet第5阶段后添加额外卷积操作变<成了FPN的第6个,总共有5个阶段
  max_level: 6
  # FPN使用主干网络最低层特征,默认是resnet第2阶段的输出
  min_level: 2
  # FPN中使用Norm类型, bn/sync_bn/affine_channel/null, 默认不用null
  norm_type: null
  # FPN输出特征的通道数量, 默认是256
  num_chan: 256
  # 特征图缩放比例, 默认是[0.03125, 0.0625, 0.125, 0.25]
F
FDInSky 已提交
82
  spatial_scale: [0.03125, 0.0625, 0.125, 0.25]
F
FDInSky 已提交
83 84 85 86 87 88 89 90 91 92 93

# 检测第一阶段RPN
FPNRPNHead:
  # FPN第一层特征生成anchor时,默认anchor尺寸32
  anchor_start_size: 32
  # RPNHead默认进行前背景二分类
  num_classes: 1
  # 根据特征图尺寸,在特征图的每个位置生成N个大小、长宽比各不同anchor
  # N = anchor_sizes * aspect_ratios
  # 具体实现参考[API](fluid.layers.anchor_generator)
  anchor_generator:
F
FDInSky 已提交
94 95
    aspect_ratios: [0.5, 1.0, 2.0]
    variance: [1.0, 1.0, 1.0, 1.0]
F
FDInSky 已提交
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
  # 首先计算Anchor和GT BBox之间的IoU,为每个Anchor匹配上GT,
  # 然后根据阈值过滤掉IoU低的Anchor,得到最终的Anchor及其GT进行loss计算
  # 具体实现参考[API](fluid.layers.rpn_target_assign)
  rpn_target_assign:
    rpn_batch_size_per_im: 256
    rpn_fg_fraction: 0.5
    rpn_negative_overlap: 0.3
    rpn_positive_overlap: 0.7
    rpn_straddle_thresh: 0.0
  # 首先取topk个分类分数高的anchor
  # 然后通过NMS对这topk个anchor进行重叠度检测,对重叠高的两个anchor只保留得分高的
  # 训练和测试阶段主要区别在最后NMS保留的Anchor数目
  # 训练时输出2000个proposals,推理时输出1000个proposals
  # 具体实现参考[API](fluid.layers.generate_proposals)
  train_proposal:
    min_size: 0.0
    nms_thresh: 0.7
    post_nms_top_n: 2000
    pre_nms_top_n: 2000
  test_proposal:
    min_size: 0.0
    nms_thresh: 0.7
    post_nms_top_n: 1000
    pre_nms_top_n: 1000

# 对FPN每层执行RoIAlign后,然后合并输出结果,用于BBox Head计算
FPNRoIAlign:
  # 用于抽取特征特征的FPN的层数,默认为4
  canconical_level: 4
  # 用于抽取特征特征的FPN的特征图尺寸,默认为224
  canonical_size: 224
  # 用于抽取特征特征的最高层FPN,默认是2
  max_level: 5
  # 用于抽取特征特征的最底层FPN,默认是2
  min_level: 2
  #roi extractor的采样率,默认为2
  sampling_ratio: 2
  # 输出bbox的特征图尺寸,默认为7
  box_resolution: 7
  # 输出mask的特征图尺寸,默认为14
  mask_resolution: 14

# 输出实例掩码的Head
MaskHead:
  # 卷积的数量,FPN是4,其他为0,默认为0
  num_convs: 4
  # mask head输出的特征图尺寸,默认14
  resolution: 28
  # 空洞率,默认为1
  dilation: 1
  # 第一个卷积后输出的特征图通道数, 默认为256
  num_chan_reduced: 256
  # 输出的mask的类别,默认为81
  num_classes: 81

# 求rpn生成的roi跟gt bbox之间的iou,然后根据阈值进行过滤,保留一定数量的roi
# 再根据gt bbox的标签,对roi进行标签赋值,即得到每个roi的类别
# 具体实现参考[API](fluid.layers.generate_proposal_labels)
BBoxAssigner:
  batch_size_per_im: 512
F
FDInSky 已提交
156
  bbox_reg_weights: [0.1, 0.1, 0.2, 0.2]
F
FDInSky 已提交
157
  bg_thresh_lo: 0.0
F
FDInSky 已提交
158
  bg_thresh_hi: 0.5
F
FDInSky 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
  fg_fraction: 0.25
  fg_thresh: 0.5

# 根据roi的label,选择前景,为其赋值mask label
# 具体实现参考[API](fluid.layers.generate_mask_labels)
MaskAssigner:
  resolution: 28
  num_classes: 81

# 输出检测框的Head
BBoxHead:
  # 在roi extractor和bbox head之间,插入两层FC,对特征做进一步学习
  head: TwoFCHead
  # 通过NMS进行bbox过滤
  # 具体实现参考[API](fluid.layers.multiclass_nms)
F
FDInSky 已提交
174 175 176 177
  nms:
    keep_top_k: 100
    nms_threshold: 0.5
    score_threshold: 0.05
F
FDInSky 已提交
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194

# 输出检测框之前,对特征进一步学习
TwoFCHead:
  # FC输出的特征图通道数,默认是1024
  num_chan: 1024

#####################################训练配置#####################################

# 学习率配置
LearningRate:
  # 初始学习率, 一般情况下8卡gpu,batch size为2时设置为0.02
  # 可以根据具体情况,按比例调整
  # 比如说4卡V100,bs=2时,设置为0.01
  base_lr: 0.01
  # 学习率规划器
  # 具体实现参考[API](fluid.layers.piecewise_decay)
  schedulers:
F
FDInSky 已提交
195 196 197 198 199 200 201 202
    # 学习率衰减策略
    # 对于coco数据集,1个epoch大概需要7000个iter
    # if step < 120000:
    #    learning_rate = 0.1
    # elif 120000 <= step < 160000:
    #    learning_rate = 0.1 * 0.1
    # else:
    #    learning_rate = 0.1 * (0.1)**2
F
FDInSky 已提交
203 204
    - !PiecewiseDecay
      gamma: 0.1
F
FDInSky 已提交
205
      milestones: [120000, 160000]
F
FDInSky 已提交
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
    # 在训练开始时,调低学习率为base_lr * start_factor,然后逐步增长到base_lr,这个过程叫学习率热身,按照以下公式更新学习率
    # linear_step = end_lr - start_lr
    # lr = start_lr + linear_step * (global_step / warmup_steps)
    # 具体实现参考[API](fluid.layers.linear_lr_warmup)
    - !LinearWarmup
      start_factor: 0.3333333333333333
      steps: 500

OptimizerBuilder:
  # 默认使用SGD+Momentum进行训练
  # 具体实现参考[API](fluid.optimizer)
  optimizer:
    momentum: 0.9
    type: Momentum
  # 默认使用L2权重衰减正则化
  # 具体实现参考[API](fluid.regularizer)
  regularizer:
    factor: 0.0001
    type: L2

#####################################数据配置#####################################

# 模型训练集设置参考
# 训练、验证、测试使用的数据配置主要区别在数据路径、模型输入、数据增强参数设置
TrainReader:
F
FDInSky 已提交
231 232 233 234 235 236
  # 训练过程中模型的相关输入
  # 包括图片,图片长宽高等基本信息,图片id,标记的目标框、实例标签、实例分割掩码
  inputs_def:
    fields: ['image', 'im_info', 'im_id', 'gt_bbox', 'gt_class', 'is_crowd', 'gt_mask']
  # VOC数据集对应的输入,注意选择VOC时,也要对应修改metric: VOC
- # fields: ['image', 'im_info', 'im_id', 'gt_bbox', 'gt_class', 'is_difficult']
F
FDInSky 已提交
237 238
  # 数据集目录配置
  dataset:
F
FDInSky 已提交
239 240
    # 指定数据集名称,可以选择VOCDataSet, COCODataSet
    !COCODataSet
F
FDInSky 已提交
241 242
    # 训练图片所在目录
    image_dir: train2017
F
FDInSky 已提交
243 244 245 246
    # 标记文件所在目录
    anno_path: annotations/instances_train2017.json
    # 数据集根目录
    dataset_dir: dataset/coco
F
FDInSky 已提交
247 248
  # 对一个batch中的单张图片做的数据增强
  sample_transforms:
F
FDInSky 已提交
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
  # 读取Image图像为numpy数组
  # 可以选择将图片从BGR转到RGB,可以选择对一个batch中的图片做mixup增强
  - !DecodeImage
    to_rgb: true
  # 对图片进行随机翻转
  # 可以选择同步翻转mask,可以选择归一化bbox的坐标
  - !RandomFlipImage
    prob: 0.5
  # 归一化图片,默认均值[0.485, 0.456, 0.406],方差[1, 1, 1]
  # 可以选择将归一化结果除以255,可以选择图片的数据格式
  - !NormalizeImage
    is_channel_first: false
    is_scale: true
    mean: [0.485,0.456,0.406]
    std: [0.229, 0.224,0.225]
  # 调整图片尺寸,默认采用cv2的线性插值
  - !ResizeImage
    target_size: 800
    max_size: 1333
    interp: 1
    use_cv2: true
  # 调整图片数据格式,默认使用CHW
  - !Permute
    to_bgr: false
    channel_first: true
F
FDInSky 已提交
274 275
  # 对一个batch中的图片统一做的数据增强
  batch_transforms:
F
FDInSky 已提交
276 277 278 279 280 281 282 283 284
  # 将一个batch中的图片,按照最大的尺寸,做补齐
  - !PadBatch
    pad_to_stride: 32
    # 选择是否使用padding之后的image信息,默认为false
    use_padded_im_info: false
  # 1个GPU的batch size,默认为1
  batch_size: 1
  # 选择是否打乱所有样本的顺序
  shuffle: true
F
FDInSky 已提交
285 286 287 288
  # 使用多进程/线程的数目,默认为2
  worker_num: 2
  # 选择是否使用多进程,默认为false
  use_process: false
F
FDInSky 已提交
289 290
  # 如果最后一个batch的图片数量为奇数,选择是否丢掉这个batch,不进行训练,默认是不丢掉的
  drop_last: false
F
FDInSky 已提交
291 292
  # 使用数据集中的样本数目,默认是-1,表示使用全部
  samples: -1
F
FDInSky 已提交
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355

  # 模型验证集设置参考
  EvalReader:
  # 验证过程中模型的相关输入
  # 包括图片,图片长宽高等基本信息,图片id,图片shape
  inputs_def:
    fields: ['image', 'im_info', 'im_id', 'im_shape']
  dataset:
    !COCODataSet
    image_dir: val2017
    anno_path: annotations/instances_val2017.json
    dataset_dir: dataset/coco
  sample_transforms:
  - !DecodeImage
    to_rgb: true
  - !NormalizeImage
    is_channel_first: false
    is_scale: true
    mean: [0.485,0.456,0.406]
    std: [0.229, 0.224,0.225]
  - !ResizeImage
    interp: 1
    max_size: 1333
    target_size: 800
    use_cv2: true
  - !Permute
    channel_first: true
    to_bgr: false
  batch_size: 1
  shuffle: false
  drop_last: false
  drop_empty: false
  worker_num: 2

# 测试验证集设置参考
TestReader:
  # 测试过程中模型的相关输入
  # 包括图片,图片长宽高等基本信息,图片id,图片shape
  inputs_def:
    fields: ['image', 'im_info', 'im_id', 'im_shape']
  dataset:
    # 测试图片所在目录
    !ImageFolder
    anno_path: annotations/instances_val2017.json
  sample_transforms:
  - !DecodeImage
    to_rgb: true
    with_mixup: false
  - !NormalizeImage
    is_channel_first: false
    is_scale: true
    mean: [0.485,0.456,0.406]
    std: [0.229, 0.224,0.225]
  - !ResizeImage
    interp: 1
    max_size: 1333
    target_size: 800
    use_cv2: true
  - !Permute
    channel_first: true
    to_bgr: false
  batch_size: 1
  shuffle: false
F
FDInSky 已提交
356 357
  drop_last: false
  ```