快捷键

微调模型

在 COCO 数据集上预训练的检测器可以作为其他数据集(例如 CityScapes 和 KITTI 数据集)的良好预训练模型。本教程为用户提供使用 模型库 中提供的模型进行其他数据集训练以获得更好性能的说明。

在新的数据集上微调模型需要两个步骤。

  • 根据 自定义数据集 添加对新数据集的支持。

  • 修改配置文件,这将在本教程中讨论。

以 Cityscapes 数据集上的微调过程为例,用户需要在配置文件中修改五个部分。

继承基础配置文件

为了减轻负担并减少编写整个配置文件的错误,MMDetection V3.0 支持从多个现有配置文件继承配置。为了微调 Mask RCNN 模型,新的配置文件需要继承 _base_/models/mask-rcnn_r50_fpn.py 来构建模型的基本结构。为了使用 Cityscapes 数据集,新的配置文件也可以简单地继承 _base_/datasets/cityscapes_instance.py。对于运行时设置,例如日志记录设置,新的配置文件需要继承 _base_/default_runtime.py。对于训练计划,新的配置文件可以继承 _base_/schedules/schedule_1x.py。这些配置文件位于 configs 目录中,用户也可以选择编写全部内容,而不是使用继承。

_base_ = [
    '../_base_/models/mask-rcnn_r50_fpn.py',
    '../_base_/datasets/cityscapes_instance.py', '../_base_/default_runtime.py',
    '../_base_/schedules/schedule_1x.py'
]

修改头部

然后,新的配置文件需要根据新数据集的类别数修改头部。通过仅更改 num_classes 在 roi_head 中,预训练模型的权重大部分被重用,除了最终的预测头。

model = dict(
    roi_head=dict(
        bbox_head=dict(
            type='Shared2FCBBoxHead',
            in_channels=256,
            fc_out_channels=1024,
            roi_feat_size=7,
            num_classes=8,
            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),
            loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)),
        mask_head=dict(
            type='FCNMaskHead',
            num_convs=4,
            in_channels=256,
            conv_out_channels=256,
            num_classes=8,
            loss_mask=dict(
                type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))))

修改数据集

用户可能还需要准备数据集并编写有关数据集的配置文件,请参阅 自定义数据集 以获取更多详细信息。MMDetection V3.0 已经支持 VOC、WIDERFACE、COCO、LIVS、OpenImages、DeepFashion、Objects365 和 Cityscapes 数据集。

修改训练计划

微调超参数与默认计划不同。它通常需要更小的学习率和更少的训练 epoch。

# optimizer
# lr is set for a batch size of 8
optim_wrapper = dict(optimizer=dict(lr=0.01))

# learning rate
param_scheduler = [
    dict(
        type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, end=500),
    dict(
        type='MultiStepLR',
        begin=0,
        end=8,
        by_epoch=True,
        milestones=[7],
        gamma=0.1)
]

# max_epochs
train_cfg = dict(max_epochs=8)

# log config
default_hooks = dict(logger=dict(interval=100)),

使用预训练模型

为了使用预训练模型,新的配置文件在 load_from 中添加了预训练模型的链接。用户可能需要在训练之前下载模型权重,以避免在训练期间下载时间。

load_from = 'https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth'  # noqa