From 025149c1d8d219fc4a274a70a251a5b4c44b4dfe Mon Sep 17 00:00:00 2001 From: ThangVu <thangvubk@gmail.com> Date: Tue, 7 May 2019 06:18:20 +0000 Subject: [PATCH] change frozen to requires_grad for clear behavior --- configs/cascade_mask_rcnn_r50_c4_1x.py | 4 ++-- configs/cascade_rcnn_r50_c4_1x.py | 4 ++-- configs/fast_rcnn_r50_c4_1x.py | 4 ++-- configs/faster_rcnn_r50_c4_1x.py | 4 ++-- configs/gn+ws/faster_rcnn_r50_fpn_gn_ws_1x.py | 2 +- .../gn+ws/mask_rcnn_r50_fpn_gn_ws_20_23_24e.py | 2 +- configs/gn+ws/mask_rcnn_r50_fpn_gn_ws_2x.py | 2 +- .../gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws_2x.py | 2 +- configs/gn/mask_rcnn_r101_fpn_gn_2x.py | 2 +- configs/gn/mask_rcnn_r50_fpn_gn_2x.py | 2 +- configs/gn/mask_rcnn_r50_fpn_gn_contrib_2x.py | 2 +- configs/mask_rcnn_r50_c4_1x.py | 4 ++-- configs/rpn_r50_c4_1x.py | 2 +- mmdet/models/backbones/resnet.py | 6 +++--- mmdet/models/shared_heads/res_layer.py | 2 +- mmdet/models/utils/norm.py | 17 +++++++---------- 16 files changed, 29 insertions(+), 32 deletions(-) diff --git a/configs/cascade_mask_rcnn_r50_c4_1x.py b/configs/cascade_mask_rcnn_r50_c4_1x.py index 653e221..cd50d75 100644 --- a/configs/cascade_mask_rcnn_r50_c4_1x.py +++ b/configs/cascade_mask_rcnn_r50_c4_1x.py @@ -11,7 +11,7 @@ model = dict( dilations=(1, 1, 1), out_indices=(2, ), frozen_stages=1, - normalize=dict(type='BN', frozen=True), + normalize=dict(type='BN', requires_grad=False), norm_eval=True, style='caffe'), shared_head=dict( @@ -21,7 +21,7 @@ model = dict( stride=2, dilation=1, style='caffe', - normalize=dict(type='BN', frozen=True), + normalize=dict(type='BN', requires_grad=False), norm_eval=True), rpn_head=dict( type='RPNHead', diff --git a/configs/cascade_rcnn_r50_c4_1x.py b/configs/cascade_rcnn_r50_c4_1x.py index e53a476..adc3818 100644 --- a/configs/cascade_rcnn_r50_c4_1x.py +++ b/configs/cascade_rcnn_r50_c4_1x.py @@ -11,7 +11,7 @@ model = dict( dilations=(1, 1, 1), out_indices=(2, ), frozen_stages=1, - normalize=dict(type='BN', frozen=True), + normalize=dict(type='BN', requires_grad=False), norm_eval=True, style='caffe'), shared_head=dict( @@ -21,7 +21,7 @@ model = dict( stride=2, dilation=1, style='caffe', - normalize=dict(type='BN', frozen=True), + normalize=dict(type='BN', requires_grad=False), norm_eval=True), rpn_head=dict( type='RPNHead', diff --git a/configs/fast_rcnn_r50_c4_1x.py b/configs/fast_rcnn_r50_c4_1x.py index 3d98c5c..052e578 100644 --- a/configs/fast_rcnn_r50_c4_1x.py +++ b/configs/fast_rcnn_r50_c4_1x.py @@ -10,7 +10,7 @@ model = dict( dilations=(1, 1, 1), out_indices=(2, ), frozen_stages=1, - normalize=dict(type='BN', frozen=True), + normalize=dict(type='BN', requires_grad=False), norm_eval=True, style='caffe'), shared_head=dict( @@ -20,7 +20,7 @@ model = dict( stride=2, dilation=1, style='caffe', - normalize=dict(type='BN', frozen=True), + normalize=dict(type='BN', requires_grad=False), norm_eval=True), bbox_roi_extractor=dict( type='SingleRoIExtractor', diff --git a/configs/faster_rcnn_r50_c4_1x.py b/configs/faster_rcnn_r50_c4_1x.py index c38e294..900b2e8 100644 --- a/configs/faster_rcnn_r50_c4_1x.py +++ b/configs/faster_rcnn_r50_c4_1x.py @@ -10,7 +10,7 @@ model = dict( dilations=(1, 1, 1), out_indices=(2, ), frozen_stages=1, - normalize=dict(type='BN', frozen=True), + normalize=dict(type='BN', requires_grad=False), norm_eval=True, style='caffe'), shared_head=dict( @@ -20,7 +20,7 @@ model = dict( stride=2, dilation=1, style='caffe', - normalize=dict(type='BN', frozen=True), + normalize=dict(type='BN', requires_grad=False), norm_eval=True), rpn_head=dict( type='RPNHead', 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 d494043..83fc821 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 @@ -1,6 +1,6 @@ # model settings conv_cfg = dict(type='ConvWS') -normalize = dict(type='GN', num_groups=32, frozen=False) +normalize = dict(type='GN', num_groups=32, requires_grad=True) model = dict( type='FasterRCNN', pretrained='open-mmlab://jhu/resnet50_gn_ws', 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 2d98767..ed71cc1 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 @@ -1,6 +1,6 @@ # model settings conv_cfg = dict(type='ConvWS') -normalize = dict(type='GN', num_groups=32, frozen=False) +normalize = dict(type='GN', num_groups=32, requires_grad=True) model = dict( type='MaskRCNN', pretrained='open-mmlab://jhu/resnet50_gn_ws', 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 c28c6ed..799e2af 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 @@ -1,6 +1,6 @@ # model settings conv_cfg = dict(type='ConvWS') -normalize = dict(type='GN', num_groups=32, frozen=False) +normalize = dict(type='GN', num_groups=32, requires_grad=True) model = dict( type='MaskRCNN', pretrained='open-mmlab://jhu/resnet50_gn_ws', 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 8fdeaa0..e0b2aa3 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 @@ -1,6 +1,6 @@ # model settings conv_cfg = dict(type='ConvWS') -normalize = dict(type='GN', num_groups=32, frozen=False) +normalize = dict(type='GN', num_groups=32, requires_grad=True) model = dict( type='MaskRCNN', pretrained='open-mmlab://jhu/resnext101_32x4d_gn_ws', diff --git a/configs/gn/mask_rcnn_r101_fpn_gn_2x.py b/configs/gn/mask_rcnn_r101_fpn_gn_2x.py index d15d1c0..bc08720 100644 --- a/configs/gn/mask_rcnn_r101_fpn_gn_2x.py +++ b/configs/gn/mask_rcnn_r101_fpn_gn_2x.py @@ -1,5 +1,5 @@ # model settings -normalize = dict(type='GN', num_groups=32, frozen=False) +normalize = dict(type='GN', num_groups=32, requires_grad=True) model = dict( type='MaskRCNN', diff --git a/configs/gn/mask_rcnn_r50_fpn_gn_2x.py b/configs/gn/mask_rcnn_r50_fpn_gn_2x.py index da07ce8..d19633f 100644 --- a/configs/gn/mask_rcnn_r50_fpn_gn_2x.py +++ b/configs/gn/mask_rcnn_r50_fpn_gn_2x.py @@ -1,5 +1,5 @@ # model settings -normalize = dict(type='GN', num_groups=32, frozen=False) +normalize = dict(type='GN', num_groups=32, requires_grad=True) model = dict( type='MaskRCNN', 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 bffb778..eb3fa2b 100644 --- a/configs/gn/mask_rcnn_r50_fpn_gn_contrib_2x.py +++ b/configs/gn/mask_rcnn_r50_fpn_gn_contrib_2x.py @@ -1,5 +1,5 @@ # model settings -normalize = dict(type='GN', num_groups=32, frozen=False) +normalize = dict(type='GN', num_groups=32, requires_grad=True) model = dict( type='MaskRCNN', diff --git a/configs/mask_rcnn_r50_c4_1x.py b/configs/mask_rcnn_r50_c4_1x.py index 6fe2142..4bdf36c 100644 --- a/configs/mask_rcnn_r50_c4_1x.py +++ b/configs/mask_rcnn_r50_c4_1x.py @@ -10,7 +10,7 @@ model = dict( dilations=(1, 1, 1), out_indices=(2, ), frozen_stages=1, - normalize=dict(type='BN', frozen=True), + normalize=dict(type='BN', requires_grad=False), norm_eval=True, style='caffe'), shared_head=dict( @@ -20,7 +20,7 @@ model = dict( stride=2, dilation=1, style='caffe', - normalize=dict(type='BN', frozen=True), + normalize=dict(type='BN', requires_grad=False), norm_eval=True), rpn_head=dict( type='RPNHead', diff --git a/configs/rpn_r50_c4_1x.py b/configs/rpn_r50_c4_1x.py index 228d54a..bc3d2a8 100644 --- a/configs/rpn_r50_c4_1x.py +++ b/configs/rpn_r50_c4_1x.py @@ -10,7 +10,7 @@ model = dict( dilations=(1, 1, 1), out_indices=(2, ), frozen_stages=1, - normalize=dict(type='BN', frozen=True), + normalize=dict(type='BN', requires_grad=False), norm_eval=True, style='caffe'), neck=None, diff --git a/mmdet/models/backbones/resnet.py b/mmdet/models/backbones/resnet.py index 2654030..c9daeef 100644 --- a/mmdet/models/backbones/resnet.py +++ b/mmdet/models/backbones/resnet.py @@ -307,8 +307,8 @@ class ResNet(nn.Module): style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two layer is the 3x3 conv layer, otherwise the stride-two layer is the first 1x1 conv layer. - frozen_stages (int): Stages to be frozen (all param fixed). -1 means - not freezing any parameters. + frozen_stages (int): Stages to be frozen (stop grad and set eval mode). + -1 means not freezing any parameters. normalize (dict): dictionary to construct and config norm layer. norm_eval (bool): Whether to set norm layers to eval mode, namely, freeze running stats (mean and var). Note: Effect on Batch Norm @@ -336,7 +336,7 @@ class ResNet(nn.Module): style='pytorch', frozen_stages=-1, conv_cfg=None, - normalize=dict(type='BN', frozen=False), + normalize=dict(type='BN', requires_grad=True), norm_eval=True, dcn=None, stage_with_dcn=(False, False, False, False), diff --git a/mmdet/models/shared_heads/res_layer.py b/mmdet/models/shared_heads/res_layer.py index f42487e..ea306e5 100644 --- a/mmdet/models/shared_heads/res_layer.py +++ b/mmdet/models/shared_heads/res_layer.py @@ -17,7 +17,7 @@ class ResLayer(nn.Module): stride=2, dilation=1, style='pytorch', - normalize=dict(type='BN', frozen=False), + normalize=dict(type='BN', requires_grad=True), norm_eval=True, with_cp=False, dcn=None): diff --git a/mmdet/models/utils/norm.py b/mmdet/models/utils/norm.py index 35f0fe7..8658f6b 100644 --- a/mmdet/models/utils/norm.py +++ b/mmdet/models/utils/norm.py @@ -17,15 +17,13 @@ def build_norm_layer(cfg, num_features, postfix=''): cfg (dict): cfg should contain: type (str): identify norm layer type. layer args: args needed to instantiate a norm layer. - frozen (bool): [optional] whether stop gradient updates - of norm layer, it is helpful to set frozen mode - in backbone's norms. - num_features (int): number of channels from input - postfix (int, str): appended into norm abbreation to + requires_grad (bool): [optional] whether stop gradient updates + num_features (int): number of channels from input. + postfix (int, str): appended into norm abbreviation to create named layer. Returns: - name (str): abbreation + postfix + name (str): abbreviation + postfix layer (nn.Module): created norm layer """ assert isinstance(cfg, dict) and 'type' in cfg @@ -42,7 +40,7 @@ def build_norm_layer(cfg, num_features, postfix=''): assert isinstance(postfix, (int, str)) name = abbr + str(postfix) - frozen = cfg_.pop('frozen', False) + requires_grad = cfg_.pop('requires_grad', True) cfg_.setdefault('eps', 1e-5) if layer_type != 'GN': layer = norm_layer(num_features, **cfg_) @@ -50,8 +48,7 @@ def build_norm_layer(cfg, num_features, postfix=''): assert 'num_groups' in cfg_ layer = norm_layer(num_channels=num_features, **cfg_) - if frozen: - for param in layer.parameters(): - param.requires_grad = False + for param in layer.parameters(): + param.requires_grad = requires_grad return name, layer -- GitLab