mmdetectionモデルのトレーニングスキル

1.事前トレーニング済みモデル

      事前トレーニングモデルに関しては、一般的な検出はImageNetによって事前トレーニングされたバックボーンを使用することです。これは基本構成であり、このロード方法も公式にサポートされています。

      より高度な方法は、データセットの事前トレーニングを行うことです。すべてのターゲットを切り取り、適切な分類モデルをトレーニングします。この初期化は、ImageNetよりもはるかに優れています。

      最後は、cocoによって事前にトレーニングされた完全な検出モデルの重みを使用することです。この効果は、モデルがすばやく収束することであり、最も一般的に使用される方法である効果が一般的に優れています。タスクごとにカテゴリが異なるため、重みを微調整する必要があります。これは、ココのトレーニング前の重みカテゴリを変更するためのmmdetectionのスクリプトです。

      スクリプトはカスケードrcnnを例として取り上げており、他のモデルの変更も同様です。

# for cascade rcnn
import torch
num_classes = 21
model_coco = torch.load("cascade_rcnn_x101_32x4d_fpn_2x_20181218-28f73c4c.pth")

# weight
model_coco["state_dict"]["bbox_head.0.fc_cls.weight"].resize_(num_classes,1024)
model_coco["state_dict"]["bbox_head.1.fc_cls.weight"].resize_(num_classes,1024)
model_coco["state_dict"]["bbox_head.2.fc_cls.weight"].resize_(num_classes,1024)
# bias
model_coco["state_dict"]["bbox_head.0.fc_cls.bias"].resize_(num_classes)
model_coco["state_dict"]["bbox_head.1.fc_cls.bias"].resize_(num_classes)
model_coco["state_dict"]["bbox_head.2.fc_cls.bias"].resize_(num_classes)
#save new model
torch.save(model_coco,"coco_pretrained_weights_classes_%d.pth"%num_classes)

2.ソフトNMS

    Soft-NMSは、以前の暴力的なNMSを改善します。IOUが特定のしきい値を超えると、ボックスは直接削除されなくなりますが、信頼度(スコア)は低下します。スコアがしきい値よりも低い場合は除外されますが、下げた後もまだ高いですが、残ります。

    mmdetectionの設定は次のとおりです。

test_cfg = dict(
    rpn=dict(
        nms_across_levels=False,
        nms_pre=1000,
        nms_post=1000,
        max_num=1000,
        nms_thr=0.7,
        min_bbox_size=0),
    rcnn=dict(
        score_thr=0.05, nms=dict(type='soft_nms', iou_thr=0.5), max_per_img=100),
    keep_all_stages=False)

3.GIoULoss

      通常の状況では、L1Lossの代わりにGIoULossを使用するとポイントが増加します。

      元のバージョン(L1Lossを使用)の構成ファイルは次のとおりです。

    rpn_head=dict(
        type='RPNHead',
        in_channels=256,
        feat_channels=256,
        anchor_generator=dict(
            type='AnchorGenerator',
            scales=[8],
            ratios=[0.5, 1.0, 2.0],
            strides=[4, 8, 16, 32, 64]),
        bbox_coder=dict(
            type='DeltaXYWHBBoxCoder',
            target_means=[0.0, 0.0, 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),
        loss_bbox=dict(type='L1Loss', loss_weight=1.0)),
    roi_head=dict(
        type='StandardRoIHead',
        bbox_roi_extractor=dict(
            type='SingleRoIExtractor',
            roi_layer=dict(type='RoIAlign', out_size=7, sample_num=0),
            out_channels=256,
            featmap_strides=[4, 8, 16, 32]),
        bbox_head=dict(
            type='Shared2FCBBoxHead',
            in_channels=256,
            fc_out_channels=1024,
            roi_feat_size=7,
            num_classes=10,
            bbox_coder=dict(
                type='DeltaXYWHBBoxCoder',
                target_means=[0.0, 0.0, 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='L1Loss', loss_weight=1.0))))

    GIoULossを追加した後の設定ファイルは次のとおりです。

    rpn_head=dict(
        type='RPNHead',
        in_channels=256,
        feat_channels=256,
        anchor_generator=dict(
            type='AnchorGenerator',
            scales=[8],
            ratios=[0.5, 1.0, 2.0],
            strides=[4, 8, 16, 32, 64]),
        bbox_coder=dict(
            type='DeltaXYWHBBoxCoder',
            target_means=[0.0, 0.0, 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),
	reg_decoded_bbox=True,      # 使用GIoUI时注意添加
        loss_bbox=dict(type='GIoULoss', loss_weight=5.0)),
    roi_head=dict(
        type='StandardRoIHead',
        bbox_roi_extractor=dict(
            type='SingleRoIExtractor',
            roi_layer=dict(type='RoIAlign', out_size=7, sample_num=0),
            out_channels=256,
            featmap_strides=[4, 8, 16, 32]),
        bbox_head=dict(
            type='Shared2FCBBoxHead',
	    
            in_channels=256,
            fc_out_channels=1024,
            roi_feat_size=7,
            num_classes=10,
            bbox_coder=dict(
                type='DeltaXYWHBBoxCoder',
                target_means=[0.0, 0.0, 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),
            reg_decoded_bbox=True,     # 使用GIoUI时注意添加
            loss_bbox=dict(type='GIoULoss', loss_weight=5.0))))

4.痩身のヒントをモデル化する

      mmdetectionがモデルを保存するとき、重量を保存するだけでなく、元のデータと最適化されたパラメーターも保存します。ただし、モデルをテストすると、一部のパラメーターが役に立たなくなります。これらの役に立たないパラメーターを削除してモデルを削減するにはどうすればよいですか(約50%)。以下のコードを参照してください。

import torch

model_path = "epoch_30.pth"
checkpoint = torch.load(model_path)
checkpoint['meta'] = None
checkpoint['optimizer'] = None

weights = checkpoint['state_dict']

state_dict = {"state_dict":weights}

torch.save(state_dict,  './epotch_30_new.pth')

5.オンラインハードケースマイニング(OHEM)

   オンラインハードケースマイニング:トレーニング中のトレーニングのための難しいサンプルのオンライン選択(損失が大きいサンプルを選択)。

   考え方は比較的単純で、mmdetectionでのアプリケーションは次のとおりです。

   例として、より高速なrcnnを取り上げます。

_base_ = './faster_rcnn_r50_fpn_1x_coco.py'
train_cfg = dict(rcnn=dict(sampler=dict(type='OHEMSampler')))

   最初の行はトレーニングモデルの構成ファイルであり、2番目の行はサンプリング方法をオンラインハードケースマイニングに設定します。       

すべて:

(1)GIoULossが完成しました

(2)オンラインハードケースマイニングが完了しました

(3)混合精密トレーニング

(4)変形可能な畳み込み

(5)マルチスケールトレーニング

(6)マルチスケールテストとデータ拡張テスト

(7)Albuデータ拡張ライブラリの使用

(8)モデル融合

(9)分割テスト

(10)モザイクデータの強化

(11)。PAFPN

(12)ロングテール分布の問題を抑制するためのサンプルバランス

おすすめ

転載: blog.csdn.net/Guo_Python/article/details/108148385