ショートカット

ファインチューニングモデル

COCO データセットで事前学習された検出器は、CityScapes や KITTI データセットなど、他のデータセットの良い事前学習済みモデルとして機能します。このチュートリアルでは、モデル動物園に用意されているモデルを他のデータセットで使用して、より良いパフォーマンスを得るための手順を説明します。

新しいデータセットでモデルをファインチューニングするには、2 つのステップがあります。

  • データセットのカスタマイズに従って、新しいデータセットのサポートを追加します。

  • このチュートリアルで説明するように、設定を変更します。

Cityscapes データセットでのファインチューニングプロセスを例として、ユーザーは設定の 5 つの部分を変更する必要があります。

基本設定の継承

負担を軽減し、設定全体を記述する際のバグを減らすために、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'
]

ヘッドの変更

次に、新しい設定で、新しいデータセットのクラス数に応じてヘッドを変更する必要があります。roi_head の num_classes を変更するだけで、最終的な予測ヘッドを除いて、事前学習済みモデルの重みがほとんど再利用されます。

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 データセットを既にサポートしています。

トレーニングスケジュールの変更

ファインチューニングのハイパーパラメータは、デフォルトのスケジュールとは異なります。通常、より小さな学習率と少ないトレーニングエポックが必要です。

# 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