| |
| from mmcv.cnn import build_conv_layer, build_norm_layer |
| from mmengine.model import Sequential |
| from torch import nn as nn |
|
|
|
|
| class ResLayer(Sequential): |
| """ResLayer to build ResNet style backbone. |
| |
| Args: |
| block (nn.Module): block used to build ResLayer. |
| inplanes (int): inplanes of block. |
| planes (int): planes of block. |
| num_blocks (int): number of blocks. |
| stride (int): stride of the first block. Default: 1 |
| avg_down (bool): Use AvgPool instead of stride conv when |
| downsampling in the bottleneck. Default: False |
| conv_cfg (dict): dictionary to construct and config conv layer. |
| Default: None |
| norm_cfg (dict): dictionary to construct and config norm layer. |
| Default: dict(type='BN') |
| multi_grid (int | None): Multi grid dilation rates of last |
| stage. Default: None |
| contract_dilation (bool): Whether contract first dilation of each layer |
| Default: False |
| """ |
|
|
| def __init__(self, |
| block, |
| inplanes, |
| planes, |
| num_blocks, |
| stride=1, |
| dilation=1, |
| avg_down=False, |
| conv_cfg=None, |
| norm_cfg=dict(type='BN'), |
| multi_grid=None, |
| contract_dilation=False, |
| **kwargs): |
| self.block = block |
|
|
| downsample = None |
| if stride != 1 or inplanes != planes * block.expansion: |
| downsample = [] |
| conv_stride = stride |
| if avg_down: |
| conv_stride = 1 |
| downsample.append( |
| nn.AvgPool2d( |
| kernel_size=stride, |
| stride=stride, |
| ceil_mode=True, |
| count_include_pad=False)) |
| downsample.extend([ |
| build_conv_layer( |
| conv_cfg, |
| inplanes, |
| planes * block.expansion, |
| kernel_size=1, |
| stride=conv_stride, |
| bias=False), |
| build_norm_layer(norm_cfg, planes * block.expansion)[1] |
| ]) |
| downsample = nn.Sequential(*downsample) |
|
|
| layers = [] |
| if multi_grid is None: |
| if dilation > 1 and contract_dilation: |
| first_dilation = dilation // 2 |
| else: |
| first_dilation = dilation |
| else: |
| first_dilation = multi_grid[0] |
| layers.append( |
| block( |
| inplanes=inplanes, |
| planes=planes, |
| stride=stride, |
| dilation=first_dilation, |
| downsample=downsample, |
| conv_cfg=conv_cfg, |
| norm_cfg=norm_cfg, |
| **kwargs)) |
| inplanes = planes * block.expansion |
| for i in range(1, num_blocks): |
| layers.append( |
| block( |
| inplanes=inplanes, |
| planes=planes, |
| stride=1, |
| dilation=dilation if multi_grid is None else multi_grid[i], |
| conv_cfg=conv_cfg, |
| norm_cfg=norm_cfg, |
| **kwargs)) |
| super().__init__(*layers) |
|
|