@@ -79,6 +79,7 @@ def __init__(
79
79
num_features : int = 1280 ,
80
80
in_chans : int = 3 ,
81
81
stem_size : int = 32 ,
82
+ stem_kernel_size : int = 3 ,
82
83
fix_stem : bool = False ,
83
84
output_stride : int = 32 ,
84
85
pad_type : str = '' ,
@@ -104,7 +105,7 @@ def __init__(
104
105
# Stem
105
106
if not fix_stem :
106
107
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 )
108
109
self .bn1 = norm_act_layer (stem_size , inplace = True )
109
110
110
111
# Middle stages (IR/ER/DS Blocks)
@@ -277,6 +278,7 @@ def __init__(
277
278
feature_location : str = 'bottleneck' ,
278
279
in_chans : int = 3 ,
279
280
stem_size : int = 32 ,
281
+ stem_kernel_size : int = 3 ,
280
282
fix_stem : bool = False ,
281
283
output_stride : int = 32 ,
282
284
pad_type : str = '' ,
@@ -299,7 +301,7 @@ def __init__(
299
301
# Stem
300
302
if not fix_stem :
301
303
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 )
303
305
self .bn1 = norm_act_layer (stem_size , inplace = True )
304
306
305
307
# Middle stages (IR/ER/DS Blocks)
@@ -478,6 +480,34 @@ def _gen_mnasnet_small(variant, channel_multiplier=1.0, pretrained=False, **kwar
478
480
return model
479
481
480
482
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
+
481
511
def _gen_mobilenet_v2 (
482
512
variant , channel_multiplier = 1.0 , depth_multiplier = 1.0 , fix_stem_head = False , pretrained = False , ** kwargs ):
483
513
""" Generate MobileNet-V2 network
@@ -1056,6 +1086,95 @@ def _gen_tinynet(
1056
1086
return model
1057
1087
1058
1088
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
+
1059
1178
def _cfg (url = '' , ** kwargs ):
1060
1179
return {
1061
1180
'url' : url , 'num_classes' : 1000 , 'input_size' : (3 , 224 , 224 ), 'pool_size' : (7 , 7 ),
@@ -1086,6 +1205,9 @@ def _cfg(url='', **kwargs):
1086
1205
url = 'https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mnasnet_small_lamb-aff75073.pth' ,
1087
1206
hf_hub_id = 'timm/' ),
1088
1207
1208
+ 'mobilenet_100.untrained' : _cfg (),
1209
+ 'mobilenet_125.untrained' : _cfg (),
1210
+
1089
1211
'mobilenetv2_035.untrained' : _cfg (),
1090
1212
'mobilenetv2_050.lamb_in1k' : _cfg (
1091
1213
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):
1395
1517
hf_hub_id = 'timm/' ,
1396
1518
input_size = (3 , 456 , 456 ), pool_size = (15 , 15 ), crop_pct = 0.934 ),
1397
1519
1398
-
1399
1520
'tf_efficientnet_es.in1k' : _cfg (
1400
1521
url = 'https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_es-ca1afbfe.pth' ,
1401
1522
hf_hub_id = 'timm/' ,
@@ -1584,6 +1705,23 @@ def _cfg(url='', **kwargs):
1584
1705
input_size = (3 , 106 , 106 ), pool_size = (4 , 4 ), # int(224 * 0.475)
1585
1706
url = 'https://github.com/huawei-noah/CV-Backbones/releases/download/v1.2.0/tinynet_e.pth' ,
1586
1707
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
+
1587
1725
})
1588
1726
1589
1727
@@ -1650,6 +1788,20 @@ def mnasnet_small(pretrained=False, **kwargs) -> EfficientNet:
1650
1788
return model
1651
1789
1652
1790
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
+
1653
1805
@register_model
1654
1806
def mobilenetv2_035 (pretrained = False , ** kwargs ) -> EfficientNet :
1655
1807
""" MobileNet V2 w/ 0.35 channel multiplier """
@@ -2510,6 +2662,41 @@ def tinynet_e(pretrained=False, **kwargs) -> EfficientNet:
2510
2662
return model
2511
2663
2512
2664
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
+
2513
2700
register_model_deprecations (__name__ , {
2514
2701
'tf_efficientnet_b0_ap' : 'tf_efficientnet_b0.ap_in1k' ,
2515
2702
'tf_efficientnet_b1_ap' : 'tf_efficientnet_b1.ap_in1k' ,
0 commit comments