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