Skip to content

Commit

Permalink
Refactor oriented rcnn (open-mmlab#515)
Browse files Browse the repository at this point in the history
* update

* Update test_two_stage.py

* Update s2anet_r50_fpn_fp16_1x_dota_le135.py

* add UT

* Update test_delta_midpointoffset_rbbox_coder.py

* update

* Update oriented_rcnn_r50_fpn_fp16_1x_dota_le90.py
  • Loading branch information
zytx121 authored and triple-Mu committed Jan 31, 2023
1 parent 6da677e commit 7f2cf9f
Show file tree
Hide file tree
Showing 11 changed files with 339 additions and 423 deletions.
83 changes: 39 additions & 44 deletions configs/oriented_rcnn/oriented_rcnn_r50_fpn_1x_dota_le90.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
_base_ = [
'../_base_/datasets/dotav1.py', '../_base_/schedules/schedule_1x.py',
'../_base_/datasets/dota.py', '../_base_/schedules/schedule_1x.py',
'../_base_/default_runtime.py'
]

angle_version = 'le90'
model = dict(
type='OrientedRCNN',
type='mmdet.FasterRCNN',
data_preprocessor=dict(
type='mmdet.DetDataPreprocessor',
mean=[123.675, 116.28, 103.53],
std=[58.395, 57.12, 57.375],
bgr_to_rgb=True,
pad_size_divisor=32,
boxtype2tensor=False),
backbone=dict(
type='ResNet',
type='mmdet.ResNet',
depth=50,
num_stages=4,
out_indices=(0, 1, 2, 3),
Expand All @@ -17,31 +24,33 @@
style='pytorch',
init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')),
neck=dict(
type='FPN',
type='mmdet.FPN',
in_channels=[256, 512, 1024, 2048],
out_channels=256,
num_outs=5),
rpn_head=dict(
type='OrientedRPNHead',
in_channels=256,
feat_channels=256,
version=angle_version,
anchor_generator=dict(
type='AnchorGenerator',
type='mmdet.AnchorGenerator',
scales=[8],
ratios=[0.5, 1.0, 2.0],
strides=[4, 8, 16, 32, 64]),
strides=[4, 8, 16, 32, 64],
use_box_type=True),
bbox_coder=dict(
type='MidpointOffsetCoder',
angle_range=angle_version,
angle_version=angle_version,
target_means=[0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
target_stds=[1.0, 1.0, 1.0, 1.0, 0.5, 0.5]),
loss_cls=dict(
type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0),
type='mmdet.CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0),
loss_bbox=dict(
type='SmoothL1Loss', beta=0.1111111111111111, loss_weight=1.0)),
type='mmdet.SmoothL1Loss',
beta=0.1111111111111111,
loss_weight=1.0)),
roi_head=dict(
type='OrientedStandardRoIHead',
type='mmdet.StandardRoIHead',
bbox_roi_extractor=dict(
type='RotatedSingleRoIExtractor',
roi_layer=dict(
Expand All @@ -52,34 +61,41 @@
out_channels=256,
featmap_strides=[4, 8, 16, 32]),
bbox_head=dict(
type='RotatedShared2FCBBoxHead',
type='mmdet.Shared2FCBBoxHead',
predict_box_type='rbox',
in_channels=256,
fc_out_channels=1024,
roi_feat_size=7,
num_classes=15,
reg_predictor_cfg=dict(type='mmdet.Linear'),
cls_predictor_cfg=dict(type='mmdet.Linear'),
bbox_coder=dict(
type='DeltaXYWHAOBBoxCoder',
angle_range=angle_version,
type='DeltaXYWHTRBBoxCoder',
angle_version=angle_version,
norm_factor=None,
edge_swap=True,
proj_xy=True,
target_means=(.0, .0, .0, .0, .0),
target_stds=(0.1, 0.1, 0.2, 0.2, 0.1)),
reg_class_agnostic=True,
loss_cls=dict(
type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0),
loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))),
type='mmdet.CrossEntropyLoss',
use_sigmoid=False,
loss_weight=1.0),
loss_bbox=dict(
type='mmdet.SmoothL1Loss', beta=1.0, loss_weight=1.0))),
train_cfg=dict(
rpn=dict(
assigner=dict(
type='MaxIoUAssigner',
type='mmdet.MaxIoUAssigner',
pos_iou_thr=0.7,
neg_iou_thr=0.3,
min_pos_iou=0.3,
match_low_quality=True,
ignore_iof_thr=-1),
ignore_iof_thr=-1,
iou_calculator=dict(type='RBbox2HBboxOverlaps2D')),
sampler=dict(
type='RandomSampler',
type='mmdet.RandomSampler',
num=256,
pos_fraction=0.5,
neg_pos_ub=-1,
Expand All @@ -94,15 +110,15 @@
min_bbox_size=0),
rcnn=dict(
assigner=dict(
type='MaxIoUAssigner',
type='mmdet.MaxIoUAssigner',
pos_iou_thr=0.5,
neg_iou_thr=0.5,
min_pos_iou=0.5,
match_low_quality=False,
iou_calculator=dict(type='RBboxOverlaps2D'),
ignore_iof_thr=-1),
sampler=dict(
type='RRandomSampler',
type='mmdet.RandomSampler',
num=512,
pos_fraction=0.25,
neg_pos_ub=-1,
Expand All @@ -119,28 +135,7 @@
nms_pre=2000,
min_bbox_size=0,
score_thr=0.05,
nms=dict(iou_thr=0.1),
nms=dict(type='nms_rotated', iou_threshold=0.1),
max_per_img=2000)))

