MMDetection源码解析:Faster RCNN(1)--配置文件
faster_rcnn_r50_fpn_1x_coco.py文件位于目录mmdetection/configs/faster_rcnn/下面,主要内容如下:
_base_ = [ '../_base_/models/faster_rcnn_r50_fpn.py', '../_base_/datasets/coco_detection.py', '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' ]
其中第1个配置文件说明了使用哪一个模型,第2个配置文件说明了训练的数据集,第3个配置文件说明了训练的参数,如学习率,epoch数量等等,第4个配置文件说明了Runtime.
第1个配置文件,faster_rcnn_r50_fpn.py,它的代码和解析如下:
model = dict( # 网络类型 type='FasterRCNN', # 预训练模型 pretrained='torchvision://resnet50', # Backbone backbone=dict( # Backbone为ResNet type='ResNet', # 深度为50 depth=50, # FPN有4个阶段 num_stages=4, # 输出的FPN Stage的编号 out_indices=(0, 1, 2, 3), # 冻结的Stage的数量 frozen_stages=1, norm_cfg=dict(type='BN', requires_grad=True), norm_eval=True, # 网络风格 style='pytorch'), # Neck neck=dict( # Neck类型为FPN type='FPN', # 输入的各个Stage的通道数 in_channels=[256, 512, 1024, 2048], # 输出的特征层通道数 out_channels=256, # 输出的特征层的数量 num_outs=5), # RPN Head rpn_head=dict( # RPN网络头部 type='RPNHead', # 输入通道数 in_channels=256, # 特征层的通道数 feat_channels=256, # Anchor生成器 anchor_generator=dict( type='AnchorGenerator', scales=[8], ratios=[0.5, 1.0, 2.0], # FPN的每一个Stage生成Anchor的步长 strides=[4, 8, 16, 32, 64]), bbox_coder=dict( # BBox编码器 type='DeltaXYWHBBoxCoder', target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0]), # 分类损失函数 loss_cls=dict( type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), # BBox损失函数 loss_bbox=dict(type='L1Loss', loss_weight=1.0)), # ROI Head roi_head=dict( # ROI头部类型 type='StandardRoIHead', # ROI特征提取器 bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), out_channels=256, featmap_strides=[4, 8, 16, 32]), # ROI的BBox头部 bbox_head=dict( # 全连接层类型 type='Shared2FCBBoxHead', # 输入通道数量 in_channels=256, # 全连接层输出通道数量 fc_out_channels=1024, # ROI特征层尺寸 roi_feat_size=7, # 类的数量 num_classes=80, # BBox编码器 bbox_coder=dict( type='DeltaXYWHBBoxCoder', target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2]), reg_class_agnostic=False, # 分类损失函数 loss_cls=dict( type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), # BBox损失函数 loss_bbox=dict(type='L1Loss', loss_weight=1.0)))) # model training and testing settings # 训练配置 train_cfg = dict( # RPN网络训练配置 rpn=dict( # 样本分配器 assigner=dict( type='MaxIoUAssigner', pos_iou_thr=0.7, neg_iou_thr=0.3, min_pos_iou=0.3, match_low_quality=True, ignore_iof_thr=-1), # 样本采样器 sampler=dict( type='RandomSampler', num=256, pos_fraction=0.5, neg_pos_ub=-1, add_gt_as_proposals=False), allowed_border=-1, pos_weight=-1, debug=False), # RPN网络提议框设置 rpn_proposal=dict( nms_across_levels=False, nms_pre=2000, nms_post=1000, max_num=1000, nms_thr=0.7, min_bbox_size=0), # ROI网络训练配置 rcnn=dict( assigner=dict( type='MaxIoUAssigner', pos_iou_thr=0.5, neg_iou_thr=0.5, min_pos_iou=0.5, match_low_quality=False, ignore_iof_thr=-1), sampler=dict( type='RandomSampler', num=512, pos_fraction=0.25, neg_pos_ub=-1, add_gt_as_proposals=True), pos_weight=-1, debug=False)) # 测试配置 test_cfg = dict( # RPN网络配置 rpn=dict( nms_across_levels=False, nms_pre=1000, nms_post=1000, max_num=1000, nms_thr=0.7, min_bbox_size=0), # ROI网络配置 rcnn=dict( score_thr=0.05, # NMS类型及IOU Threshold nms=dict(type='nms', iou_threshold=0.5), max_per_img=100) # soft-nms is also supported for rcnn testing # e.g., nms=dict(type='soft_nms', iou_threshold=0.5, min_score=0.05) )