@@ -236,7 +236,23 @@ def _cfg(url='', **kwargs):
236236 interpolation = 'bicubic' ),
237237 'resnetblur50' : _cfg (
238238 url = 'https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnetblur50-84f4748f.pth' ,
239- interpolation = 'bicubic' )
239+ interpolation = 'bicubic' ),
240+
241+ # ResNet-RS models
242+ 'resnetrs50' : _cfg (
243+ interpolation = 'bicubic' , first_conv = 'conv1.0' ),
244+ 'resnetrs101' : _cfg (
245+ interpolation = 'bicubic' , first_conv = 'conv1.0' ),
246+ 'resnetrs152' : _cfg (
247+ interpolation = 'bicubic' , first_conv = 'conv1.0' ),
248+ 'resnetrs200' : _cfg (
249+ interpolation = 'bicubic' , first_conv = 'conv1.0' ),
250+ 'resnetrs270' : _cfg (
251+ interpolation = 'bicubic' , first_conv = 'conv1.0' ),
252+ 'resnetrs350' : _cfg (
253+ interpolation = 'bicubic' , first_conv = 'conv1.0' ),
254+ 'resnetrs420' : _cfg (
255+ interpolation = 'bicubic' , first_conv = 'conv1.0' ),
240256}
241257
242258
@@ -318,7 +334,7 @@ class Bottleneck(nn.Module):
318334
319335 def __init__ (self , inplanes , planes , stride = 1 , downsample = None , cardinality = 1 , base_width = 64 ,
320336 reduce_first = 1 , dilation = 1 , first_dilation = None , act_layer = nn .ReLU , norm_layer = nn .BatchNorm2d ,
321- attn_layer = None , aa_layer = None , drop_block = None , drop_path = None ):
337+ attn_layer = None , aa_layer = None , drop_block = None , drop_path = None , ** kwargs ):
322338 super (Bottleneck , self ).__init__ ()
323339
324340 width = int (math .floor (planes * (base_width / 64 )) * cardinality )
@@ -341,7 +357,7 @@ def __init__(self, inplanes, planes, stride=1, downsample=None, cardinality=1, b
341357 self .conv3 = nn .Conv2d (width , outplanes , kernel_size = 1 , bias = False )
342358 self .bn3 = norm_layer (outplanes )
343359
344- self .se = create_attn (attn_layer , outplanes )
360+ self .se = create_attn (attn_layer , outplanes , ** kwargs )
345361
346362 self .act3 = act_layer (inplace = True )
347363 self .downsample = downsample
@@ -545,11 +561,12 @@ def __init__(self, block, layers, num_classes=1000, in_chans=3,
545561 cardinality = 1 , base_width = 64 , stem_width = 64 , stem_type = '' ,
546562 output_stride = 32 , block_reduce_first = 1 , down_kernel_size = 1 , avg_down = False ,
547563 act_layer = nn .ReLU , norm_layer = nn .BatchNorm2d , aa_layer = None , drop_rate = 0.0 , drop_path_rate = 0. ,
548- drop_block_rate = 0. , global_pool = 'avg' , zero_init_last_bn = True , block_args = None ):
564+ drop_block_rate = 0. , global_pool = 'avg' , zero_init_last_bn = True , block_args = None , replace_stem_max_pool = False ):
549565 block_args = block_args or dict ()
550566 assert output_stride in (8 , 16 , 32 )
551567 self .num_classes = num_classes
552568 self .drop_rate = drop_rate
569+ self .replace_stem_max_pool = replace_stem_max_pool
553570 super (ResNet , self ).__init__ ()
554571
555572 # Stem
@@ -574,12 +591,19 @@ def __init__(self, block, layers, num_classes=1000, in_chans=3,
574591 self .feature_info = [dict (num_chs = inplanes , reduction = 2 , module = 'act1' )]
575592
576593 # Stem Pooling
577- if aa_layer is not None :
578- self .maxpool = nn .Sequential (* [
579- nn .MaxPool2d (kernel_size = 3 , stride = 1 , padding = 1 ),
580- aa_layer (channels = inplanes , stride = 2 )])
594+ if not self .replace_stem_max_pool :
595+ if aa_layer is not None :
596+ self .maxpool = nn .Sequential (* [
597+ nn .MaxPool2d (kernel_size = 3 , stride = 1 , padding = 1 ),
598+ aa_layer (channels = inplanes , stride = 2 )])
599+ else :
600+ self .maxpool = nn .MaxPool2d (kernel_size = 3 , stride = 2 , padding = 1 )
581601 else :
582- self .maxpool = nn .MaxPool2d (kernel_size = 3 , stride = 2 , padding = 1 )
602+ self .maxpool = nn .Sequential (* [
603+ nn .Conv2d (inplanes , inplanes , 3 , stride = 2 , padding = 1 , bias = False ),
604+ norm_layer (inplanes ),
605+ act_layer (inplace = True )
606+ ])
583607
584608 # Feature Blocks
585609 channels = [64 , 128 , 256 , 512 ]
@@ -1065,6 +1089,63 @@ def ecaresnet50d(pretrained=False, **kwargs):
10651089 return _create_resnet ('ecaresnet50d' , pretrained , ** model_args )
10661090
10671091
1092+ @register_model
1093+ def resnetrs50 (pretrained = False , ** kwargs ):
1094+ model_args = dict (
1095+ block = Bottleneck , layers = [3 , 4 , 6 , 3 ], stem_width = 32 , stem_type = 'deep' , replace_stem_max_pool = True ,
1096+ avg_down = True , block_args = dict (attn_layer = 'se' , reduction_ratio = 0.25 ), ** kwargs )
1097+ return _create_resnet ('resnetrs50' , pretrained , ** model_args )
1098+
1099+
1100+ @register_model
1101+ def resnetrs101 (pretrained = False , ** kwargs ):
1102+ model_args = dict (
1103+ block = Bottleneck , layers = [3 , 4 , 23 , 3 ], stem_width = 32 , stem_type = 'deep' , replace_stem_max_pool = True ,
1104+ avg_down = True , block_args = dict (attn_layer = 'se' , reduction_ratio = 0.25 ), ** kwargs )
1105+ return _create_resnet ('resnetrs101' , pretrained , ** model_args )
1106+
1107+
1108+ @register_model
1109+ def resnetrs152 (pretrained = False , ** kwargs ):
1110+ model_args = dict (
1111+ block = Bottleneck , layers = [3 , 8 , 36 , 3 ], stem_width = 32 , stem_type = 'deep' , replace_stem_max_pool = True ,
1112+ avg_down = True , block_args = dict (attn_layer = 'se' , reduction_ratio = 0.25 ), ** kwargs )
1113+ return _create_resnet ('resnetrs152' , pretrained , ** model_args )
1114+
1115+
1116+ @register_model
1117+ def resnetrs200 (pretrained = False , ** kwargs ):
1118+ model_args = dict (
1119+ block = Bottleneck , layers = [3 , 24 , 36 , 3 ], stem_width = 32 , stem_type = 'deep' , replace_stem_max_pool = True ,
1120+ avg_down = True , block_args = dict (attn_layer = 'se' , reduction_ratio = 0.25 ), ** kwargs )
1121+ return _create_resnet ('resnetrs200' , pretrained , ** model_args )
1122+
1123+
1124+ @register_model
1125+ def resnetrs270 (pretrained = False , ** kwargs ):
1126+ model_args = dict (
1127+ block = Bottleneck , layers = [4 , 29 , 53 , 4 ], stem_width = 32 , stem_type = 'deep' , replace_stem_max_pool = True ,
1128+ avg_down = True , block_args = dict (attn_layer = 'se' , reduction_ratio = 0.25 ), ** kwargs )
1129+ return _create_resnet ('resnetrs270' , pretrained , ** model_args )
1130+
1131+
1132+
1133+ @register_model
1134+ def resnetrs350 (pretrained = False , ** kwargs ):
1135+ model_args = dict (
1136+ block = Bottleneck , layers = [4 , 36 , 72 , 4 ], stem_width = 32 , stem_type = 'deep' , replace_stem_max_pool = True ,
1137+ avg_down = True , block_args = dict (attn_layer = 'se' , reduction_ratio = 0.25 ), ** kwargs )
1138+ return _create_resnet ('resnetrs350' , pretrained , ** model_args )
1139+
1140+
1141+ @register_model
1142+ def resnetrs420 (pretrained = False , ** kwargs ):
1143+ model_args = dict (
1144+ block = Bottleneck , layers = [4 , 44 , 87 , 4 ], stem_width = 32 , stem_type = 'deep' , replace_stem_max_pool = True ,
1145+ avg_down = True , block_args = dict (attn_layer = 'se' , reduction_ratio = 0.25 ), ** kwargs )
1146+ return _create_resnet ('resnetrs420' , pretrained , ** model_args )
1147+
1148+
10681149@register_model
10691150def ecaresnet50d_pruned (pretrained = False , ** kwargs ):
10701151 """Constructs a ResNet-50-D model pruned with eca.
0 commit comments