img_norm_cfg = dict(
mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
train_pipeline = [
dict(type='LoadImageFromFile'),
dict(type='LoadAnnotations', with_bbox=True),
dict(type='RResize', img_scale=(1024, 1024)),
dict(
type='RRandomFlip',
flip_ratio=[0.25, 0.25, 0.25],
direction=['horizontal', 'vertical', 'diagonal'],
version=angle_version),
dict(type='Normalize', **img_norm_cfg),
dict(type='Pad', size_divisor=32),
dict(type='DefaultFormatBundle'),
dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels'])
]
data = dict(
train=dict(pipeline=train_pipeline, version=angle_version),
val=dict(version=angle_version),
test=dict(version=angle_version))

optimizer = dict(lr=0.005)
optim_wrapper = dict(optimizer=dict(lr=0.005))
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
_base_ = ['./oriented_rcnn_r50_fpn_1x_dota_le90.py']
_base_ = './oriented_rcnn_r50_fpn_1x_dota_le90.py'

fp16 = dict(loss_scale='dynamic')
optim_wrapper = dict(type='AmpOptimWrapper')
55 changes: 39 additions & 16 deletions configs/oriented_rcnn/oriented_rcnn_swin_tiny_fpn_1x_dota_le90.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
_base_ = ['./oriented_rcnn_r50_fpn_1x_dota_le90.py']

_base_ = './oriented_rcnn_r50_fpn_1x_dota_le90.py'
pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth' # noqa

depths = [2, 2, 6, 2]
model = dict(
backbone=dict(
_delete_=True,
type='SwinTransformer',
embed_dims=96,
depths=[2, 2, 6, 2],
depths=depths,
num_heads=[3, 6, 12, 24],
window_size=7,
mlp_ratio=4,
Expand All @@ -23,20 +23,43 @@
init_cfg=dict(type='Pretrained', checkpoint=pretrained)),
neck=dict(
_delete_=True,
type='FPN',
type='mmdet.FPN',
in_channels=[96, 192, 384, 768],
out_channels=256,
num_outs=5))

optimizer = dict(
_delete_=True,
type='AdamW',
lr=0.0001,
betas=(0.9, 0.999),
weight_decay=0.05,
paramwise_cfg=dict(
custom_keys={
'absolute_pos_embed': dict(decay_mult=0.),
'relative_position_bias_table': dict(decay_mult=0.),
'norm': dict(decay_mult=0.)
}))
# set all layers in backbone to lr_mult=0.1
# set all norm layers, position_embeding,
# query_embeding, level_embeding to decay_multi=0.0
backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0)
backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0)
embed_multi = dict(lr_mult=1.0, decay_mult=0.0)
custom_keys = {
'backbone': dict(lr_mult=0.1, decay_mult=1.0),
'backbone.patch_embed.norm': backbone_norm_multi,
'backbone.norm': backbone_norm_multi,
'absolute_pos_embed': backbone_embed_multi,
'relative_position_bias_table': backbone_embed_multi,
'query_embed': embed_multi,
'query_feat': embed_multi,
'level_embed': embed_multi
}
custom_keys.update({
f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi
for stage_id, num_blocks in enumerate(depths)
for block_id in range(num_blocks)
})
custom_keys.update({
f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi
for stage_id in range(len(depths) - 1)
})

# optimizer
optim_wrapper = dict(
optimizer=dict(
_delete_=True,
type='AdamW',
lr=0.0001,
betas=(0.9, 0.999),
weight_decay=0.05),
paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0))
Loading

0 comments on commit 7f2cf9f

Please sign in to comment.