2021SC@SDUSC
本周分析PaddleDetection中的MaskRcnn配置文件。
config/mask_rcnn_r50_fpn_1x_coco.yml
# 全局配置
# 拆分成了几个文件:模型、优化器、数据、数据读取、运行时的配置
_BASE_: [
'./_base_/models/mask_rcnn_r50_fpn.yml', #models配置
'./_base_/optimizers/rcnn_1x.yml', #optimizers配置
'./_base_/datasets/coco_instance.yml', #datasets配置
'./_base_/readers/mask_fpn_reader.yml', #readers配置
'./_base_/runtime.yml', #runtime配置
]
configs/_base_/models/mask_rcnn_r50_fpn.yml
architecture: MaskRCNN # 检测模型的名称
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_cos_pretrained.tar# 模型的预训练权重,默认是从指定url下载
weights: output/mask_rcnn_r50_fpn_1x/model_final # 用于模型验证或测试的训练好的权重
load_static_weights: True # 是否加载静态图模型
# Model Achitecture
# MaskRCNNYOLOV3结构,包括了以下主要组
MaskRCNN:
# model anchor info flow
anchor: Anchor #Anchor类名
proposal: Proposal #Proposal类名
mask: Mask #Mask类名
# model feat info flow
backbone: ResNet #主干网络类名
neck: FPN #neck FPN类名
rpn_head: RPNHead #Head成员类名
bbox_head: BBoxHead #Head成员类名
mask_head: MaskHead #Head成员类名
# post process #后处理类名
bbox_post_process: BBoxPostProcess #BBox后处理
mask_post_process: MaskPostProcess #Mask后处理
ResNet:#初始化
# index 0 stands for res2
depth: 50 #网络层数
norm_type: bn #BN类型
freeze_at: 0 #冻结权重
return_idx: [0,1,2,3] # 主干网络返回的主要阶段特征用于FPN作进一步的特征融合
num_stages: 4 #输出层数,指上面的索引个数
FPN: #特征金字塔类名
in_channels: [256, 512, 1024, 2048] #FPN输入通道数
out_channel: 256 #FPN输出通道数
min_level: 0 #从0开始 [0,1,2,3]
max_level: 4 #到4结束 [0,1,2,3]
spatial_scale: [0.25, 0.125, 0.0625, 0.03125] #变换尺度
RPNHead: #RPNHead类名
rpn_feat: #rpn特征
name: RPNFeat #类名
feat_in: 256 #输入通道数
feat_out: 256 #输出通道数
anchor_per_position: 3 #anchor个数
rpn_channel: 256 #rpn通道数
Anchor:#锚框
anchor_generator: #产生锚框
name: AnchorGeneratorRPN #类名
aspect_ratios: [0.5, 1.0, 2.0] #锚框比例
anchor_start_size: 32 #产生锚框尺寸大小
stride: [4., 4.] #步长
anchor_target_generator: #目标框
name: AnchorTargetGeneratorRPN #产生目标框类名
batch_size_per_im: 256 #输入图片尺寸
fg_fraction: 0.5 #RPN阈值
negative_overlap: 0.3 #负例iou置信度
positive_overlap: 0.7 #正例iou置信度
straddle_thresh: 0.0 #目标框阈值
Proposal: #目标框
proposal_generator: #生成目标框
name: ProposalGenerator #生成目标框类名
min_size: 0.0 #最小尺寸
nms_thresh: 0.7 #nms阈值
train_pre_nms_top_n: 2000 #训练时产生最多框数
train_post_nms_top_n: 2000 #训练时经后处理后产生最多框数
infer_pre_nms_top_n: 1000 #推理时产生最多框数
infer_post_nms_top_n: 1000 #推理时经后处理后产生最多框数
proposal_target_generator: #目标框后处理
name: ProposalTargetGenerator #目标框后处理类名
batch_size_per_im: 512 #图片尺寸
bbox_reg_weights: [0.1, 0.1, 0.2, 0.2] #bbox权重
bg_thresh_hi: [0.5,] #最大阈值 在bg_thresh_hi、bg_thresh_lo区间为背景
bg_thresh_lo: [0.0,] #最小阈值 在bg_thresh_hi、bg_thresh_lo区间为背景
fg_thresh: [0.5,] #被选正例iou阈值
fg_fraction: 0.25 #类别阈值
BBoxHead: #BBox头
bbox_feat: #bbox特征
name: BBoxFeat #bbox特征类名
roi_extractor: #roi提取
name: RoIAlign #RoIAlign
resolution: 7 #像素值
sampling_ratio: 2 #采样率
head_feat: #head特征
name: TwoFCHead #就是两个全连接类名
in_dim: 256 #输入维度
mlp_dim: 1024 #中间维度
in_feat: 1024 #特征维度
BBoxPostProcess: #BBox后处理
decode: #解码
name: RCNNBox # RCNNBox类名
num_classes: 81 #物体类别+北京类
batch_size: 1 #输入batch数
nms: #非极大值抑制
name: MultiClassNMS #非极大值抑制类名
keep_top_k: 100 #最多框数
score_threshold: 0.05 #置信度阈值
nms_threshold: 0.5 #iou阈值
Mask: #掩膜
mask_target_generator: #产生掩膜
name: MaskTargetGenerator #产生掩膜类名
mask_resolution: 28 #像素值
MaskHead: #掩膜头
mask_feat: #掩膜特征
name: MaskFeat #掩膜特征名
num_convs: 4 #卷积个数
feat_in: 256 #输入特征维度
feat_out: 256 #输出特征维度
mask_roi_extractor: #ROI提取
name: RoIAlign #RoIAlign
resolution: 14 #像素值
sampling_ratio: 2 #采样率
share_bbox_feat: False #是否贡献bbox特征
feat_in: 256 #特征维度
MaskPostProcess: #掩膜后处理
mask_resolution: 28 #掩膜像素值
configs/_base_/optimizers/rcnn_1x.yml
epoch: 12 #训练epoch数
学习率部分详解可参考yolov3中的此部分
LearningRate: #学习率类名
# 初始学习率, 一般情况下8卡gpu,batch size为2时设置为0.02
# 可以根据具体情况,按比例调整
# 比如说4卡V100,bs=2时,设置为0.01
base_lr: 0.01 #学习率
schedulers: #实例化优化器策略
- !PiecewiseDecay #分段式衰减
gamma: 0.1 #衰减系数
milestones: [8, 11] #衰减点[列表]
- !LinearWarmup #学习率从非常小的数值线性增加到预设值之后,然后再线性减小。
start_factor: 0.3333333333333333 #初始值
steps: 500 #线性增长步长
OptimizerBuilder: #构建优化器
optimizer: #优化器
momentum: 0.9 #动量系数
type: Momentum #类型
regularizer: #正则初始化
factor: 0.0001 #正则系数
type: L2 #L2正则
configs/_base_/readers/mask_fpn_reader.yml
worker_num: 2 #数据读取线程数
TrainReader: # 训练过程中模型的输入设置
sample_transforms: #单张图片数据前处理,数据增强,下面是各种数据增强方法,放入列表中
- DecodeOp: {}
- RandomFlipImage: {prob: 0.5, is_mask_flip: true}
- NormalizeImage: {is_channel_first: false, is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
- ResizeImage: {target_size: 800, max_size: 1333, interp: 1, use_cv2: true}
- Permute: {to_bgr: false, channel_first: true}
batch_transforms:#数据批处理
- PadBatch: {pad_to_stride: 32, use_padded_im_info: false, pad_gt: true}
batch_size: 1 # 1个GPU的batch size,默认为1。需要注意:每个iter迭代会运行batch_size * device_num张图片
shuffle: true #数据是否随机
drop_last: true #是否丢弃最后与设置维度不匹配的数据 # 注意,在某些情况下,drop_last=false时训练过程中可能会出错,建议训练时都设置为true
EvalReader: #验证数据读取
sample_transforms: #单张图片数据前处理,数据增强,下面是各种数据增强方法,放入列表中
- DecodeOp: {}
- NormalizeImageOp: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
- ResizeOp: {interp: 1, target_size: [800, 1333], keep_ratio: True}
- PermuteOp: {}
batch_transforms: #数据批处理
- PadBatchOp: {pad_to_stride: 32, pad_gt: false}
batch_size: 1 # 1个GPU的batch size,默认为1。需要注意:每个iter迭代会运行batch_size * device_num张图片
shuffle: false #数据是否随机
drop_last: false # 注意,在某些情况下,drop_last=false时训练过程中可能会出错,建议训练时都设置为true
drop_empty: false #丢弃空数据
TestReader: #测试数据读取,有些前处理需要保持一致
sample_transforms: #单张图片数据前处理,数据增强,下面是各种数据增强方法,放入列表中
- DecodeOp: {}
- NormalizeImageOp: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
- ResizeOp: {interp: 1, target_size: [800, 1333], keep_ratio: True}
- PermuteOp: {}
batch_transforms: #数据批处理
- PadBatchOp: {pad_to_stride: 32, pad_gt: false}
batch_size: 1 # 1个GPU的batch size,默认为1。需要注意:每个iter迭代会运行batch_size * device_num张图片
shuffle: false #数据是否随机
drop_last: false #是否丢弃最后与设置维度不匹配的数据 # 注意,在某些情况下,drop_last=false时训练过程中可能会出错,建议训练时都设置为true
'''