faster_rcnn_r50_fpn_1x.py配置文件

一、简介
在使用mmdetection对模型进行调优的过程中总会遇到很多参数的问题,不知道参数在代码中是什么作用,会对训练产生怎样的影响,这里我以faster_rcnn_r50_fpn_1x.py和cascade_rcnn_r50_fpn_1x.py为例,简单介绍一下mmdetection中的各项参数含义

 

二、faster_rcnn_r50_fpn_1x.py配置文件
首先介绍一下这个配置文件所描述的框架,它是基于resnet50的backbone,有着5个fpn特征层的faster-RCNN目标检测网络,训练迭代次数为标准的12次epoch,下面逐条解释其含义

 

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

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

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

156

# model settings

model = dict(

    type='FasterRCNN',                         # model类型

    pretrained='modelzoo://resnet50',          # 预训练模型:imagenet-resnet50

    backbone=dict(

        type='ResNet',                         # backbone类型

        depth=50,                              # 网络层数

        num_stages=4,                          # resnet的stage数量

        out_indices=(0123),              # 输出的stage的序号

        frozen_stages=1,                       # 冻结的stage数量,即该stage不更新参数,-1表示所有的stage都更新参数

        style='pytorch'),                      # 网络风格:如果设置pytorch,则stride为2的层是conv3x3的卷积层;如果设置caffe,则stride为2的层是第一个conv1x1的卷积层

    neck=dict(

        type='FPN',                            # neck类型

        in_channels=[25651210242048],    # 输入的各个stage的通道数

        out_channels=256,                      # 输出的特征层的通道数

        num_outs=5),                           # 输出的特征层的数量

    rpn_head=dict(

        type='RPNHead',                        # RPN网络类型

        in_channels=256,                       # RPN网络的输入通道数

        feat_channels=256,                     # 特征层的通道数

        anchor_scales=[8],                     # 生成的anchor的baselen,baselen = sqrt(w*h),w和h为anchor的宽和高

        anchor_ratios=[0.51.02.0],         # anchor的宽高比

        anchor_strides=[48163264],     # 在每个特征层上的anchor的步长(对应于原图)

        target_means=[.0, .0, .0, .0],         # 均值

        target_stds=[1.01.01.01.0],      # 方差

        use_sigmoid_cls=True),                 # 是否使用sigmoid来进行分类,如果False则使用softmax来分类

    bbox_roi_extractor=dict(

        type='SingleRoIExtractor',                                   # RoIExtractor类型

        roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2),   # ROI具体参数:ROI类型为ROIalign,输出尺寸为7,sample数为2

        out_channels=256,                                            # 输出通道数

        featmap_strides=[481632]),                             # 特征图的步长

    bbox_head=dict(

        type='SharedFCBBoxHead',                     # 全连接层类型

        num_fcs=2,                                   # 全连接层数量

        in_channels=256,                             # 输入通道数

        fc_out_channels=1024,                        # 输出通道数

        roi_feat_size=7,                             # ROI特征层尺寸

        num_classes=81,                              # 分类器的类别数量+1,+1是因为多了一个背景的类别

        target_means=[0.0.0.0.],               # 均值

        target_stds=[0.10.10.20.2],            # 方差

        reg_class_agnostic=False))                   # 是否采用class_agnostic的方式来预测,class_agnostic表示输出bbox时只考虑其是否为前景,后续分类的时候再根据该bbox在网络中的类别得分来分类,也就是说一个框可以对应多个类别

# model training and testing settings

train_cfg = dict(

    rpn=dict(

        assigner=dict(

            type='MaxIoUAssigner',            # RPN网络的正负样本划分

            pos_iou_thr=0.7,                  # 正样本的iou阈值

            neg_iou_thr=0.3,                  # 负样本的iou阈值

            min_pos_iou=0.3,                  # 正样本的iou最小值。如果assign给ground truth的anchors中最大的IOU低于0.3,则忽略所有的anchors,否则保留最大IOU的anchor

            ignore_iof_thr=-1),               # 忽略bbox的阈值,当ground truth中包含需要忽略的bbox时使用,-1表示不忽略

        sampler=dict(

            type='RandomSampler',             # 正负样本提取器类型

            num=256,                          # 需提取的正负样本数量

            pos_fraction=0.5,                 # 正样本比例

            neg_pos_ub=-1,                    # 最大负样本比例,大于该比例的负样本忽略,-1表示不忽略

            add_gt_as_proposals=False),       # 把ground truth加入proposal作为正样本

        allowed_border=0,                     # 允许在bbox周围外扩一定的像素

        pos_weight=-1,                        # 正样本权重,-1表示不改变原始的权重

        smoothl1_beta=1 / 9.0,                # 平滑L1系数

        debug=False),                         # debug模式

    rcnn=dict(

        assigner=dict(

            type='MaxIoUAssigner',            # RCNN网络正负样本划分

            pos_iou_thr=0.5,                  # 正样本的iou阈值

            neg_iou_thr=0.5,                  # 负样本的iou阈值

            min_pos_iou=0.5,                  # 正样本的iou最小值。如果assign给ground truth的anchors中最大的IOU低于0.3,则忽略所有的anchors,否则保留最大IOU的anchor

            ignore_iof_thr=-1),               # 忽略bbox的阈值,当ground truth中包含需要忽略的bbox时使用,-1表示不忽略

        sampler=dict(

            type='RandomSampler',             # 正负样本提取器类型

            num=512,                          # 需提取的正负样本数量

            pos_fraction=0.25,                # 正样本比例

            neg_pos_ub=-1,                    # 最大负样本比例,大于该比例的负样本忽略,-1表示不忽略

            add_gt_as_proposals=True),        # 把ground truth加入proposal作为正样本

        pos_weight=-1,                        # 正样本权重,-1表示不改变原始的权重

        debug=False))                         # debug模式

