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)ロングテール分布の問題を抑制するためのサンプルバランス