From 57d34592ec9cbeb5416a5528c40f202b34487c4f Mon Sep 17 00:00:00 2001 From: Jiangmiao Pang <pangjiangmiao@gmail.com> Date: Tue, 21 May 2019 22:48:19 +0800 Subject: [PATCH] Add loss evaluator (#678) * Fix license in setup.py * Add code for loss evaluator * Configs support loss evaluator * Fix a little bug * Fix flake8 * return revised bbox to reg * return revised bbox to reg * revision according to comments * fix flake8 --- configs/cascade_mask_rcnn_r101_fpn_1x.py | 39 +++++++-- configs/cascade_mask_rcnn_r50_caffe_c4_1x.py | 39 +++++++-- configs/cascade_mask_rcnn_r50_fpn_1x.py | 39 +++++++-- .../cascade_mask_rcnn_x101_32x4d_fpn_1x.py | 41 +++++++-- .../cascade_mask_rcnn_x101_64x4d_fpn_1x.py | 41 +++++++-- configs/cascade_rcnn_r101_fpn_1x.py | 35 ++++++-- configs/cascade_rcnn_r50_caffe_c4_1x.py | 35 ++++++-- configs/cascade_rcnn_r50_fpn_1x.py | 35 ++++++-- configs/cascade_rcnn_x101_32x4d_fpn_1x.py | 37 ++++++-- configs/cascade_rcnn_x101_64x4d_fpn_1x.py | 37 ++++++-- ...ascade_mask_rcnn_dconv_c3-c5_r50_fpn_1x.py | 24 ++++-- .../cascade_rcnn_dconv_c3-c5_r50_fpn_1x.py | 39 +++++++-- .../dcn/faster_rcnn_dconv_c3-c5_r50_fpn_1x.py | 10 ++- ...ster_rcnn_dconv_c3-c5_x101_32x4d_fpn_1x.py | 10 ++- configs/dcn/faster_rcnn_dpool_r50_fpn_1x.py | 10 ++- .../faster_rcnn_mdconv_c3-c5_r50_fpn_1x.py | 10 ++- configs/dcn/faster_rcnn_mdpool_r50_fpn_1x.py | 10 ++- .../dcn/mask_rcnn_dconv_c3-c5_r50_fpn_1x.py | 18 ++-- configs/fast_mask_rcnn_r101_fpn_1x.py | 9 +- configs/fast_mask_rcnn_r50_fpn_1x.py | 9 +- configs/fast_rcnn_r101_fpn_1x.py | 8 +- configs/fast_rcnn_r50_caffe_c4_1x.py | 8 +- configs/fast_rcnn_r50_fpn_1x.py | 8 +- configs/faster_rcnn_ohem_r50_fpn_1x.py | 10 ++- configs/faster_rcnn_r101_fpn_1x.py | 10 ++- configs/faster_rcnn_r50_caffe_c4_1x.py | 10 ++- configs/faster_rcnn_r50_fpn_1x.py | 10 ++- configs/faster_rcnn_x101_32x4d_fpn_1x.py | 12 ++- configs/faster_rcnn_x101_64x4d_fpn_1x.py | 12 ++- configs/gn+ws/faster_rcnn_r50_fpn_gn_ws_1x.py | 10 ++- .../mask_rcnn_r50_fpn_gn_ws_20_23_24e.py | 14 ++- configs/gn+ws/mask_rcnn_r50_fpn_gn_ws_2x.py | 14 ++- .../mask_rcnn_x101_32x4d_fpn_gn_ws_2x.py | 14 ++- configs/gn/mask_rcnn_r101_fpn_gn_2x.py | 15 ++-- configs/gn/mask_rcnn_r50_fpn_gn_2x.py | 15 ++-- configs/gn/mask_rcnn_r50_fpn_gn_contrib_2x.py | 15 ++-- configs/htc/README.md | 4 +- ...-c5_mstrain_400_1400_x101_64x4d_fpn_20e.py | 39 +++++++-- configs/htc/htc_r101_fpn_20e.py | 39 +++++++-- configs/htc/htc_r50_fpn_1x.py | 39 +++++++-- configs/htc/htc_r50_fpn_20e.py | 39 +++++++-- .../htc/htc_without_semantic_r50_fpn_1x.py | 39 +++++++-- configs/htc/htc_x101_32x4d_fpn_20e_16gpu.py | 39 +++++++-- configs/htc/htc_x101_64x4d_fpn_20e_16gpu.py | 39 +++++++-- configs/mask_rcnn_r101_fpn_1x.py | 14 ++- configs/mask_rcnn_r50_caffe_c4_1x.py | 16 ++-- configs/mask_rcnn_r50_fpn_1x.py | 14 ++- configs/mask_rcnn_x101_32x4d_fpn_1x.py | 16 ++-- configs/mask_rcnn_x101_64x4d_fpn_1x.py | 16 ++-- .../faster_rcnn_r50_fpn_1x_voc0712.py | 10 ++- configs/retinanet_r101_fpn_1x.py | 12 ++- configs/retinanet_r50_fpn_1x.py | 12 ++- configs/retinanet_x101_32x4d_fpn_1x.py | 14 +-- configs/retinanet_x101_64x4d_fpn_1x.py | 14 +-- configs/rpn_r101_fpn_1x.py | 5 +- configs/rpn_r50_caffe_c4_1x.py | 5 +- configs/rpn_r50_fpn_1x.py | 5 +- configs/rpn_x101_32x4d_fpn_1x.py | 7 +- configs/rpn_x101_64x4d_fpn_1x.py | 7 +- .../scratch_faster_rcnn_r50_fpn_gn_6x.py | 10 ++- .../scratch_mask_rcnn_r50_fpn_gn_6x.py | 15 +++- mmdet/models/__init__.py | 10 ++- mmdet/models/anchor_heads/anchor_head.py | 85 ++++++++----------- mmdet/models/anchor_heads/retina_head.py | 7 +- mmdet/models/anchor_heads/rpn_head.py | 2 +- mmdet/models/anchor_heads/ssd_head.py | 21 ++--- mmdet/models/bbox_heads/bbox_head.py | 24 ++++-- mmdet/models/bbox_heads/convfc_bbox_head.py | 8 +- mmdet/models/builder.py | 6 +- mmdet/models/losses/__init__.py | 5 ++ mmdet/models/losses/cross_entropy_loss.py | 28 ++++++ mmdet/models/losses/focal_loss.py | 35 ++++++++ mmdet/models/losses/smooth_l1_loss.py | 18 ++++ mmdet/models/mask_heads/fcn_mask_head.py | 14 +-- mmdet/models/registry.py | 1 + setup.py | 2 +- 76 files changed, 1102 insertions(+), 345 deletions(-) create mode 100644 mmdet/models/losses/__init__.py create mode 100644 mmdet/models/losses/cross_entropy_loss.py create mode 100644 mmdet/models/losses/focal_loss.py create mode 100644 mmdet/models/losses/smooth_l1_loss.py diff --git a/configs/cascade_mask_rcnn_r101_fpn_1x.py b/configs/cascade_mask_rcnn_r101_fpn_1x.py index 9915c2e..574b5aa 100644 --- a/configs/cascade_mask_rcnn_r101_fpn_1x.py +++ b/configs/cascade_mask_rcnn_r101_fpn_1x.py @@ -24,7 +24,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -40,7 +42,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -50,7 +60,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -60,7 +78,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ], mask_roi_extractor=dict( type='SingleRoIExtractor', @@ -72,7 +98,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -90,7 +118,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/cascade_mask_rcnn_r50_caffe_c4_1x.py b/configs/cascade_mask_rcnn_r50_caffe_c4_1x.py index 985945a..cdf5ff0 100644 --- a/configs/cascade_mask_rcnn_r50_caffe_c4_1x.py +++ b/configs/cascade_mask_rcnn_r50_caffe_c4_1x.py @@ -33,7 +33,9 @@ model = dict( anchor_strides=[16], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -48,7 +50,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='BBoxHead', with_avg_pool=True, @@ -57,7 +67,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='BBoxHead', with_avg_pool=True, @@ -66,7 +84,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ], mask_roi_extractor=None, mask_head=dict( @@ -74,7 +100,9 @@ model = dict( num_convs=0, in_channels=2048, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -92,7 +120,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/cascade_mask_rcnn_r50_fpn_1x.py b/configs/cascade_mask_rcnn_r50_fpn_1x.py index 7d89be3..64923c3 100644 --- a/configs/cascade_mask_rcnn_r50_fpn_1x.py +++ b/configs/cascade_mask_rcnn_r50_fpn_1x.py @@ -24,7 +24,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -40,7 +42,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -50,7 +60,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -60,7 +78,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ], mask_roi_extractor=dict( type='SingleRoIExtractor', @@ -72,7 +98,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -90,7 +118,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/cascade_mask_rcnn_x101_32x4d_fpn_1x.py b/configs/cascade_mask_rcnn_x101_32x4d_fpn_1x.py index 7377432..e8a31d0 100644 --- a/configs/cascade_mask_rcnn_x101_32x4d_fpn_1x.py +++ b/configs/cascade_mask_rcnn_x101_32x4d_fpn_1x.py @@ -26,7 +26,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -42,7 +44,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -52,7 +62,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -62,7 +80,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ], mask_roi_extractor=dict( type='SingleRoIExtractor', @@ -74,7 +100,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -92,7 +120,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, @@ -230,7 +257,7 @@ log_config = dict( total_epochs = 12 dist_params = dict(backend='nccl') log_level = 'INFO' -work_dir = './work_dirs/cascade_mask_rcnn_r50_fpn_1x' +work_dir = './work_dirs/cascade_mask_rcnn_x101_32x4d_fpn_1x' load_from = None resume_from = None workflow = [('train', 1)] diff --git a/configs/cascade_mask_rcnn_x101_64x4d_fpn_1x.py b/configs/cascade_mask_rcnn_x101_64x4d_fpn_1x.py index d71351e..1661a10 100644 --- a/configs/cascade_mask_rcnn_x101_64x4d_fpn_1x.py +++ b/configs/cascade_mask_rcnn_x101_64x4d_fpn_1x.py @@ -26,7 +26,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -42,7 +44,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -52,7 +62,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -62,7 +80,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ], mask_roi_extractor=dict( type='SingleRoIExtractor', @@ -74,7 +100,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -92,7 +120,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, @@ -230,7 +257,7 @@ log_config = dict( total_epochs = 12 dist_params = dict(backend='nccl') log_level = 'INFO' -work_dir = './work_dirs/cascade_mask_rcnn_r50_fpn_1x' +work_dir = './work_dirs/cascade_mask_rcnn_x101_64x4d_fpn_1x' load_from = None resume_from = None workflow = [('train', 1)] diff --git a/configs/cascade_rcnn_r101_fpn_1x.py b/configs/cascade_rcnn_r101_fpn_1x.py index 0c11598..35a7aa8 100644 --- a/configs/cascade_rcnn_r101_fpn_1x.py +++ b/configs/cascade_rcnn_r101_fpn_1x.py @@ -24,7 +24,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -40,7 +42,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -50,7 +60,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -60,7 +78,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ]) # model training and testing settings train_cfg = dict( @@ -79,7 +105,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/cascade_rcnn_r50_caffe_c4_1x.py b/configs/cascade_rcnn_r50_caffe_c4_1x.py index 8224f2f..978724b 100644 --- a/configs/cascade_rcnn_r50_caffe_c4_1x.py +++ b/configs/cascade_rcnn_r50_caffe_c4_1x.py @@ -33,7 +33,9 @@ model = dict( anchor_strides=[16], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -48,7 +50,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='BBoxHead', with_avg_pool=True, @@ -57,7 +67,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='BBoxHead', with_avg_pool=True, @@ -66,7 +84,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)), ]) # model training and testing settings train_cfg = dict( @@ -85,7 +111,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/cascade_rcnn_r50_fpn_1x.py b/configs/cascade_rcnn_r50_fpn_1x.py index de0ca00..bc33238 100644 --- a/configs/cascade_rcnn_r50_fpn_1x.py +++ b/configs/cascade_rcnn_r50_fpn_1x.py @@ -24,7 +24,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -40,7 +42,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -50,7 +60,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -60,7 +78,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ]) # model training and testing settings train_cfg = dict( @@ -79,7 +105,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/cascade_rcnn_x101_32x4d_fpn_1x.py b/configs/cascade_rcnn_x101_32x4d_fpn_1x.py index ba7c890..7ce7aab 100644 --- a/configs/cascade_rcnn_x101_32x4d_fpn_1x.py +++ b/configs/cascade_rcnn_x101_32x4d_fpn_1x.py @@ -26,7 +26,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -42,7 +44,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -52,7 +62,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -62,7 +80,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ]) # model training and testing settings train_cfg = dict( @@ -81,7 +107,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, @@ -213,7 +238,7 @@ log_config = dict( total_epochs = 12 dist_params = dict(backend='nccl') log_level = 'INFO' -work_dir = './work_dirs/cascade_rcnn_r50_fpn_1x' +work_dir = './work_dirs/cascade_rcnn_x101_32x4d_fpn_1x' load_from = None resume_from = None workflow = [('train', 1)] diff --git a/configs/cascade_rcnn_x101_64x4d_fpn_1x.py b/configs/cascade_rcnn_x101_64x4d_fpn_1x.py index 4203956..401dfac 100644 --- a/configs/cascade_rcnn_x101_64x4d_fpn_1x.py +++ b/configs/cascade_rcnn_x101_64x4d_fpn_1x.py @@ -26,7 +26,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -42,7 +44,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -52,7 +62,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -62,7 +80,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ]) # model training and testing settings train_cfg = dict( @@ -81,7 +107,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, @@ -213,7 +238,7 @@ log_config = dict( total_epochs = 12 dist_params = dict(backend='nccl') log_level = 'INFO' -work_dir = './work_dirs/cascade_rcnn_r50_fpn_1x' +work_dir = './work_dirs/cascade_rcnn_x101_64x4d_fpn_1x' load_from = None resume_from = None workflow = [('train', 1)] diff --git a/configs/dcn/cascade_mask_rcnn_dconv_c3-c5_r50_fpn_1x.py b/configs/dcn/cascade_mask_rcnn_dconv_c3-c5_r50_fpn_1x.py index 711231e..c564809 100644 --- a/configs/dcn/cascade_mask_rcnn_dconv_c3-c5_r50_fpn_1x.py +++ b/configs/dcn/cascade_mask_rcnn_dconv_c3-c5_r50_fpn_1x.py @@ -27,7 +27,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -43,7 +45,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -53,7 +58,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -63,7 +71,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ], mask_roi_extractor=dict( type='SingleRoIExtractor', @@ -75,7 +86,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -93,7 +106,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/dcn/cascade_rcnn_dconv_c3-c5_r50_fpn_1x.py b/configs/dcn/cascade_rcnn_dconv_c3-c5_r50_fpn_1x.py index cc00d91..204370d 100644 --- a/configs/dcn/cascade_rcnn_dconv_c3-c5_r50_fpn_1x.py +++ b/configs/dcn/cascade_rcnn_dconv_c3-c5_r50_fpn_1x.py @@ -11,7 +11,9 @@ model = dict( frozen_stages=1, style='pytorch', dcn=dict( - modulated=False, deformable_groups=1, fallback_on_stride=False), + modulated=False, + deformable_groups=1, + fallback_on_stride=False), stage_with_dcn=(False, True, True, True)), neck=dict( type='FPN', @@ -27,7 +29,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -43,7 +47,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -53,7 +65,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -63,7 +83,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ]) # model training and testing settings train_cfg = dict( @@ -82,7 +110,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/dcn/faster_rcnn_dconv_c3-c5_r50_fpn_1x.py b/configs/dcn/faster_rcnn_dconv_c3-c5_r50_fpn_1x.py index 5e47eae..80c3a58 100644 --- a/configs/dcn/faster_rcnn_dconv_c3-c5_r50_fpn_1x.py +++ b/configs/dcn/faster_rcnn_dconv_c3-c5_r50_fpn_1x.py @@ -26,7 +26,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -41,7 +43,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -59,7 +64,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/dcn/faster_rcnn_dconv_c3-c5_x101_32x4d_fpn_1x.py b/configs/dcn/faster_rcnn_dconv_c3-c5_x101_32x4d_fpn_1x.py index aab40b9..31aa198 100644 --- a/configs/dcn/faster_rcnn_dconv_c3-c5_x101_32x4d_fpn_1x.py +++ b/configs/dcn/faster_rcnn_dconv_c3-c5_x101_32x4d_fpn_1x.py @@ -31,7 +31,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -46,7 +48,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -64,7 +69,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/dcn/faster_rcnn_dpool_r50_fpn_1x.py b/configs/dcn/faster_rcnn_dpool_r50_fpn_1x.py index 9d94e57..eeede41 100644 --- a/configs/dcn/faster_rcnn_dpool_r50_fpn_1x.py +++ b/configs/dcn/faster_rcnn_dpool_r50_fpn_1x.py @@ -23,7 +23,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict( @@ -44,7 +46,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -62,7 +67,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/dcn/faster_rcnn_mdconv_c3-c5_r50_fpn_1x.py b/configs/dcn/faster_rcnn_mdconv_c3-c5_r50_fpn_1x.py index 73dc579..a6d53b1 100644 --- a/configs/dcn/faster_rcnn_mdconv_c3-c5_r50_fpn_1x.py +++ b/configs/dcn/faster_rcnn_mdconv_c3-c5_r50_fpn_1x.py @@ -26,7 +26,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -41,7 +43,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -59,7 +64,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/dcn/faster_rcnn_mdpool_r50_fpn_1x.py b/configs/dcn/faster_rcnn_mdpool_r50_fpn_1x.py index b55a34c..d033cdf 100644 --- a/configs/dcn/faster_rcnn_mdpool_r50_fpn_1x.py +++ b/configs/dcn/faster_rcnn_mdpool_r50_fpn_1x.py @@ -23,7 +23,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict( @@ -44,7 +46,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -62,7 +67,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/dcn/mask_rcnn_dconv_c3-c5_r50_fpn_1x.py b/configs/dcn/mask_rcnn_dconv_c3-c5_r50_fpn_1x.py index 8135f09..33ca7ff 100644 --- a/configs/dcn/mask_rcnn_dconv_c3-c5_r50_fpn_1x.py +++ b/configs/dcn/mask_rcnn_dconv_c3-c5_r50_fpn_1x.py @@ -10,7 +10,9 @@ model = dict( frozen_stages=1, style='pytorch', dcn=dict( - modulated=False, deformable_groups=1, fallback_on_stride=False), + modulated=False, + deformable_groups=1, + fallback_on_stride=False), stage_with_dcn=(False, True, True, True)), neck=dict( type='FPN', @@ -26,7 +28,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -41,7 +45,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False), + 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_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -52,7 +59,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -70,7 +79,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/fast_mask_rcnn_r101_fpn_1x.py b/configs/fast_mask_rcnn_r101_fpn_1x.py index fa64d6f..d80e326 100644 --- a/configs/fast_mask_rcnn_r101_fpn_1x.py +++ b/configs/fast_mask_rcnn_r101_fpn_1x.py @@ -28,7 +28,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False), + 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_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -39,7 +42,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rcnn=dict( diff --git a/configs/fast_mask_rcnn_r50_fpn_1x.py b/configs/fast_mask_rcnn_r50_fpn_1x.py index 2005100..88d3eb0 100644 --- a/configs/fast_mask_rcnn_r50_fpn_1x.py +++ b/configs/fast_mask_rcnn_r50_fpn_1x.py @@ -28,7 +28,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False), + 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_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -39,7 +42,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rcnn=dict( diff --git a/configs/fast_rcnn_r101_fpn_1x.py b/configs/fast_rcnn_r101_fpn_1x.py index c61b74f..d39eee5 100644 --- a/configs/fast_rcnn_r101_fpn_1x.py +++ b/configs/fast_rcnn_r101_fpn_1x.py @@ -28,7 +28,13 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rcnn=dict( diff --git a/configs/fast_rcnn_r50_caffe_c4_1x.py b/configs/fast_rcnn_r50_caffe_c4_1x.py index 20481f3..5d78baf 100644 --- a/configs/fast_rcnn_r50_caffe_c4_1x.py +++ b/configs/fast_rcnn_r50_caffe_c4_1x.py @@ -36,7 +36,13 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rcnn=dict( diff --git a/configs/fast_rcnn_r50_fpn_1x.py b/configs/fast_rcnn_r50_fpn_1x.py index 542e2dd..8764192 100644 --- a/configs/fast_rcnn_r50_fpn_1x.py +++ b/configs/fast_rcnn_r50_fpn_1x.py @@ -28,7 +28,13 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rcnn=dict( diff --git a/configs/faster_rcnn_ohem_r50_fpn_1x.py b/configs/faster_rcnn_ohem_r50_fpn_1x.py index 9311c5f..a8ea239 100644 --- a/configs/faster_rcnn_ohem_r50_fpn_1x.py +++ b/configs/faster_rcnn_ohem_r50_fpn_1x.py @@ -23,7 +23,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -38,7 +40,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -56,7 +61,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/faster_rcnn_r101_fpn_1x.py b/configs/faster_rcnn_r101_fpn_1x.py index 90a3aad..379382a 100644 --- a/configs/faster_rcnn_r101_fpn_1x.py +++ b/configs/faster_rcnn_r101_fpn_1x.py @@ -23,7 +23,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -38,7 +40,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -56,7 +61,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/faster_rcnn_r50_caffe_c4_1x.py b/configs/faster_rcnn_r50_caffe_c4_1x.py index 24b1f0d..ebbcc4e 100644 --- a/configs/faster_rcnn_r50_caffe_c4_1x.py +++ b/configs/faster_rcnn_r50_caffe_c4_1x.py @@ -32,7 +32,9 @@ model = dict( anchor_strides=[16], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -46,7 +48,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -64,7 +69,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/faster_rcnn_r50_fpn_1x.py b/configs/faster_rcnn_r50_fpn_1x.py index bcfcd15..f4ee369 100644 --- a/configs/faster_rcnn_r50_fpn_1x.py +++ b/configs/faster_rcnn_r50_fpn_1x.py @@ -23,7 +23,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -38,7 +40,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -56,7 +61,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/faster_rcnn_x101_32x4d_fpn_1x.py b/configs/faster_rcnn_x101_32x4d_fpn_1x.py index cdeee64..50b479d 100644 --- a/configs/faster_rcnn_x101_32x4d_fpn_1x.py +++ b/configs/faster_rcnn_x101_32x4d_fpn_1x.py @@ -25,7 +25,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -40,7 +42,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -58,7 +63,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, @@ -159,7 +163,7 @@ log_config = dict( total_epochs = 12 dist_params = dict(backend='nccl') log_level = 'INFO' -work_dir = './work_dirs/faster_rcnn_r50_fpn_1x' +work_dir = './work_dirs/faster_rcnn_x101_32x4d_fpn_1x' load_from = None resume_from = None workflow = [('train', 1)] diff --git a/configs/faster_rcnn_x101_64x4d_fpn_1x.py b/configs/faster_rcnn_x101_64x4d_fpn_1x.py index 647d07c..4397d2d 100644 --- a/configs/faster_rcnn_x101_64x4d_fpn_1x.py +++ b/configs/faster_rcnn_x101_64x4d_fpn_1x.py @@ -25,7 +25,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -40,7 +42,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -58,7 +63,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, @@ -159,7 +163,7 @@ log_config = dict( total_epochs = 12 dist_params = dict(backend='nccl') log_level = 'INFO' -work_dir = './work_dirs/faster_rcnn_r50_fpn_1x' +work_dir = './work_dirs/faster_rcnn_x101_64x4d_fpn_1x' load_from = None resume_from = None workflow = [('train', 1)] diff --git a/configs/gn+ws/faster_rcnn_r50_fpn_gn_ws_1x.py b/configs/gn+ws/faster_rcnn_r50_fpn_gn_ws_1x.py index 396993f..0eef1e9 100644 --- a/configs/gn+ws/faster_rcnn_r50_fpn_gn_ws_1x.py +++ b/configs/gn+ws/faster_rcnn_r50_fpn_gn_ws_1x.py @@ -29,7 +29,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -48,7 +50,10 @@ model = dict( target_stds=[0.1, 0.1, 0.2, 0.2], reg_class_agnostic=False, conv_cfg=conv_cfg, - norm_cfg=norm_cfg)) + norm_cfg=norm_cfg, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -66,7 +71,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws_20_23_24e.py b/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws_20_23_24e.py index 5a79bfd..da39db1 100644 --- a/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws_20_23_24e.py +++ b/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws_20_23_24e.py @@ -29,7 +29,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -48,7 +50,10 @@ model = dict( target_stds=[0.1, 0.1, 0.2, 0.2], reg_class_agnostic=False, conv_cfg=conv_cfg, - norm_cfg=norm_cfg), + norm_cfg=norm_cfg, + 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_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -61,7 +66,9 @@ model = dict( conv_out_channels=256, num_classes=81, conv_cfg=conv_cfg, - norm_cfg=norm_cfg)) + norm_cfg=norm_cfg, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -79,7 +86,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws_2x.py b/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws_2x.py index 7294aee..c023ec3 100644 --- a/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws_2x.py +++ b/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws_2x.py @@ -29,7 +29,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -48,7 +50,10 @@ model = dict( target_stds=[0.1, 0.1, 0.2, 0.2], reg_class_agnostic=False, conv_cfg=conv_cfg, - norm_cfg=norm_cfg), + norm_cfg=norm_cfg, + 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_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -61,7 +66,9 @@ model = dict( conv_out_channels=256, num_classes=81, conv_cfg=conv_cfg, - norm_cfg=norm_cfg)) + norm_cfg=norm_cfg, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -79,7 +86,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws_2x.py b/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws_2x.py index 4ed83b2..271ed6e 100644 --- a/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws_2x.py +++ b/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws_2x.py @@ -31,7 +31,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -50,7 +52,10 @@ model = dict( target_stds=[0.1, 0.1, 0.2, 0.2], reg_class_agnostic=False, conv_cfg=conv_cfg, - norm_cfg=norm_cfg), + norm_cfg=norm_cfg, + 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_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -63,7 +68,9 @@ model = dict( conv_out_channels=256, num_classes=81, conv_cfg=conv_cfg, - norm_cfg=norm_cfg)) + norm_cfg=norm_cfg, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -81,7 +88,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/gn/mask_rcnn_r101_fpn_gn_2x.py b/configs/gn/mask_rcnn_r101_fpn_gn_2x.py index 3f61dc4..ae09042 100644 --- a/configs/gn/mask_rcnn_r101_fpn_gn_2x.py +++ b/configs/gn/mask_rcnn_r101_fpn_gn_2x.py @@ -27,7 +27,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -45,7 +47,10 @@ model = dict( target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], reg_class_agnostic=False, - norm_cfg=norm_cfg), + norm_cfg=norm_cfg, + 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_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -57,8 +62,9 @@ model = dict( in_channels=256, conv_out_channels=256, num_classes=81, - norm_cfg=norm_cfg)) - + norm_cfg=norm_cfg, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -76,7 +82,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/gn/mask_rcnn_r50_fpn_gn_2x.py b/configs/gn/mask_rcnn_r50_fpn_gn_2x.py index 165c4aa..bbeaa78 100644 --- a/configs/gn/mask_rcnn_r50_fpn_gn_2x.py +++ b/configs/gn/mask_rcnn_r50_fpn_gn_2x.py @@ -27,7 +27,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -45,7 +47,10 @@ model = dict( target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], reg_class_agnostic=False, - norm_cfg=norm_cfg), + norm_cfg=norm_cfg, + 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_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -57,8 +62,9 @@ model = dict( in_channels=256, conv_out_channels=256, num_classes=81, - norm_cfg=norm_cfg)) - + norm_cfg=norm_cfg, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -76,7 +82,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/gn/mask_rcnn_r50_fpn_gn_contrib_2x.py b/configs/gn/mask_rcnn_r50_fpn_gn_contrib_2x.py index 00760fb..87db0f5 100644 --- a/configs/gn/mask_rcnn_r50_fpn_gn_contrib_2x.py +++ b/configs/gn/mask_rcnn_r50_fpn_gn_contrib_2x.py @@ -27,7 +27,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -45,7 +47,10 @@ model = dict( target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], reg_class_agnostic=False, - norm_cfg=norm_cfg), + norm_cfg=norm_cfg, + 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_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -57,8 +62,9 @@ model = dict( in_channels=256, conv_out_channels=256, num_classes=81, - norm_cfg=norm_cfg)) - + norm_cfg=norm_cfg, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -76,7 +82,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/htc/README.md b/configs/htc/README.md index 7a819ed..4d78c70 100644 --- a/configs/htc/README.md +++ b/configs/htc/README.md @@ -34,7 +34,7 @@ mmdetection ## Results and Models -The results on COCO 2017val is shown in the below table. (results on test-dev are usually slightly higher than val) +The results on COCO 2017val are shown in the below table. (results on test-dev are usually slightly higher than val) | Backbone | Style | Lr schd | Mem (GB) | Train time (s/iter) | Inf time (fps) | box AP | mask AP | Download | |:---------:|:-------:|:-------:|:--------:|:-------------------:|:--------------:|:------:|:-------:|:--------:| @@ -52,4 +52,4 @@ We also provide a powerful HTC with DCN and multi-scale training model. No testi | Backbone | Style | DCN | training scales | Lr schd | box AP | mask AP | Download | |:----------------:|:-------:|:-----:|:---------------:|:-------:|:------:|:-------:|:--------:| -| X-101-64x4d-FPN | pytorch | c3-c5 | 400~1400 | 20e | 50.7 | 43.9 | [model](https://s3.ap-northeast-2.amazonaws.com/open-mmlab/mmdetection/models/htc/htc_dconv_c3-c5_mstrain_400_1400_x101_64x4d_fpn_20e_20190408-0e50669c.pth) | \ No newline at end of file +| X-101-64x4d-FPN | pytorch | c3-c5 | 400~1400 | 20e | 50.7 | 43.9 | [model](https://s3.ap-northeast-2.amazonaws.com/open-mmlab/mmdetection/models/htc/htc_dconv_c3-c5_mstrain_400_1400_x101_64x4d_fpn_20e_20190408-0e50669c.pth) | diff --git a/configs/htc/htc_dconv_c3-c5_mstrain_400_1400_x101_64x4d_fpn_20e.py b/configs/htc/htc_dconv_c3-c5_mstrain_400_1400_x101_64x4d_fpn_20e.py index dbebfe3..4c95819 100644 --- a/configs/htc/htc_dconv_c3-c5_mstrain_400_1400_x101_64x4d_fpn_20e.py +++ b/configs/htc/htc_dconv_c3-c5_mstrain_400_1400_x101_64x4d_fpn_20e.py @@ -34,7 +34,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -50,7 +52,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -60,7 +70,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -70,7 +88,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ], mask_roi_extractor=dict( type='SingleRoIExtractor', @@ -82,7 +108,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81), + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)), semantic_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -115,7 +143,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/htc/htc_r101_fpn_20e.py b/configs/htc/htc_r101_fpn_20e.py index 8736c81..6be9537 100644 --- a/configs/htc/htc_r101_fpn_20e.py +++ b/configs/htc/htc_r101_fpn_20e.py @@ -26,7 +26,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -42,7 +44,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -52,7 +62,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -62,7 +80,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ], mask_roi_extractor=dict( type='SingleRoIExtractor', @@ -74,7 +100,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81), + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)), semantic_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -107,7 +135,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/htc/htc_r50_fpn_1x.py b/configs/htc/htc_r50_fpn_1x.py index 2291470..08f3a43 100644 --- a/configs/htc/htc_r50_fpn_1x.py +++ b/configs/htc/htc_r50_fpn_1x.py @@ -26,7 +26,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -42,7 +44,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -52,7 +62,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -62,7 +80,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ], mask_roi_extractor=dict( type='SingleRoIExtractor', @@ -74,7 +100,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81), + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)), semantic_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -107,7 +135,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/htc/htc_r50_fpn_20e.py b/configs/htc/htc_r50_fpn_20e.py index e37cae2..25a7ffe 100644 --- a/configs/htc/htc_r50_fpn_20e.py +++ b/configs/htc/htc_r50_fpn_20e.py @@ -26,7 +26,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -42,7 +44,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -52,7 +62,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -62,7 +80,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ], mask_roi_extractor=dict( type='SingleRoIExtractor', @@ -74,7 +100,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81), + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)), semantic_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -107,7 +135,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/htc/htc_without_semantic_r50_fpn_1x.py b/configs/htc/htc_without_semantic_r50_fpn_1x.py index 83d4537..83b531d 100644 --- a/configs/htc/htc_without_semantic_r50_fpn_1x.py +++ b/configs/htc/htc_without_semantic_r50_fpn_1x.py @@ -26,7 +26,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -42,7 +44,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -52,7 +62,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -62,7 +80,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ], mask_roi_extractor=dict( type='SingleRoIExtractor', @@ -74,7 +100,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -92,7 +120,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/htc/htc_x101_32x4d_fpn_20e_16gpu.py b/configs/htc/htc_x101_32x4d_fpn_20e_16gpu.py index 7a1f234..2846c57 100644 --- a/configs/htc/htc_x101_32x4d_fpn_20e_16gpu.py +++ b/configs/htc/htc_x101_32x4d_fpn_20e_16gpu.py @@ -28,7 +28,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -44,7 +46,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -54,7 +64,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -64,7 +82,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ], mask_roi_extractor=dict( type='SingleRoIExtractor', @@ -76,7 +102,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81), + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)), semantic_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -109,7 +137,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/htc/htc_x101_64x4d_fpn_20e_16gpu.py b/configs/htc/htc_x101_64x4d_fpn_20e_16gpu.py index 025b36d..095a81b 100644 --- a/configs/htc/htc_x101_64x4d_fpn_20e_16gpu.py +++ b/configs/htc/htc_x101_64x4d_fpn_20e_16gpu.py @@ -28,7 +28,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -44,7 +46,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -54,7 +64,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.05, 0.05, 0.1, 0.1], - reg_class_agnostic=True), + 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)), dict( type='SharedFCBBoxHead', num_fcs=2, @@ -64,7 +82,15 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.033, 0.033, 0.067, 0.067], - reg_class_agnostic=True) + 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)) ], mask_roi_extractor=dict( type='SingleRoIExtractor', @@ -76,7 +102,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81), + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)), semantic_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -109,7 +137,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/mask_rcnn_r101_fpn_1x.py b/configs/mask_rcnn_r101_fpn_1x.py index 1059120..a3cfd56 100644 --- a/configs/mask_rcnn_r101_fpn_1x.py +++ b/configs/mask_rcnn_r101_fpn_1x.py @@ -23,7 +23,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -38,7 +40,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False), + 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_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -49,7 +54,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -67,7 +74,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/mask_rcnn_r50_caffe_c4_1x.py b/configs/mask_rcnn_r50_caffe_c4_1x.py index 4173b29..f901c51 100644 --- a/configs/mask_rcnn_r50_caffe_c4_1x.py +++ b/configs/mask_rcnn_r50_caffe_c4_1x.py @@ -2,7 +2,7 @@ norm_cfg = dict(type='BN', requires_grad=False) model = dict( type='MaskRCNN', - pretrained='open-mmlab://resnet50_caffe', + # pretrained='open-mmlab://resnet50_caffe', backbone=dict( type='ResNet', depth=50, @@ -32,7 +32,9 @@ model = dict( anchor_strides=[16], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -46,14 +48,19 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False), + 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_roi_extractor=None, mask_head=dict( type='FCNMaskHead', num_convs=0, in_channels=2048, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -71,7 +78,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/mask_rcnn_r50_fpn_1x.py b/configs/mask_rcnn_r50_fpn_1x.py index eb4330b..b2854fa 100644 --- a/configs/mask_rcnn_r50_fpn_1x.py +++ b/configs/mask_rcnn_r50_fpn_1x.py @@ -23,7 +23,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -38,7 +40,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False), + 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_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -49,7 +54,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -67,7 +74,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/mask_rcnn_x101_32x4d_fpn_1x.py b/configs/mask_rcnn_x101_32x4d_fpn_1x.py index 6772f2b..051801b 100644 --- a/configs/mask_rcnn_x101_32x4d_fpn_1x.py +++ b/configs/mask_rcnn_x101_32x4d_fpn_1x.py @@ -25,7 +25,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -40,7 +42,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False), + 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_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -51,7 +56,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -69,7 +76,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, @@ -171,7 +177,7 @@ log_config = dict( total_epochs = 12 dist_params = dict(backend='nccl') log_level = 'INFO' -work_dir = './work_dirs/mask_rcnn_r50_fpn_1x' +work_dir = './work_dirs/mask_rcnn_x101_32x4d_fpn_1x' load_from = None resume_from = None workflow = [('train', 1)] diff --git a/configs/mask_rcnn_x101_64x4d_fpn_1x.py b/configs/mask_rcnn_x101_64x4d_fpn_1x.py index 8c61e33..434bf69 100644 --- a/configs/mask_rcnn_x101_64x4d_fpn_1x.py +++ b/configs/mask_rcnn_x101_64x4d_fpn_1x.py @@ -25,7 +25,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -40,7 +42,10 @@ model = dict( num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False), + 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_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -51,7 +56,9 @@ model = dict( num_convs=4, in_channels=256, conv_out_channels=256, - num_classes=81)) + num_classes=81, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -69,7 +76,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, @@ -171,7 +177,7 @@ log_config = dict( total_epochs = 12 dist_params = dict(backend='nccl') log_level = 'INFO' -work_dir = './work_dirs/mask_rcnn_r50_fpn_1x' +work_dir = './work_dirs/mask_rcnn_x101_64x4d_fpn_1x' load_from = None resume_from = None workflow = [('train', 1)] diff --git a/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py b/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py index 88f0ae0..0c0be0e 100644 --- a/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py +++ b/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py @@ -23,7 +23,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -38,7 +40,10 @@ model = dict( num_classes=21, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False)) + 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))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -56,7 +61,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/retinanet_r101_fpn_1x.py b/configs/retinanet_r101_fpn_1x.py index e07d98a..81e5557 100644 --- a/configs/retinanet_r101_fpn_1x.py +++ b/configs/retinanet_r101_fpn_1x.py @@ -27,7 +27,14 @@ model = dict( anchor_ratios=[0.5, 1.0, 2.0], anchor_strides=[8, 16, 32, 64, 128], target_means=[.0, .0, .0, .0], - target_stds=[1.0, 1.0, 1.0, 1.0])) + target_stds=[1.0, 1.0, 1.0, 1.0], + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0))) # training and testing settings train_cfg = dict( assigner=dict( @@ -36,9 +43,6 @@ train_cfg = dict( neg_iou_thr=0.4, min_pos_iou=0, ignore_iof_thr=-1), - smoothl1_beta=0.11, - gamma=2.0, - alpha=0.25, allowed_border=-1, pos_weight=-1, debug=False) diff --git a/configs/retinanet_r50_fpn_1x.py b/configs/retinanet_r50_fpn_1x.py index 2840c06..b721f9d 100644 --- a/configs/retinanet_r50_fpn_1x.py +++ b/configs/retinanet_r50_fpn_1x.py @@ -27,7 +27,14 @@ model = dict( anchor_ratios=[0.5, 1.0, 2.0], anchor_strides=[8, 16, 32, 64, 128], target_means=[.0, .0, .0, .0], - target_stds=[1.0, 1.0, 1.0, 1.0])) + target_stds=[1.0, 1.0, 1.0, 1.0], + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0))) # training and testing settings train_cfg = dict( assigner=dict( @@ -36,9 +43,6 @@ train_cfg = dict( neg_iou_thr=0.4, min_pos_iou=0, ignore_iof_thr=-1), - smoothl1_beta=0.11, - gamma=2.0, - alpha=0.25, allowed_border=-1, pos_weight=-1, debug=False) diff --git a/configs/retinanet_x101_32x4d_fpn_1x.py b/configs/retinanet_x101_32x4d_fpn_1x.py index 3f7741b..1b0aaaa 100644 --- a/configs/retinanet_x101_32x4d_fpn_1x.py +++ b/configs/retinanet_x101_32x4d_fpn_1x.py @@ -29,7 +29,14 @@ model = dict( anchor_ratios=[0.5, 1.0, 2.0], anchor_strides=[8, 16, 32, 64, 128], target_means=[.0, .0, .0, .0], - target_stds=[1.0, 1.0, 1.0, 1.0])) + target_stds=[1.0, 1.0, 1.0, 1.0], + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0))) # training and testing settings train_cfg = dict( assigner=dict( @@ -38,9 +45,6 @@ train_cfg = dict( neg_iou_thr=0.4, min_pos_iou=0, ignore_iof_thr=-1), - smoothl1_beta=0.11, - gamma=2.0, - alpha=0.25, allowed_border=-1, pos_weight=-1, debug=False) @@ -116,7 +120,7 @@ total_epochs = 12 device_ids = range(8) dist_params = dict(backend='nccl') log_level = 'INFO' -work_dir = './work_dirs/retinanet_r50_fpn_1x' +work_dir = './work_dirs/retinanet_x101_32x4d_fpn_1x' load_from = None resume_from = None workflow = [('train', 1)] diff --git a/configs/retinanet_x101_64x4d_fpn_1x.py b/configs/retinanet_x101_64x4d_fpn_1x.py index 2ef8b53..f5631f7 100644 --- a/configs/retinanet_x101_64x4d_fpn_1x.py +++ b/configs/retinanet_x101_64x4d_fpn_1x.py @@ -29,7 +29,14 @@ model = dict( anchor_ratios=[0.5, 1.0, 2.0], anchor_strides=[8, 16, 32, 64, 128], target_means=[.0, .0, .0, .0], - target_stds=[1.0, 1.0, 1.0, 1.0])) + target_stds=[1.0, 1.0, 1.0, 1.0], + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0))) # training and testing settings train_cfg = dict( assigner=dict( @@ -38,9 +45,6 @@ train_cfg = dict( neg_iou_thr=0.4, min_pos_iou=0, ignore_iof_thr=-1), - smoothl1_beta=0.11, - gamma=2.0, - alpha=0.25, allowed_border=-1, pos_weight=-1, debug=False) @@ -116,7 +120,7 @@ total_epochs = 12 device_ids = range(8) dist_params = dict(backend='nccl') log_level = 'INFO' -work_dir = './work_dirs/retinanet_r50_fpn_1x' +work_dir = './work_dirs/retinanet_x101_64x4d_fpn_1x' load_from = None resume_from = None workflow = [('train', 1)] diff --git a/configs/rpn_r101_fpn_1x.py b/configs/rpn_r101_fpn_1x.py index 450215e..6e1acd5 100644 --- a/configs/rpn_r101_fpn_1x.py +++ b/configs/rpn_r101_fpn_1x.py @@ -23,7 +23,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True)) + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -41,7 +43,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False)) test_cfg = dict( rpn=dict( diff --git a/configs/rpn_r50_caffe_c4_1x.py b/configs/rpn_r50_caffe_c4_1x.py index 373603f..caf0108 100644 --- a/configs/rpn_r50_caffe_c4_1x.py +++ b/configs/rpn_r50_caffe_c4_1x.py @@ -23,7 +23,9 @@ model = dict( anchor_strides=[16], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True)) + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -41,7 +43,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False)) test_cfg = dict( rpn=dict( diff --git a/configs/rpn_r50_fpn_1x.py b/configs/rpn_r50_fpn_1x.py index 3af2649..8c648ad 100644 --- a/configs/rpn_r50_fpn_1x.py +++ b/configs/rpn_r50_fpn_1x.py @@ -23,7 +23,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True)) + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -41,7 +43,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False)) test_cfg = dict( rpn=dict( diff --git a/configs/rpn_x101_32x4d_fpn_1x.py b/configs/rpn_x101_32x4d_fpn_1x.py index c23d715..2a3faef 100644 --- a/configs/rpn_x101_32x4d_fpn_1x.py +++ b/configs/rpn_x101_32x4d_fpn_1x.py @@ -25,7 +25,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True)) + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -43,7 +45,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False)) test_cfg = dict( rpn=dict( @@ -117,7 +118,7 @@ log_config = dict( total_epochs = 12 dist_params = dict(backend='nccl') log_level = 'INFO' -work_dir = './work_dirs/rpn_r101_fpn_1x' +work_dir = './work_dirs/rpn_x101_32x4d_fpn_1x' load_from = None resume_from = None workflow = [('train', 1)] diff --git a/configs/rpn_x101_64x4d_fpn_1x.py b/configs/rpn_x101_64x4d_fpn_1x.py index c34a146..182a0b3 100644 --- a/configs/rpn_x101_64x4d_fpn_1x.py +++ b/configs/rpn_x101_64x4d_fpn_1x.py @@ -25,7 +25,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True)) + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -43,7 +45,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False)) test_cfg = dict( rpn=dict( @@ -117,7 +118,7 @@ log_config = dict( total_epochs = 12 dist_params = dict(backend='nccl') log_level = 'INFO' -work_dir = './work_dirs/rpn_r101_fpn_1x' +work_dir = './work_dirs/rpn_x101_64x4d_fpn_1x' load_from = None resume_from = None workflow = [('train', 1)] diff --git a/configs/scratch/scratch_faster_rcnn_r50_fpn_gn_6x.py b/configs/scratch/scratch_faster_rcnn_r50_fpn_gn_6x.py index d4da529..cbb0e23 100644 --- a/configs/scratch/scratch_faster_rcnn_r50_fpn_gn_6x.py +++ b/configs/scratch/scratch_faster_rcnn_r50_fpn_gn_6x.py @@ -27,7 +27,9 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -45,7 +47,10 @@ model = dict( target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], reg_class_agnostic=False, - norm_cfg=norm_cfg)) + norm_cfg=norm_cfg, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -63,7 +68,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/configs/scratch/scratch_mask_rcnn_r50_fpn_gn_6x.py b/configs/scratch/scratch_mask_rcnn_r50_fpn_gn_6x.py index 63d21c8..679aab3 100644 --- a/configs/scratch/scratch_mask_rcnn_r50_fpn_gn_6x.py +++ b/configs/scratch/scratch_mask_rcnn_r50_fpn_gn_6x.py @@ -27,7 +27,10 @@ model = dict( anchor_strides=[4, 8, 16, 32, 64], target_means=[.0, .0, .0, .0], target_stds=[1.0, 1.0, 1.0, 1.0], - use_sigmoid_cls=True), + use_sigmoid_cls=True, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2), @@ -45,7 +48,10 @@ model = dict( target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], reg_class_agnostic=False, - norm_cfg=norm_cfg), + norm_cfg=norm_cfg, + 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_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', out_size=14, sample_num=2), @@ -57,7 +63,9 @@ model = dict( in_channels=256, conv_out_channels=256, num_classes=81, - norm_cfg=norm_cfg)) + norm_cfg=norm_cfg, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))) # model training and testing settings train_cfg = dict( rpn=dict( @@ -75,7 +83,6 @@ train_cfg = dict( add_gt_as_proposals=False), allowed_border=0, pos_weight=-1, - smoothl1_beta=1 / 9.0, debug=False), rpn_proposal=dict( nms_across_levels=False, diff --git a/mmdet/models/__init__.py b/mmdet/models/__init__.py index 7925e6a..c1776bf 100644 --- a/mmdet/models/__init__.py +++ b/mmdet/models/__init__.py @@ -5,14 +5,16 @@ from .anchor_heads import * # noqa: F401,F403 from .shared_heads import * # noqa: F401,F403 from .bbox_heads import * # noqa: F401,F403 from .mask_heads import * # noqa: F401,F403 +from .losses import * # noqa: F401,F403 from .detectors import * # noqa: F401,F403 from .registry import (BACKBONES, NECKS, ROI_EXTRACTORS, SHARED_HEADS, HEADS, - DETECTORS) + LOSSES, DETECTORS) from .builder import (build_backbone, build_neck, build_roi_extractor, - build_shared_head, build_head, build_detector) + build_shared_head, build_head, build_loss, + build_detector) __all__ = [ - 'BACKBONES', 'NECKS', 'ROI_EXTRACTORS', 'SHARED_HEADS', 'HEADS', + 'BACKBONES', 'NECKS', 'ROI_EXTRACTORS', 'SHARED_HEADS', 'HEADS', 'LOSSES', 'DETECTORS', 'build_backbone', 'build_neck', 'build_roi_extractor', - 'build_shared_head', 'build_head', 'build_detector' + 'build_shared_head', 'build_head', 'build_loss', 'build_detector' ] diff --git a/mmdet/models/anchor_heads/anchor_head.py b/mmdet/models/anchor_heads/anchor_head.py index 881415b..6d68c20 100644 --- a/mmdet/models/anchor_heads/anchor_head.py +++ b/mmdet/models/anchor_heads/anchor_head.py @@ -6,9 +6,8 @@ import torch.nn as nn from mmcv.cnn import normal_init from mmdet.core import (AnchorGenerator, anchor_target, delta2bbox, - multi_apply, weighted_cross_entropy, weighted_smoothl1, - weighted_binary_cross_entropy, - weighted_sigmoid_focal_loss, multiclass_nms) + multi_apply, multiclass_nms) +from ..builder import build_loss from ..registry import HEADS @@ -25,9 +24,8 @@ class AnchorHead(nn.Module): anchor_base_sizes (Iterable): Anchor base sizes. target_means (Iterable): Mean values of regression targets. target_stds (Iterable): Std values of regression targets. - use_sigmoid_cls (bool): Whether to use sigmoid loss for - classification. (softmax by default) - cls_focal_loss (bool): Whether to use focal loss for classification. + loss_cls (dict): Config of classification loss. + loss_bbox (dict): Config of localization loss. """ # noqa: W605 def __init__(self, @@ -40,8 +38,12 @@ class AnchorHead(nn.Module): anchor_base_sizes=None, target_means=(.0, .0, .0, .0), target_stds=(1.0, 1.0, 1.0, 1.0), - use_sigmoid_cls=False, - cls_focal_loss=False): + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0), + loss_bbox=dict( + type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)): super(AnchorHead, self).__init__() self.in_channels = in_channels self.num_classes = num_classes @@ -53,8 +55,15 @@ class AnchorHead(nn.Module): anchor_strides) if anchor_base_sizes is None else anchor_base_sizes self.target_means = target_means self.target_stds = target_stds - self.use_sigmoid_cls = use_sigmoid_cls - self.cls_focal_loss = cls_focal_loss + + self.use_sigmoid_cls = loss_cls.get('use_sigmoid', False) + self.sampling = loss_cls['type'] not in ['FocalLoss'] + if self.use_sigmoid_cls: + self.cls_out_channels = num_classes - 1 + else: + self.cls_out_channels = num_classes + self.loss_cls = build_loss(loss_cls) + self.loss_bbox = build_loss(loss_bbox) self.anchor_generators = [] for anchor_base in self.anchor_base_sizes: @@ -62,11 +71,6 @@ class AnchorHead(nn.Module): AnchorGenerator(anchor_base, anchor_scales, anchor_ratios)) self.num_anchors = len(self.anchor_ratios) * len(self.anchor_scales) - if self.use_sigmoid_cls: - self.cls_out_channels = self.num_classes - 1 - else: - self.cls_out_channels = self.num_classes - self._init_layers() def _init_layers(self): @@ -130,40 +134,20 @@ class AnchorHead(nn.Module): # classification loss labels = labels.reshape(-1) label_weights = label_weights.reshape(-1) - cls_score = cls_score.permute(0, 2, 3, 1).reshape( - -1, self.cls_out_channels) - if self.use_sigmoid_cls: - if self.cls_focal_loss: - cls_criterion = weighted_sigmoid_focal_loss - else: - cls_criterion = weighted_binary_cross_entropy - else: - if self.cls_focal_loss: - raise NotImplementedError - else: - cls_criterion = weighted_cross_entropy - if self.cls_focal_loss: - loss_cls = cls_criterion( - cls_score, - labels, - label_weights, - gamma=cfg.gamma, - alpha=cfg.alpha, - avg_factor=num_total_samples) - else: - loss_cls = cls_criterion( - cls_score, labels, label_weights, avg_factor=num_total_samples) + cls_score = cls_score.permute(0, 2, 3, + 1).reshape(-1, self.cls_out_channels) + loss_cls = self.loss_cls( + cls_score, labels, label_weights, avg_factor=num_total_samples) # regression loss bbox_targets = bbox_targets.reshape(-1, 4) bbox_weights = bbox_weights.reshape(-1, 4) bbox_pred = bbox_pred.permute(0, 2, 3, 1).reshape(-1, 4) - loss_reg = weighted_smoothl1( + loss_bbox = self.loss_bbox( bbox_pred, bbox_targets, bbox_weights, - beta=cfg.smoothl1_beta, avg_factor=num_total_samples) - return loss_cls, loss_reg + return loss_cls, loss_bbox def loss(self, cls_scores, @@ -178,7 +162,6 @@ class AnchorHead(nn.Module): anchor_list, valid_flag_list = self.get_anchors( featmap_sizes, img_metas) - sampling = False if self.cls_focal_loss else True label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 cls_reg_targets = anchor_target( anchor_list, @@ -191,15 +174,14 @@ class AnchorHead(nn.Module): gt_bboxes_ignore_list=gt_bboxes_ignore, gt_labels_list=gt_labels, label_channels=label_channels, - sampling=sampling) + sampling=self.sampling) if cls_reg_targets is None: return None (labels_list, label_weights_list, bbox_targets_list, bbox_weights_list, num_total_pos, num_total_neg) = cls_reg_targets num_total_samples = ( - num_total_pos - if self.cls_focal_loss else num_total_pos + num_total_neg) - losses_cls, losses_reg = multi_apply( + num_total_pos + num_total_neg if self.sampling else num_total_pos) + losses_cls, losses_bbox = multi_apply( self.loss_single, cls_scores, bbox_preds, @@ -209,7 +191,7 @@ class AnchorHead(nn.Module): bbox_weights_list, num_total_samples=num_total_samples, cfg=cfg) - return dict(loss_cls=losses_cls, loss_reg=losses_reg) + return dict(loss_cls=losses_cls, loss_bbox=losses_bbox) def get_bboxes(self, cls_scores, bbox_preds, img_metas, cfg, rescale=False): @@ -251,8 +233,8 @@ class AnchorHead(nn.Module): for cls_score, bbox_pred, anchors in zip(cls_scores, bbox_preds, mlvl_anchors): assert cls_score.size()[-2:] == bbox_pred.size()[-2:] - cls_score = cls_score.permute(1, 2, 0).reshape( - -1, self.cls_out_channels) + cls_score = cls_score.permute(1, 2, + 0).reshape(-1, self.cls_out_channels) if self.use_sigmoid_cls: scores = cls_score.sigmoid() else: @@ -279,6 +261,7 @@ class AnchorHead(nn.Module): if self.use_sigmoid_cls: padding = mlvl_scores.new_zeros(mlvl_scores.shape[0], 1) mlvl_scores = torch.cat([padding, mlvl_scores], dim=1) - det_bboxes, det_labels = multiclass_nms( - mlvl_bboxes, mlvl_scores, cfg.score_thr, cfg.nms, cfg.max_per_img) + det_bboxes, det_labels = multiclass_nms(mlvl_bboxes, mlvl_scores, + cfg.score_thr, cfg.nms, + cfg.max_per_img) return det_bboxes, det_labels diff --git a/mmdet/models/anchor_heads/retina_head.py b/mmdet/models/anchor_heads/retina_head.py index 3eefca4..53a5cc9 100644 --- a/mmdet/models/anchor_heads/retina_head.py +++ b/mmdet/models/anchor_heads/retina_head.py @@ -28,12 +28,7 @@ class RetinaHead(AnchorHead): [2**(i / scales_per_octave) for i in range(scales_per_octave)]) anchor_scales = octave_scales * octave_base_scale super(RetinaHead, self).__init__( - num_classes, - in_channels, - anchor_scales=anchor_scales, - use_sigmoid_cls=True, - cls_focal_loss=True, - **kwargs) + num_classes, in_channels, anchor_scales=anchor_scales, **kwargs) def _init_layers(self): self.relu = nn.ReLU(inplace=True) diff --git a/mmdet/models/anchor_heads/rpn_head.py b/mmdet/models/anchor_heads/rpn_head.py index fe9d5c3..0a5fd37 100644 --- a/mmdet/models/anchor_heads/rpn_head.py +++ b/mmdet/models/anchor_heads/rpn_head.py @@ -50,7 +50,7 @@ class RPNHead(AnchorHead): cfg, gt_bboxes_ignore=gt_bboxes_ignore) return dict( - loss_rpn_cls=losses['loss_cls'], loss_rpn_reg=losses['loss_reg']) + loss_rpn_cls=losses['loss_cls'], loss_rpn_bbox=losses['loss_bbox']) def get_bboxes_single(self, cls_scores, diff --git a/mmdet/models/anchor_heads/ssd_head.py b/mmdet/models/anchor_heads/ssd_head.py index 9c8b2a1..92a3e9c 100644 --- a/mmdet/models/anchor_heads/ssd_head.py +++ b/mmdet/models/anchor_heads/ssd_head.py @@ -10,6 +10,7 @@ from .anchor_head import AnchorHead from ..registry import HEADS +# TODO: add loss evaluator for SSD @HEADS.register_module class SSDHead(AnchorHead): @@ -122,13 +123,13 @@ class SSDHead(AnchorHead): loss_cls_neg = topk_loss_cls_neg.sum() loss_cls = (loss_cls_pos + loss_cls_neg) / num_total_samples - loss_reg = weighted_smoothl1( + loss_bbox = weighted_smoothl1( bbox_pred, bbox_targets, bbox_weights, beta=cfg.smoothl1_beta, avg_factor=num_total_samples) - return loss_cls[None], loss_reg + return loss_cls[None], loss_bbox def loss(self, cls_scores, @@ -167,18 +168,18 @@ class SSDHead(AnchorHead): num_images, -1, self.cls_out_channels) for s in cls_scores ], 1) all_labels = torch.cat(labels_list, -1).view(num_images, -1) - all_label_weights = torch.cat(label_weights_list, -1).view( - num_images, -1) + all_label_weights = torch.cat(label_weights_list, + -1).view(num_images, -1) all_bbox_preds = torch.cat([ b.permute(0, 2, 3, 1).reshape(num_images, -1, 4) for b in bbox_preds ], -2) - all_bbox_targets = torch.cat(bbox_targets_list, -2).view( - num_images, -1, 4) - all_bbox_weights = torch.cat(bbox_weights_list, -2).view( - num_images, -1, 4) + all_bbox_targets = torch.cat(bbox_targets_list, + -2).view(num_images, -1, 4) + all_bbox_weights = torch.cat(bbox_weights_list, + -2).view(num_images, -1, 4) - losses_cls, losses_reg = multi_apply( + losses_cls, losses_bbox = multi_apply( self.loss_single, all_cls_scores, all_bbox_preds, @@ -188,4 +189,4 @@ class SSDHead(AnchorHead): all_bbox_weights, num_total_samples=num_total_pos, cfg=cfg) - return dict(loss_cls=losses_cls, loss_reg=losses_reg) + return dict(loss_cls=losses_cls, loss_bbox=losses_bbox) diff --git a/mmdet/models/bbox_heads/bbox_head.py b/mmdet/models/bbox_heads/bbox_head.py index 4dcbd97..d0d98ff 100644 --- a/mmdet/models/bbox_heads/bbox_head.py +++ b/mmdet/models/bbox_heads/bbox_head.py @@ -2,8 +2,8 @@ import torch import torch.nn as nn import torch.nn.functional as F -from mmdet.core import (delta2bbox, multiclass_nms, bbox_target, - weighted_cross_entropy, weighted_smoothl1, accuracy) +from mmdet.core import delta2bbox, multiclass_nms, bbox_target, accuracy +from ..builder import build_loss from ..registry import HEADS @@ -21,7 +21,13 @@ class BBoxHead(nn.Module): num_classes=81, target_means=[0., 0., 0., 0.], target_stds=[0.1, 0.1, 0.2, 0.2], - reg_class_agnostic=False): + 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)): super(BBoxHead, self).__init__() assert with_cls or with_reg self.with_avg_pool = with_avg_pool @@ -34,6 +40,9 @@ class BBoxHead(nn.Module): self.target_stds = target_stds self.reg_class_agnostic = reg_class_agnostic + self.loss_cls = build_loss(loss_cls) + self.loss_bbox = build_loss(loss_bbox) + in_channels = self.in_channels if self.with_avg_pool: self.avg_pool = nn.AvgPool2d(roi_feat_size) @@ -90,7 +99,7 @@ class BBoxHead(nn.Module): reduce=True): losses = dict() if cls_score is not None: - losses['loss_cls'] = weighted_cross_entropy( + losses['loss_cls'] = self.loss_cls( cls_score, labels, label_weights, reduce=reduce) losses['acc'] = accuracy(cls_score, labels) if bbox_pred is not None: @@ -100,7 +109,7 @@ class BBoxHead(nn.Module): else: pos_bbox_pred = bbox_pred.view(bbox_pred.size(0), -1, 4)[pos_inds, labels[pos_inds]] - losses['loss_reg'] = weighted_smoothl1( + losses['loss_bbox'] = self.loss_bbox( pos_bbox_pred, bbox_targets[pos_inds], bbox_weights[pos_inds], @@ -132,8 +141,9 @@ class BBoxHead(nn.Module): if cfg is None: return bboxes, scores else: - det_bboxes, det_labels = multiclass_nms( - bboxes, scores, cfg.score_thr, cfg.nms, cfg.max_per_img) + det_bboxes, det_labels = multiclass_nms(bboxes, scores, + cfg.score_thr, cfg.nms, + cfg.max_per_img) return det_bboxes, det_labels diff --git a/mmdet/models/bbox_heads/convfc_bbox_head.py b/mmdet/models/bbox_heads/convfc_bbox_head.py index 2ce687e..470c511 100644 --- a/mmdet/models/bbox_heads/convfc_bbox_head.py +++ b/mmdet/models/bbox_heads/convfc_bbox_head.py @@ -29,8 +29,8 @@ class ConvFCBBoxHead(BBoxHead): *args, **kwargs): super(ConvFCBBoxHead, self).__init__(*args, **kwargs) - assert (num_shared_convs + num_shared_fcs + num_cls_convs + num_cls_fcs - + num_reg_convs + num_reg_fcs > 0) + assert (num_shared_convs + num_shared_fcs + num_cls_convs + + num_cls_fcs + num_reg_convs + num_reg_fcs > 0) if num_cls_convs > 0 or num_reg_convs > 0: assert num_shared_fcs == 0 if not self.with_cls: @@ -76,8 +76,8 @@ class ConvFCBBoxHead(BBoxHead): if self.with_cls: self.fc_cls = nn.Linear(self.cls_last_dim, self.num_classes) if self.with_reg: - out_dim_reg = (4 if self.reg_class_agnostic else - 4 * self.num_classes) + out_dim_reg = (4 if self.reg_class_agnostic else 4 * + self.num_classes) self.fc_reg = nn.Linear(self.reg_last_dim, out_dim_reg) def _add_conv_fc_branch(self, diff --git a/mmdet/models/builder.py b/mmdet/models/builder.py index 3de186c..93cdb19 100644 --- a/mmdet/models/builder.py +++ b/mmdet/models/builder.py @@ -2,7 +2,7 @@ import mmcv from torch import nn from .registry import (BACKBONES, NECKS, ROI_EXTRACTORS, SHARED_HEADS, HEADS, - DETECTORS) + LOSSES, DETECTORS) def _build_module(cfg, registry, default_args): @@ -52,5 +52,9 @@ def build_head(cfg): return build(cfg, HEADS) +def build_loss(cfg): + return build(cfg, LOSSES) + + def build_detector(cfg, train_cfg=None, test_cfg=None): return build(cfg, DETECTORS, dict(train_cfg=train_cfg, test_cfg=test_cfg)) diff --git a/mmdet/models/losses/__init__.py b/mmdet/models/losses/__init__.py new file mode 100644 index 0000000..efe40ea --- /dev/null +++ b/mmdet/models/losses/__init__.py @@ -0,0 +1,5 @@ +from .cross_entropy_loss import CrossEntropyLoss +from .focal_loss import FocalLoss +from .smooth_l1_loss import SmoothL1Loss + +__all__ = ['CrossEntropyLoss', 'FocalLoss', 'SmoothL1Loss'] diff --git a/mmdet/models/losses/cross_entropy_loss.py b/mmdet/models/losses/cross_entropy_loss.py new file mode 100644 index 0000000..1953987 --- /dev/null +++ b/mmdet/models/losses/cross_entropy_loss.py @@ -0,0 +1,28 @@ +import torch.nn as nn +from mmdet.core import (weighted_cross_entropy, weighted_binary_cross_entropy, + mask_cross_entropy) + +from ..registry import LOSSES + + +@LOSSES.register_module +class CrossEntropyLoss(nn.Module): + + def __init__(self, use_sigmoid=False, use_mask=False, loss_weight=1.0): + super(CrossEntropyLoss, self).__init__() + assert (use_sigmoid is False) or (use_mask is False) + self.use_sigmoid = use_sigmoid + self.use_mask = use_mask + self.loss_weight = loss_weight + + if self.use_sigmoid: + self.cls_criterion = weighted_binary_cross_entropy + elif self.use_mask: + self.cls_criterion = mask_cross_entropy + else: + self.cls_criterion = weighted_cross_entropy + + def forward(self, cls_score, label, label_weight, *args, **kwargs): + loss_cls = self.loss_weight * self.cls_criterion( + cls_score, label, label_weight, *args, **kwargs) + return loss_cls diff --git a/mmdet/models/losses/focal_loss.py b/mmdet/models/losses/focal_loss.py new file mode 100644 index 0000000..57b28b0 --- /dev/null +++ b/mmdet/models/losses/focal_loss.py @@ -0,0 +1,35 @@ +import torch.nn as nn +from mmdet.core import weighted_sigmoid_focal_loss + +from ..registry import LOSSES + + +@LOSSES.register_module +class FocalLoss(nn.Module): + + def __init__(self, + use_sigmoid=False, + loss_weight=1.0, + gamma=2.0, + alpha=0.25): + super(FocalLoss, self).__init__() + assert use_sigmoid is True, 'Only sigmoid focaloss supported now.' + self.use_sigmoid = use_sigmoid + self.loss_weight = loss_weight + self.gamma = gamma + self.alpha = alpha + self.cls_criterion = weighted_sigmoid_focal_loss + + def forward(self, cls_score, label, label_weight, *args, **kwargs): + if self.use_sigmoid: + loss_cls = self.loss_weight * self.cls_criterion( + cls_score, + label, + label_weight, + gamma=self.gamma, + alpha=self.alpha, + *args, + **kwargs) + else: + raise NotImplementedError + return loss_cls diff --git a/mmdet/models/losses/smooth_l1_loss.py b/mmdet/models/losses/smooth_l1_loss.py new file mode 100644 index 0000000..7c11aa5 --- /dev/null +++ b/mmdet/models/losses/smooth_l1_loss.py @@ -0,0 +1,18 @@ +import torch.nn as nn +from mmdet.core import weighted_smoothl1 + +from ..registry import LOSSES + + +@LOSSES.register_module +class SmoothL1Loss(nn.Module): + + def __init__(self, beta=1.0, loss_weight=1.0): + super(SmoothL1Loss, self).__init__() + self.beta = beta + self.loss_weight = loss_weight + + def forward(self, pred, target, weight, *args, **kwargs): + loss_bbox = self.loss_weight * weighted_smoothl1( + pred, target, weight, beta=self.beta, *args, **kwargs) + return loss_bbox diff --git a/mmdet/models/mask_heads/fcn_mask_head.py b/mmdet/models/mask_heads/fcn_mask_head.py index 0a5054c..2136fff 100644 --- a/mmdet/models/mask_heads/fcn_mask_head.py +++ b/mmdet/models/mask_heads/fcn_mask_head.py @@ -4,9 +4,10 @@ import pycocotools.mask as mask_util import torch import torch.nn as nn +from ..builder import build_loss from ..registry import HEADS from ..utils import ConvModule -from mmdet.core import mask_cross_entropy, mask_target +from mmdet.core import mask_target @HEADS.register_module @@ -23,7 +24,9 @@ class FCNMaskHead(nn.Module): num_classes=81, class_agnostic=False, conv_cfg=None, - norm_cfg=None): + norm_cfg=None, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)): super(FCNMaskHead, self).__init__() if upsample_method not in [None, 'deconv', 'nearest', 'bilinear']: raise ValueError( @@ -40,6 +43,7 @@ class FCNMaskHead(nn.Module): self.class_agnostic = class_agnostic self.conv_cfg = conv_cfg self.norm_cfg = norm_cfg + self.loss_mask = build_loss(loss_mask) self.convs = nn.ModuleList() for i in range(self.num_convs): @@ -106,10 +110,10 @@ class FCNMaskHead(nn.Module): def loss(self, mask_pred, mask_targets, labels): loss = dict() if self.class_agnostic: - loss_mask = mask_cross_entropy(mask_pred, mask_targets, - torch.zeros_like(labels)) + loss_mask = self.loss_mask(mask_pred, mask_targets, + torch.zeros_like(labels)) else: - loss_mask = mask_cross_entropy(mask_pred, mask_targets, labels) + loss_mask = self.loss_mask(mask_pred, mask_targets, labels) loss['loss_mask'] = loss_mask return loss diff --git a/mmdet/models/registry.py b/mmdet/models/registry.py index d5f8e67..533fdf8 100644 --- a/mmdet/models/registry.py +++ b/mmdet/models/registry.py @@ -41,4 +41,5 @@ NECKS = Registry('neck') ROI_EXTRACTORS = Registry('roi_extractor') SHARED_HEADS = Registry('shared_head') HEADS = Registry('head') +LOSSES = Registry('loss') DETECTORS = Registry('detector') diff --git a/setup.py b/setup.py index b79eb4d..6a87520 100644 --- a/setup.py +++ b/setup.py @@ -102,7 +102,7 @@ if __name__ == '__main__': 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', ], - license='GPLv3', + license='Apache License 2.0', setup_requires=['pytest-runner'], tests_require=['pytest'], install_requires=[ -- GitLab