Skip to content

Commit fb13e63

Browse files
authored
Merge pull request #2203 from huggingface/more_mobile
Add mobilenet edgetpu defs for exp, add ol mobilenet v1 back for comp…
2 parents 427b3e4 + a0bb5b4 commit fb13e63

File tree

3 files changed

+193
-5
lines changed

3 files changed

+193
-5
lines changed

timm/models/_efficientnet_blocks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,7 @@ def __init__(
662662
mid_chs = make_divisible(force_in_chs * exp_ratio)
663663
else:
664664
mid_chs = make_divisible(in_chs * exp_ratio)
665-
groups = num_groups(group_size, in_chs)
665+
groups = num_groups(group_size, mid_chs) # NOTE: Using out_chs of conv_exp for groups calc
666666
self.has_skip = (in_chs == out_chs and stride == 1) and not noskip
667667
use_aa = aa_layer is not None and stride > 1 # FIXME handle dilation
668668

timm/models/_efficientnet_builder.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,9 @@ def _decode_block_str(block_str):
221221
))
222222
else:
223223
assert False, 'Unknown block type (%s)' % block_type
224+
224225
if 'gs' in options:
225-
block_args['group_size'] = options['gs']
226+
block_args['group_size'] = int(options['gs'])
226227

227228
return block_args, num_repeat
228229

timm/models/efficientnet.py

Lines changed: 190 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
481511
def _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+
10591178
def _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
16541806
def 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+
25132700
register_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

Comments
 (0)