@@ -79,6 +79,7 @@ def __init__(
7979 num_features : int = 1280 ,
8080 in_chans : int = 3 ,
8181 stem_size : int = 32 ,
82+ stem_kernel_size : int = 3 ,
8283 fix_stem : bool = False ,
8384 output_stride : int = 32 ,
8485 pad_type : str = '' ,
@@ -104,7 +105,7 @@ def __init__(
104105 # Stem
105106 if not fix_stem :
106107 stem_size = round_chs_fn (stem_size )
107- self .conv_stem = create_conv2d (in_chans , stem_size , 3 , stride = 2 , padding = pad_type )
108+ self .conv_stem = create_conv2d (in_chans , stem_size , stem_kernel_size , stride = 2 , padding = pad_type )
108109 self .bn1 = norm_act_layer (stem_size , inplace = True )
109110
110111 # Middle stages (IR/ER/DS Blocks)
@@ -277,6 +278,7 @@ def __init__(
277278 feature_location : str = 'bottleneck' ,
278279 in_chans : int = 3 ,
279280 stem_size : int = 32 ,
281+ stem_kernel_size : int = 3 ,
280282 fix_stem : bool = False ,
281283 output_stride : int = 32 ,
282284 pad_type : str = '' ,
@@ -299,7 +301,7 @@ def __init__(
299301 # Stem
300302 if not fix_stem :
301303 stem_size = round_chs_fn (stem_size )
302- self .conv_stem = create_conv2d (in_chans , stem_size , 3 , stride = 2 , padding = pad_type )
304+ self .conv_stem = create_conv2d (in_chans , stem_size , stem_kernel_size , stride = 2 , padding = pad_type )
303305 self .bn1 = norm_act_layer (stem_size , inplace = True )
304306
305307 # Middle stages (IR/ER/DS Blocks)
@@ -478,6 +480,34 @@ def _gen_mnasnet_small(variant, channel_multiplier=1.0, pretrained=False, **kwar
478480 return model
479481
480482
483+ def _gen_mobilenet_v1 (
484+ variant , channel_multiplier = 1.0 , depth_multiplier = 1.0 , fix_stem_head = False , pretrained = False , ** kwargs ):
485+ """
486+ Ref impl: https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet_v2.py
487+ Paper: https://arxiv.org/abs/1801.04381
488+ """
489+ arch_def = [
490+ ['dsa_r1_k3_s1_c64' ],
491+ ['dsa_r2_k3_s2_c128' ],
492+ ['dsa_r2_k3_s2_c256' ],
493+ ['dsa_r6_k3_s2_c512' ],
494+ ['dsa_r2_k3_s2_c1024' ],
495+ ]
496+ round_chs_fn = partial (round_channels , multiplier = channel_multiplier )
497+ model_kwargs = dict (
498+ block_args = decode_arch_def (arch_def , depth_multiplier = depth_multiplier , fix_first_last = fix_stem_head ),
499+ num_features = 1024 if fix_stem_head else max (1024 , round_chs_fn (1024 )),
500+ stem_size = 32 ,
501+ fix_stem = fix_stem_head ,
502+ round_chs_fn = round_chs_fn ,
503+ norm_layer = kwargs .pop ('norm_layer' , None ) or partial (nn .BatchNorm2d , ** resolve_bn_args (kwargs )),
504+ act_layer = resolve_act_layer (kwargs , 'relu6' ),
505+ ** kwargs
506+ )
507+ model = _create_effnet (variant , pretrained , ** model_kwargs )
508+ return model
509+
510+
481511def _gen_mobilenet_v2 (
482512 variant , channel_multiplier = 1.0 , depth_multiplier = 1.0 , fix_stem_head = False , pretrained = False , ** kwargs ):
483513 """ Generate MobileNet-V2 network
@@ -1056,6 +1086,95 @@ def _gen_tinynet(
10561086 return model
10571087
10581088
1089+ def _gen_mobilenet_edgetpu (variant , channel_multiplier = 1.0 , depth_multiplier = 1.0 , pretrained = False , ** kwargs ):
1090+ """
1091+ Based on definitions in: https://github.com/tensorflow/models/tree/d2427a562f401c9af118e47af2f030a0a5599f55/official/projects/edgetpu/vision
1092+ """
1093+ if 'edgetpu_v2' in variant :
1094+ stem_size = 64
1095+ stem_kernel_size = 5
1096+ group_size = 64
1097+ num_features = 1280
1098+ act_layer = resolve_act_layer (kwargs , 'relu' )
1099+
1100+ def _arch_def (chs : List [int ], group_size : int ):
1101+ return [
1102+ # stage 0, 112x112 in
1103+ [f'cn_r1_k1_s1_c{ chs [0 ]} ' ], # NOTE with expansion==1, official impl block ends just 1x1 pwl
1104+ # stage 1, 112x112 in
1105+ [f'er_r1_k3_s2_e8_c{ chs [1 ]} ' , f'er_r1_k3_s1_e4_gs{ group_size } _c{ chs [1 ]} ' ],
1106+ # stage 2, 56x56 in
1107+ [
1108+ f'er_r1_k3_s2_e8_c{ chs [2 ]} ' ,
1109+ f'er_r1_k3_s1_e4_gs{ group_size } _c{ chs [2 ]} ' ,
1110+ f'er_r1_k3_s1_e4_c{ chs [2 ]} ' ,
1111+ f'er_r1_k3_s1_e4_gs{ group_size } _c{ chs [2 ]} ' ,
1112+ ],
1113+ # stage 3, 28x28 in
1114+ [f'er_r1_k3_s2_e8_c{ chs [3 ]} ' , f'ir_r3_k3_s1_e4_c{ chs [3 ]} ' ],
1115+ # stage 4, 14x14in
1116+ [f'ir_r1_k3_s1_e8_c{ chs [4 ]} ' , f'ir_r3_k3_s1_e4_c{ chs [4 ]} ' ],
1117+ # stage 5, 14x14in
1118+ [f'ir_r1_k3_s2_e8_c{ chs [5 ]} ' , f'ir_r3_k3_s1_e4_c{ chs [5 ]} ' ],
1119+ # stage 6, 7x7 in
1120+ [f'ir_r1_k3_s1_e8_c{ chs [6 ]} ' ],
1121+ ]
1122+
1123+ if 'edgetpu_v2_xs' in variant :
1124+ stem_size = 32
1125+ stem_kernel_size = 3
1126+ channels = [16 , 32 , 48 , 96 , 144 , 160 , 192 ]
1127+ elif 'edgetpu_v2_s' in variant :
1128+ channels = [24 , 48 , 64 , 128 , 160 , 192 , 256 ]
1129+ elif 'edgetpu_v2_m' in variant :
1130+ channels = [32 , 64 , 80 , 160 , 192 , 240 , 320 ]
1131+ num_features = 1344
1132+ elif 'edgetpu_v2_l' in variant :
1133+ stem_kernel_size = 7
1134+ group_size = 128
1135+ channels = [32 , 64 , 96 , 192 , 240 , 256 , 384 ]
1136+ num_features = 1408
1137+ else :
1138+ assert False
1139+
1140+ arch_def = _arch_def (channels , group_size )
1141+ else :
1142+ # v1
1143+ stem_size = 32
1144+ stem_kernel_size = 3
1145+ num_features = 1280
1146+ act_layer = resolve_act_layer (kwargs , 'relu' )
1147+ arch_def = [
1148+ # stage 0, 112x112 in
1149+ ['cn_r1_k1_s1_c16' ],
1150+ # stage 1, 112x112 in
1151+ ['er_r1_k3_s2_e8_c32' , 'er_r3_k3_s1_e4_c32' ],
1152+ # stage 2, 56x56 in
1153+ ['er_r1_k3_s2_e8_c48' , 'er_r3_k3_s1_e4_c48' ],
1154+ # stage 3, 28x28 in
1155+ ['ir_r1_k3_s2_e8_c96' , 'ir_r3_k3_s1_e4_c96' ],
1156+ # stage 4, 14x14in
1157+ ['ir_r1_k3_s1_e8_c96_noskip' , 'ir_r3_k3_s1_e4_c96' ],
1158+ # stage 5, 14x14in
1159+ ['ir_r1_k5_s2_e8_c160' , 'ir_r3_k5_s1_e4_c160' ],
1160+ # stage 6, 7x7 in
1161+ ['ir_r1_k3_s1_e8_c192' ],
1162+ ]
1163+
1164+ model_kwargs = dict (
1165+ block_args = decode_arch_def (arch_def , depth_multiplier ),
1166+ num_features = num_features ,
1167+ stem_size = stem_size ,
1168+ stem_kernel_size = stem_kernel_size ,
1169+ round_chs_fn = partial (round_channels , multiplier = channel_multiplier ),
1170+ norm_layer = kwargs .pop ('norm_layer' , None ) or partial (nn .BatchNorm2d , ** resolve_bn_args (kwargs )),
1171+ act_layer = act_layer ,
1172+ ** kwargs ,
1173+ )
1174+ model = _create_effnet (variant , pretrained , ** model_kwargs )
1175+ return model
1176+
1177+
10591178def _cfg (url = '' , ** kwargs ):
10601179 return {
10611180 'url' : url , 'num_classes' : 1000 , 'input_size' : (3 , 224 , 224 ), 'pool_size' : (7 , 7 ),
@@ -1086,6 +1205,9 @@ def _cfg(url='', **kwargs):
10861205 url = 'https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mnasnet_small_lamb-aff75073.pth' ,
10871206 hf_hub_id = 'timm/' ),
10881207
1208+ 'mobilenet_100.untrained' : _cfg (),
1209+ 'mobilenet_125.untrained' : _cfg (),
1210+
10891211 'mobilenetv2_035.untrained' : _cfg (),
10901212 'mobilenetv2_050.lamb_in1k' : _cfg (
10911213 url = 'https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv2_050-3d30d450.pth' ,
@@ -1395,7 +1517,6 @@ def _cfg(url='', **kwargs):
13951517 hf_hub_id = 'timm/' ,
13961518 input_size = (3 , 456 , 456 ), pool_size = (15 , 15 ), crop_pct = 0.934 ),
13971519
1398-
13991520 'tf_efficientnet_es.in1k' : _cfg (
14001521 url = 'https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_es-ca1afbfe.pth' ,
14011522 hf_hub_id = 'timm/' ,
@@ -1584,6 +1705,23 @@ def _cfg(url='', **kwargs):
15841705 input_size = (3 , 106 , 106 ), pool_size = (4 , 4 ), # int(224 * 0.475)
15851706 url = 'https://github.com/huawei-noah/CV-Backbones/releases/download/v1.2.0/tinynet_e.pth' ,
15861707 hf_hub_id = 'timm/' ),
1708+
1709+ 'mobilenet_edgetpu_100.untrained' : _cfg (
1710+ # hf_hub_id='timm/',
1711+ input_size = (3 , 224 , 224 ), crop_pct = 0.9 ),
1712+ 'mobilenet_edgetpu_v2_xs.untrained' : _cfg (
1713+ # hf_hub_id='timm/',
1714+ input_size = (3 , 224 , 224 ), crop_pct = 0.9 ),
1715+ 'mobilenet_edgetpu_v2_s.untrained' : _cfg (
1716+ #hf_hub_id='timm/',
1717+ input_size = (3 , 224 , 224 ), crop_pct = 0.9 ),
1718+ 'mobilenet_edgetpu_v2_m.untrained' : _cfg (
1719+ #hf_hub_id='timm/',
1720+ input_size = (3 , 224 , 224 ), crop_pct = 0.9 ),
1721+ 'mobilenet_edgetpu_v2_l.untrained' : _cfg (
1722+ #hf_hub_id='timm/',
1723+ input_size = (3 , 224 , 224 ), crop_pct = 0.9 ),
1724+
15871725})
15881726
15891727
@@ -1650,6 +1788,20 @@ def mnasnet_small(pretrained=False, **kwargs) -> EfficientNet:
16501788 return model
16511789
16521790
1791+ @register_model
1792+ def mobilenet_100 (pretrained = False , ** kwargs ) -> EfficientNet :
1793+ """ MobileNet V1 """
1794+ model = _gen_mobilenet_v1 ('mobilenet_100' , 1.0 , pretrained = pretrained , ** kwargs )
1795+ return model
1796+
1797+
1798+ @register_model
1799+ def mobilenet_125 (pretrained = False , ** kwargs ) -> EfficientNet :
1800+ """ MobileNet V1 """
1801+ model = _gen_mobilenet_v1 ('mobilenet_125' , 1.25 , pretrained = pretrained , ** kwargs )
1802+ return model
1803+
1804+
16531805@register_model
16541806def mobilenetv2_035 (pretrained = False , ** kwargs ) -> EfficientNet :
16551807 """ MobileNet V2 w/ 0.35 channel multiplier """
@@ -2510,6 +2662,41 @@ def tinynet_e(pretrained=False, **kwargs) -> EfficientNet:
25102662 return model
25112663
25122664
2665+ @register_model
2666+ def mobilenet_edgetpu_100 (pretrained = False , ** kwargs ) -> EfficientNet :
2667+ """ MobileNet-EdgeTPU-v1 100. """
2668+ model = _gen_mobilenet_edgetpu ('mobilenet_edgetpu_100' , pretrained = pretrained , ** kwargs )
2669+ return model
2670+
2671+
2672+ @register_model
2673+ def mobilenet_edgetpu_v2_xs (pretrained = False , ** kwargs ) -> EfficientNet :
2674+ """ MobileNet-EdgeTPU-v2 Extra Small. """
2675+ model = _gen_mobilenet_edgetpu ('mobilenet_edgetpu_v2_xs' , pretrained = pretrained , ** kwargs )
2676+ return model
2677+
2678+
2679+ @register_model
2680+ def mobilenet_edgetpu_v2_s (pretrained = False , ** kwargs ) -> EfficientNet :
2681+ """ MobileNet-EdgeTPU-v2 Small. """
2682+ model = _gen_mobilenet_edgetpu ('mobilenet_edgetpu_v2_s' , pretrained = pretrained , ** kwargs )
2683+ return model
2684+
2685+
2686+ @register_model
2687+ def mobilenet_edgetpu_v2_m (pretrained = False , ** kwargs ) -> EfficientNet :
2688+ """ MobileNet-EdgeTPU-v2 Medium. """
2689+ model = _gen_mobilenet_edgetpu ('mobilenet_edgetpu_v2_m' , pretrained = pretrained , ** kwargs )
2690+ return model
2691+
2692+
2693+ @register_model
2694+ def mobilenet_edgetpu_v2_l (pretrained = False , ** kwargs ) -> EfficientNet :
2695+ """ MobileNet-EdgeTPU-v2 Large. """
2696+ model = _gen_mobilenet_edgetpu ('mobilenet_edgetpu_v2_l' , pretrained = pretrained , ** kwargs )
2697+ return model
2698+
2699+
25132700register_model_deprecations (__name__ , {
25142701 'tf_efficientnet_b0_ap' : 'tf_efficientnet_b0.ap_in1k' ,
25152702 'tf_efficientnet_b1_ap' : 'tf_efficientnet_b1.ap_in1k' ,
0 commit comments