efficientnet.py 123 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973
  1. """ The EfficientNet Family in PyTorch
  2. An implementation of EfficienNet that covers variety of related models with efficient architectures:
  3. * EfficientNet-V2
  4. - `EfficientNetV2: Smaller Models and Faster Training` - https://arxiv.org/abs/2104.00298
  5. * EfficientNet (B0-B8, L2 + Tensorflow pretrained AutoAug/RandAug/AdvProp/NoisyStudent weight ports)
  6. - EfficientNet: Rethinking Model Scaling for CNNs - https://arxiv.org/abs/1905.11946
  7. - CondConv: Conditionally Parameterized Convolutions for Efficient Inference - https://arxiv.org/abs/1904.04971
  8. - Adversarial Examples Improve Image Recognition - https://arxiv.org/abs/1911.09665
  9. - Self-training with Noisy Student improves ImageNet classification - https://arxiv.org/abs/1911.04252
  10. * MixNet (Small, Medium, and Large)
  11. - MixConv: Mixed Depthwise Convolutional Kernels - https://arxiv.org/abs/1907.09595
  12. * MNasNet B1, A1 (SE), Small
  13. - MnasNet: Platform-Aware Neural Architecture Search for Mobile - https://arxiv.org/abs/1807.11626
  14. * FBNet-C
  15. - FBNet: Hardware-Aware Efficient ConvNet Design via Differentiable NAS - https://arxiv.org/abs/1812.03443
  16. * Single-Path NAS Pixel1
  17. - Single-Path NAS: Designing Hardware-Efficient ConvNets - https://arxiv.org/abs/1904.02877
  18. * TinyNet
  19. - Model Rubik's Cube: Twisting Resolution, Depth and Width for TinyNets - https://arxiv.org/abs/2010.14819
  20. - Definitions & weights borrowed from https://github.com/huawei-noah/CV-Backbones/tree/master/tinynet_pytorch
  21. * And likely more...
  22. The majority of the above models (EfficientNet*, MixNet, MnasNet) and original weights were made available
  23. by Mingxing Tan, Quoc Le, and other members of their Google Brain team. Thanks for consistently releasing
  24. the models and weights open source!
  25. Hacked together by / Copyright 2019, Ross Wightman
  26. """
  27. from functools import partial
  28. from typing import Callable, Dict, List, Optional, Tuple, Union
  29. import torch
  30. import torch.nn as nn
  31. import torch.nn.functional as F
  32. from timm.data import IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD, IMAGENET_INCEPTION_MEAN, IMAGENET_INCEPTION_STD
  33. from timm.layers import create_conv2d, create_classifier, get_norm_act_layer, LayerType, \
  34. GroupNormAct, LayerNormAct2d, EvoNorm2dS0
  35. from ._builder import build_model_with_cfg, pretrained_cfg_for_features
  36. from ._efficientnet_blocks import SqueezeExcite
  37. from ._efficientnet_builder import BlockArgs, EfficientNetBuilder, decode_arch_def, efficientnet_init_weights, \
  38. round_channels, resolve_bn_args, resolve_act_layer, BN_EPS_TF_DEFAULT
  39. from ._features import FeatureInfo, FeatureHooks, feature_take_indices
  40. from ._manipulate import checkpoint_seq, checkpoint
  41. from ._registry import generate_default_cfgs, register_model, register_model_deprecations
  42. __all__ = ['EfficientNet', 'EfficientNetFeatures']
  43. class EfficientNet(nn.Module):
  44. """EfficientNet model architecture.
  45. A flexible and performant PyTorch implementation of efficient network architectures, including:
  46. * EfficientNet-V2 Small, Medium, Large, XL & B0-B3
  47. * EfficientNet B0-B8, L2
  48. * EfficientNet-EdgeTPU
  49. * EfficientNet-CondConv
  50. * MixNet S, M, L, XL
  51. * MnasNet A1, B1, and small
  52. * MobileNet-V2
  53. * FBNet C
  54. * Single-Path NAS Pixel1
  55. * TinyNet
  56. References:
  57. - EfficientNet: https://arxiv.org/abs/1905.11946
  58. - EfficientNetV2: https://arxiv.org/abs/2104.00298
  59. - MixNet: https://arxiv.org/abs/1907.09595
  60. - MnasNet: https://arxiv.org/abs/1807.11626
  61. """
  62. def __init__(
  63. self,
  64. block_args: BlockArgs,
  65. num_classes: int = 1000,
  66. num_features: int = 1280,
  67. in_chans: int = 3,
  68. stem_size: int = 32,
  69. stem_kernel_size: int = 3,
  70. fix_stem: bool = False,
  71. output_stride: int = 32,
  72. pad_type: str = '',
  73. act_layer: Optional[LayerType] = None,
  74. norm_layer: Optional[LayerType] = None,
  75. aa_layer: Optional[LayerType] = None,
  76. se_layer: Optional[LayerType] = None,
  77. round_chs_fn: Callable = round_channels,
  78. drop_rate: float = 0.,
  79. drop_path_rate: float = 0.,
  80. global_pool: str = 'avg',
  81. device=None,
  82. dtype=None,
  83. ) -> None:
  84. """Initialize EfficientNet model.
  85. Args:
  86. block_args: Arguments for building blocks.
  87. num_classes: Number of classifier classes.
  88. num_features: Number of features for penultimate layer.
  89. in_chans: Number of input channels.
  90. stem_size: Number of output channels in stem.
  91. stem_kernel_size: Kernel size for stem convolution.
  92. fix_stem: If True, don't scale stem channels.
  93. output_stride: Output stride of network.
  94. pad_type: Padding type.
  95. act_layer: Activation layer class.
  96. norm_layer: Normalization layer class.
  97. aa_layer: Anti-aliasing layer class.
  98. se_layer: Squeeze-and-excitation layer class.
  99. round_chs_fn: Channel rounding function.
  100. drop_rate: Dropout rate for classifier.
  101. drop_path_rate: Drop path rate for stochastic depth.
  102. global_pool: Global pooling type.
  103. """
  104. super().__init__()
  105. dd = {'device': device, 'dtype': dtype}
  106. act_layer = act_layer or nn.ReLU
  107. norm_layer = norm_layer or nn.BatchNorm2d
  108. norm_act_layer = get_norm_act_layer(norm_layer, act_layer)
  109. se_layer = se_layer or SqueezeExcite
  110. self.num_classes = num_classes
  111. self.in_chans = in_chans
  112. self.drop_rate = drop_rate
  113. self.grad_checkpointing = False
  114. # Stem
  115. if not fix_stem:
  116. stem_size = round_chs_fn(stem_size)
  117. self.conv_stem = create_conv2d(in_chans, stem_size, stem_kernel_size, stride=2, padding=pad_type, **dd)
  118. self.bn1 = norm_act_layer(stem_size, inplace=True, **dd)
  119. # Middle stages (IR/ER/DS Blocks)
  120. builder = EfficientNetBuilder(
  121. output_stride=output_stride,
  122. pad_type=pad_type,
  123. round_chs_fn=round_chs_fn,
  124. act_layer=act_layer,
  125. norm_layer=norm_layer,
  126. aa_layer=aa_layer,
  127. se_layer=se_layer,
  128. drop_path_rate=drop_path_rate,
  129. **dd,
  130. )
  131. self.blocks = nn.Sequential(*builder(stem_size, block_args))
  132. self.feature_info = builder.features
  133. self.stage_ends = [f['stage'] for f in self.feature_info]
  134. head_chs = builder.in_chs
  135. # Head + Pooling
  136. if num_features > 0:
  137. self.conv_head = create_conv2d(head_chs, num_features, 1, padding=pad_type, **dd)
  138. self.bn2 = norm_act_layer(num_features, inplace=True, **dd)
  139. self.num_features = self.head_hidden_size = num_features
  140. else:
  141. self.conv_head = nn.Identity()
  142. self.bn2 = nn.Identity()
  143. self.num_features = self.head_hidden_size = head_chs
  144. self.global_pool, self.classifier = create_classifier(
  145. self.num_features,
  146. self.num_classes,
  147. pool_type=global_pool,
  148. **dd,
  149. )
  150. efficientnet_init_weights(self)
  151. def as_sequential(self) -> nn.Sequential:
  152. """Convert model to sequential for feature extraction."""
  153. layers = [self.conv_stem, self.bn1]
  154. layers.extend(self.blocks)
  155. layers.extend([self.conv_head, self.bn2, self.global_pool])
  156. layers.extend([nn.Dropout(self.drop_rate), self.classifier])
  157. return nn.Sequential(*layers)
  158. @torch.jit.ignore
  159. def group_matcher(self, coarse: bool = False) -> Dict[str, Union[str, List]]:
  160. """Create regex patterns for parameter groups.
  161. Args:
  162. coarse: Use coarse (stage-level) grouping.
  163. Returns:
  164. Dictionary mapping group names to regex patterns.
  165. """
  166. return dict(
  167. stem=r'^conv_stem|bn1',
  168. blocks=[
  169. (r'^blocks\.(\d+)' if coarse else r'^blocks\.(\d+)\.(\d+)', None),
  170. (r'conv_head|bn2', (99999,))
  171. ]
  172. )
  173. @torch.jit.ignore
  174. def set_grad_checkpointing(self, enable: bool = True) -> None:
  175. """Enable or disable gradient checkpointing.
  176. Args:
  177. enable: Whether to enable gradient checkpointing.
  178. """
  179. self.grad_checkpointing = enable
  180. @torch.jit.ignore
  181. def get_classifier(self) -> nn.Module:
  182. """Get the classifier module."""
  183. return self.classifier
  184. def reset_classifier(self, num_classes: int, global_pool: str = 'avg') -> None:
  185. """Reset the classifier head.
  186. Args:
  187. num_classes: Number of classes for new classifier.
  188. global_pool: Global pooling type.
  189. """
  190. self.num_classes = num_classes
  191. self.global_pool, self.classifier = create_classifier(
  192. self.num_features, self.num_classes, pool_type=global_pool)
  193. def forward_intermediates(
  194. self,
  195. x: torch.Tensor,
  196. indices: Optional[Union[int, List[int]]] = None,
  197. norm: bool = False,
  198. stop_early: bool = False,
  199. output_fmt: str = 'NCHW',
  200. intermediates_only: bool = False,
  201. extra_blocks: bool = False,
  202. ) -> Union[List[torch.Tensor], Tuple[torch.Tensor, List[torch.Tensor]]]:
  203. """Forward features that returns intermediates.
  204. Args:
  205. x: Input image tensor.
  206. indices: Take last n blocks if int, all if None, select matching indices if sequence.
  207. norm: Apply norm layer to compatible intermediates.
  208. stop_early: Stop iterating over blocks when last desired intermediate hit.
  209. output_fmt: Shape of intermediate feature outputs.
  210. intermediates_only: Only return intermediate features.
  211. extra_blocks: Include outputs of all blocks and head conv in output, does not align with feature_info.
  212. Returns:
  213. List of intermediate features or tuple of (final features, intermediates).
  214. """
  215. assert output_fmt in ('NCHW',), 'Output shape must be NCHW.'
  216. intermediates = []
  217. if extra_blocks:
  218. take_indices, max_index = feature_take_indices(len(self.blocks) + 1, indices)
  219. else:
  220. take_indices, max_index = feature_take_indices(len(self.stage_ends), indices)
  221. take_indices = [self.stage_ends[i] for i in take_indices]
  222. max_index = self.stage_ends[max_index]
  223. # forward pass
  224. feat_idx = 0 # stem is index 0
  225. x = self.conv_stem(x)
  226. x = self.bn1(x)
  227. if feat_idx in take_indices:
  228. intermediates.append(x)
  229. if torch.jit.is_scripting() or not stop_early: # can't slice blocks in torchscript
  230. blocks = self.blocks
  231. else:
  232. blocks = self.blocks[:max_index]
  233. for feat_idx, blk in enumerate(blocks, start=1):
  234. if self.grad_checkpointing and not torch.jit.is_scripting():
  235. x = checkpoint_seq(blk, x)
  236. else:
  237. x = blk(x)
  238. if feat_idx in take_indices:
  239. intermediates.append(x)
  240. if intermediates_only:
  241. return intermediates
  242. if feat_idx == self.stage_ends[-1]:
  243. x = self.conv_head(x)
  244. x = self.bn2(x)
  245. return x, intermediates
  246. def prune_intermediate_layers(
  247. self,
  248. indices: Union[int, List[int]] = 1,
  249. prune_norm: bool = False,
  250. prune_head: bool = True,
  251. extra_blocks: bool = False,
  252. ) -> List[int]:
  253. """Prune layers not required for specified intermediates.
  254. Args:
  255. indices: Indices of intermediate layers to keep.
  256. prune_norm: Whether to prune normalization layers.
  257. prune_head: Whether to prune the classifier head.
  258. extra_blocks: Include all blocks in indexing.
  259. Returns:
  260. List of indices that were kept.
  261. """
  262. if extra_blocks:
  263. take_indices, max_index = feature_take_indices(len(self.blocks) + 1, indices)
  264. else:
  265. take_indices, max_index = feature_take_indices(len(self.stage_ends), indices)
  266. max_index = self.stage_ends[max_index]
  267. self.blocks = self.blocks[:max_index] # truncate blocks w/ stem as idx 0
  268. if prune_norm or max_index < len(self.blocks):
  269. self.conv_head = nn.Identity()
  270. self.bn2 = nn.Identity()
  271. if prune_head:
  272. self.reset_classifier(0, '')
  273. return take_indices
  274. def forward_features(self, x: torch.Tensor) -> torch.Tensor:
  275. """Forward pass through feature extraction layers."""
  276. x = self.conv_stem(x)
  277. x = self.bn1(x)
  278. if self.grad_checkpointing and not torch.jit.is_scripting():
  279. x = checkpoint_seq(self.blocks, x, flatten=True)
  280. else:
  281. x = self.blocks(x)
  282. x = self.conv_head(x)
  283. x = self.bn2(x)
  284. return x
  285. def forward_head(self, x: torch.Tensor, pre_logits: bool = False) -> torch.Tensor:
  286. """Forward pass through classifier head.
  287. Args:
  288. x: Feature tensor.
  289. pre_logits: Return features before final classifier.
  290. Returns:
  291. Output tensor.
  292. """
  293. x = self.global_pool(x)
  294. if self.drop_rate > 0.:
  295. x = F.dropout(x, p=self.drop_rate, training=self.training)
  296. return x if pre_logits else self.classifier(x)
  297. def forward(self, x: torch.Tensor) -> torch.Tensor:
  298. """Forward pass."""
  299. x = self.forward_features(x)
  300. x = self.forward_head(x)
  301. return x
  302. class EfficientNetFeatures(nn.Module):
  303. """ EfficientNet Feature Extractor
  304. A work-in-progress feature extraction module for EfficientNet, to use as a backbone for segmentation
  305. and object detection models.
  306. """
  307. def __init__(
  308. self,
  309. block_args: BlockArgs,
  310. out_indices: Tuple[int, ...] = (0, 1, 2, 3, 4),
  311. feature_location: str = 'bottleneck',
  312. in_chans: int = 3,
  313. stem_size: int = 32,
  314. stem_kernel_size: int = 3,
  315. fix_stem: bool = False,
  316. output_stride: int = 32,
  317. pad_type: str = '',
  318. act_layer: Optional[LayerType] = None,
  319. norm_layer: Optional[LayerType] = None,
  320. aa_layer: Optional[LayerType] = None,
  321. se_layer: Optional[LayerType] = None,
  322. round_chs_fn: Callable = round_channels,
  323. drop_rate: float = 0.,
  324. drop_path_rate: float = 0.,
  325. device=None,
  326. dtype=None,
  327. ):
  328. super().__init__()
  329. dd = {'device': device, 'dtype': dtype}
  330. act_layer = act_layer or nn.ReLU
  331. norm_layer = norm_layer or nn.BatchNorm2d
  332. norm_act_layer = get_norm_act_layer(norm_layer, act_layer)
  333. se_layer = se_layer or SqueezeExcite
  334. self.in_chans = in_chans
  335. self.drop_rate = drop_rate
  336. self.grad_checkpointing = False
  337. # Stem
  338. if not fix_stem:
  339. stem_size = round_chs_fn(stem_size)
  340. self.conv_stem = create_conv2d(in_chans, stem_size, stem_kernel_size, stride=2, padding=pad_type, **dd)
  341. self.bn1 = norm_act_layer(stem_size, inplace=True, **dd)
  342. # Middle stages (IR/ER/DS Blocks)
  343. builder = EfficientNetBuilder(
  344. output_stride=output_stride,
  345. pad_type=pad_type,
  346. round_chs_fn=round_chs_fn,
  347. act_layer=act_layer,
  348. norm_layer=norm_layer,
  349. aa_layer=aa_layer,
  350. se_layer=se_layer,
  351. drop_path_rate=drop_path_rate,
  352. feature_location=feature_location,
  353. **dd,
  354. )
  355. self.blocks = nn.Sequential(*builder(stem_size, block_args))
  356. self.feature_info = FeatureInfo(builder.features, out_indices)
  357. self._stage_out_idx = {f['stage']: f['index'] for f in self.feature_info.get_dicts()}
  358. efficientnet_init_weights(self)
  359. # Register feature extraction hooks with FeatureHooks helper
  360. self.feature_hooks = None
  361. if feature_location != 'bottleneck':
  362. hooks = self.feature_info.get_dicts(keys=('module', 'hook_type'))
  363. self.feature_hooks = FeatureHooks(hooks, self.named_modules())
  364. @torch.jit.ignore
  365. def set_grad_checkpointing(self, enable: bool = True) -> None:
  366. """Enable or disable gradient checkpointing.
  367. Args:
  368. enable: Whether to enable gradient checkpointing.
  369. """
  370. self.grad_checkpointing = enable
  371. def forward(self, x) -> List[torch.Tensor]:
  372. x = self.conv_stem(x)
  373. x = self.bn1(x)
  374. if self.feature_hooks is None:
  375. features = []
  376. if 0 in self._stage_out_idx:
  377. features.append(x) # add stem out
  378. for i, b in enumerate(self.blocks):
  379. if self.grad_checkpointing and not torch.jit.is_scripting():
  380. x = checkpoint(b, x)
  381. else:
  382. x = b(x)
  383. if i + 1 in self._stage_out_idx:
  384. features.append(x)
  385. return features
  386. else:
  387. self.blocks(x)
  388. out = self.feature_hooks.get_output(x.device)
  389. return list(out.values())
  390. def _create_effnet(variant, pretrained=False, **kwargs):
  391. features_mode = ''
  392. model_cls = EfficientNet
  393. kwargs_filter = None
  394. if kwargs.pop('features_only', False):
  395. if 'feature_cfg' in kwargs or 'feature_cls' in kwargs:
  396. features_mode = 'cfg'
  397. else:
  398. kwargs_filter = ('num_classes', 'num_features', 'head_conv', 'global_pool')
  399. model_cls = EfficientNetFeatures
  400. features_mode = 'cls'
  401. pretrained_strict = kwargs.pop('pretrained_strict', True)
  402. model = build_model_with_cfg(
  403. model_cls,
  404. variant,
  405. pretrained,
  406. features_only=features_mode == 'cfg',
  407. pretrained_strict=pretrained_strict and features_mode != 'cls',
  408. kwargs_filter=kwargs_filter,
  409. **kwargs,
  410. )
  411. if features_mode == 'cls':
  412. model.pretrained_cfg = model.default_cfg = pretrained_cfg_for_features(model.pretrained_cfg)
  413. return model
  414. def _gen_mnasnet_a1(variant, channel_multiplier=1.0, pretrained=False, **kwargs):
  415. """Creates a mnasnet-a1 model.
  416. Ref impl: https://github.com/tensorflow/tpu/tree/master/models/official/mnasnet
  417. Paper: https://arxiv.org/pdf/1807.11626.pdf.
  418. Args:
  419. channel_multiplier: multiplier to number of channels per layer.
  420. """
  421. arch_def = [
  422. # stage 0, 112x112 in
  423. ['ds_r1_k3_s1_e1_c16_noskip'],
  424. # stage 1, 112x112 in
  425. ['ir_r2_k3_s2_e6_c24'],
  426. # stage 2, 56x56 in
  427. ['ir_r3_k5_s2_e3_c40_se0.25'],
  428. # stage 3, 28x28 in
  429. ['ir_r4_k3_s2_e6_c80'],
  430. # stage 4, 14x14in
  431. ['ir_r2_k3_s1_e6_c112_se0.25'],
  432. # stage 5, 14x14in
  433. ['ir_r3_k5_s2_e6_c160_se0.25'],
  434. # stage 6, 7x7 in
  435. ['ir_r1_k3_s1_e6_c320'],
  436. ]
  437. model_kwargs = dict(
  438. block_args=decode_arch_def(arch_def),
  439. stem_size=32,
  440. round_chs_fn=partial(round_channels, multiplier=channel_multiplier),
  441. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  442. **kwargs
  443. )
  444. model = _create_effnet(variant, pretrained, **model_kwargs)
  445. return model
  446. def _gen_mnasnet_b1(variant, channel_multiplier=1.0, pretrained=False, **kwargs):
  447. """Creates a mnasnet-b1 model.
  448. Ref impl: https://github.com/tensorflow/tpu/tree/master/models/official/mnasnet
  449. Paper: https://arxiv.org/pdf/1807.11626.pdf.
  450. Args:
  451. channel_multiplier: multiplier to number of channels per layer.
  452. """
  453. arch_def = [
  454. # stage 0, 112x112 in
  455. ['ds_r1_k3_s1_c16_noskip'],
  456. # stage 1, 112x112 in
  457. ['ir_r3_k3_s2_e3_c24'],
  458. # stage 2, 56x56 in
  459. ['ir_r3_k5_s2_e3_c40'],
  460. # stage 3, 28x28 in
  461. ['ir_r3_k5_s2_e6_c80'],
  462. # stage 4, 14x14in
  463. ['ir_r2_k3_s1_e6_c96'],
  464. # stage 5, 14x14in
  465. ['ir_r4_k5_s2_e6_c192'],
  466. # stage 6, 7x7 in
  467. ['ir_r1_k3_s1_e6_c320_noskip']
  468. ]
  469. model_kwargs = dict(
  470. block_args=decode_arch_def(arch_def),
  471. stem_size=32,
  472. round_chs_fn=partial(round_channels, multiplier=channel_multiplier),
  473. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  474. **kwargs
  475. )
  476. model = _create_effnet(variant, pretrained, **model_kwargs)
  477. return model
  478. def _gen_mnasnet_small(variant, channel_multiplier=1.0, pretrained=False, **kwargs):
  479. """Creates a mnasnet-b1 model.
  480. Ref impl: https://github.com/tensorflow/tpu/tree/master/models/official/mnasnet
  481. Paper: https://arxiv.org/pdf/1807.11626.pdf.
  482. Args:
  483. channel_multiplier: multiplier to number of channels per layer.
  484. """
  485. arch_def = [
  486. ['ds_r1_k3_s1_c8'],
  487. ['ir_r1_k3_s2_e3_c16'],
  488. ['ir_r2_k3_s2_e6_c16'],
  489. ['ir_r4_k5_s2_e6_c32_se0.25'],
  490. ['ir_r3_k3_s1_e6_c32_se0.25'],
  491. ['ir_r3_k5_s2_e6_c88_se0.25'],
  492. ['ir_r1_k3_s1_e6_c144']
  493. ]
  494. model_kwargs = dict(
  495. block_args=decode_arch_def(arch_def),
  496. stem_size=8,
  497. round_chs_fn=partial(round_channels, multiplier=channel_multiplier),
  498. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  499. **kwargs
  500. )
  501. model = _create_effnet(variant, pretrained, **model_kwargs)
  502. return model
  503. def _gen_mobilenet_v1(
  504. variant, channel_multiplier=1.0, depth_multiplier=1.0,
  505. group_size=None, fix_stem_head=False, head_conv=False, pretrained=False, **kwargs
  506. ):
  507. """
  508. Ref impl: https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet_v2.py
  509. Paper: https://arxiv.org/abs/1801.04381
  510. """
  511. arch_def = [
  512. ['dsa_r1_k3_s1_c64'],
  513. ['dsa_r2_k3_s2_c128'],
  514. ['dsa_r2_k3_s2_c256'],
  515. ['dsa_r6_k3_s2_c512'],
  516. ['dsa_r2_k3_s2_c1024'],
  517. ]
  518. round_chs_fn = partial(round_channels, multiplier=channel_multiplier)
  519. head_features = (1024 if fix_stem_head else max(1024, round_chs_fn(1024))) if head_conv else 0
  520. model_kwargs = dict(
  521. block_args=decode_arch_def(
  522. arch_def,
  523. depth_multiplier=depth_multiplier,
  524. fix_first_last=fix_stem_head,
  525. group_size=group_size,
  526. ),
  527. num_features=head_features,
  528. stem_size=32,
  529. fix_stem=fix_stem_head,
  530. round_chs_fn=round_chs_fn,
  531. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  532. act_layer=resolve_act_layer(kwargs, 'relu6'),
  533. **kwargs
  534. )
  535. model = _create_effnet(variant, pretrained, **model_kwargs)
  536. return model
  537. def _gen_mobilenet_v2(
  538. variant, channel_multiplier=1.0, depth_multiplier=1.0,
  539. group_size=None, fix_stem_head=False, pretrained=False, **kwargs
  540. ):
  541. """ Generate MobileNet-V2 network
  542. Ref impl: https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet_v2.py
  543. Paper: https://arxiv.org/abs/1801.04381
  544. """
  545. arch_def = [
  546. ['ds_r1_k3_s1_c16'],
  547. ['ir_r2_k3_s2_e6_c24'],
  548. ['ir_r3_k3_s2_e6_c32'],
  549. ['ir_r4_k3_s2_e6_c64'],
  550. ['ir_r3_k3_s1_e6_c96'],
  551. ['ir_r3_k3_s2_e6_c160'],
  552. ['ir_r1_k3_s1_e6_c320'],
  553. ]
  554. round_chs_fn = partial(round_channels, multiplier=channel_multiplier)
  555. model_kwargs = dict(
  556. block_args=decode_arch_def(
  557. arch_def,
  558. depth_multiplier=depth_multiplier,
  559. fix_first_last=fix_stem_head,
  560. group_size=group_size,
  561. ),
  562. num_features=1280 if fix_stem_head else max(1280, round_chs_fn(1280)),
  563. stem_size=32,
  564. fix_stem=fix_stem_head,
  565. round_chs_fn=round_chs_fn,
  566. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  567. act_layer=resolve_act_layer(kwargs, 'relu6'),
  568. **kwargs
  569. )
  570. model = _create_effnet(variant, pretrained, **model_kwargs)
  571. return model
  572. def _gen_fbnetc(variant, channel_multiplier=1.0, pretrained=False, **kwargs):
  573. """ FBNet-C
  574. Paper: https://arxiv.org/abs/1812.03443
  575. Ref Impl: https://github.com/facebookresearch/maskrcnn-benchmark/blob/master/maskrcnn_benchmark/modeling/backbone/fbnet_modeldef.py
  576. NOTE: the impl above does not relate to the 'C' variant here, that was derived from paper,
  577. it was used to confirm some building block details
  578. """
  579. arch_def = [
  580. ['ir_r1_k3_s1_e1_c16'],
  581. ['ir_r1_k3_s2_e6_c24', 'ir_r2_k3_s1_e1_c24'],
  582. ['ir_r1_k5_s2_e6_c32', 'ir_r1_k5_s1_e3_c32', 'ir_r1_k5_s1_e6_c32', 'ir_r1_k3_s1_e6_c32'],
  583. ['ir_r1_k5_s2_e6_c64', 'ir_r1_k5_s1_e3_c64', 'ir_r2_k5_s1_e6_c64'],
  584. ['ir_r3_k5_s1_e6_c112', 'ir_r1_k5_s1_e3_c112'],
  585. ['ir_r4_k5_s2_e6_c184'],
  586. ['ir_r1_k3_s1_e6_c352'],
  587. ]
  588. model_kwargs = dict(
  589. block_args=decode_arch_def(arch_def),
  590. stem_size=16,
  591. num_features=1984, # paper suggests this, but is not 100% clear
  592. round_chs_fn=partial(round_channels, multiplier=channel_multiplier),
  593. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  594. **kwargs
  595. )
  596. model = _create_effnet(variant, pretrained, **model_kwargs)
  597. return model
  598. def _gen_spnasnet(variant, channel_multiplier=1.0, pretrained=False, **kwargs):
  599. """Creates the Single-Path NAS model from search targeted for Pixel1 phone.
  600. Paper: https://arxiv.org/abs/1904.02877
  601. Args:
  602. channel_multiplier: multiplier to number of channels per layer.
  603. """
  604. arch_def = [
  605. # stage 0, 112x112 in
  606. ['ds_r1_k3_s1_c16_noskip'],
  607. # stage 1, 112x112 in
  608. ['ir_r3_k3_s2_e3_c24'],
  609. # stage 2, 56x56 in
  610. ['ir_r1_k5_s2_e6_c40', 'ir_r3_k3_s1_e3_c40'],
  611. # stage 3, 28x28 in
  612. ['ir_r1_k5_s2_e6_c80', 'ir_r3_k3_s1_e3_c80'],
  613. # stage 4, 14x14in
  614. ['ir_r1_k5_s1_e6_c96', 'ir_r3_k5_s1_e3_c96'],
  615. # stage 5, 14x14in
  616. ['ir_r4_k5_s2_e6_c192'],
  617. # stage 6, 7x7 in
  618. ['ir_r1_k3_s1_e6_c320_noskip']
  619. ]
  620. model_kwargs = dict(
  621. block_args=decode_arch_def(arch_def),
  622. stem_size=32,
  623. round_chs_fn=partial(round_channels, multiplier=channel_multiplier),
  624. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  625. **kwargs
  626. )
  627. model = _create_effnet(variant, pretrained, **model_kwargs)
  628. return model
  629. def _gen_efficientnet(
  630. variant, channel_multiplier=1.0, depth_multiplier=1.0, channel_divisor=8,
  631. group_size=None, pretrained=False, **kwargs
  632. ):
  633. """Creates an EfficientNet model.
  634. Ref impl: https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/efficientnet_model.py
  635. Paper: https://arxiv.org/abs/1905.11946
  636. EfficientNet params
  637. name: (channel_multiplier, depth_multiplier, resolution, dropout_rate)
  638. 'efficientnet-b0': (1.0, 1.0, 224, 0.2),
  639. 'efficientnet-b1': (1.0, 1.1, 240, 0.2),
  640. 'efficientnet-b2': (1.1, 1.2, 260, 0.3),
  641. 'efficientnet-b3': (1.2, 1.4, 300, 0.3),
  642. 'efficientnet-b4': (1.4, 1.8, 380, 0.4),
  643. 'efficientnet-b5': (1.6, 2.2, 456, 0.4),
  644. 'efficientnet-b6': (1.8, 2.6, 528, 0.5),
  645. 'efficientnet-b7': (2.0, 3.1, 600, 0.5),
  646. 'efficientnet-b8': (2.2, 3.6, 672, 0.5),
  647. 'efficientnet-l2': (4.3, 5.3, 800, 0.5),
  648. Args:
  649. channel_multiplier: multiplier to number of channels per layer
  650. depth_multiplier: multiplier to number of repeats per stage
  651. """
  652. arch_def = [
  653. ['ds_r1_k3_s1_e1_c16_se0.25'],
  654. ['ir_r2_k3_s2_e6_c24_se0.25'],
  655. ['ir_r2_k5_s2_e6_c40_se0.25'],
  656. ['ir_r3_k3_s2_e6_c80_se0.25'],
  657. ['ir_r3_k5_s1_e6_c112_se0.25'],
  658. ['ir_r4_k5_s2_e6_c192_se0.25'],
  659. ['ir_r1_k3_s1_e6_c320_se0.25'],
  660. ]
  661. round_chs_fn = partial(round_channels, multiplier=channel_multiplier, divisor=channel_divisor)
  662. model_kwargs = dict(
  663. block_args=decode_arch_def(arch_def, depth_multiplier, group_size=group_size),
  664. num_features=round_chs_fn(1280),
  665. stem_size=32,
  666. round_chs_fn=round_chs_fn,
  667. act_layer=resolve_act_layer(kwargs, 'swish'),
  668. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  669. **kwargs,
  670. )
  671. model = _create_effnet(variant, pretrained, **model_kwargs)
  672. return model
  673. def _gen_efficientnet_edge(
  674. variant, channel_multiplier=1.0, depth_multiplier=1.0, group_size=None, pretrained=False, **kwargs
  675. ):
  676. """ Creates an EfficientNet-EdgeTPU model
  677. Ref impl: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet/edgetpu
  678. """
  679. arch_def = [
  680. # NOTE `fc` is present to override a mismatch between stem channels and in chs not
  681. # present in other models
  682. ['er_r1_k3_s1_e4_c24_fc24_noskip'],
  683. ['er_r2_k3_s2_e8_c32'],
  684. ['er_r4_k3_s2_e8_c48'],
  685. ['ir_r5_k5_s2_e8_c96'],
  686. ['ir_r4_k5_s1_e8_c144'],
  687. ['ir_r2_k5_s2_e8_c192'],
  688. ]
  689. round_chs_fn = partial(round_channels, multiplier=channel_multiplier)
  690. model_kwargs = dict(
  691. block_args=decode_arch_def(arch_def, depth_multiplier, group_size=group_size),
  692. num_features=round_chs_fn(1280),
  693. stem_size=32,
  694. round_chs_fn=round_chs_fn,
  695. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  696. act_layer=resolve_act_layer(kwargs, 'relu'),
  697. **kwargs,
  698. )
  699. model = _create_effnet(variant, pretrained, **model_kwargs)
  700. return model
  701. def _gen_efficientnet_condconv(
  702. variant, channel_multiplier=1.0, depth_multiplier=1.0, experts_multiplier=1, pretrained=False, **kwargs
  703. ):
  704. """Creates an EfficientNet-CondConv model.
  705. Ref impl: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet/condconv
  706. """
  707. arch_def = [
  708. ['ds_r1_k3_s1_e1_c16_se0.25'],
  709. ['ir_r2_k3_s2_e6_c24_se0.25'],
  710. ['ir_r2_k5_s2_e6_c40_se0.25'],
  711. ['ir_r3_k3_s2_e6_c80_se0.25'],
  712. ['ir_r3_k5_s1_e6_c112_se0.25_cc4'],
  713. ['ir_r4_k5_s2_e6_c192_se0.25_cc4'],
  714. ['ir_r1_k3_s1_e6_c320_se0.25_cc4'],
  715. ]
  716. # NOTE unlike official impl, this one uses `cc<x>` option where x is the base number of experts for each stage and
  717. # the expert_multiplier increases that on a per-model basis as with depth/channel multipliers
  718. round_chs_fn = partial(round_channels, multiplier=channel_multiplier)
  719. model_kwargs = dict(
  720. block_args=decode_arch_def(arch_def, depth_multiplier, experts_multiplier=experts_multiplier),
  721. num_features=round_chs_fn(1280),
  722. stem_size=32,
  723. round_chs_fn=round_chs_fn,
  724. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  725. act_layer=resolve_act_layer(kwargs, 'swish'),
  726. **kwargs,
  727. )
  728. model = _create_effnet(variant, pretrained, **model_kwargs)
  729. return model
  730. def _gen_efficientnet_lite(variant, channel_multiplier=1.0, depth_multiplier=1.0, pretrained=False, **kwargs):
  731. """Creates an EfficientNet-Lite model.
  732. Ref impl: https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet/lite
  733. Paper: https://arxiv.org/abs/1905.11946
  734. EfficientNet params
  735. name: (channel_multiplier, depth_multiplier, resolution, dropout_rate)
  736. 'efficientnet-lite0': (1.0, 1.0, 224, 0.2),
  737. 'efficientnet-lite1': (1.0, 1.1, 240, 0.2),
  738. 'efficientnet-lite2': (1.1, 1.2, 260, 0.3),
  739. 'efficientnet-lite3': (1.2, 1.4, 280, 0.3),
  740. 'efficientnet-lite4': (1.4, 1.8, 300, 0.3),
  741. Args:
  742. channel_multiplier: multiplier to number of channels per layer
  743. depth_multiplier: multiplier to number of repeats per stage
  744. """
  745. arch_def = [
  746. ['ds_r1_k3_s1_e1_c16'],
  747. ['ir_r2_k3_s2_e6_c24'],
  748. ['ir_r2_k5_s2_e6_c40'],
  749. ['ir_r3_k3_s2_e6_c80'],
  750. ['ir_r3_k5_s1_e6_c112'],
  751. ['ir_r4_k5_s2_e6_c192'],
  752. ['ir_r1_k3_s1_e6_c320'],
  753. ]
  754. model_kwargs = dict(
  755. block_args=decode_arch_def(arch_def, depth_multiplier, fix_first_last=True),
  756. num_features=1280,
  757. stem_size=32,
  758. fix_stem=True,
  759. round_chs_fn=partial(round_channels, multiplier=channel_multiplier),
  760. act_layer=resolve_act_layer(kwargs, 'relu6'),
  761. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  762. **kwargs,
  763. )
  764. model = _create_effnet(variant, pretrained, **model_kwargs)
  765. return model
  766. def _gen_efficientnetv2_base(
  767. variant, channel_multiplier=1.0, depth_multiplier=1.0, group_size=None, pretrained=False, **kwargs
  768. ):
  769. """ Creates an EfficientNet-V2 base model
  770. Ref impl: https://github.com/google/automl/tree/master/efficientnetv2
  771. Paper: `EfficientNetV2: Smaller Models and Faster Training` - https://arxiv.org/abs/2104.00298
  772. """
  773. arch_def = [
  774. ['cn_r1_k3_s1_e1_c16_skip'],
  775. ['er_r2_k3_s2_e4_c32'],
  776. ['er_r2_k3_s2_e4_c48'],
  777. ['ir_r3_k3_s2_e4_c96_se0.25'],
  778. ['ir_r5_k3_s1_e6_c112_se0.25'],
  779. ['ir_r8_k3_s2_e6_c192_se0.25'],
  780. ]
  781. round_chs_fn = partial(round_channels, multiplier=channel_multiplier, round_limit=0.)
  782. model_kwargs = dict(
  783. block_args=decode_arch_def(arch_def, depth_multiplier, group_size=group_size),
  784. num_features=round_chs_fn(1280),
  785. stem_size=32,
  786. round_chs_fn=round_chs_fn,
  787. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  788. act_layer=resolve_act_layer(kwargs, 'silu'),
  789. **kwargs,
  790. )
  791. model = _create_effnet(variant, pretrained, **model_kwargs)
  792. return model
  793. def _gen_efficientnetv2_s(
  794. variant, channel_multiplier=1.0, depth_multiplier=1.0, group_size=None, rw=False, pretrained=False, **kwargs
  795. ):
  796. """ Creates an EfficientNet-V2 Small model
  797. Ref impl: https://github.com/google/automl/tree/master/efficientnetv2
  798. Paper: `EfficientNetV2: Smaller Models and Faster Training` - https://arxiv.org/abs/2104.00298
  799. NOTE: `rw` flag sets up 'small' variant to behave like my initial v2 small model,
  800. before ref the impl was released.
  801. """
  802. arch_def = [
  803. ['cn_r2_k3_s1_e1_c24_skip'],
  804. ['er_r4_k3_s2_e4_c48'],
  805. ['er_r4_k3_s2_e4_c64'],
  806. ['ir_r6_k3_s2_e4_c128_se0.25'],
  807. ['ir_r9_k3_s1_e6_c160_se0.25'],
  808. ['ir_r15_k3_s2_e6_c256_se0.25'],
  809. ]
  810. num_features = 1280
  811. if rw:
  812. # my original variant, based on paper figure differs from the official release
  813. arch_def[0] = ['er_r2_k3_s1_e1_c24']
  814. arch_def[-1] = ['ir_r15_k3_s2_e6_c272_se0.25']
  815. num_features = 1792
  816. round_chs_fn = partial(round_channels, multiplier=channel_multiplier)
  817. model_kwargs = dict(
  818. block_args=decode_arch_def(arch_def, depth_multiplier, group_size=group_size),
  819. num_features=round_chs_fn(num_features),
  820. stem_size=24,
  821. round_chs_fn=round_chs_fn,
  822. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  823. act_layer=resolve_act_layer(kwargs, 'silu'),
  824. **kwargs,
  825. )
  826. model = _create_effnet(variant, pretrained, **model_kwargs)
  827. return model
  828. def _gen_efficientnetv2_m(
  829. variant, channel_multiplier=1.0, depth_multiplier=1.0, group_size=None, pretrained=False, **kwargs
  830. ):
  831. """ Creates an EfficientNet-V2 Medium model
  832. Ref impl: https://github.com/google/automl/tree/master/efficientnetv2
  833. Paper: `EfficientNetV2: Smaller Models and Faster Training` - https://arxiv.org/abs/2104.00298
  834. """
  835. arch_def = [
  836. ['cn_r3_k3_s1_e1_c24_skip'],
  837. ['er_r5_k3_s2_e4_c48'],
  838. ['er_r5_k3_s2_e4_c80'],
  839. ['ir_r7_k3_s2_e4_c160_se0.25'],
  840. ['ir_r14_k3_s1_e6_c176_se0.25'],
  841. ['ir_r18_k3_s2_e6_c304_se0.25'],
  842. ['ir_r5_k3_s1_e6_c512_se0.25'],
  843. ]
  844. model_kwargs = dict(
  845. block_args=decode_arch_def(arch_def, depth_multiplier, group_size=group_size),
  846. num_features=1280,
  847. stem_size=24,
  848. round_chs_fn=partial(round_channels, multiplier=channel_multiplier),
  849. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  850. act_layer=resolve_act_layer(kwargs, 'silu'),
  851. **kwargs,
  852. )
  853. model = _create_effnet(variant, pretrained, **model_kwargs)
  854. return model
  855. def _gen_efficientnetv2_l(
  856. variant, channel_multiplier=1.0, depth_multiplier=1.0, group_size=None, pretrained=False, **kwargs
  857. ):
  858. """ Creates an EfficientNet-V2 Large model
  859. Ref impl: https://github.com/google/automl/tree/master/efficientnetv2
  860. Paper: `EfficientNetV2: Smaller Models and Faster Training` - https://arxiv.org/abs/2104.00298
  861. """
  862. arch_def = [
  863. ['cn_r4_k3_s1_e1_c32_skip'],
  864. ['er_r7_k3_s2_e4_c64'],
  865. ['er_r7_k3_s2_e4_c96'],
  866. ['ir_r10_k3_s2_e4_c192_se0.25'],
  867. ['ir_r19_k3_s1_e6_c224_se0.25'],
  868. ['ir_r25_k3_s2_e6_c384_se0.25'],
  869. ['ir_r7_k3_s1_e6_c640_se0.25'],
  870. ]
  871. model_kwargs = dict(
  872. block_args=decode_arch_def(arch_def, depth_multiplier, group_size=group_size),
  873. num_features=1280,
  874. stem_size=32,
  875. round_chs_fn=partial(round_channels, multiplier=channel_multiplier),
  876. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  877. act_layer=resolve_act_layer(kwargs, 'silu'),
  878. **kwargs,
  879. )
  880. model = _create_effnet(variant, pretrained, **model_kwargs)
  881. return model
  882. def _gen_efficientnetv2_xl(
  883. variant, channel_multiplier=1.0, depth_multiplier=1.0, group_size=None, pretrained=False, **kwargs
  884. ):
  885. """ Creates an EfficientNet-V2 Xtra-Large model
  886. Ref impl: https://github.com/google/automl/tree/master/efficientnetv2
  887. Paper: `EfficientNetV2: Smaller Models and Faster Training` - https://arxiv.org/abs/2104.00298
  888. """
  889. arch_def = [
  890. ['cn_r4_k3_s1_e1_c32_skip'],
  891. ['er_r8_k3_s2_e4_c64'],
  892. ['er_r8_k3_s2_e4_c96'],
  893. ['ir_r16_k3_s2_e4_c192_se0.25'],
  894. ['ir_r24_k3_s1_e6_c256_se0.25'],
  895. ['ir_r32_k3_s2_e6_c512_se0.25'],
  896. ['ir_r8_k3_s1_e6_c640_se0.25'],
  897. ]
  898. model_kwargs = dict(
  899. block_args=decode_arch_def(arch_def, depth_multiplier, group_size=group_size),
  900. num_features=1280,
  901. stem_size=32,
  902. round_chs_fn=partial(round_channels, multiplier=channel_multiplier),
  903. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  904. act_layer=resolve_act_layer(kwargs, 'silu'),
  905. **kwargs,
  906. )
  907. model = _create_effnet(variant, pretrained, **model_kwargs)
  908. return model
  909. def _gen_efficientnet_x(
  910. variant, channel_multiplier=1.0, depth_multiplier=1.0, channel_divisor=8,
  911. group_size=None, version=1, pretrained=False, **kwargs
  912. ):
  913. """Creates an EfficientNet model.
  914. Ref impl: https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/efficientnet_model.py
  915. Paper: https://arxiv.org/abs/1905.11946
  916. EfficientNet params
  917. name: (channel_multiplier, depth_multiplier, resolution, dropout_rate)
  918. 'efficientnet-x-b0': (1.0, 1.0, 224, 0.2),
  919. 'efficientnet-x-b1': (1.0, 1.1, 240, 0.2),
  920. 'efficientnet-x-b2': (1.1, 1.2, 260, 0.3),
  921. 'efficientnet-x-b3': (1.2, 1.4, 300, 0.3),
  922. 'efficientnet-x-b4': (1.4, 1.8, 380, 0.4),
  923. 'efficientnet-x-b5': (1.6, 2.2, 456, 0.4),
  924. 'efficientnet-x-b6': (1.8, 2.6, 528, 0.5),
  925. 'efficientnet-x-b7': (2.0, 3.1, 600, 0.5),
  926. 'efficientnet-x-b8': (2.2, 3.6, 672, 0.5),
  927. 'efficientnet-l2': (4.3, 5.3, 800, 0.5),
  928. Args:
  929. channel_multiplier: multiplier to number of channels per layer
  930. depth_multiplier: multiplier to number of repeats per stage
  931. """
  932. """
  933. if version == 1:
  934. blocks_args = [
  935. 'r1_k3_s11_e1_i32_o16_se0.25_d1_a0',
  936. 'r2_k3_s22_e6_i16_o24_se0.25_f1_d2_a1',
  937. 'r2_k5_s22_e6_i24_o40_se0.25_f1_a1',
  938. 'r3_k3_s22_e6_i40_o80_se0.25_a0',
  939. 'r3_k5_s11_e6_i80_o112_se0.25_a0',
  940. 'r4_k5_s22_e6_i112_o192_se0.25_a0',
  941. 'r1_k3_s11_e6_i192_o320_se0.25_a0',
  942. ]
  943. elif version == 2:
  944. blocks_args = [
  945. 'r1_k3_s11_e1_i32_o16_se0.25_d1_a0',
  946. 'r2_k3_s22_e4_i16_o24_se0.25_f1_d2_a1',
  947. 'r2_k5_s22_e4_i24_o40_se0.25_f1_a1',
  948. 'r3_k3_s22_e4_i40_o80_se0.25_a0',
  949. 'r3_k5_s11_e6_i80_o112_se0.25_a0',
  950. 'r4_k5_s22_e6_i112_o192_se0.25_a0',
  951. 'r1_k3_s11_e6_i192_o320_se0.25_a0',
  952. ]
  953. """
  954. if version == 1:
  955. arch_def = [
  956. ['ds_r1_k3_s1_e1_c16_se0.25_d1'],
  957. ['er_r2_k3_s2_e6_c24_se0.25_nre'],
  958. ['er_r2_k5_s2_e6_c40_se0.25_nre'],
  959. ['ir_r3_k3_s2_e6_c80_se0.25'],
  960. ['ir_r3_k5_s1_e6_c112_se0.25'],
  961. ['ir_r4_k5_s2_e6_c192_se0.25'],
  962. ['ir_r1_k3_s1_e6_c320_se0.25'],
  963. ]
  964. else:
  965. arch_def = [
  966. ['ds_r1_k3_s1_e1_c16_se0.25_d1'],
  967. ['er_r2_k3_s2_e4_c24_se0.25_nre'],
  968. ['er_r2_k5_s2_e4_c40_se0.25_nre'],
  969. ['ir_r3_k3_s2_e4_c80_se0.25'],
  970. ['ir_r3_k5_s1_e6_c112_se0.25'],
  971. ['ir_r4_k5_s2_e6_c192_se0.25'],
  972. ['ir_r1_k3_s1_e6_c320_se0.25'],
  973. ]
  974. round_chs_fn = partial(round_channels, multiplier=channel_multiplier, divisor=channel_divisor)
  975. model_kwargs = dict(
  976. block_args=decode_arch_def(arch_def, depth_multiplier, group_size=group_size),
  977. num_features=round_chs_fn(1280),
  978. stem_size=32,
  979. round_chs_fn=round_chs_fn,
  980. act_layer=resolve_act_layer(kwargs, 'silu'),
  981. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  982. **kwargs,
  983. )
  984. model = _create_effnet(variant, pretrained, **model_kwargs)
  985. return model
  986. def _gen_mixnet_s(variant, channel_multiplier=1.0, pretrained=False, **kwargs):
  987. """Creates a MixNet Small model.
  988. Ref impl: https://github.com/tensorflow/tpu/tree/master/models/official/mnasnet/mixnet
  989. Paper: https://arxiv.org/abs/1907.09595
  990. """
  991. arch_def = [
  992. # stage 0, 112x112 in
  993. ['ds_r1_k3_s1_e1_c16'], # relu
  994. # stage 1, 112x112 in
  995. ['ir_r1_k3_a1.1_p1.1_s2_e6_c24', 'ir_r1_k3_a1.1_p1.1_s1_e3_c24'], # relu
  996. # stage 2, 56x56 in
  997. ['ir_r1_k3.5.7_s2_e6_c40_se0.5_nsw', 'ir_r3_k3.5_a1.1_p1.1_s1_e6_c40_se0.5_nsw'], # swish
  998. # stage 3, 28x28 in
  999. ['ir_r1_k3.5.7_p1.1_s2_e6_c80_se0.25_nsw', 'ir_r2_k3.5_p1.1_s1_e6_c80_se0.25_nsw'], # swish
  1000. # stage 4, 14x14in
  1001. ['ir_r1_k3.5.7_a1.1_p1.1_s1_e6_c120_se0.5_nsw', 'ir_r2_k3.5.7.9_a1.1_p1.1_s1_e3_c120_se0.5_nsw'], # swish
  1002. # stage 5, 14x14in
  1003. ['ir_r1_k3.5.7.9.11_s2_e6_c200_se0.5_nsw', 'ir_r2_k3.5.7.9_p1.1_s1_e6_c200_se0.5_nsw'], # swish
  1004. # 7x7
  1005. ]
  1006. model_kwargs = dict(
  1007. block_args=decode_arch_def(arch_def),
  1008. num_features=1536,
  1009. stem_size=16,
  1010. round_chs_fn=partial(round_channels, multiplier=channel_multiplier),
  1011. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  1012. **kwargs
  1013. )
  1014. model = _create_effnet(variant, pretrained, **model_kwargs)
  1015. return model
  1016. def _gen_mixnet_m(variant, channel_multiplier=1.0, depth_multiplier=1.0, pretrained=False, **kwargs):
  1017. """Creates a MixNet Medium-Large model.
  1018. Ref impl: https://github.com/tensorflow/tpu/tree/master/models/official/mnasnet/mixnet
  1019. Paper: https://arxiv.org/abs/1907.09595
  1020. """
  1021. arch_def = [
  1022. # stage 0, 112x112 in
  1023. ['ds_r1_k3_s1_e1_c24'], # relu
  1024. # stage 1, 112x112 in
  1025. ['ir_r1_k3.5.7_a1.1_p1.1_s2_e6_c32', 'ir_r1_k3_a1.1_p1.1_s1_e3_c32'], # relu
  1026. # stage 2, 56x56 in
  1027. ['ir_r1_k3.5.7.9_s2_e6_c40_se0.5_nsw', 'ir_r3_k3.5_a1.1_p1.1_s1_e6_c40_se0.5_nsw'], # swish
  1028. # stage 3, 28x28 in
  1029. ['ir_r1_k3.5.7_s2_e6_c80_se0.25_nsw', 'ir_r3_k3.5.7.9_a1.1_p1.1_s1_e6_c80_se0.25_nsw'], # swish
  1030. # stage 4, 14x14in
  1031. ['ir_r1_k3_s1_e6_c120_se0.5_nsw', 'ir_r3_k3.5.7.9_a1.1_p1.1_s1_e3_c120_se0.5_nsw'], # swish
  1032. # stage 5, 14x14in
  1033. ['ir_r1_k3.5.7.9_s2_e6_c200_se0.5_nsw', 'ir_r3_k3.5.7.9_p1.1_s1_e6_c200_se0.5_nsw'], # swish
  1034. # 7x7
  1035. ]
  1036. model_kwargs = dict(
  1037. block_args=decode_arch_def(arch_def, depth_multiplier, depth_trunc='round'),
  1038. num_features=1536,
  1039. stem_size=24,
  1040. round_chs_fn=partial(round_channels, multiplier=channel_multiplier),
  1041. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  1042. **kwargs
  1043. )
  1044. model = _create_effnet(variant, pretrained, **model_kwargs)
  1045. return model
  1046. def _gen_tinynet(variant, model_width=1.0, depth_multiplier=1.0, pretrained=False, **kwargs):
  1047. """Creates a TinyNet model.
  1048. """
  1049. arch_def = [
  1050. ['ds_r1_k3_s1_e1_c16_se0.25'], ['ir_r2_k3_s2_e6_c24_se0.25'],
  1051. ['ir_r2_k5_s2_e6_c40_se0.25'], ['ir_r3_k3_s2_e6_c80_se0.25'],
  1052. ['ir_r3_k5_s1_e6_c112_se0.25'], ['ir_r4_k5_s2_e6_c192_se0.25'],
  1053. ['ir_r1_k3_s1_e6_c320_se0.25'],
  1054. ]
  1055. model_kwargs = dict(
  1056. block_args=decode_arch_def(arch_def, depth_multiplier, depth_trunc='round'),
  1057. num_features=max(1280, round_channels(1280, model_width, 8, None)),
  1058. stem_size=32,
  1059. fix_stem=True,
  1060. round_chs_fn=partial(round_channels, multiplier=model_width),
  1061. act_layer=resolve_act_layer(kwargs, 'swish'),
  1062. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  1063. **kwargs,
  1064. )
  1065. model = _create_effnet(variant, pretrained, **model_kwargs)
  1066. return model
  1067. def _gen_mobilenet_edgetpu(variant, channel_multiplier=1.0, depth_multiplier=1.0, pretrained=False, **kwargs):
  1068. """
  1069. Based on definitions in: https://github.com/tensorflow/models/tree/d2427a562f401c9af118e47af2f030a0a5599f55/official/projects/edgetpu/vision
  1070. """
  1071. if 'edgetpu_v2' in variant:
  1072. stem_size = 64
  1073. stem_kernel_size = 5
  1074. group_size = 64
  1075. num_features = 1280
  1076. act_layer = resolve_act_layer(kwargs, 'relu')
  1077. def _arch_def(chs: List[int], group_size: int):
  1078. return [
  1079. # stage 0, 112x112 in
  1080. [f'cn_r1_k1_s1_c{chs[0]}'], # NOTE with expansion==1, official impl block ends just 1x1 pwl
  1081. # stage 1, 112x112 in
  1082. [f'er_r1_k3_s2_e8_c{chs[1]}', f'er_r1_k3_s1_e4_gs{group_size}_c{chs[1]}'],
  1083. # stage 2, 56x56 in
  1084. [
  1085. f'er_r1_k3_s2_e8_c{chs[2]}',
  1086. f'er_r1_k3_s1_e4_gs{group_size}_c{chs[2]}',
  1087. f'er_r1_k3_s1_e4_c{chs[2]}',
  1088. f'er_r1_k3_s1_e4_gs{group_size}_c{chs[2]}',
  1089. ],
  1090. # stage 3, 28x28 in
  1091. [f'er_r1_k3_s2_e8_c{chs[3]}', f'ir_r3_k3_s1_e4_c{chs[3]}'],
  1092. # stage 4, 14x14in
  1093. [f'ir_r1_k3_s1_e8_c{chs[4]}', f'ir_r3_k3_s1_e4_c{chs[4]}'],
  1094. # stage 5, 14x14in
  1095. [f'ir_r1_k3_s2_e8_c{chs[5]}', f'ir_r3_k3_s1_e4_c{chs[5]}'],
  1096. # stage 6, 7x7 in
  1097. [f'ir_r1_k3_s1_e8_c{chs[6]}'],
  1098. ]
  1099. if 'edgetpu_v2_xs' in variant:
  1100. stem_size = 32
  1101. stem_kernel_size = 3
  1102. channels = [16, 32, 48, 96, 144, 160, 192]
  1103. elif 'edgetpu_v2_s' in variant:
  1104. channels = [24, 48, 64, 128, 160, 192, 256]
  1105. elif 'edgetpu_v2_m' in variant:
  1106. channels = [32, 64, 80, 160, 192, 240, 320]
  1107. num_features = 1344
  1108. elif 'edgetpu_v2_l' in variant:
  1109. stem_kernel_size = 7
  1110. group_size = 128
  1111. channels = [32, 64, 96, 192, 240, 256, 384]
  1112. num_features = 1408
  1113. else:
  1114. assert False
  1115. arch_def = _arch_def(channels, group_size)
  1116. else:
  1117. # v1
  1118. stem_size = 32
  1119. stem_kernel_size = 3
  1120. num_features = 1280
  1121. act_layer = resolve_act_layer(kwargs, 'relu')
  1122. arch_def = [
  1123. # stage 0, 112x112 in
  1124. ['cn_r1_k1_s1_c16'],
  1125. # stage 1, 112x112 in
  1126. ['er_r1_k3_s2_e8_c32', 'er_r3_k3_s1_e4_c32'],
  1127. # stage 2, 56x56 in
  1128. ['er_r1_k3_s2_e8_c48', 'er_r3_k3_s1_e4_c48'],
  1129. # stage 3, 28x28 in
  1130. ['ir_r1_k3_s2_e8_c96', 'ir_r3_k3_s1_e4_c96'],
  1131. # stage 4, 14x14in
  1132. ['ir_r1_k3_s1_e8_c96_noskip', 'ir_r3_k3_s1_e4_c96'],
  1133. # stage 5, 14x14in
  1134. ['ir_r1_k5_s2_e8_c160', 'ir_r3_k5_s1_e4_c160'],
  1135. # stage 6, 7x7 in
  1136. ['ir_r1_k3_s1_e8_c192'],
  1137. ]
  1138. model_kwargs = dict(
  1139. block_args=decode_arch_def(arch_def, depth_multiplier),
  1140. num_features=num_features,
  1141. stem_size=stem_size,
  1142. stem_kernel_size=stem_kernel_size,
  1143. round_chs_fn=partial(round_channels, multiplier=channel_multiplier),
  1144. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  1145. act_layer=act_layer,
  1146. **kwargs,
  1147. )
  1148. model = _create_effnet(variant, pretrained, **model_kwargs)
  1149. return model
  1150. def _gen_test_efficientnet(variant, channel_multiplier=1.0, depth_multiplier=1.0, pretrained=False, **kwargs):
  1151. """ Minimal test EfficientNet generator.
  1152. """
  1153. arch_def = [
  1154. ['cn_r1_k3_s1_e1_c16_skip'],
  1155. ['er_r1_k3_s2_e4_c24'],
  1156. ['er_r1_k3_s2_e4_c32'],
  1157. ['ir_r1_k3_s2_e4_c48_se0.25'],
  1158. ['ir_r1_k3_s2_e4_c64_se0.25'],
  1159. ]
  1160. round_chs_fn = partial(round_channels, multiplier=channel_multiplier, round_limit=0.)
  1161. model_kwargs = dict(
  1162. block_args=decode_arch_def(arch_def, depth_multiplier),
  1163. num_features=round_chs_fn(256),
  1164. stem_size=24,
  1165. round_chs_fn=round_chs_fn,
  1166. norm_layer=kwargs.pop('norm_layer', None) or partial(nn.BatchNorm2d, **resolve_bn_args(kwargs)),
  1167. act_layer=resolve_act_layer(kwargs, 'silu'),
  1168. **kwargs,
  1169. )
  1170. model = _create_effnet(variant, pretrained, **model_kwargs)
  1171. return model
  1172. def _cfg(url='', **kwargs):
  1173. return {
  1174. 'url': url, 'num_classes': 1000, 'input_size': (3, 224, 224), 'pool_size': (7, 7),
  1175. 'crop_pct': 0.875, 'interpolation': 'bicubic',
  1176. 'mean': IMAGENET_DEFAULT_MEAN, 'std': IMAGENET_DEFAULT_STD,
  1177. 'first_conv': 'conv_stem', 'classifier': 'classifier',
  1178. 'license': 'apache-2.0', **kwargs
  1179. }
  1180. default_cfgs = generate_default_cfgs({
  1181. 'mnasnet_050.untrained': _cfg(),
  1182. 'mnasnet_075.untrained': _cfg(),
  1183. 'mnasnet_100.rmsp_in1k': _cfg(
  1184. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mnasnet_b1-74cb7081.pth',
  1185. hf_hub_id='timm/'),
  1186. 'mnasnet_140.untrained': _cfg(),
  1187. 'semnasnet_050.untrained': _cfg(),
  1188. 'semnasnet_075.rmsp_in1k': _cfg(
  1189. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/semnasnet_075-18710866.pth',
  1190. hf_hub_id='timm/'),
  1191. 'semnasnet_100.rmsp_in1k': _cfg(
  1192. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mnasnet_a1-d9418771.pth',
  1193. hf_hub_id='timm/'),
  1194. 'semnasnet_140.untrained': _cfg(),
  1195. 'mnasnet_small.lamb_in1k': _cfg(
  1196. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mnasnet_small_lamb-aff75073.pth',
  1197. hf_hub_id='timm/'),
  1198. 'mobilenetv1_100.ra4_e3600_r224_in1k': _cfg(
  1199. hf_hub_id='timm/',
  1200. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1201. test_input_size=(3, 256, 256), test_crop_pct=0.95,
  1202. ),
  1203. 'mobilenetv1_100h.ra4_e3600_r224_in1k': _cfg(
  1204. hf_hub_id='timm/',
  1205. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1206. test_input_size=(3, 256, 256), test_crop_pct=0.95,
  1207. ),
  1208. 'mobilenetv1_125.ra4_e3600_r224_in1k': _cfg(
  1209. hf_hub_id='timm/',
  1210. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1211. crop_pct=0.9, test_input_size=(3, 256, 256), test_crop_pct=1.0,
  1212. ),
  1213. 'mobilenetv2_035.untrained': _cfg(),
  1214. 'mobilenetv2_050.lamb_in1k': _cfg(
  1215. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv2_050-3d30d450.pth',
  1216. hf_hub_id='timm/',
  1217. interpolation='bicubic',
  1218. ),
  1219. 'mobilenetv2_075.untrained': _cfg(),
  1220. 'mobilenetv2_100.ra_in1k': _cfg(
  1221. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv2_100_ra-b33bc2c4.pth',
  1222. hf_hub_id='timm/'),
  1223. 'mobilenetv2_110d.ra_in1k': _cfg(
  1224. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv2_110d_ra-77090ade.pth',
  1225. hf_hub_id='timm/'),
  1226. 'mobilenetv2_120d.ra_in1k': _cfg(
  1227. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv2_120d_ra-5987e2ed.pth',
  1228. hf_hub_id='timm/'),
  1229. 'mobilenetv2_140.ra_in1k': _cfg(
  1230. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv2_140_ra-21a4e913.pth',
  1231. hf_hub_id='timm/'),
  1232. 'fbnetc_100.rmsp_in1k': _cfg(
  1233. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/fbnetc_100-c345b898.pth',
  1234. hf_hub_id='timm/',
  1235. interpolation='bilinear'),
  1236. 'spnasnet_100.rmsp_in1k': _cfg(
  1237. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/spnasnet_100-048bc3f4.pth',
  1238. hf_hub_id='timm/',
  1239. interpolation='bilinear'),
  1240. # NOTE experimenting with alternate attention
  1241. 'efficientnet_b0.ra_in1k': _cfg(
  1242. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/efficientnet_b0_ra-3dd342df.pth',
  1243. hf_hub_id='timm/'),
  1244. 'efficientnet_b0.ra4_e3600_r224_in1k': _cfg(
  1245. hf_hub_id='timm/',
  1246. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1247. crop_pct=0.9, test_input_size=(3, 256, 256), test_crop_pct=1.0),
  1248. 'efficientnet_b1.ra4_e3600_r240_in1k': _cfg(
  1249. hf_hub_id='timm/',
  1250. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1251. input_size=(3, 240, 240), crop_pct=0.9, pool_size=(8, 8),
  1252. test_input_size=(3, 288, 288), test_crop_pct=1.0),
  1253. 'efficientnet_b1.ft_in1k': _cfg(
  1254. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/efficientnet_b1-533bc792.pth',
  1255. hf_hub_id='timm/',
  1256. test_input_size=(3, 256, 256), test_crop_pct=1.0),
  1257. 'efficientnet_b2.ra_in1k': _cfg(
  1258. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/efficientnet_b2_ra-bcdf34b7.pth',
  1259. hf_hub_id='timm/',
  1260. input_size=(3, 256, 256), pool_size=(8, 8), test_input_size=(3, 288, 288), test_crop_pct=1.0),
  1261. 'efficientnet_b3.ra2_in1k': _cfg(
  1262. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/efficientnet_b3_ra2-cf984f9c.pth',
  1263. hf_hub_id='timm/',
  1264. input_size=(3, 288, 288), pool_size=(9, 9), test_input_size=(3, 320, 320), test_crop_pct=1.0),
  1265. 'efficientnet_b4.ra2_in1k': _cfg(
  1266. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/efficientnet_b4_ra2_320-7eb33cd5.pth',
  1267. hf_hub_id='timm/',
  1268. input_size=(3, 320, 320), pool_size=(10, 10), test_input_size=(3, 384, 384), test_crop_pct=1.0),
  1269. 'efficientnet_b5.sw_in12k_ft_in1k': _cfg(
  1270. hf_hub_id='timm/',
  1271. input_size=(3, 448, 448), pool_size=(14, 14), crop_pct=1.0, crop_mode='squash'),
  1272. 'efficientnet_b5.sw_in12k': _cfg(
  1273. hf_hub_id='timm/',
  1274. input_size=(3, 416, 416), pool_size=(13, 13), crop_pct=0.95, num_classes=11821),
  1275. 'efficientnet_b6.untrained': _cfg(
  1276. url='', input_size=(3, 528, 528), pool_size=(17, 17), crop_pct=0.942),
  1277. 'efficientnet_b7.untrained': _cfg(
  1278. url='', input_size=(3, 600, 600), pool_size=(19, 19), crop_pct=0.949),
  1279. 'efficientnet_b8.untrained': _cfg(
  1280. url='', input_size=(3, 672, 672), pool_size=(21, 21), crop_pct=0.954),
  1281. 'efficientnet_l2.untrained': _cfg(
  1282. url='', input_size=(3, 800, 800), pool_size=(25, 25), crop_pct=0.961),
  1283. # FIXME experimental
  1284. 'efficientnet_b0_gn.untrained': _cfg(),
  1285. 'efficientnet_b0_g8_gn.untrained': _cfg(),
  1286. 'efficientnet_b0_g16_evos.untrained': _cfg(),
  1287. 'efficientnet_b3_gn.untrained': _cfg(
  1288. input_size=(3, 288, 288), pool_size=(9, 9), test_input_size=(3, 320, 320), crop_pct=1.0),
  1289. 'efficientnet_b3_g8_gn.untrained': _cfg(
  1290. input_size=(3, 288, 288), pool_size=(9, 9), test_input_size=(3, 320, 320), crop_pct=1.0),
  1291. 'efficientnet_blur_b0.untrained': _cfg(),
  1292. 'efficientnet_h_b5.sw_r448_e450_in1k': _cfg(
  1293. hf_hub_id='timm/',
  1294. input_size=(3, 448, 448), pool_size=(14, 14), crop_pct=1.0,
  1295. crop_mode='squash', test_input_size=(3, 576, 576)),
  1296. 'efficientnet_x_b3.untrained': _cfg(
  1297. url='', input_size=(3, 288, 288), pool_size=(9, 9), crop_pct=0.95),
  1298. 'efficientnet_x_b5.sw_r448_e450_in1k': _cfg(
  1299. hf_hub_id='timm/',
  1300. input_size=(3, 448, 448), pool_size=(14, 14), crop_pct=1.0,
  1301. crop_mode='squash', test_input_size=(3, 576, 576)),
  1302. 'efficientnet_es.ra_in1k': _cfg(
  1303. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/efficientnet_es_ra-f111e99c.pth',
  1304. hf_hub_id='timm/'),
  1305. 'efficientnet_em.ra2_in1k': _cfg(
  1306. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/efficientnet_em_ra2-66250f76.pth',
  1307. hf_hub_id='timm/',
  1308. input_size=(3, 240, 240), pool_size=(8, 8), crop_pct=0.882),
  1309. 'efficientnet_el.ra_in1k': _cfg(
  1310. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/efficientnet_el-3b455510.pth',
  1311. hf_hub_id='timm/',
  1312. input_size=(3, 300, 300), pool_size=(10, 10), crop_pct=0.904),
  1313. 'efficientnet_es_pruned.in1k': _cfg(
  1314. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/efficientnet_es_pruned75-1b7248cf.pth',
  1315. hf_hub_id='timm/'),
  1316. 'efficientnet_el_pruned.in1k': _cfg(
  1317. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/efficientnet_el_pruned70-ef2a2ccf.pth',
  1318. hf_hub_id='timm/',
  1319. input_size=(3, 300, 300), pool_size=(10, 10), crop_pct=0.904),
  1320. 'efficientnet_cc_b0_4e.untrained': _cfg(),
  1321. 'efficientnet_cc_b0_8e.untrained': _cfg(),
  1322. 'efficientnet_cc_b1_8e.untrained': _cfg(input_size=(3, 240, 240), pool_size=(8, 8), crop_pct=0.882),
  1323. 'efficientnet_lite0.ra_in1k': _cfg(
  1324. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/efficientnet_lite0_ra-37913777.pth',
  1325. hf_hub_id='timm/'),
  1326. 'efficientnet_lite1.untrained': _cfg(
  1327. input_size=(3, 240, 240), pool_size=(8, 8), crop_pct=0.882),
  1328. 'efficientnet_lite2.untrained': _cfg(
  1329. input_size=(3, 260, 260), pool_size=(9, 9), crop_pct=0.890),
  1330. 'efficientnet_lite3.untrained': _cfg(
  1331. input_size=(3, 300, 300), pool_size=(10, 10), crop_pct=0.904),
  1332. 'efficientnet_lite4.untrained': _cfg(
  1333. input_size=(3, 380, 380), pool_size=(12, 12), crop_pct=0.922),
  1334. 'efficientnet_b1_pruned.in1k': _cfg(
  1335. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/effnetb1_pruned-bea43a3a.pth',
  1336. hf_hub_id='timm/',
  1337. input_size=(3, 240, 240), pool_size=(8, 8),
  1338. crop_pct=0.882, mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD),
  1339. 'efficientnet_b2_pruned.in1k': _cfg(
  1340. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/effnetb2_pruned-08c1b27c.pth',
  1341. hf_hub_id='timm/',
  1342. input_size=(3, 260, 260), pool_size=(9, 9),
  1343. crop_pct=0.890, mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD),
  1344. 'efficientnet_b3_pruned.in1k': _cfg(
  1345. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/effnetb3_pruned-59ecf72d.pth',
  1346. hf_hub_id='timm/',
  1347. input_size=(3, 300, 300), pool_size=(10, 10),
  1348. crop_pct=0.904, mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD),
  1349. 'efficientnetv2_rw_t.ra2_in1k': _cfg(
  1350. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/efficientnetv2_t_agc-3620981a.pth',
  1351. hf_hub_id='timm/',
  1352. input_size=(3, 224, 224), test_input_size=(3, 288, 288), pool_size=(7, 7), crop_pct=1.0),
  1353. 'gc_efficientnetv2_rw_t.agc_in1k': _cfg(
  1354. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/gc_efficientnetv2_rw_t_agc-927a0bde.pth',
  1355. hf_hub_id='timm/',
  1356. input_size=(3, 224, 224), test_input_size=(3, 288, 288), pool_size=(7, 7), crop_pct=1.0),
  1357. 'efficientnetv2_rw_s.ra2_in1k': _cfg(
  1358. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/efficientnet_v2s_ra2_288-a6477665.pth',
  1359. hf_hub_id='timm/',
  1360. input_size=(3, 288, 288), test_input_size=(3, 384, 384), pool_size=(9, 9), crop_pct=1.0),
  1361. 'efficientnetv2_rw_m.agc_in1k': _cfg(
  1362. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/efficientnetv2_rw_m_agc-3d90cb1e.pth',
  1363. hf_hub_id='timm/',
  1364. input_size=(3, 320, 320), test_input_size=(3, 416, 416), pool_size=(10, 10), crop_pct=1.0),
  1365. 'efficientnetv2_s.untrained': _cfg(
  1366. input_size=(3, 288, 288), test_input_size=(3, 384, 384), pool_size=(9, 9), crop_pct=1.0),
  1367. 'efficientnetv2_m.untrained': _cfg(
  1368. input_size=(3, 320, 320), test_input_size=(3, 416, 416), pool_size=(10, 10), crop_pct=1.0),
  1369. 'efficientnetv2_l.untrained': _cfg(
  1370. input_size=(3, 384, 384), test_input_size=(3, 480, 480), pool_size=(12, 12), crop_pct=1.0),
  1371. 'efficientnetv2_xl.untrained': _cfg(
  1372. input_size=(3, 384, 384), test_input_size=(3, 512, 512), pool_size=(12, 12), crop_pct=1.0),
  1373. 'tf_efficientnet_b0.ns_jft_in1k': _cfg(
  1374. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b0_ns-c0e6a31c.pth',
  1375. hf_hub_id='timm/',
  1376. input_size=(3, 224, 224)),
  1377. 'tf_efficientnet_b1.ns_jft_in1k': _cfg(
  1378. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b1_ns-99dd0c41.pth',
  1379. hf_hub_id='timm/',
  1380. input_size=(3, 240, 240), pool_size=(8, 8), crop_pct=0.882),
  1381. 'tf_efficientnet_b2.ns_jft_in1k': _cfg(
  1382. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b2_ns-00306e48.pth',
  1383. hf_hub_id='timm/',
  1384. input_size=(3, 260, 260), pool_size=(9, 9), crop_pct=0.890),
  1385. 'tf_efficientnet_b3.ns_jft_in1k': _cfg(
  1386. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b3_ns-9d44bf68.pth',
  1387. hf_hub_id='timm/',
  1388. input_size=(3, 300, 300), pool_size=(10, 10), crop_pct=0.904),
  1389. 'tf_efficientnet_b4.ns_jft_in1k': _cfg(
  1390. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b4_ns-d6313a46.pth',
  1391. hf_hub_id='timm/',
  1392. input_size=(3, 380, 380), pool_size=(12, 12), crop_pct=0.922),
  1393. 'tf_efficientnet_b5.ns_jft_in1k': _cfg(
  1394. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b5_ns-6f26d0cf.pth',
  1395. hf_hub_id='timm/',
  1396. input_size=(3, 456, 456), pool_size=(15, 15), crop_pct=0.934),
  1397. 'tf_efficientnet_b6.ns_jft_in1k': _cfg(
  1398. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b6_ns-51548356.pth',
  1399. hf_hub_id='timm/',
  1400. input_size=(3, 528, 528), pool_size=(17, 17), crop_pct=0.942),
  1401. 'tf_efficientnet_b7.ns_jft_in1k': _cfg(
  1402. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b7_ns-1dbc32de.pth',
  1403. hf_hub_id='timm/',
  1404. input_size=(3, 600, 600), pool_size=(19, 19), crop_pct=0.949),
  1405. 'tf_efficientnet_l2.ns_jft_in1k_475': _cfg(
  1406. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_l2_ns_475-bebbd00a.pth',
  1407. hf_hub_id='timm/',
  1408. input_size=(3, 475, 475), pool_size=(15, 15), crop_pct=0.936),
  1409. 'tf_efficientnet_l2.ns_jft_in1k': _cfg(
  1410. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_l2_ns-df73bb44.pth',
  1411. hf_hub_id='timm/',
  1412. input_size=(3, 800, 800), pool_size=(25, 25), crop_pct=0.96),
  1413. 'tf_efficientnet_b0.ap_in1k': _cfg(
  1414. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b0_ap-f262efe1.pth',
  1415. hf_hub_id='timm/',
  1416. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD, input_size=(3, 224, 224)),
  1417. 'tf_efficientnet_b1.ap_in1k': _cfg(
  1418. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b1_ap-44ef0a3d.pth',
  1419. hf_hub_id='timm/',
  1420. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1421. input_size=(3, 240, 240), pool_size=(8, 8), crop_pct=0.882),
  1422. 'tf_efficientnet_b2.ap_in1k': _cfg(
  1423. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b2_ap-2f8e7636.pth',
  1424. hf_hub_id='timm/',
  1425. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1426. input_size=(3, 260, 260), pool_size=(9, 9), crop_pct=0.890),
  1427. 'tf_efficientnet_b3.ap_in1k': _cfg(
  1428. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b3_ap-aad25bdd.pth',
  1429. hf_hub_id='timm/',
  1430. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1431. input_size=(3, 300, 300), pool_size=(10, 10), crop_pct=0.904),
  1432. 'tf_efficientnet_b4.ap_in1k': _cfg(
  1433. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b4_ap-dedb23e6.pth',
  1434. hf_hub_id='timm/',
  1435. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1436. input_size=(3, 380, 380), pool_size=(12, 12), crop_pct=0.922),
  1437. 'tf_efficientnet_b5.ap_in1k': _cfg(
  1438. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b5_ap-9e82fae8.pth',
  1439. hf_hub_id='timm/',
  1440. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1441. input_size=(3, 456, 456), pool_size=(15, 15), crop_pct=0.934),
  1442. 'tf_efficientnet_b6.ap_in1k': _cfg(
  1443. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b6_ap-4ffb161f.pth',
  1444. hf_hub_id='timm/',
  1445. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1446. input_size=(3, 528, 528), pool_size=(17, 17), crop_pct=0.942),
  1447. 'tf_efficientnet_b7.ap_in1k': _cfg(
  1448. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b7_ap-ddb28fec.pth',
  1449. hf_hub_id='timm/',
  1450. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1451. input_size=(3, 600, 600), pool_size=(19, 19), crop_pct=0.949),
  1452. 'tf_efficientnet_b8.ap_in1k': _cfg(
  1453. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b8_ap-00e169fa.pth',
  1454. hf_hub_id='timm/',
  1455. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1456. input_size=(3, 672, 672), pool_size=(21, 21), crop_pct=0.954),
  1457. 'tf_efficientnet_b5.ra_in1k': _cfg(
  1458. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b5_ra-9a3e5369.pth',
  1459. hf_hub_id='timm/',
  1460. input_size=(3, 456, 456), pool_size=(15, 15), crop_pct=0.934),
  1461. 'tf_efficientnet_b7.ra_in1k': _cfg(
  1462. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b7_ra-6c08e654.pth',
  1463. hf_hub_id='timm/',
  1464. input_size=(3, 600, 600), pool_size=(19, 19), crop_pct=0.949),
  1465. 'tf_efficientnet_b8.ra_in1k': _cfg(
  1466. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b8_ra-572d5dd9.pth',
  1467. hf_hub_id='timm/',
  1468. input_size=(3, 672, 672), pool_size=(21, 21), crop_pct=0.954),
  1469. 'tf_efficientnet_b0.aa_in1k': _cfg(
  1470. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b0_aa-827b6e33.pth',
  1471. hf_hub_id='timm/',
  1472. input_size=(3, 224, 224)),
  1473. 'tf_efficientnet_b1.aa_in1k': _cfg(
  1474. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b1_aa-ea7a6ee0.pth',
  1475. hf_hub_id='timm/',
  1476. input_size=(3, 240, 240), pool_size=(8, 8), crop_pct=0.882),
  1477. 'tf_efficientnet_b2.aa_in1k': _cfg(
  1478. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b2_aa-60c94f97.pth',
  1479. hf_hub_id='timm/',
  1480. input_size=(3, 260, 260), pool_size=(9, 9), crop_pct=0.890),
  1481. 'tf_efficientnet_b3.aa_in1k': _cfg(
  1482. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b3_aa-84b4657e.pth',
  1483. hf_hub_id='timm/',
  1484. input_size=(3, 300, 300), pool_size=(10, 10), crop_pct=0.904),
  1485. 'tf_efficientnet_b4.aa_in1k': _cfg(
  1486. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b4_aa-818f208c.pth',
  1487. hf_hub_id='timm/',
  1488. input_size=(3, 380, 380), pool_size=(12, 12), crop_pct=0.922),
  1489. 'tf_efficientnet_b5.aa_in1k': _cfg(
  1490. url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b5_aa-99018a74.pth',
  1491. hf_hub_id='timm/',
  1492. input_size=(3, 456, 456), pool_size=(15, 15), crop_pct=0.934),
  1493. 'tf_efficientnet_b6.aa_in1k': _cfg(
  1494. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b6_aa-80ba17e4.pth',
  1495. hf_hub_id='timm/',
  1496. input_size=(3, 528, 528), pool_size=(17, 17), crop_pct=0.942),
  1497. 'tf_efficientnet_b7.aa_in1k': _cfg(
  1498. url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b7_aa-076e3472.pth',
  1499. hf_hub_id='timm/',
  1500. input_size=(3, 600, 600), pool_size=(19, 19), crop_pct=0.949),
  1501. 'tf_efficientnet_b0.in1k': _cfg(
  1502. url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b0-0af12548.pth',
  1503. hf_hub_id='timm/',
  1504. input_size=(3, 224, 224)),
  1505. 'tf_efficientnet_b1.in1k': _cfg(
  1506. url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b1-5c1377c4.pth',
  1507. hf_hub_id='timm/',
  1508. input_size=(3, 240, 240), pool_size=(8, 8), crop_pct=0.882),
  1509. 'tf_efficientnet_b2.in1k': _cfg(
  1510. url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b2-e393ef04.pth',
  1511. hf_hub_id='timm/',
  1512. input_size=(3, 260, 260), pool_size=(9, 9), crop_pct=0.890),
  1513. 'tf_efficientnet_b3.in1k': _cfg(
  1514. url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b3-e3bd6955.pth',
  1515. hf_hub_id='timm/',
  1516. input_size=(3, 300, 300), pool_size=(10, 10), crop_pct=0.904),
  1517. 'tf_efficientnet_b4.in1k': _cfg(
  1518. url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b4-74ee3bed.pth',
  1519. hf_hub_id='timm/',
  1520. input_size=(3, 380, 380), pool_size=(12, 12), crop_pct=0.922),
  1521. 'tf_efficientnet_b5.in1k': _cfg(
  1522. url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_b5-c6949ce9.pth',
  1523. hf_hub_id='timm/',
  1524. input_size=(3, 456, 456), pool_size=(15, 15), crop_pct=0.934),
  1525. 'tf_efficientnet_es.in1k': _cfg(
  1526. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_es-ca1afbfe.pth',
  1527. hf_hub_id='timm/',
  1528. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1529. input_size=(3, 224, 224), ),
  1530. 'tf_efficientnet_em.in1k': _cfg(
  1531. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_em-e78cfe58.pth',
  1532. hf_hub_id='timm/',
  1533. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1534. input_size=(3, 240, 240), pool_size=(8, 8), crop_pct=0.882),
  1535. 'tf_efficientnet_el.in1k': _cfg(
  1536. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_el-5143854e.pth',
  1537. hf_hub_id='timm/',
  1538. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1539. input_size=(3, 300, 300), pool_size=(10, 10), crop_pct=0.904),
  1540. 'tf_efficientnet_cc_b0_4e.in1k': _cfg(
  1541. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_cc_b0_4e-4362b6b2.pth',
  1542. hf_hub_id='timm/',
  1543. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD),
  1544. 'tf_efficientnet_cc_b0_8e.in1k': _cfg(
  1545. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_cc_b0_8e-66184a25.pth',
  1546. hf_hub_id='timm/',
  1547. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD),
  1548. 'tf_efficientnet_cc_b1_8e.in1k': _cfg(
  1549. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_cc_b1_8e-f7c79ae1.pth',
  1550. hf_hub_id='timm/',
  1551. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1552. input_size=(3, 240, 240), pool_size=(8, 8), crop_pct=0.882),
  1553. 'tf_efficientnet_lite0.in1k': _cfg(
  1554. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_lite0-0aa007d2.pth',
  1555. hf_hub_id='timm/',
  1556. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1557. interpolation='bicubic', # should be bilinear but bicubic better match for TF bilinear at low res
  1558. ),
  1559. 'tf_efficientnet_lite1.in1k': _cfg(
  1560. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_lite1-bde8b488.pth',
  1561. hf_hub_id='timm/',
  1562. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1563. input_size=(3, 240, 240), pool_size=(8, 8), crop_pct=0.882,
  1564. interpolation='bicubic', # should be bilinear but bicubic better match for TF bilinear at low res
  1565. ),
  1566. 'tf_efficientnet_lite2.in1k': _cfg(
  1567. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_lite2-dcccb7df.pth',
  1568. hf_hub_id='timm/',
  1569. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1570. input_size=(3, 260, 260), pool_size=(9, 9), crop_pct=0.890,
  1571. interpolation='bicubic', # should be bilinear but bicubic better match for TF bilinear at low res
  1572. ),
  1573. 'tf_efficientnet_lite3.in1k': _cfg(
  1574. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_lite3-b733e338.pth',
  1575. hf_hub_id='timm/',
  1576. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1577. input_size=(3, 300, 300), pool_size=(10, 10), crop_pct=0.904, interpolation='bilinear'),
  1578. 'tf_efficientnet_lite4.in1k': _cfg(
  1579. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_efficientnet_lite4-741542c3.pth',
  1580. hf_hub_id='timm/',
  1581. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1582. input_size=(3, 380, 380), pool_size=(12, 12), crop_pct=0.920, interpolation='bilinear'),
  1583. 'tf_efficientnetv2_s.in21k_ft_in1k': _cfg(
  1584. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_s_21ft1k-d7dafa41.pth',
  1585. hf_hub_id='timm/',
  1586. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1587. input_size=(3, 300, 300), test_input_size=(3, 384, 384), pool_size=(10, 10), crop_pct=1.0),
  1588. 'tf_efficientnetv2_m.in21k_ft_in1k': _cfg(
  1589. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_m_21ft1k-bf41664a.pth',
  1590. hf_hub_id='timm/',
  1591. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1592. input_size=(3, 384, 384), test_input_size=(3, 480, 480), pool_size=(12, 12), crop_pct=1.0, crop_mode='squash'),
  1593. 'tf_efficientnetv2_l.in21k_ft_in1k': _cfg(
  1594. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_l_21ft1k-60127a9d.pth',
  1595. hf_hub_id='timm/',
  1596. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1597. input_size=(3, 384, 384), test_input_size=(3, 480, 480), pool_size=(12, 12), crop_pct=1.0, crop_mode='squash'),
  1598. 'tf_efficientnetv2_xl.in21k_ft_in1k': _cfg(
  1599. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_xl_in21ft1k-06c35c48.pth',
  1600. hf_hub_id='timm/',
  1601. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1602. input_size=(3, 384, 384), test_input_size=(3, 512, 512), pool_size=(12, 12), crop_pct=1.0, crop_mode='squash'),
  1603. 'tf_efficientnetv2_s.in1k': _cfg(
  1604. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_s-eb54923e.pth',
  1605. hf_hub_id='timm/',
  1606. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1607. input_size=(3, 300, 300), test_input_size=(3, 384, 384), pool_size=(10, 10), crop_pct=1.0),
  1608. 'tf_efficientnetv2_m.in1k': _cfg(
  1609. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_m-cc09e0cd.pth',
  1610. hf_hub_id='timm/',
  1611. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1612. input_size=(3, 384, 384), test_input_size=(3, 480, 480), pool_size=(12, 12), crop_pct=1.0, crop_mode='squash'),
  1613. 'tf_efficientnetv2_l.in1k': _cfg(
  1614. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_l-d664b728.pth',
  1615. hf_hub_id='timm/',
  1616. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1617. input_size=(3, 384, 384), test_input_size=(3, 480, 480), pool_size=(12, 12), crop_pct=1.0, crop_mode='squash'),
  1618. 'tf_efficientnetv2_s.in21k': _cfg(
  1619. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_s_21k-6337ad01.pth',
  1620. hf_hub_id='timm/',
  1621. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), num_classes=21843,
  1622. input_size=(3, 300, 300), test_input_size=(3, 384, 384), pool_size=(10, 10), crop_pct=1.0),
  1623. 'tf_efficientnetv2_m.in21k': _cfg(
  1624. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_m_21k-361418a2.pth',
  1625. hf_hub_id='timm/',
  1626. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), num_classes=21843,
  1627. input_size=(3, 384, 384), test_input_size=(3, 480, 480), pool_size=(12, 12), crop_pct=1.0, crop_mode='squash'),
  1628. 'tf_efficientnetv2_l.in21k': _cfg(
  1629. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_l_21k-91a19ec9.pth',
  1630. hf_hub_id='timm/',
  1631. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), num_classes=21843,
  1632. input_size=(3, 384, 384), test_input_size=(3, 480, 480), pool_size=(12, 12), crop_pct=1.0, crop_mode='squash'),
  1633. 'tf_efficientnetv2_xl.in21k': _cfg(
  1634. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_xl_in21k-fd7e8abf.pth',
  1635. hf_hub_id='timm/',
  1636. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), num_classes=21843,
  1637. input_size=(3, 384, 384), test_input_size=(3, 512, 512), pool_size=(12, 12), crop_pct=1.0, crop_mode='squash'),
  1638. 'tf_efficientnetv2_b0.in1k': _cfg(
  1639. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_b0-c7cc451f.pth',
  1640. hf_hub_id='timm/',
  1641. input_size=(3, 192, 192), test_input_size=(3, 224, 224), pool_size=(6, 6)),
  1642. 'tf_efficientnetv2_b1.in1k': _cfg(
  1643. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_b1-be6e41b0.pth',
  1644. hf_hub_id='timm/',
  1645. input_size=(3, 192, 192), test_input_size=(3, 240, 240), pool_size=(6, 6), crop_pct=0.882),
  1646. 'tf_efficientnetv2_b2.in1k': _cfg(
  1647. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_b2-847de54e.pth',
  1648. hf_hub_id='timm/',
  1649. input_size=(3, 208, 208), test_input_size=(3, 260, 260), pool_size=(7, 7), crop_pct=0.890),
  1650. 'tf_efficientnetv2_b3.in21k_ft_in1k': _cfg(
  1651. hf_hub_id='timm/',
  1652. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1653. input_size=(3, 240, 240), test_input_size=(3, 300, 300), pool_size=(8, 8), crop_pct=0.9, crop_mode='squash'),
  1654. 'tf_efficientnetv2_b3.in1k': _cfg(
  1655. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-effv2-weights/tf_efficientnetv2_b3-57773f13.pth',
  1656. hf_hub_id='timm/',
  1657. input_size=(3, 240, 240), test_input_size=(3, 300, 300), pool_size=(8, 8), crop_pct=0.904),
  1658. 'tf_efficientnetv2_b3.in21k': _cfg(
  1659. hf_hub_id='timm/',
  1660. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD, num_classes=21843,
  1661. input_size=(3, 240, 240), test_input_size=(3, 300, 300), pool_size=(8, 8), crop_pct=0.904),
  1662. 'mixnet_s.ft_in1k': _cfg(
  1663. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mixnet_s-a907afbc.pth',
  1664. hf_hub_id='timm/'),
  1665. 'mixnet_m.ft_in1k': _cfg(
  1666. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mixnet_m-4647fc68.pth',
  1667. hf_hub_id='timm/'),
  1668. 'mixnet_l.ft_in1k': _cfg(
  1669. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mixnet_l-5a9a2ed8.pth',
  1670. hf_hub_id='timm/'),
  1671. 'mixnet_xl.ra_in1k': _cfg(
  1672. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mixnet_xl_ra-aac3c00c.pth',
  1673. hf_hub_id='timm/'),
  1674. 'mixnet_xxl.untrained': _cfg(),
  1675. 'tf_mixnet_s.in1k': _cfg(
  1676. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mixnet_s-89d3354b.pth',
  1677. hf_hub_id='timm/'),
  1678. 'tf_mixnet_m.in1k': _cfg(
  1679. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mixnet_m-0f4d8805.pth',
  1680. hf_hub_id='timm/'),
  1681. 'tf_mixnet_l.in1k': _cfg(
  1682. url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mixnet_l-6c92e0c8.pth',
  1683. hf_hub_id='timm/'),
  1684. "tinynet_a.in1k": _cfg(
  1685. input_size=(3, 192, 192), pool_size=(6, 6), # int(224 * 0.86)
  1686. url='https://github.com/huawei-noah/CV-Backbones/releases/download/v1.2.0/tinynet_a.pth',
  1687. hf_hub_id='timm/'),
  1688. "tinynet_b.in1k": _cfg(
  1689. input_size=(3, 188, 188), pool_size=(6, 6), # int(224 * 0.84)
  1690. url='https://github.com/huawei-noah/CV-Backbones/releases/download/v1.2.0/tinynet_b.pth',
  1691. hf_hub_id='timm/'),
  1692. "tinynet_c.in1k": _cfg(
  1693. input_size=(3, 184, 184), pool_size=(6, 6), # int(224 * 0.825)
  1694. url='https://github.com/huawei-noah/CV-Backbones/releases/download/v1.2.0/tinynet_c.pth',
  1695. hf_hub_id='timm/'),
  1696. "tinynet_d.in1k": _cfg(
  1697. input_size=(3, 152, 152), pool_size=(5, 5), # int(224 * 0.68)
  1698. url='https://github.com/huawei-noah/CV-Backbones/releases/download/v1.2.0/tinynet_d.pth',
  1699. hf_hub_id='timm/'),
  1700. "tinynet_e.in1k": _cfg(
  1701. input_size=(3, 106, 106), pool_size=(4, 4), # int(224 * 0.475)
  1702. url='https://github.com/huawei-noah/CV-Backbones/releases/download/v1.2.0/tinynet_e.pth',
  1703. hf_hub_id='timm/'),
  1704. 'mobilenet_edgetpu_100.untrained': _cfg(
  1705. # hf_hub_id='timm/',
  1706. input_size=(3, 224, 224), crop_pct=0.9),
  1707. 'mobilenet_edgetpu_v2_xs.untrained': _cfg(
  1708. # hf_hub_id='timm/',
  1709. input_size=(3, 224, 224), crop_pct=0.9),
  1710. 'mobilenet_edgetpu_v2_s.untrained': _cfg(
  1711. #hf_hub_id='timm/',
  1712. input_size=(3, 224, 224), crop_pct=0.9),
  1713. 'mobilenet_edgetpu_v2_m.ra4_e3600_r224_in1k': _cfg(
  1714. hf_hub_id='timm/',
  1715. mean=IMAGENET_INCEPTION_MEAN, std=IMAGENET_INCEPTION_STD,
  1716. crop_pct=0.9, test_input_size=(3, 256, 256), test_crop_pct=0.95,
  1717. ),
  1718. 'mobilenet_edgetpu_v2_l.untrained': _cfg(
  1719. #hf_hub_id='timm/',
  1720. input_size=(3, 224, 224), crop_pct=0.9),
  1721. "test_efficientnet.r160_in1k": _cfg(
  1722. hf_hub_id='timm/',
  1723. input_size=(3, 160, 160), pool_size=(5, 5), crop_pct=0.95),
  1724. "test_efficientnet_ln.r160_in1k": _cfg(
  1725. hf_hub_id='timm/',
  1726. input_size=(3, 160, 160), pool_size=(5, 5), crop_pct=0.95),
  1727. "test_efficientnet_gn.r160_in1k": _cfg(
  1728. hf_hub_id='timm/',
  1729. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1730. input_size=(3, 160, 160), pool_size=(5, 5), crop_pct=0.95),
  1731. "test_efficientnet_evos.r160_in1k": _cfg(
  1732. hf_hub_id='timm/',
  1733. mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
  1734. input_size=(3, 160, 160), pool_size=(5, 5), crop_pct=0.95),
  1735. })
  1736. @register_model
  1737. def mnasnet_050(pretrained=False, **kwargs) -> EfficientNet:
  1738. """ MNASNet B1, depth multiplier of 0.5. """
  1739. model = _gen_mnasnet_b1('mnasnet_050', 0.5, pretrained=pretrained, **kwargs)
  1740. return model
  1741. @register_model
  1742. def mnasnet_075(pretrained=False, **kwargs) -> EfficientNet:
  1743. """ MNASNet B1, depth multiplier of 0.75. """
  1744. model = _gen_mnasnet_b1('mnasnet_075', 0.75, pretrained=pretrained, **kwargs)
  1745. return model
  1746. @register_model
  1747. def mnasnet_100(pretrained=False, **kwargs) -> EfficientNet:
  1748. """ MNASNet B1, depth multiplier of 1.0. """
  1749. model = _gen_mnasnet_b1('mnasnet_100', 1.0, pretrained=pretrained, **kwargs)
  1750. return model
  1751. @register_model
  1752. def mnasnet_140(pretrained=False, **kwargs) -> EfficientNet:
  1753. """ MNASNet B1, depth multiplier of 1.4 """
  1754. model = _gen_mnasnet_b1('mnasnet_140', 1.4, pretrained=pretrained, **kwargs)
  1755. return model
  1756. @register_model
  1757. def semnasnet_050(pretrained=False, **kwargs) -> EfficientNet:
  1758. """ MNASNet A1 (w/ SE), depth multiplier of 0.5 """
  1759. model = _gen_mnasnet_a1('semnasnet_050', 0.5, pretrained=pretrained, **kwargs)
  1760. return model
  1761. @register_model
  1762. def semnasnet_075(pretrained=False, **kwargs) -> EfficientNet:
  1763. """ MNASNet A1 (w/ SE), depth multiplier of 0.75. """
  1764. model = _gen_mnasnet_a1('semnasnet_075', 0.75, pretrained=pretrained, **kwargs)
  1765. return model
  1766. @register_model
  1767. def semnasnet_100(pretrained=False, **kwargs) -> EfficientNet:
  1768. """ MNASNet A1 (w/ SE), depth multiplier of 1.0. """
  1769. model = _gen_mnasnet_a1('semnasnet_100', 1.0, pretrained=pretrained, **kwargs)
  1770. return model
  1771. @register_model
  1772. def semnasnet_140(pretrained=False, **kwargs) -> EfficientNet:
  1773. """ MNASNet A1 (w/ SE), depth multiplier of 1.4. """
  1774. model = _gen_mnasnet_a1('semnasnet_140', 1.4, pretrained=pretrained, **kwargs)
  1775. return model
  1776. @register_model
  1777. def mnasnet_small(pretrained=False, **kwargs) -> EfficientNet:
  1778. """ MNASNet Small, depth multiplier of 1.0. """
  1779. model = _gen_mnasnet_small('mnasnet_small', 1.0, pretrained=pretrained, **kwargs)
  1780. return model
  1781. @register_model
  1782. def mobilenetv1_100(pretrained=False, **kwargs) -> EfficientNet:
  1783. """ MobileNet V1 """
  1784. model = _gen_mobilenet_v1('mobilenetv1_100', 1.0, pretrained=pretrained, **kwargs)
  1785. return model
  1786. @register_model
  1787. def mobilenetv1_100h(pretrained=False, **kwargs) -> EfficientNet:
  1788. """ MobileNet V1 """
  1789. model = _gen_mobilenet_v1('mobilenetv1_100h', 1.0, head_conv=True, pretrained=pretrained, **kwargs)
  1790. return model
  1791. @register_model
  1792. def mobilenetv1_125(pretrained=False, **kwargs) -> EfficientNet:
  1793. """ MobileNet V1 """
  1794. model = _gen_mobilenet_v1('mobilenetv1_125', 1.25, pretrained=pretrained, **kwargs)
  1795. return model
  1796. @register_model
  1797. def mobilenetv2_035(pretrained=False, **kwargs) -> EfficientNet:
  1798. """ MobileNet V2 w/ 0.35 channel multiplier """
  1799. model = _gen_mobilenet_v2('mobilenetv2_035', 0.35, pretrained=pretrained, **kwargs)
  1800. return model
  1801. @register_model
  1802. def mobilenetv2_050(pretrained=False, **kwargs) -> EfficientNet:
  1803. """ MobileNet V2 w/ 0.5 channel multiplier """
  1804. model = _gen_mobilenet_v2('mobilenetv2_050', 0.5, pretrained=pretrained, **kwargs)
  1805. return model
  1806. @register_model
  1807. def mobilenetv2_075(pretrained=False, **kwargs) -> EfficientNet:
  1808. """ MobileNet V2 w/ 0.75 channel multiplier """
  1809. model = _gen_mobilenet_v2('mobilenetv2_075', 0.75, pretrained=pretrained, **kwargs)
  1810. return model
  1811. @register_model
  1812. def mobilenetv2_100(pretrained=False, **kwargs) -> EfficientNet:
  1813. """ MobileNet V2 w/ 1.0 channel multiplier """
  1814. model = _gen_mobilenet_v2('mobilenetv2_100', 1.0, pretrained=pretrained, **kwargs)
  1815. return model
  1816. @register_model
  1817. def mobilenetv2_140(pretrained=False, **kwargs) -> EfficientNet:
  1818. """ MobileNet V2 w/ 1.4 channel multiplier """
  1819. model = _gen_mobilenet_v2('mobilenetv2_140', 1.4, pretrained=pretrained, **kwargs)
  1820. return model
  1821. @register_model
  1822. def mobilenetv2_110d(pretrained=False, **kwargs) -> EfficientNet:
  1823. """ MobileNet V2 w/ 1.1 channel, 1.2 depth multipliers"""
  1824. model = _gen_mobilenet_v2(
  1825. 'mobilenetv2_110d', 1.1, depth_multiplier=1.2, fix_stem_head=True, pretrained=pretrained, **kwargs)
  1826. return model
  1827. @register_model
  1828. def mobilenetv2_120d(pretrained=False, **kwargs) -> EfficientNet:
  1829. """ MobileNet V2 w/ 1.2 channel, 1.4 depth multipliers """
  1830. model = _gen_mobilenet_v2(
  1831. 'mobilenetv2_120d', 1.2, depth_multiplier=1.4, fix_stem_head=True, pretrained=pretrained, **kwargs)
  1832. return model
  1833. @register_model
  1834. def fbnetc_100(pretrained=False, **kwargs) -> EfficientNet:
  1835. """ FBNet-C """
  1836. if pretrained:
  1837. # pretrained model trained with non-default BN epsilon
  1838. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  1839. model = _gen_fbnetc('fbnetc_100', 1.0, pretrained=pretrained, **kwargs)
  1840. return model
  1841. @register_model
  1842. def spnasnet_100(pretrained=False, **kwargs) -> EfficientNet:
  1843. """ Single-Path NAS Pixel1"""
  1844. model = _gen_spnasnet('spnasnet_100', 1.0, pretrained=pretrained, **kwargs)
  1845. return model
  1846. @register_model
  1847. def efficientnet_b0(pretrained=False, **kwargs) -> EfficientNet:
  1848. """ EfficientNet-B0 """
  1849. # NOTE for train, drop_rate should be 0.2, drop_path_rate should be 0.2
  1850. model = _gen_efficientnet(
  1851. 'efficientnet_b0', channel_multiplier=1.0, depth_multiplier=1.0, pretrained=pretrained, **kwargs)
  1852. return model
  1853. @register_model
  1854. def efficientnet_b1(pretrained=False, **kwargs) -> EfficientNet:
  1855. """ EfficientNet-B1 """
  1856. # NOTE for train, drop_rate should be 0.2, drop_path_rate should be 0.2
  1857. model = _gen_efficientnet(
  1858. 'efficientnet_b1', channel_multiplier=1.0, depth_multiplier=1.1, pretrained=pretrained, **kwargs)
  1859. return model
  1860. @register_model
  1861. def efficientnet_b2(pretrained=False, **kwargs) -> EfficientNet:
  1862. """ EfficientNet-B2 """
  1863. # NOTE for train, drop_rate should be 0.3, drop_path_rate should be 0.2
  1864. model = _gen_efficientnet(
  1865. 'efficientnet_b2', channel_multiplier=1.1, depth_multiplier=1.2, pretrained=pretrained, **kwargs)
  1866. return model
  1867. @register_model
  1868. def efficientnet_b3(pretrained=False, **kwargs) -> EfficientNet:
  1869. """ EfficientNet-B3 """
  1870. # NOTE for train, drop_rate should be 0.3, drop_path_rate should be 0.2
  1871. model = _gen_efficientnet(
  1872. 'efficientnet_b3', channel_multiplier=1.2, depth_multiplier=1.4, pretrained=pretrained, **kwargs)
  1873. return model
  1874. @register_model
  1875. def efficientnet_b4(pretrained=False, **kwargs) -> EfficientNet:
  1876. """ EfficientNet-B4 """
  1877. # NOTE for train, drop_rate should be 0.4, drop_path_rate should be 0.2
  1878. model = _gen_efficientnet(
  1879. 'efficientnet_b4', channel_multiplier=1.4, depth_multiplier=1.8, pretrained=pretrained, **kwargs)
  1880. return model
  1881. @register_model
  1882. def efficientnet_b5(pretrained=False, **kwargs) -> EfficientNet:
  1883. """ EfficientNet-B5 """
  1884. # NOTE for train, drop_rate should be 0.4, drop_path_rate should be 0.2
  1885. model = _gen_efficientnet(
  1886. 'efficientnet_b5', channel_multiplier=1.6, depth_multiplier=2.2, pretrained=pretrained, **kwargs)
  1887. return model
  1888. @register_model
  1889. def efficientnet_b6(pretrained=False, **kwargs) -> EfficientNet:
  1890. """ EfficientNet-B6 """
  1891. # NOTE for train, drop_rate should be 0.5, drop_path_rate should be 0.2
  1892. model = _gen_efficientnet(
  1893. 'efficientnet_b6', channel_multiplier=1.8, depth_multiplier=2.6, pretrained=pretrained, **kwargs)
  1894. return model
  1895. @register_model
  1896. def efficientnet_b7(pretrained=False, **kwargs) -> EfficientNet:
  1897. """ EfficientNet-B7 """
  1898. # NOTE for train, drop_rate should be 0.5, drop_path_rate should be 0.2
  1899. model = _gen_efficientnet(
  1900. 'efficientnet_b7', channel_multiplier=2.0, depth_multiplier=3.1, pretrained=pretrained, **kwargs)
  1901. return model
  1902. @register_model
  1903. def efficientnet_b8(pretrained=False, **kwargs) -> EfficientNet:
  1904. """ EfficientNet-B8 """
  1905. # NOTE for train, drop_rate should be 0.5, drop_path_rate should be 0.2
  1906. model = _gen_efficientnet(
  1907. 'efficientnet_b8', channel_multiplier=2.2, depth_multiplier=3.6, pretrained=pretrained, **kwargs)
  1908. return model
  1909. @register_model
  1910. def efficientnet_l2(pretrained=False, **kwargs) -> EfficientNet:
  1911. """ EfficientNet-L2."""
  1912. # NOTE for train, drop_rate should be 0.5, drop_path_rate should be 0.2
  1913. model = _gen_efficientnet(
  1914. 'efficientnet_l2', channel_multiplier=4.3, depth_multiplier=5.3, pretrained=pretrained, **kwargs)
  1915. return model
  1916. # FIXME experimental group cong / GroupNorm / EvoNorm experiments
  1917. @register_model
  1918. def efficientnet_b0_gn(pretrained=False, **kwargs) -> EfficientNet:
  1919. """ EfficientNet-B0 + GroupNorm"""
  1920. model = _gen_efficientnet(
  1921. 'efficientnet_b0_gn', norm_layer=partial(GroupNormAct, group_size=8), pretrained=pretrained, **kwargs)
  1922. return model
  1923. @register_model
  1924. def efficientnet_b0_g8_gn(pretrained=False, **kwargs) -> EfficientNet:
  1925. """ EfficientNet-B0 w/ group conv + GroupNorm"""
  1926. model = _gen_efficientnet(
  1927. 'efficientnet_b0_g8_gn', group_size=8, norm_layer=partial(GroupNormAct, group_size=8),
  1928. pretrained=pretrained, **kwargs)
  1929. return model
  1930. @register_model
  1931. def efficientnet_b0_g16_evos(pretrained=False, **kwargs) -> EfficientNet:
  1932. """ EfficientNet-B0 w/ group 16 conv + EvoNorm"""
  1933. model = _gen_efficientnet(
  1934. 'efficientnet_b0_g16_evos', group_size=16, channel_divisor=16,
  1935. pretrained=pretrained, **kwargs) #norm_layer=partial(EvoNorm2dS0, group_size=16),
  1936. return model
  1937. @register_model
  1938. def efficientnet_b3_gn(pretrained=False, **kwargs) -> EfficientNet:
  1939. """ EfficientNet-B3 w/ GroupNorm """
  1940. # NOTE for train, drop_rate should be 0.3, drop_path_rate should be 0.2
  1941. model = _gen_efficientnet(
  1942. 'efficientnet_b3_gn', channel_multiplier=1.2, depth_multiplier=1.4, channel_divisor=16,
  1943. norm_layer=partial(GroupNormAct, group_size=16), pretrained=pretrained, **kwargs)
  1944. return model
  1945. @register_model
  1946. def efficientnet_b3_g8_gn(pretrained=False, **kwargs) -> EfficientNet:
  1947. """ EfficientNet-B3 w/ grouped conv + BN"""
  1948. # NOTE for train, drop_rate should be 0.3, drop_path_rate should be 0.2
  1949. model = _gen_efficientnet(
  1950. 'efficientnet_b3_g8_gn', channel_multiplier=1.2, depth_multiplier=1.4, group_size=8, channel_divisor=16,
  1951. norm_layer=partial(GroupNormAct, group_size=16), pretrained=pretrained, **kwargs)
  1952. return model
  1953. @register_model
  1954. def efficientnet_blur_b0(pretrained=False, **kwargs) -> EfficientNet:
  1955. """ EfficientNet-B0 w/ BlurPool """
  1956. # NOTE for train, drop_rate should be 0.2, drop_path_rate should be 0.2
  1957. model = _gen_efficientnet(
  1958. 'efficientnet_blur_b0', channel_multiplier=1.0, depth_multiplier=1.0, pretrained=pretrained,
  1959. aa_layer='blurpc', **kwargs
  1960. )
  1961. return model
  1962. @register_model
  1963. def efficientnet_es(pretrained=False, **kwargs) -> EfficientNet:
  1964. """ EfficientNet-Edge Small. """
  1965. model = _gen_efficientnet_edge(
  1966. 'efficientnet_es', channel_multiplier=1.0, depth_multiplier=1.0, pretrained=pretrained, **kwargs)
  1967. return model
  1968. @register_model
  1969. def efficientnet_es_pruned(pretrained=False, **kwargs) -> EfficientNet:
  1970. """ EfficientNet-Edge Small Pruned. For more info: https://github.com/DeGirum/pruned-models/releases/tag/efficientnet_v1.0"""
  1971. model = _gen_efficientnet_edge(
  1972. 'efficientnet_es_pruned', channel_multiplier=1.0, depth_multiplier=1.0, pretrained=pretrained, **kwargs)
  1973. return model
  1974. @register_model
  1975. def efficientnet_em(pretrained=False, **kwargs) -> EfficientNet:
  1976. """ EfficientNet-Edge-Medium. """
  1977. model = _gen_efficientnet_edge(
  1978. 'efficientnet_em', channel_multiplier=1.0, depth_multiplier=1.1, pretrained=pretrained, **kwargs)
  1979. return model
  1980. @register_model
  1981. def efficientnet_el(pretrained=False, **kwargs) -> EfficientNet:
  1982. """ EfficientNet-Edge-Large. """
  1983. model = _gen_efficientnet_edge(
  1984. 'efficientnet_el', channel_multiplier=1.2, depth_multiplier=1.4, pretrained=pretrained, **kwargs)
  1985. return model
  1986. @register_model
  1987. def efficientnet_el_pruned(pretrained=False, **kwargs) -> EfficientNet:
  1988. """ EfficientNet-Edge-Large pruned. For more info: https://github.com/DeGirum/pruned-models/releases/tag/efficientnet_v1.0"""
  1989. model = _gen_efficientnet_edge(
  1990. 'efficientnet_el_pruned', channel_multiplier=1.2, depth_multiplier=1.4, pretrained=pretrained, **kwargs)
  1991. return model
  1992. @register_model
  1993. def efficientnet_cc_b0_4e(pretrained=False, **kwargs) -> EfficientNet:
  1994. """ EfficientNet-CondConv-B0 w/ 8 Experts """
  1995. # NOTE for train, drop_rate should be 0.2, drop_path_rate should be 0.2
  1996. model = _gen_efficientnet_condconv(
  1997. 'efficientnet_cc_b0_4e', channel_multiplier=1.0, depth_multiplier=1.0, pretrained=pretrained, **kwargs)
  1998. return model
  1999. @register_model
  2000. def efficientnet_cc_b0_8e(pretrained=False, **kwargs) -> EfficientNet:
  2001. """ EfficientNet-CondConv-B0 w/ 8 Experts """
  2002. # NOTE for train, drop_rate should be 0.2, drop_path_rate should be 0.2
  2003. model = _gen_efficientnet_condconv(
  2004. 'efficientnet_cc_b0_8e', channel_multiplier=1.0, depth_multiplier=1.0, experts_multiplier=2,
  2005. pretrained=pretrained, **kwargs)
  2006. return model
  2007. @register_model
  2008. def efficientnet_cc_b1_8e(pretrained=False, **kwargs) -> EfficientNet:
  2009. """ EfficientNet-CondConv-B1 w/ 8 Experts """
  2010. # NOTE for train, drop_rate should be 0.2, drop_path_rate should be 0.2
  2011. model = _gen_efficientnet_condconv(
  2012. 'efficientnet_cc_b1_8e', channel_multiplier=1.0, depth_multiplier=1.1, experts_multiplier=2,
  2013. pretrained=pretrained, **kwargs)
  2014. return model
  2015. @register_model
  2016. def efficientnet_lite0(pretrained=False, **kwargs) -> EfficientNet:
  2017. """ EfficientNet-Lite0 """
  2018. # NOTE for train, drop_rate should be 0.2, drop_path_rate should be 0.2
  2019. model = _gen_efficientnet_lite(
  2020. 'efficientnet_lite0', channel_multiplier=1.0, depth_multiplier=1.0, pretrained=pretrained, **kwargs)
  2021. return model
  2022. @register_model
  2023. def efficientnet_lite1(pretrained=False, **kwargs) -> EfficientNet:
  2024. """ EfficientNet-Lite1 """
  2025. # NOTE for train, drop_rate should be 0.2, drop_path_rate should be 0.2
  2026. model = _gen_efficientnet_lite(
  2027. 'efficientnet_lite1', channel_multiplier=1.0, depth_multiplier=1.1, pretrained=pretrained, **kwargs)
  2028. return model
  2029. @register_model
  2030. def efficientnet_lite2(pretrained=False, **kwargs) -> EfficientNet:
  2031. """ EfficientNet-Lite2 """
  2032. # NOTE for train, drop_rate should be 0.3, drop_path_rate should be 0.2
  2033. model = _gen_efficientnet_lite(
  2034. 'efficientnet_lite2', channel_multiplier=1.1, depth_multiplier=1.2, pretrained=pretrained, **kwargs)
  2035. return model
  2036. @register_model
  2037. def efficientnet_lite3(pretrained=False, **kwargs) -> EfficientNet:
  2038. """ EfficientNet-Lite3 """
  2039. # NOTE for train, drop_rate should be 0.3, drop_path_rate should be 0.2
  2040. model = _gen_efficientnet_lite(
  2041. 'efficientnet_lite3', channel_multiplier=1.2, depth_multiplier=1.4, pretrained=pretrained, **kwargs)
  2042. return model
  2043. @register_model
  2044. def efficientnet_lite4(pretrained=False, **kwargs) -> EfficientNet:
  2045. """ EfficientNet-Lite4 """
  2046. # NOTE for train, drop_rate should be 0.4, drop_path_rate should be 0.2
  2047. model = _gen_efficientnet_lite(
  2048. 'efficientnet_lite4', channel_multiplier=1.4, depth_multiplier=1.8, pretrained=pretrained, **kwargs)
  2049. return model
  2050. @register_model
  2051. def efficientnet_b1_pruned(pretrained=False, **kwargs) -> EfficientNet:
  2052. """ EfficientNet-B1 Pruned. The pruning has been obtained using https://arxiv.org/pdf/2002.08258.pdf """
  2053. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2054. kwargs.setdefault('pad_type', 'same')
  2055. variant = 'efficientnet_b1_pruned'
  2056. model = _gen_efficientnet(
  2057. variant, channel_multiplier=1.0, depth_multiplier=1.1, pruned=True, pretrained=pretrained, **kwargs)
  2058. return model
  2059. @register_model
  2060. def efficientnet_b2_pruned(pretrained=False, **kwargs) -> EfficientNet:
  2061. """ EfficientNet-B2 Pruned. The pruning has been obtained using https://arxiv.org/pdf/2002.08258.pdf """
  2062. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2063. kwargs.setdefault('pad_type', 'same')
  2064. model = _gen_efficientnet(
  2065. 'efficientnet_b2_pruned', channel_multiplier=1.1, depth_multiplier=1.2, pruned=True,
  2066. pretrained=pretrained, **kwargs)
  2067. return model
  2068. @register_model
  2069. def efficientnet_b3_pruned(pretrained=False, **kwargs) -> EfficientNet:
  2070. """ EfficientNet-B3 Pruned. The pruning has been obtained using https://arxiv.org/pdf/2002.08258.pdf """
  2071. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2072. kwargs.setdefault('pad_type', 'same')
  2073. model = _gen_efficientnet(
  2074. 'efficientnet_b3_pruned', channel_multiplier=1.2, depth_multiplier=1.4, pruned=True,
  2075. pretrained=pretrained, **kwargs)
  2076. return model
  2077. @register_model
  2078. def efficientnetv2_rw_t(pretrained=False, **kwargs) -> EfficientNet:
  2079. """ EfficientNet-V2 Tiny (Custom variant, tiny not in paper). """
  2080. model = _gen_efficientnetv2_s(
  2081. 'efficientnetv2_rw_t', channel_multiplier=0.8, depth_multiplier=0.9, rw=False, pretrained=pretrained, **kwargs)
  2082. return model
  2083. @register_model
  2084. def gc_efficientnetv2_rw_t(pretrained=False, **kwargs) -> EfficientNet:
  2085. """ EfficientNet-V2 Tiny w/ Global Context Attn (Custom variant, tiny not in paper). """
  2086. model = _gen_efficientnetv2_s(
  2087. 'gc_efficientnetv2_rw_t', channel_multiplier=0.8, depth_multiplier=0.9,
  2088. rw=False, se_layer='gc', pretrained=pretrained, **kwargs)
  2089. return model
  2090. @register_model
  2091. def efficientnetv2_rw_s(pretrained=False, **kwargs) -> EfficientNet:
  2092. """ EfficientNet-V2 Small (RW variant).
  2093. NOTE: This is my initial (pre official code release) w/ some differences.
  2094. See efficientnetv2_s and tf_efficientnetv2_s for versions that match the official w/ PyTorch vs TF padding
  2095. """
  2096. model = _gen_efficientnetv2_s('efficientnetv2_rw_s', rw=True, pretrained=pretrained, **kwargs)
  2097. return model
  2098. @register_model
  2099. def efficientnetv2_rw_m(pretrained=False, **kwargs) -> EfficientNet:
  2100. """ EfficientNet-V2 Medium (RW variant).
  2101. """
  2102. model = _gen_efficientnetv2_s(
  2103. 'efficientnetv2_rw_m', channel_multiplier=1.2, depth_multiplier=(1.2,) * 4 + (1.6,) * 2, rw=True,
  2104. pretrained=pretrained, **kwargs)
  2105. return model
  2106. @register_model
  2107. def efficientnetv2_s(pretrained=False, **kwargs) -> EfficientNet:
  2108. """ EfficientNet-V2 Small. """
  2109. model = _gen_efficientnetv2_s('efficientnetv2_s', pretrained=pretrained, **kwargs)
  2110. return model
  2111. @register_model
  2112. def efficientnetv2_m(pretrained=False, **kwargs) -> EfficientNet:
  2113. """ EfficientNet-V2 Medium. """
  2114. model = _gen_efficientnetv2_m('efficientnetv2_m', pretrained=pretrained, **kwargs)
  2115. return model
  2116. @register_model
  2117. def efficientnetv2_l(pretrained=False, **kwargs) -> EfficientNet:
  2118. """ EfficientNet-V2 Large. """
  2119. model = _gen_efficientnetv2_l('efficientnetv2_l', pretrained=pretrained, **kwargs)
  2120. return model
  2121. @register_model
  2122. def efficientnetv2_xl(pretrained=False, **kwargs) -> EfficientNet:
  2123. """ EfficientNet-V2 Xtra-Large. """
  2124. model = _gen_efficientnetv2_xl('efficientnetv2_xl', pretrained=pretrained, **kwargs)
  2125. return model
  2126. @register_model
  2127. def tf_efficientnet_b0(pretrained=False, **kwargs) -> EfficientNet:
  2128. """ EfficientNet-B0. Tensorflow compatible variant """
  2129. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2130. kwargs.setdefault('pad_type', 'same')
  2131. model = _gen_efficientnet(
  2132. 'tf_efficientnet_b0', channel_multiplier=1.0, depth_multiplier=1.0, pretrained=pretrained, **kwargs)
  2133. return model
  2134. @register_model
  2135. def tf_efficientnet_b1(pretrained=False, **kwargs) -> EfficientNet:
  2136. """ EfficientNet-B1. Tensorflow compatible variant """
  2137. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2138. kwargs.setdefault('pad_type', 'same')
  2139. model = _gen_efficientnet(
  2140. 'tf_efficientnet_b1', channel_multiplier=1.0, depth_multiplier=1.1, pretrained=pretrained, **kwargs)
  2141. return model
  2142. @register_model
  2143. def tf_efficientnet_b2(pretrained=False, **kwargs) -> EfficientNet:
  2144. """ EfficientNet-B2. Tensorflow compatible variant """
  2145. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2146. kwargs.setdefault('pad_type', 'same')
  2147. model = _gen_efficientnet(
  2148. 'tf_efficientnet_b2', channel_multiplier=1.1, depth_multiplier=1.2, pretrained=pretrained, **kwargs)
  2149. return model
  2150. @register_model
  2151. def tf_efficientnet_b3(pretrained=False, **kwargs) -> EfficientNet:
  2152. """ EfficientNet-B3. Tensorflow compatible variant """
  2153. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2154. kwargs.setdefault('pad_type', 'same')
  2155. model = _gen_efficientnet(
  2156. 'tf_efficientnet_b3', channel_multiplier=1.2, depth_multiplier=1.4, pretrained=pretrained, **kwargs)
  2157. return model
  2158. @register_model
  2159. def tf_efficientnet_b4(pretrained=False, **kwargs) -> EfficientNet:
  2160. """ EfficientNet-B4. Tensorflow compatible variant """
  2161. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2162. kwargs.setdefault('pad_type', 'same')
  2163. model = _gen_efficientnet(
  2164. 'tf_efficientnet_b4', channel_multiplier=1.4, depth_multiplier=1.8, pretrained=pretrained, **kwargs)
  2165. return model
  2166. @register_model
  2167. def tf_efficientnet_b5(pretrained=False, **kwargs) -> EfficientNet:
  2168. """ EfficientNet-B5. Tensorflow compatible variant """
  2169. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2170. kwargs.setdefault('pad_type', 'same')
  2171. model = _gen_efficientnet(
  2172. 'tf_efficientnet_b5', channel_multiplier=1.6, depth_multiplier=2.2, pretrained=pretrained, **kwargs)
  2173. return model
  2174. @register_model
  2175. def tf_efficientnet_b6(pretrained=False, **kwargs) -> EfficientNet:
  2176. """ EfficientNet-B6. Tensorflow compatible variant """
  2177. # NOTE for train, drop_rate should be 0.5
  2178. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2179. kwargs.setdefault('pad_type', 'same')
  2180. model = _gen_efficientnet(
  2181. 'tf_efficientnet_b6', channel_multiplier=1.8, depth_multiplier=2.6, pretrained=pretrained, **kwargs)
  2182. return model
  2183. @register_model
  2184. def tf_efficientnet_b7(pretrained=False, **kwargs) -> EfficientNet:
  2185. """ EfficientNet-B7. Tensorflow compatible variant """
  2186. # NOTE for train, drop_rate should be 0.5
  2187. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2188. kwargs.setdefault('pad_type', 'same')
  2189. model = _gen_efficientnet(
  2190. 'tf_efficientnet_b7', channel_multiplier=2.0, depth_multiplier=3.1, pretrained=pretrained, **kwargs)
  2191. return model
  2192. @register_model
  2193. def tf_efficientnet_b8(pretrained=False, **kwargs) -> EfficientNet:
  2194. """ EfficientNet-B8. Tensorflow compatible variant """
  2195. # NOTE for train, drop_rate should be 0.5
  2196. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2197. kwargs.setdefault('pad_type', 'same')
  2198. model = _gen_efficientnet(
  2199. 'tf_efficientnet_b8', channel_multiplier=2.2, depth_multiplier=3.6, pretrained=pretrained, **kwargs)
  2200. return model
  2201. @register_model
  2202. def tf_efficientnet_l2(pretrained=False, **kwargs) -> EfficientNet:
  2203. """ EfficientNet-L2 NoisyStudent. Tensorflow compatible variant """
  2204. # NOTE for train, drop_rate should be 0.5
  2205. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2206. kwargs.setdefault('pad_type', 'same')
  2207. model = _gen_efficientnet(
  2208. 'tf_efficientnet_l2', channel_multiplier=4.3, depth_multiplier=5.3, pretrained=pretrained, **kwargs)
  2209. return model
  2210. @register_model
  2211. def tf_efficientnet_es(pretrained=False, **kwargs) -> EfficientNet:
  2212. """ EfficientNet-Edge Small. Tensorflow compatible variant """
  2213. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2214. kwargs.setdefault('pad_type', 'same')
  2215. model = _gen_efficientnet_edge(
  2216. 'tf_efficientnet_es', channel_multiplier=1.0, depth_multiplier=1.0, pretrained=pretrained, **kwargs)
  2217. return model
  2218. @register_model
  2219. def tf_efficientnet_em(pretrained=False, **kwargs) -> EfficientNet:
  2220. """ EfficientNet-Edge-Medium. Tensorflow compatible variant """
  2221. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2222. kwargs.setdefault('pad_type', 'same')
  2223. model = _gen_efficientnet_edge(
  2224. 'tf_efficientnet_em', channel_multiplier=1.0, depth_multiplier=1.1, pretrained=pretrained, **kwargs)
  2225. return model
  2226. @register_model
  2227. def tf_efficientnet_el(pretrained=False, **kwargs) -> EfficientNet:
  2228. """ EfficientNet-Edge-Large. Tensorflow compatible variant """
  2229. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2230. kwargs.setdefault('pad_type', 'same')
  2231. model = _gen_efficientnet_edge(
  2232. 'tf_efficientnet_el', channel_multiplier=1.2, depth_multiplier=1.4, pretrained=pretrained, **kwargs)
  2233. return model
  2234. @register_model
  2235. def tf_efficientnet_cc_b0_4e(pretrained=False, **kwargs) -> EfficientNet:
  2236. """ EfficientNet-CondConv-B0 w/ 4 Experts. Tensorflow compatible variant """
  2237. # NOTE for train, drop_rate should be 0.2, drop_path_rate should be 0.2
  2238. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2239. kwargs.setdefault('pad_type', 'same')
  2240. model = _gen_efficientnet_condconv(
  2241. 'tf_efficientnet_cc_b0_4e', channel_multiplier=1.0, depth_multiplier=1.0, pretrained=pretrained, **kwargs)
  2242. return model
  2243. @register_model
  2244. def tf_efficientnet_cc_b0_8e(pretrained=False, **kwargs) -> EfficientNet:
  2245. """ EfficientNet-CondConv-B0 w/ 8 Experts. Tensorflow compatible variant """
  2246. # NOTE for train, drop_rate should be 0.2, drop_path_rate should be 0.2
  2247. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2248. kwargs.setdefault('pad_type', 'same')
  2249. model = _gen_efficientnet_condconv(
  2250. 'tf_efficientnet_cc_b0_8e', channel_multiplier=1.0, depth_multiplier=1.0, experts_multiplier=2,
  2251. pretrained=pretrained, **kwargs)
  2252. return model
  2253. @register_model
  2254. def tf_efficientnet_cc_b1_8e(pretrained=False, **kwargs) -> EfficientNet:
  2255. """ EfficientNet-CondConv-B1 w/ 8 Experts. Tensorflow compatible variant """
  2256. # NOTE for train, drop_rate should be 0.2, drop_path_rate should be 0.2
  2257. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2258. kwargs.setdefault('pad_type', 'same')
  2259. model = _gen_efficientnet_condconv(
  2260. 'tf_efficientnet_cc_b1_8e', channel_multiplier=1.0, depth_multiplier=1.1, experts_multiplier=2,
  2261. pretrained=pretrained, **kwargs)
  2262. return model
  2263. @register_model
  2264. def tf_efficientnet_lite0(pretrained=False, **kwargs) -> EfficientNet:
  2265. """ EfficientNet-Lite0 """
  2266. # NOTE for train, drop_rate should be 0.2, drop_path_rate should be 0.2
  2267. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2268. kwargs.setdefault('pad_type', 'same')
  2269. model = _gen_efficientnet_lite(
  2270. 'tf_efficientnet_lite0', channel_multiplier=1.0, depth_multiplier=1.0, pretrained=pretrained, **kwargs)
  2271. return model
  2272. @register_model
  2273. def tf_efficientnet_lite1(pretrained=False, **kwargs) -> EfficientNet:
  2274. """ EfficientNet-Lite1 """
  2275. # NOTE for train, drop_rate should be 0.2, drop_path_rate should be 0.2
  2276. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2277. kwargs.setdefault('pad_type', 'same')
  2278. model = _gen_efficientnet_lite(
  2279. 'tf_efficientnet_lite1', channel_multiplier=1.0, depth_multiplier=1.1, pretrained=pretrained, **kwargs)
  2280. return model
  2281. @register_model
  2282. def tf_efficientnet_lite2(pretrained=False, **kwargs) -> EfficientNet:
  2283. """ EfficientNet-Lite2 """
  2284. # NOTE for train, drop_rate should be 0.3, drop_path_rate should be 0.2
  2285. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2286. kwargs.setdefault('pad_type', 'same')
  2287. model = _gen_efficientnet_lite(
  2288. 'tf_efficientnet_lite2', channel_multiplier=1.1, depth_multiplier=1.2, pretrained=pretrained, **kwargs)
  2289. return model
  2290. @register_model
  2291. def tf_efficientnet_lite3(pretrained=False, **kwargs) -> EfficientNet:
  2292. """ EfficientNet-Lite3 """
  2293. # NOTE for train, drop_rate should be 0.3, drop_path_rate should be 0.2
  2294. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2295. kwargs.setdefault('pad_type', 'same')
  2296. model = _gen_efficientnet_lite(
  2297. 'tf_efficientnet_lite3', channel_multiplier=1.2, depth_multiplier=1.4, pretrained=pretrained, **kwargs)
  2298. return model
  2299. @register_model
  2300. def tf_efficientnet_lite4(pretrained=False, **kwargs) -> EfficientNet:
  2301. """ EfficientNet-Lite4 """
  2302. # NOTE for train, drop_rate should be 0.4, drop_path_rate should be 0.2
  2303. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2304. kwargs.setdefault('pad_type', 'same')
  2305. model = _gen_efficientnet_lite(
  2306. 'tf_efficientnet_lite4', channel_multiplier=1.4, depth_multiplier=1.8, pretrained=pretrained, **kwargs)
  2307. return model
  2308. @register_model
  2309. def tf_efficientnetv2_s(pretrained=False, **kwargs) -> EfficientNet:
  2310. """ EfficientNet-V2 Small. Tensorflow compatible variant """
  2311. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2312. kwargs.setdefault('pad_type', 'same')
  2313. model = _gen_efficientnetv2_s('tf_efficientnetv2_s', pretrained=pretrained, **kwargs)
  2314. return model
  2315. @register_model
  2316. def tf_efficientnetv2_m(pretrained=False, **kwargs) -> EfficientNet:
  2317. """ EfficientNet-V2 Medium. Tensorflow compatible variant """
  2318. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2319. kwargs.setdefault('pad_type', 'same')
  2320. model = _gen_efficientnetv2_m('tf_efficientnetv2_m', pretrained=pretrained, **kwargs)
  2321. return model
  2322. @register_model
  2323. def tf_efficientnetv2_l(pretrained=False, **kwargs) -> EfficientNet:
  2324. """ EfficientNet-V2 Large. Tensorflow compatible variant """
  2325. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2326. kwargs.setdefault('pad_type', 'same')
  2327. model = _gen_efficientnetv2_l('tf_efficientnetv2_l', pretrained=pretrained, **kwargs)
  2328. return model
  2329. @register_model
  2330. def tf_efficientnetv2_xl(pretrained=False, **kwargs) -> EfficientNet:
  2331. """ EfficientNet-V2 Xtra-Large. Tensorflow compatible variant
  2332. """
  2333. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2334. kwargs.setdefault('pad_type', 'same')
  2335. model = _gen_efficientnetv2_xl('tf_efficientnetv2_xl', pretrained=pretrained, **kwargs)
  2336. return model
  2337. @register_model
  2338. def tf_efficientnetv2_b0(pretrained=False, **kwargs) -> EfficientNet:
  2339. """ EfficientNet-V2-B0. Tensorflow compatible variant """
  2340. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2341. kwargs.setdefault('pad_type', 'same')
  2342. model = _gen_efficientnetv2_base('tf_efficientnetv2_b0', pretrained=pretrained, **kwargs)
  2343. return model
  2344. @register_model
  2345. def tf_efficientnetv2_b1(pretrained=False, **kwargs) -> EfficientNet:
  2346. """ EfficientNet-V2-B1. Tensorflow compatible variant """
  2347. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2348. kwargs.setdefault('pad_type', 'same')
  2349. model = _gen_efficientnetv2_base(
  2350. 'tf_efficientnetv2_b1', channel_multiplier=1.0, depth_multiplier=1.1, pretrained=pretrained, **kwargs)
  2351. return model
  2352. @register_model
  2353. def tf_efficientnetv2_b2(pretrained=False, **kwargs) -> EfficientNet:
  2354. """ EfficientNet-V2-B2. Tensorflow compatible variant """
  2355. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2356. kwargs.setdefault('pad_type', 'same')
  2357. model = _gen_efficientnetv2_base(
  2358. 'tf_efficientnetv2_b2', channel_multiplier=1.1, depth_multiplier=1.2, pretrained=pretrained, **kwargs)
  2359. return model
  2360. @register_model
  2361. def tf_efficientnetv2_b3(pretrained=False, **kwargs) -> EfficientNet:
  2362. """ EfficientNet-V2-B3. Tensorflow compatible variant """
  2363. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2364. kwargs.setdefault('pad_type', 'same')
  2365. model = _gen_efficientnetv2_base(
  2366. 'tf_efficientnetv2_b3', channel_multiplier=1.2, depth_multiplier=1.4, pretrained=pretrained, **kwargs)
  2367. return model
  2368. @register_model
  2369. def efficientnet_x_b3(pretrained=False, **kwargs) -> EfficientNet:
  2370. """ EfficientNet-B3 """
  2371. # NOTE for train, drop_rate should be 0.3, drop_path_rate should be 0.2
  2372. model = _gen_efficientnet_x(
  2373. 'efficientnet_x_b3', channel_multiplier=1.2, depth_multiplier=1.4, pretrained=pretrained, **kwargs)
  2374. return model
  2375. @register_model
  2376. def efficientnet_x_b5(pretrained=False, **kwargs) -> EfficientNet:
  2377. """ EfficientNet-B5 """
  2378. model = _gen_efficientnet_x(
  2379. 'efficientnet_x_b5', channel_multiplier=1.6, depth_multiplier=2.2, pretrained=pretrained, **kwargs)
  2380. return model
  2381. @register_model
  2382. def efficientnet_h_b5(pretrained=False, **kwargs) -> EfficientNet:
  2383. """ EfficientNet-B5 """
  2384. model = _gen_efficientnet_x(
  2385. 'efficientnet_h_b5', channel_multiplier=1.92, depth_multiplier=2.2, version=2, pretrained=pretrained, **kwargs)
  2386. return model
  2387. @register_model
  2388. def mixnet_s(pretrained=False, **kwargs) -> EfficientNet:
  2389. """Creates a MixNet Small model.
  2390. """
  2391. model = _gen_mixnet_s(
  2392. 'mixnet_s', channel_multiplier=1.0, pretrained=pretrained, **kwargs)
  2393. return model
  2394. @register_model
  2395. def mixnet_m(pretrained=False, **kwargs) -> EfficientNet:
  2396. """Creates a MixNet Medium model.
  2397. """
  2398. model = _gen_mixnet_m(
  2399. 'mixnet_m', channel_multiplier=1.0, pretrained=pretrained, **kwargs)
  2400. return model
  2401. @register_model
  2402. def mixnet_l(pretrained=False, **kwargs) -> EfficientNet:
  2403. """Creates a MixNet Large model.
  2404. """
  2405. model = _gen_mixnet_m(
  2406. 'mixnet_l', channel_multiplier=1.3, pretrained=pretrained, **kwargs)
  2407. return model
  2408. @register_model
  2409. def mixnet_xl(pretrained=False, **kwargs) -> EfficientNet:
  2410. """Creates a MixNet Extra-Large model.
  2411. Not a paper spec, experimental def by RW w/ depth scaling.
  2412. """
  2413. model = _gen_mixnet_m(
  2414. 'mixnet_xl', channel_multiplier=1.6, depth_multiplier=1.2, pretrained=pretrained, **kwargs)
  2415. return model
  2416. @register_model
  2417. def mixnet_xxl(pretrained=False, **kwargs) -> EfficientNet:
  2418. """Creates a MixNet Double Extra Large model.
  2419. Not a paper spec, experimental def by RW w/ depth scaling.
  2420. """
  2421. model = _gen_mixnet_m(
  2422. 'mixnet_xxl', channel_multiplier=2.4, depth_multiplier=1.3, pretrained=pretrained, **kwargs)
  2423. return model
  2424. @register_model
  2425. def tf_mixnet_s(pretrained=False, **kwargs) -> EfficientNet:
  2426. """Creates a MixNet Small model. Tensorflow compatible variant
  2427. """
  2428. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2429. kwargs.setdefault('pad_type', 'same')
  2430. model = _gen_mixnet_s(
  2431. 'tf_mixnet_s', channel_multiplier=1.0, pretrained=pretrained, **kwargs)
  2432. return model
  2433. @register_model
  2434. def tf_mixnet_m(pretrained=False, **kwargs) -> EfficientNet:
  2435. """Creates a MixNet Medium model. Tensorflow compatible variant
  2436. """
  2437. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2438. kwargs.setdefault('pad_type', 'same')
  2439. model = _gen_mixnet_m(
  2440. 'tf_mixnet_m', channel_multiplier=1.0, pretrained=pretrained, **kwargs)
  2441. return model
  2442. @register_model
  2443. def tf_mixnet_l(pretrained=False, **kwargs) -> EfficientNet:
  2444. """Creates a MixNet Large model. Tensorflow compatible variant
  2445. """
  2446. kwargs.setdefault('bn_eps', BN_EPS_TF_DEFAULT)
  2447. kwargs.setdefault('pad_type', 'same')
  2448. model = _gen_mixnet_m(
  2449. 'tf_mixnet_l', channel_multiplier=1.3, pretrained=pretrained, **kwargs)
  2450. return model
  2451. @register_model
  2452. def tinynet_a(pretrained=False, **kwargs) -> EfficientNet:
  2453. model = _gen_tinynet('tinynet_a', 1.0, 1.2, pretrained=pretrained, **kwargs)
  2454. return model
  2455. @register_model
  2456. def tinynet_b(pretrained=False, **kwargs) -> EfficientNet:
  2457. model = _gen_tinynet('tinynet_b', 0.75, 1.1, pretrained=pretrained, **kwargs)
  2458. return model
  2459. @register_model
  2460. def tinynet_c(pretrained=False, **kwargs) -> EfficientNet:
  2461. model = _gen_tinynet('tinynet_c', 0.54, 0.85, pretrained=pretrained, **kwargs)
  2462. return model
  2463. @register_model
  2464. def tinynet_d(pretrained=False, **kwargs) -> EfficientNet:
  2465. model = _gen_tinynet('tinynet_d', 0.54, 0.695, pretrained=pretrained, **kwargs)
  2466. return model
  2467. @register_model
  2468. def tinynet_e(pretrained=False, **kwargs) -> EfficientNet:
  2469. model = _gen_tinynet('tinynet_e', 0.51, 0.6, pretrained=pretrained, **kwargs)
  2470. return model
  2471. @register_model
  2472. def mobilenet_edgetpu_100(pretrained=False, **kwargs) -> EfficientNet:
  2473. """ MobileNet-EdgeTPU-v1 100. """
  2474. model = _gen_mobilenet_edgetpu('mobilenet_edgetpu_100', pretrained=pretrained, **kwargs)
  2475. return model
  2476. @register_model
  2477. def mobilenet_edgetpu_v2_xs(pretrained=False, **kwargs) -> EfficientNet:
  2478. """ MobileNet-EdgeTPU-v2 Extra Small. """
  2479. model = _gen_mobilenet_edgetpu('mobilenet_edgetpu_v2_xs', pretrained=pretrained, **kwargs)
  2480. return model
  2481. @register_model
  2482. def mobilenet_edgetpu_v2_s(pretrained=False, **kwargs) -> EfficientNet:
  2483. """ MobileNet-EdgeTPU-v2 Small. """
  2484. model = _gen_mobilenet_edgetpu('mobilenet_edgetpu_v2_s', pretrained=pretrained, **kwargs)
  2485. return model
  2486. @register_model
  2487. def mobilenet_edgetpu_v2_m(pretrained=False, **kwargs) -> EfficientNet:
  2488. """ MobileNet-EdgeTPU-v2 Medium. """
  2489. model = _gen_mobilenet_edgetpu('mobilenet_edgetpu_v2_m', pretrained=pretrained, **kwargs)
  2490. return model
  2491. @register_model
  2492. def mobilenet_edgetpu_v2_l(pretrained=False, **kwargs) -> EfficientNet:
  2493. """ MobileNet-EdgeTPU-v2 Large. """
  2494. model = _gen_mobilenet_edgetpu('mobilenet_edgetpu_v2_l', pretrained=pretrained, **kwargs)
  2495. return model
  2496. @register_model
  2497. def test_efficientnet(pretrained=False, **kwargs) -> EfficientNet:
  2498. model = _gen_test_efficientnet('test_efficientnet', pretrained=pretrained, **kwargs)
  2499. return model
  2500. @register_model
  2501. def test_efficientnet_gn(pretrained=False, **kwargs) -> EfficientNet:
  2502. model = _gen_test_efficientnet(
  2503. 'test_efficientnet_gn',
  2504. pretrained=pretrained,
  2505. norm_layer=kwargs.pop('norm_layer', partial(GroupNormAct, group_size=8)),
  2506. **kwargs
  2507. )
  2508. return model
  2509. @register_model
  2510. def test_efficientnet_ln(pretrained=False, **kwargs) -> EfficientNet:
  2511. model = _gen_test_efficientnet(
  2512. 'test_efficientnet_ln',
  2513. pretrained=pretrained,
  2514. norm_layer=kwargs.pop('norm_layer', LayerNormAct2d),
  2515. **kwargs
  2516. )
  2517. return model
  2518. @register_model
  2519. def test_efficientnet_evos(pretrained=False, **kwargs) -> EfficientNet:
  2520. model = _gen_test_efficientnet(
  2521. 'test_efficientnet_evos',
  2522. pretrained=pretrained,
  2523. norm_layer=kwargs.pop('norm_layer', partial(EvoNorm2dS0, group_size=8)),
  2524. **kwargs
  2525. )
  2526. return model
  2527. register_model_deprecations(__name__, {
  2528. 'tf_efficientnet_b0_ap': 'tf_efficientnet_b0.ap_in1k',
  2529. 'tf_efficientnet_b1_ap': 'tf_efficientnet_b1.ap_in1k',
  2530. 'tf_efficientnet_b2_ap': 'tf_efficientnet_b2.ap_in1k',
  2531. 'tf_efficientnet_b3_ap': 'tf_efficientnet_b3.ap_in1k',
  2532. 'tf_efficientnet_b4_ap': 'tf_efficientnet_b4.ap_in1k',
  2533. 'tf_efficientnet_b5_ap': 'tf_efficientnet_b5.ap_in1k',
  2534. 'tf_efficientnet_b6_ap': 'tf_efficientnet_b6.ap_in1k',
  2535. 'tf_efficientnet_b7_ap': 'tf_efficientnet_b7.ap_in1k',
  2536. 'tf_efficientnet_b8_ap': 'tf_efficientnet_b8.ap_in1k',
  2537. 'tf_efficientnet_b0_ns': 'tf_efficientnet_b0.ns_jft_in1k',
  2538. 'tf_efficientnet_b1_ns': 'tf_efficientnet_b1.ns_jft_in1k',
  2539. 'tf_efficientnet_b2_ns': 'tf_efficientnet_b2.ns_jft_in1k',
  2540. 'tf_efficientnet_b3_ns': 'tf_efficientnet_b3.ns_jft_in1k',
  2541. 'tf_efficientnet_b4_ns': 'tf_efficientnet_b4.ns_jft_in1k',
  2542. 'tf_efficientnet_b5_ns': 'tf_efficientnet_b5.ns_jft_in1k',
  2543. 'tf_efficientnet_b6_ns': 'tf_efficientnet_b6.ns_jft_in1k',
  2544. 'tf_efficientnet_b7_ns': 'tf_efficientnet_b7.ns_jft_in1k',
  2545. 'tf_efficientnet_l2_ns_475': 'tf_efficientnet_l2.ns_jft_in1k_475',
  2546. 'tf_efficientnet_l2_ns': 'tf_efficientnet_l2.ns_jft_in1k',
  2547. 'tf_efficientnetv2_s_in21ft1k': 'tf_efficientnetv2_s.in21k_ft_in1k',
  2548. 'tf_efficientnetv2_m_in21ft1k': 'tf_efficientnetv2_m.in21k_ft_in1k',
  2549. 'tf_efficientnetv2_l_in21ft1k': 'tf_efficientnetv2_l.in21k_ft_in1k',
  2550. 'tf_efficientnetv2_xl_in21ft1k': 'tf_efficientnetv2_xl.in21k_ft_in1k',
  2551. 'tf_efficientnetv2_s_in21k': 'tf_efficientnetv2_s.in21k',
  2552. 'tf_efficientnetv2_m_in21k': 'tf_efficientnetv2_m.in21k',
  2553. 'tf_efficientnetv2_l_in21k': 'tf_efficientnetv2_l.in21k',
  2554. 'tf_efficientnetv2_xl_in21k': 'tf_efficientnetv2_xl.in21k',
  2555. 'efficientnet_b2a': 'efficientnet_b2',
  2556. 'efficientnet_b3a': 'efficientnet_b3',
  2557. 'mnasnet_a1': 'semnasnet_100',
  2558. 'mnasnet_b1': 'mnasnet_100',
  2559. })