in seamseg/utils/misc.py [0:0]
def norm_act_from_config(body_config):
"""Make normalization + activation function from configuration
Available normalization modes are:
- `bn`: Standard In-Place Batch Normalization
- `syncbn`: Synchronized In-Place Batch Normalization
- `syncbn+bn`: Synchronized In-Place Batch Normalization in the "static" part of the network, Standard In-Place
Batch Normalization in the "dynamic" parts
- `gn`: Group Normalization
- `syncbn+gn`: Synchronized In-Place Batch Normalization in the "static" part of the network, Group Normalization
in the "dynamic" parts
- `off`: No normalization (preserve scale and bias parameters)
The "static" part of the network includes the backbone, FPN and semantic segmentation components, while the
"dynamic" part of the network includes the RPN, detection and instance segmentation components. Note that this
distinction is due to historical reasons and for back-compatibility with the CVPR2019 pre-trained models.
Parameters
----------
body_config
Configuration object containing the following fields: `normalization_mode`, `activation`, `activation_slope`
and `gn_groups`
Returns
-------
norm_act_static : callable
Function that returns norm_act modules for the static parts of the network
norm_act_dynamic : callable
Function that returns norm_act modules for the dynamic parts of the network
"""
mode = body_config["normalization_mode"]
activation = body_config["activation"]
slope = body_config.getfloat("activation_slope")
groups = body_config.getint("gn_groups")
if mode == "bn":
norm_act_static = norm_act_dynamic = partial(InPlaceABN, activation=activation, activation_param=slope)
elif mode == "syncbn":
norm_act_static = norm_act_dynamic = partial(InPlaceABNSync, activation=activation, activation_param=slope)
elif mode == "syncbn+bn":
norm_act_static = partial(InPlaceABNSync, activation=activation, activation_param=slope)
norm_act_dynamic = partial(InPlaceABN, activation=activation, activation_param=slope)
elif mode == "gn":
norm_act_static = norm_act_dynamic = partial(
ActivatedGroupNorm, num_groups=groups, activation=activation, activation_param=slope)
elif mode == "syncbn+gn":
norm_act_static = partial(InPlaceABNSync, activation=activation, activation_param=slope)
norm_act_dynamic = partial(ActivatedGroupNorm, num_groups=groups, activation=activation, activation_param=slope)
elif mode == "off":
norm_act_static = norm_act_dynamic = partial(ActivatedAffine, activation=activation, activation_param=slope)
else:
raise ValueError("Unrecognized normalization_mode {}, valid options: 'bn', 'syncbn', 'syncbn+bn', 'gn', "
"'syncbn+gn', 'off'".format(mode))
return norm_act_static, norm_act_dynamic