test_cfg = dict(

    rpn=dict(                                 # 推断时的RPN参数

        nms_across_levels=False,              # 在所有的fpn层内做nms

        nms_pre=2000,                         # 在nms之前保留的的得分最高的proposal数量

        nms_post=2000,                        # 在nms之后保留的的得分最高的proposal数量

        max_num=2000,                         # 在后处理完成之后保留的proposal数量

        nms_thr=0.7,                          # nms阈值

        min_bbox_size=0),                     # 最小bbox尺寸

    rcnn=dict(

        score_thr=0.05, nms=dict(type='nms', iou_thr=0.5), max_per_img=100)   # max_per_img表示最终输出的det bbox数量

    # soft-nms is also supported for rcnn testing

    # e.g., nms=dict(type='soft_nms', iou_thr=0.5, min_score=0.05)            # soft_nms参数

)

# dataset settings

dataset_type = 'CocoDataset'                # 数据集类型

data_root = 'data/coco/'                    # 数据集根目录

img_norm_cfg = dict(

    mean=[123.675116.28103.53], std=[58.39557.1257.375], to_rgb=True)   # 输入图像初始化,减去均值mean并处以方差std,to_rgb表示将bgr转为rgb

data = dict(

    imgs_per_gpu=2,                # 每个gpu计算的图像数量

    workers_per_gpu=2,             # 每个gpu分配的线程数

    train=dict(

        type=dataset_type,                                                 # 数据集类型

        ann_file=data_root + 'annotations/instances_train2017.json',       # 数据集annotation路径

        img_prefix=data_root + 'train2017/',                               # 数据集的图片路径

        img_scale=(1333800),                                             # 输入图像尺寸,最大边1333,最小边800

        img_norm_cfg=img_norm_cfg,                                         # 图像初始化参数

        size_divisor=32,                                                   # 对图像进行resize时的最小单位,32表示所有的图像都会被resize成32的倍数

        flip_ratio=0.5,                                                    # 图像的随机左右翻转的概率

        with_mask=False,                                                   # 训练时附带mask

        with_crowd=True,                                                   # 训练时附带difficult的样本

        with_label=True),                                                  # 训练时附带label

    val=dict(

        type=dataset_type,                                                 # 同上

        ann_file=data_root + 'annotations/instances_val2017.json',         # 同上

        img_prefix=data_root + 'val2017/',                                 # 同上

        img_scale=(1333800),                                             # 同上

        img_norm_cfg=img_norm_cfg,                                         # 同上

        size_divisor=32,                                                   # 同上

        flip_ratio=0,                                                      # 同上

        with_mask=False,                                                   # 同上

        with_crowd=True,                                                   # 同上

        with_label=True),                                                  # 同上

    test=dict(

        type=dataset_type,                                                 # 同上

        ann_file=data_root + 'annotations/instances_val2017.json',         # 同上

        img_prefix=data_root + 'val2017/',                                 # 同上

        img_scale=(1333800),                                             # 同上

        img_norm_cfg=img_norm_cfg,                                         # 同上

        size_divisor=32,                                                   # 同上

        flip_ratio=0,                                                      # 同上

        with_mask=False,                                                   # 同上

        with_label=False,                                                  # 同上

        test_mode=True))                                                   # 同上

# optimizer

optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001)   # 优化参数,lr为学习率,momentum为动量因子,weight_decay为权重衰减因子

optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2))          # 梯度均衡参数

# learning policy

lr_config = dict(

    policy='step',                        # 优化策略

    warmup='linear',                      # 初始的学习率增加的策略,linear为线性增加

    warmup_iters=500,                     # 在初始的500次迭代中学习率逐渐增加

    warmup_ratio=1.0 / 3,                 # 起始的学习率

    step=[811])                         # 在第8和11个epoch时降低学习率

checkpoint_config = dict(interval=1)      # 每1个epoch存储一次模型

# yapf:disable

log_config = dict(

    interval=50,                          # 每50个batch输出一次信息

    hooks=[

        dict(type='TextLoggerHook'),      # 控制台输出信息的风格

        # dict(type='TensorboardLoggerHook')

    ])

# yapf:enable

# runtime settings

total_epochs = 12                               # 最大epoch数

dist_params = dict(backend='nccl')              # 分布式参数

log_level = 'INFO'                              # 输出信息的完整度级别

work_dir = './work_dirs/faster_rcnn_r50_fpn_1x' # log文件和模型文件存储路径

load_from = None                                # 加载模型的路径,None表示从预训练模型加载

resume_from = None                              # 恢复训练模型的路径

workflow = [('train'1)]                       # 当前工作区名称

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值