1515import torch .nn .functional as F
1616
1717from timm .data import IMAGENET_DPN_MEAN , IMAGENET_DPN_STD , IMAGENET_DEFAULT_MEAN , IMAGENET_DEFAULT_STD
18- from timm .layers import BatchNormAct2d , ConvNormAct , create_conv2d , create_classifier
18+ from timm .layers import BatchNormAct2d , ConvNormAct , create_conv2d , create_classifier , get_norm_act_layer
1919from ._builder import build_model_with_cfg
2020from ._registry import register_model
2121
@@ -33,6 +33,7 @@ def _cfg(url='', **kwargs):
3333
3434
3535default_cfgs = {
36+ 'dpn48b' : _cfg (mean = IMAGENET_DEFAULT_MEAN , std = IMAGENET_DEFAULT_STD ),
3637 'dpn68' : _cfg (
3738 url = 'https://github.com/rwightman/pytorch-dpn-pretrained/releases/download/v0.1/dpn68-66bebafa7.pth' ),
3839 'dpn68b' : _cfg (
@@ -82,7 +83,16 @@ def forward(self, x):
8283
8384class DualPathBlock (nn .Module ):
8485 def __init__ (
85- self , in_chs , num_1x1_a , num_3x3_b , num_1x1_c , inc , groups , block_type = 'normal' , b = False ):
86+ self ,
87+ in_chs ,
88+ num_1x1_a ,
89+ num_3x3_b ,
90+ num_1x1_c ,
91+ inc ,
92+ groups ,
93+ block_type = 'normal' ,
94+ b = False ,
95+ ):
8696 super (DualPathBlock , self ).__init__ ()
8797 self .num_1x1_c = num_1x1_c
8898 self .inc = inc
@@ -167,16 +177,31 @@ def forward(self, x) -> Tuple[torch.Tensor, torch.Tensor]:
167177
168178class DPN (nn .Module ):
169179 def __init__ (
170- self , small = False , num_init_features = 64 , k_r = 96 , groups = 32 , global_pool = 'avg' ,
171- b = False , k_sec = (3 , 4 , 20 , 3 ), inc_sec = (16 , 32 , 24 , 128 ), output_stride = 32 ,
172- num_classes = 1000 , in_chans = 3 , drop_rate = 0. , fc_act_layer = nn .ELU ):
180+ self ,
181+ num_classes = 1000 ,
182+ in_chans = 3 ,
183+ output_stride = 32 ,
184+ global_pool = 'avg' ,
185+ k_sec = (3 , 4 , 20 , 3 ),
186+ inc_sec = (16 , 32 , 24 , 128 ),
187+ k_r = 96 ,
188+ groups = 32 ,
189+ small = False ,
190+ num_init_features = 64 ,
191+ b = False ,
192+ drop_rate = 0. ,
193+ norm_layer = 'batchnorm2d' ,
194+ act_layer = 'relu' ,
195+ fc_act_layer = nn .ELU ,
196+ ):
173197 super (DPN , self ).__init__ ()
174198 self .num_classes = num_classes
175199 self .drop_rate = drop_rate
176200 self .b = b
177201 assert output_stride == 32 # FIXME look into dilation support
178- norm_layer = partial (BatchNormAct2d , eps = .001 )
179- fc_norm_layer = partial (BatchNormAct2d , eps = .001 , act_layer = fc_act_layer , inplace = False )
202+
203+ norm_layer = partial (get_norm_act_layer (norm_layer , act_layer = act_layer ), eps = .001 )
204+ fc_norm_layer = partial (get_norm_act_layer (norm_layer , act_layer = fc_act_layer ), eps = .001 , inplace = False )
180205 bw_factor = 1 if small else 4
181206 blocks = OrderedDict ()
182207
@@ -291,49 +316,57 @@ def _create_dpn(variant, pretrained=False, **kwargs):
291316 ** kwargs )
292317
293318
319+ @register_model
320+ def dpn48b (pretrained = False , ** kwargs ):
321+ model_kwargs = dict (
322+ small = True , num_init_features = 10 , k_r = 128 , groups = 32 ,
323+ b = True , k_sec = (3 , 4 , 6 , 3 ), inc_sec = (16 , 32 , 32 , 64 ), act_layer = 'silu' )
324+ return _create_dpn ('dpn48b' , pretrained = pretrained , ** dict (model_kwargs , ** kwargs ))
325+
326+
294327@register_model
295328def dpn68 (pretrained = False , ** kwargs ):
296329 model_kwargs = dict (
297330 small = True , num_init_features = 10 , k_r = 128 , groups = 32 ,
298- k_sec = (3 , 4 , 12 , 3 ), inc_sec = (16 , 32 , 32 , 64 ), ** kwargs )
299- return _create_dpn ('dpn68' , pretrained = pretrained , ** model_kwargs )
331+ k_sec = (3 , 4 , 12 , 3 ), inc_sec = (16 , 32 , 32 , 64 ))
332+ return _create_dpn ('dpn68' , pretrained = pretrained , ** dict ( model_kwargs , ** kwargs ) )
300333
301334
302335@register_model
303336def dpn68b (pretrained = False , ** kwargs ):
304337 model_kwargs = dict (
305338 small = True , num_init_features = 10 , k_r = 128 , groups = 32 ,
306- b = True , k_sec = (3 , 4 , 12 , 3 ), inc_sec = (16 , 32 , 32 , 64 ), ** kwargs )
307- return _create_dpn ('dpn68b' , pretrained = pretrained , ** model_kwargs )
339+ b = True , k_sec = (3 , 4 , 12 , 3 ), inc_sec = (16 , 32 , 32 , 64 ))
340+ return _create_dpn ('dpn68b' , pretrained = pretrained , ** dict ( model_kwargs , ** kwargs ) )
308341
309342
310343@register_model
311344def dpn92 (pretrained = False , ** kwargs ):
312345 model_kwargs = dict (
313346 num_init_features = 64 , k_r = 96 , groups = 32 ,
314- k_sec = (3 , 4 , 20 , 3 ), inc_sec = (16 , 32 , 24 , 128 ), ** kwargs )
315- return _create_dpn ('dpn92' , pretrained = pretrained , ** model_kwargs )
347+ k_sec = (3 , 4 , 20 , 3 ), inc_sec = (16 , 32 , 24 , 128 ))
348+ return _create_dpn ('dpn92' , pretrained = pretrained , ** dict ( model_kwargs , ** kwargs ) )
316349
317350
318351@register_model
319352def dpn98 (pretrained = False , ** kwargs ):
320353 model_kwargs = dict (
321354 num_init_features = 96 , k_r = 160 , groups = 40 ,
322- k_sec = (3 , 6 , 20 , 3 ), inc_sec = (16 , 32 , 32 , 128 ), ** kwargs )
323- return _create_dpn ('dpn98' , pretrained = pretrained , ** model_kwargs )
355+ k_sec = (3 , 6 , 20 , 3 ), inc_sec = (16 , 32 , 32 , 128 ))
356+ return _create_dpn ('dpn98' , pretrained = pretrained , ** dict ( model_kwargs , ** kwargs ) )
324357
325358
326359@register_model
327360def dpn131 (pretrained = False , ** kwargs ):
328361 model_kwargs = dict (
329362 num_init_features = 128 , k_r = 160 , groups = 40 ,
330- k_sec = (4 , 8 , 28 , 3 ), inc_sec = (16 , 32 , 32 , 128 ), ** kwargs )
331- return _create_dpn ('dpn131' , pretrained = pretrained , ** model_kwargs )
363+ k_sec = (4 , 8 , 28 , 3 ), inc_sec = (16 , 32 , 32 , 128 ))
364+ return _create_dpn ('dpn131' , pretrained = pretrained , ** dict ( model_kwargs , ** kwargs ) )
332365
333366
334367@register_model
335368def dpn107 (pretrained = False , ** kwargs ):
336369 model_kwargs = dict (
337370 num_init_features = 128 , k_r = 200 , groups = 50 ,
338- k_sec = (4 , 8 , 20 , 3 ), inc_sec = (20 , 64 , 64 , 128 ), ** kwargs )
339- return _create_dpn ('dpn107' , pretrained = pretrained , ** model_kwargs )
371+ k_sec = (4 , 8 , 20 , 3 ), inc_sec = (20 , 64 , 64 , 128 ))
372+ return _create_dpn ('dpn107' , pretrained = pretrained , ** dict ( model_kwargs , ** kwargs ) )
0 commit comments