Ë
    éÓ^j@ñ  ã                   óÈ  — d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
 ddlZddlmZ ddlmc mZ ddlmZmZmZmZ ddlmZmZmZmZmZmZ ddlmZmZ dd	l m!Z! dd
l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5 ddgZ6 G d„ dejn                  «      Z8 G d„ dejn                  «      Z9dµde:de;de8fd„Z<	 d¶de:de=de;de8fd„Z>	 	 	 	 d·de:de=de=dee?   de;de8fd„Z@d¶de:de=de;de8fd„ZAd¶de:de=de;de8fd„ZB	 	 	 d¸de:de=dee?   de;de8f
d„ZCd¹d e:dee:ef   fd!„ZD e3i d" eDd¬#«      “d$ eDd%d&d'¬(«      “d) eDd'd%eed*d+d¬,«      “d- eDd.d/d0d1d2d3d'¬4«      “d5 eDd6d'd1d2d.d/d0d7¬8«      “d9 eDd'eed+d*d:d;d¬<«      “d= eDd>d'd%¬?«      “d@ eDdAd'd%¬?«      “dB eDdCd'd%¬?«      “dD eDdEd'd%¬?«      “dF eDdGd'ee¬H«      “dI eDdJd'ee¬H«      “dK eDdLd'ee¬H«      “dM eDdNd'ee¬H«      “dO eDdPd'ee¬H«      “dQ eDdRd'ee¬H«      “dS eDdTd'd+d*¬U«      “i dV eDdWd'd+d*¬U«      “dX eDdYd'dZd[d*d:¬\«      “d] eD«       “d^ eDd_d'd%¬?«      “d` eDdad'd%¬?«      “db eDdcd'd%¬?«      “dd eD«       “de eDeed+d*d%¬f«      “dg eDd'eed+d*d%¬h«      “di eDd'd+d*d%¬j«      “dk eDd'd+d*d%¬j«      “dl eDd'eed+d:d*d;dd%¬m«	      “dn eDd'd+d:d*d;dd%¬o«      “dp eDd'd*d+dd%¬q«      “dr eDd'dsdtd*d%¬u«      “dv eDd'dwdsdtdd%¬x«      “dy eDd'dwdsdtdd%¬x«      “¥i dz eDd'dwdsdtdd%¬x«      “d{ eDd'dsdtd*d|dd%¬o«      “d} eDd'd+d:d*d;dd%¬o«      “d~ eDd'd+d:d*d;dd%¬o«      “d eDd'd+d:d*d;dd%¬o«      “d€ eDd'dsdtd*d|dd%¬o«      “d� eDd'd*d+dd%¬q«      “d‚ eDd'dwd+d:d*d;dd%¬ƒ«      “d„ eDd'dsdtd*d|dd%¬o«      “d… eDd'dsdtd*d|dd%¬o«      “d† eDd+d:d*d%¬‡«      “dˆ eDd'd*d+dd%¬q«      “d‰ eDd'd|dŠd*d‹dd%¬o«      “dŒ eDd'dsdtd*d�dd%¬o«      “dŽ eDd'dsdtd*d�dd%¬o«      “d� eDd'dwdsdtd*d|dd%¬ƒ«      “d� eDd*d%¬‘«      “¥d’ eDd+d:d*d%¬‡«      i¥«      ZEe4dµde;de8fd“„«       ZFe4dµde;de8fd”„«       ZGe4dµde;de8fd•„«       ZHe4dµde;de8fd–„«       ZIe4dµde;de8fd—„«       ZJe4dµde;de8fd˜„«       ZKe4dµde;de8fd™„«       ZLe4dµde;de8fdš„«       ZMe4dµde;de8fd›„«       ZNe4dµde;de8fdœ„«       ZOe4dµde;de8fd�„«       ZPe4dµde;de8fdž„«       ZQe4dµde;de8fdŸ„«       ZRe4dµde;de8fd „«       ZSe4dµde;de8fd¡„«       ZTe4dµde;de8fd¢„«       ZUe4dµde;de8fd£„«       ZVe4dµde;de8fd¤„«       ZWe4dµde;de8fd¥„«       ZXe4dµde;de8fd¦„«       ZYe4dµde;de8fd§„«       ZZe4dµde;de8fd¨„«       Z[e4dµde;de8fd©„«       Z\e4dµde;de8fdª„«       Z]e4dµde;de8fd«„«       Z^e4dµde;de8fd¬„«       Z_e4dµde;de8fd­„«       Z`e4dµde;de8fd®„«       Zae4dµde;de8fd¯„«       Zbe4dµde;de8fd°„«       Zce4dµde;de8fd±„«       Zde4dµde;de8fd²„«       Zee4dµde;de8fd³„«       Zf e5egd-d5d´œ«       y)ºz× MobileNet V3

A PyTorch impl of MobileNet-V3, compatible with TF weights from official impl.

Paper: Searching for MobileNetV3 - https://arxiv.org/abs/1905.02244

Hacked together by / Copyright 2019, Ross Wightman
é    )Úpartial)ÚAnyÚDictÚCallableÚListÚOptionalÚTupleÚUnionN)ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STDÚIMAGENET_INCEPTION_MEANÚIMAGENET_INCEPTION_STD)ÚSelectAdaptivePool2dÚLinearÚ	LayerTypeÚPadTypeÚcreate_conv2dÚget_norm_act_layeré   )Úbuild_model_with_cfgÚpretrained_cfg_for_features)ÚSqueezeExcite)Ú	BlockArgsÚEfficientNetBuilderÚdecode_arch_defÚefficientnet_init_weightsÚround_channelsÚresolve_bn_argsÚresolve_act_layerÚBN_EPS_TF_DEFAULT)ÚFeatureInfoÚFeatureHooksÚfeature_take_indices)Úcheckpoint_seqÚ
checkpoint)Úgenerate_default_cfgsÚregister_modelÚregister_model_deprecationsÚMobileNetV3ÚMobileNetV3Featuresc            '       óx  ‡ — e Zd ZdZddddddddd	d	d	d	ded
d
d	dd	d	fdededededededededede	e
   de	e
   de	e
   de	e
   dedededede	e   def&ˆ fd„Zd ej                  fd!„Zej$                  j&                  d7d"ed eeef   fd#„«       Zej$                  j&                  d8d$ed d	fd%„«       Zej$                  j&                  d ej0                  fd&„«       Zd9deded d	fd'„Z	 	 	 	 	 	 d:d(ej6                  d)e	eeee   f      d*ed+ed,ed-ed.ed eeej6                     eej6                  eej6                     f   f   fd/„Z	 	 	 	 d;d)eeee   f   d0ed1ed.ed ee   f
d2„Z d(ej6                  d ej6                  fd3„Z!d7d(ej6                  d4ed ej6                  fd5„Z"d(ej6                  d ej6                  fd6„Z#ˆ xZ$S )<r)   a½  MobileNetV3.

    Based on my EfficientNet implementation and building blocks, this model utilizes the MobileNet-v3 specific
    'efficient head', where global pooling is done before the head convolution without a final batch-norm
    layer before the classifier.

    Paper: `Searching for MobileNetV3` - https://arxiv.org/abs/1905.02244

    Other architectures utilizing MobileNet-V3 efficient head that are supported by this impl include:
      * HardCoRe-NAS - https://arxiv.org/abs/2102.11646 (defn in hardcorenas.py uses this class)
      * FBNet-V3 - https://arxiv.org/abs/2006.02049
      * LCNet - https://arxiv.org/abs/2109.15099
      * MobileNet-V4 - https://arxiv.org/abs/2404.10518
    éè  é   é   Fé   TÚ Nç        ÚavgÚ
block_argsÚnum_classesÚin_chansÚ	stem_sizeÚfix_stemÚnum_featuresÚ	head_biasÚ	head_normÚpad_typeÚ	act_layerÚ
norm_layerÚaa_layerÚse_layerÚse_from_expÚround_chs_fnÚ	drop_rateÚdrop_path_rateÚlayer_scale_init_valueÚglobal_poolc                 óÎ  •— t         ‰| �  «        ||dœ}|
xs t        j                  }
|xs t        j                  }t        ||
«      }|xs t        }|| _        || _        || _	        d| _
        |s ||«      }t        ||dfd|	dœ|¤Ž| _         ||fddi|¤Ž| _        t        dd|	|||
|||||d	œ
|¤Ž}t        j                   |||«      Ž | _        |j"                  | _        | j$                  D �cg c]  }|d
   ‘Œ	 c}| _        |j(                  | _        || _        t/        |¬«      | _        | j*                  | j0                  j3                  «       z  }|rRt        || j,                  df|	ddœ|¤Ž| _         || j,                  fi |¤Ž| _        t        j8                  «       | _        nGt        || j,                  df|	|dœ|¤Ž| _        t        j8                  «       | _         |
d¬«      | _        |rt        j<                  d«      nt        j8                  «       | _        |dkD  rtA        | j,                  |fi |¤Žnt        j8                  «       | _!        tE        | «       yc c}w )a0  Initialize MobileNetV3.

        Args:
            block_args: Arguments for blocks of the network.
            num_classes: Number of classes for classification head.
            in_chans: Number of input image channels.
            stem_size: Number of output channels of the initial stem convolution.
            fix_stem: If True, don't scale stem by round_chs_fn.
            num_features: Number of output channels of the conv head layer.
            head_bias: If True, add a learnable bias to the conv head layer.
            head_norm: If True, add normalization to the head layer.
            pad_type: Type of padding to use for convolution layers.
            act_layer: Type of activation layer.
            norm_layer: Type of normalization layer.
            aa_layer: Type of anti-aliasing layer.
            se_layer: Type of Squeeze-and-Excite layer.
            se_from_exp: If True, calculate SE channel reduction from expanded mid channels.
            round_chs_fn: Callable to round number of filters based on depth multiplier.
            drop_rate: Dropout rate.
            drop_path_rate: Stochastic depth rate.
            layer_scale_init_value: Enable layer scale on compatible blocks if not None.
            global_pool: Type of pooling to use for global pooling features of the FC head.
        ©ÚdeviceÚdtypeFr-   é   ©ÚstrideÚpaddingÚinplaceTé    )
Úoutput_strider;   rA   r@   r<   r=   r>   r?   rC   rD   Ústage©Ú	pool_typer   )rM   Úbias©rN   r   N© )#ÚsuperÚ__init__ÚnnÚReLUÚBatchNorm2dr   r   r4   r5   rB   Úgrad_checkpointingr   Ú	conv_stemÚbn1r   Ú
SequentialÚblocksÚfeaturesÚfeature_infoÚ
stage_endsÚin_chsr8   Úhead_hidden_sizer   rE   Ú	feat_multÚ	conv_headÚ	norm_headÚIdentityÚact2ÚFlattenÚflattenr   Ú
classifierr   )Úselfr3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rH   rI   ÚddÚnorm_act_layerÚbuilderÚfÚnum_pooled_chsÚ	__class__s                              €úb/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/mobilenetv3.pyrX   zMobileNetV3.__init__-   sj  ø€ ô^ 	‰ÑÔØ¨Ñ/ˆØÒ(¤§¡ˆ	ØÒ1¤2§>¡>ˆ
Ü+¨J¸	ÓBˆØÒ,œ}ˆØ&ˆÔØ ˆŒØ"ˆŒØ"'ˆÔñ Ù$ YÓ/ˆIÜ& x°¸AÐ`ÀaÐQYÑ`Ð]_Ñ`ˆŒÙ! )Ñ@°TÐ@¸RÑ@ˆŒô &ð 
ØØØ%Ø#ØØ!ØØØ)Ø#9ñ
ð ñ
ˆô —m‘m¡W¨Y¸
Ó%CÐDˆŒØ#×,Ñ,ˆÔØ/3×/@Ñ/@ÖA¨!˜1˜W›:ÒAˆŒØ#ŸN™NˆÔØ ,ˆÔô 0¸+ÔFˆÔØ×*Ñ*¨T×-=Ñ-=×-GÑ-GÓ-IÑIˆÙä*ØØ×%Ñ%Øðð !Øñð ñˆDŒNñ ,¨D×,AÑ,AÑHÀRÑHˆDŒNÜŸ™›ˆD�Iô +ØØ×%Ñ%Øðð !Øñð ñˆDŒNô  Ÿ[™[›]ˆDŒNÙ!¨$Ô/ˆDŒIÙ(3”r—z‘z !”}¼¿¹»ˆŒØNYÐ\]Êoœ& ×!6Ñ!6¸ÑJÀrÒJÔce×cnÑcnÓcpˆŒä! $Õ'ùòE Bs   Ã2I"Úreturnc                 ó   — | j                   | j                  g}|j                  | j                  «       |j                  | j                  | j
                  | j                  | j                  g«       |j                  t        j                  «       t        j                  | j                  «      | j                  g«       t        j                  |Ž S )zqConvert model to sequential form.

        Returns:
            Sequential module containing all layers.
        )r]   r^   Úextendr`   rE   rg   rh   rj   rY   rk   ÚDropoutrB   rm   r_   )rn   Úlayerss     ru   Úas_sequentialzMobileNetV3.as_sequential¡   s†   € ð —.‘. $§(¡(Ð+ˆØ�‰�d—k‘kÔ"Ø�‰�t×'Ñ'¨¯©¸¿¹ÈÏÉÐSÔTØ�‰”r—z‘z“|¤R§Z¡Z°·±Ó%?ÀÇÁÐQÔRÜ�}‰}˜fÐ%Ð%ó    Úcoarsec                 ó.   — t        d|rd¬«      S d¬«      S )z"Group parameters for optimization.z^conv_stem|bn1z^blocks\.(\d+)z^blocks\.(\d+)\.(\d+))Ústemr`   )Údict)rn   r}   s     ru   Úgroup_matcherzMobileNetV3.group_matcher­   s'   € ô Ø"Ù(.Ð$ô
ð 	
à4Lô
ð 	
r|   Úenablec                 ó   — || _         y©z)Enable or disable gradient checkpointing.N©r\   ©rn   r‚   s     ru   Úset_grad_checkpointingz"MobileNetV3.set_grad_checkpointingµ   ó   € ð #)ˆÕr|   c                 ó   — | j                   S )zGet the classifier head.)rm   )rn   s    ru   Úget_classifierzMobileNetV3.get_classifierº   s   € ð �‰Ðr|   c                 ó  — || _         t        |¬«      | _        |rt        j                  d«      nt        j
                  «       | _        |dkD  rt        | j                  |«      | _	        yt        j
                  «       | _	        y)zŸReset the classifier head.

        Args:
            num_classes: Number of classes for new classifier.
            global_pool: Global pooling type.
        rR   r   r   N)
r4   r   rE   rY   rk   ri   rl   r   re   rm   )rn   r4   rE   s      ru   Úreset_classifierzMobileNetV3.reset_classifier¿   s]   € ð 'ˆÔä/¸+ÔFˆÔÙ(3”r—z‘z !”}¼¿¹»ˆŒØHSÐVWÊœ& ×!6Ñ!6¸ÓDˆ�Ô]_×]hÑ]hÓ]jˆ�r|   ÚxÚindicesÚnormÚ
stop_earlyÚ
output_fmtÚintermediates_onlyÚextra_blocksc                 óô  — |dv sJ d«       ‚|r	|sJ d«       ‚g }|r&t        t        | j                  «      dz   |«      \  }	}
nMt        t        | j                  «      |«      \  }	}
|	D �cg c]  }| j                  |   ‘Œ }	}| j                  |
   }
d}| j	                  |«      }| j                  |«      }||	v r|j                  |«       t        j                  j                  «       s|s| j                  }n| j                  d|
 }t        |d¬«      D ]Z  \  }}| j                  r+t        j                  j                  «       st        ||«      }n ||«      }||	v sŒJ|j                  |«       Œ\ |r|S ||fS c c}w )aa   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to compatible intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
            extra_blocks: Include outputs of all blocks and head conv in output, does not align with feature_info
        Returns:

        )ÚNCHWzOutput shape must be NCHW.z/Must use intermediates_only for early stopping.r   r   N)Ústart)r#   Úlenr`   rc   r]   r^   ÚappendÚtorchÚjitÚis_scriptingÚ	enumerater\   r$   )rn   r�   rŽ   r�   r�   r‘   r’   r“   ÚintermediatesÚtake_indicesÚ	max_indexÚiÚfeat_idxr`   Úblks                  ru   Úforward_intermediatesz!MobileNetV3.forward_intermediatesÌ   ss  € ð. ˜YÑ&ÐDÐ(DÓDÐ&ÙÙ%ÐXÐ'XÓXÐ%ØˆÙÜ&:¼3¸t¿{¹{Ó;KÈaÑ;OÐQXÓ&YÑ#ˆL™)ä&:¼3¸t¿¹Ó;OÐQXÓ&YÑ#ˆL˜)Ø8DÖE°1˜DŸO™O¨AÓ.ÐEˆLÐEØŸ™¨	Ñ2ˆIð ˆØ�N‰N˜1ÓˆØ�H‰H�Q‹KˆØ�|Ñ#Ø× Ñ  Ô#ä�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )Ð,ˆFÜ& v°QÔ7ò 	(‰MˆH�cØ×&Ò&¬u¯y©y×/EÑ/EÔ/GÜ" 3¨Ó*‘á˜“F�Ø˜<Ò'Ø×$Ñ$ QÕ'ð	(ñ Ø Ð à�-ÐÐùò3 Fs   Á'E5Ú
prune_normÚ
prune_headc                 ó   — |r&t        t        | j                  «      dz   |«      \  }}n1t        t        | j                  «      |«      \  }}| j                  |   }| j                  d| | _        |t        | j                  «      k  r2t	        j
                  «       | _        t	        j
                  «       | _        |rDt	        j
                  «       | _        t	        j
                  «       | _        | j                  dd«       |S )a~  Prune layers not required for specified intermediates.

        Args:
            indices: Indices of intermediate layers to keep.
            prune_norm: Whether to prune normalization layer.
            prune_head: Whether to prune the classifier head.
            extra_blocks: Include outputs of all blocks.

        Returns:
            List of indices that were kept.
        r   Nr   r0   )	r#   r—   r`   rc   rY   ri   rg   rh   rŒ   )rn   rŽ   r¤   r¥   r“   rž   rŸ   s          ru   Úprune_intermediate_layersz%MobileNetV3.prune_intermediate_layers  sÀ   € ñ$ Ü&:¼3¸t¿{¹{Ó;KÈaÑ;OÐQXÓ&YÑ#ˆL™)ä&:¼3¸t¿¹Ó;OÐQXÓ&YÑ#ˆL˜)ØŸ™¨	Ñ2ˆIØ—k‘k * 9Ð-ˆŒØ”s˜4Ÿ;™;Ó'Ò'ÜŸ[™[›]ˆDŒNÜŸ[™[›]ˆDŒNÙÜŸ[™[›]ˆDŒNÜŸ[™[›]ˆDŒNØ×!Ñ! ! RÔ(ØÐr|   c                 óô   — | j                  |«      }| j                  |«      }| j                  r8t        j                  j                  «       st        | j                  |d¬«      }|S | j                  |«      }|S )z’Forward pass through feature extraction layers.

        Args:
            x: Input tensor.

        Returns:
            Feature tensor.
        T)rl   )r]   r^   r\   r™   rš   r›   r$   r`   ©rn   r�   s     ru   Úforward_featureszMobileNetV3.forward_features'  sd   € ð �N‰N˜1ÓˆØ�H‰H�Q‹KˆØ×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨A°tÔ<ˆAð ˆð —‘˜A“ˆAØˆr|   Ú
pre_logitsc                 óL  — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j
                  dkD  r,t        j                  || j
                  | j                  ¬«      }|r|S | j                  |«      S )zàForward pass through classifier head.

        Args:
            x: Input features.
            pre_logits: Return features before final linear layer.

        Returns:
            Classification logits or features.
        r1   )ÚpÚtraining)
rE   rg   rh   rj   rl   rB   ÚFÚdropoutr®   rm   )rn   r�   r«   s      ru   Úforward_headzMobileNetV3.forward_head8  s‡   € ð ×Ñ˜QÓˆØ�N‰N˜1ÓˆØ�N‰N˜1ÓˆØ�I‰I�a‹LˆØ�L‰L˜‹OˆØ�>‰>˜BÒÜ—	‘	˜!˜tŸ~™~¸¿¹ÔFˆAÙØˆHØ�‰˜qÓ!Ð!r|   c                 óJ   — | j                  |«      }| j                  |«      }|S )zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output logits.
        )rª   r±   r©   s     ru   ÚforwardzMobileNetV3.forwardM  s)   € ð ×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆr|   ©F©T)r2   )NFFr•   FF)r   FTF)%Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚintÚboolÚstrr   r   r   ÚfloatrX   rY   r_   r{   r™   rš   Úignorer   r   r�   r‡   ÚModulerŠ   rŒ   ÚTensorr
   r   r	   r£   r§   rª   r±   r³   Ú__classcell__©rt   s   @ru   r)   r)      s@  ø„ ñð$  $ØØØ"Ø $Ø"Ø#ØØ-1Ø.2Ø,0Ø,0Ø $Ø%3Ø!Ø$&Ø6:Ø$ØØñ-r(à!ðr(ð ðr(ð ð	r(ð
 ðr(ð ðr(ð ðr(ð ðr(ð ðr(ð ðr(ð   	Ñ*ðr(ð ! Ñ+ðr(ð ˜yÑ)ðr(ð ˜yÑ)ðr(ð ðr(ð  #ð!r(ð" ð#r(ð$ "ð%r(ð& %-¨U¡Oð'r(ð( õ)r(ðh
&˜rŸ}™}ó 
&ð ‡Y�Y×Ññ
 Dð 
°T¸#¸s¸(±^ò 
ó ð
ð ‡Y�Y×Ññ)¨Tð )¸Tò )ó ð)ð ‡Y�Y×Ñð §	¡	ò ó ðñk¨Cð k¸cð kÈdó kð  8<ØØ$Ø$Ø',Ø!&ñ8 à�|‰|ð8 ð ˜e C¨¨c© NÑ3Ñ4ð8 ð ð	8 ð
 ð8 ð ð8 ð !%ð8 ð ð8 ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó8 ðx ./Ø$Ø#Ø!&ñà˜3  S¡	˜>Ñ*ðð ðð ð	ð
 ðð 
ˆc‰óðB %§,¡,ð °5·<±<ó ñ""˜eŸl™lð "¸ð "ÈÏÉó "ð*˜Ÿ™ð ¨%¯,©,÷ r|   c            $       ó8  ‡ — e Zd ZdZddddddded	d
d
d
d
ddd
d
d
fdedeedf   dededede	dede
dede	dee   dee   dee   dee   dededee   f"ˆ fd„Zej"                  j$                  d$de	d d
fd!„«       Zd"ej(                  d eej(                     fd#„Zˆ xZS )%r*   z­MobileNetV3 Feature Extractor.

    A work-in-progress feature extraction module for MobileNet-V3 to use as a backbone for segmentation
    and object detection models.
    )r   r   rJ   r-   é   Ú
bottleneckr-   r.   FrO   r0   TNr1   r3   Úout_indices.Úfeature_locationr5   r6   r7   rP   r;   rA   r@   r<   r=   r>   r?   rB   rC   rD   c                 óê  •— t         ‰| �  «        ||dœ}|xs t        j                  }|xs t        j                  }|xs t
        }|| _        || _        d| _        |s |	|«      }t        ||dfd|dœ|¤Ž| _
         ||fi |¤Ž| _         |d¬«      | _        t        d|||	|
|||||||dœ|¤Ž}t        j                   |||«      Ž | _        t!        |j"                  |«      | _        | j$                  j'                  «       D �ci c]  }|d	   |d
   “Œ c}| _        t+        | «       d| _        |dk7  r<| j$                  j'                  d¬«      }t/        || j1                  «       «      | _        yyc c}w )až  Initialize MobileNetV3Features.

        Args:
            block_args: Arguments for blocks of the network.
            out_indices: Output from stages at indices.
            feature_location: Location of feature before/after each block, must be in ['bottleneck', 'expansion'].
            in_chans: Number of input image channels.
            stem_size: Number of output channels of the initial stem convolution.
            fix_stem: If True, don't scale stem by round_chs_fn.
            output_stride: Output stride of the network.
            pad_type: Type of padding to use for convolution layers.
            round_chs_fn: Callable to round number of filters based on depth multiplier.
            se_from_exp: If True, calculate SE channel reduction from expanded mid channels.
            act_layer: Type of activation layer.
            norm_layer: Type of normalization layer.
            aa_layer: Type of anti-aliasing layer.
            se_layer: Type of Squeeze-and-Excite layer.
            drop_rate: Dropout rate.
            drop_path_rate: Stochastic depth rate.
            layer_scale_init_value: Enable layer scale on compatible blocks if not None.
        rG   Fr-   rJ   rK   TrU   )rP   r;   rA   r@   r<   r=   r>   r?   rC   rD   rÇ   rQ   ÚindexNrÅ   )ÚmoduleÚ	hook_type)ÚkeysrV   )rW   rX   rY   rZ   r[   r   r5   rB   r\   r   r]   r^   Úact1r   r_   r`   r!   ra   rb   Ú	get_dictsÚ_stage_out_idxr   Úfeature_hooksr"   Únamed_modules)rn   r3   rÆ   rÇ   r5   r6   r7   rP   r;   rA   r@   r<   r=   r>   r?   rB   rC   rD   rH   rI   ro   rq   rr   Úhooksrt   s                           €ru   rX   zMobileNetV3Features.__init__b  s‘  ø€ ôV 	‰ÑÔØ¨Ñ/ˆØÒ(¤§¡ˆ	ØÒ1¤2§>¡>ˆ
ØÒ,œ}ˆØ ˆŒØ"ˆŒØ"'ˆÔñ Ù$ YÓ/ˆIÜ& x°¸AÐ`ÀaÐQYÑ`Ð]_Ñ`ˆŒÙ˜iÑ.¨2Ñ.ˆŒÙ dÔ+ˆŒ	ô &ð 
Ø'ØØ%Ø#ØØ!ØØØ)Ø#9Ø-ñ
ð ñ
ˆô —m‘m¡W¨Y¸
Ó%CÐDˆŒÜ'¨×(8Ñ(8¸+ÓFˆÔØ?C×?PÑ?P×?ZÑ?ZÓ?\Ö]¸!˜q ™z¨1¨W©:Ñ5Ò]ˆÔä! $Ô'ð "ˆÔØ˜|Ò+Ø×%Ñ%×/Ñ/Ð5LÐ/ÓMˆEÜ!-¨e°T×5GÑ5GÓ5IÓ!JˆDÕð ,ùò ^s   ÄE0r‚   rv   c                 ó   — || _         yr„   r…   r†   s     ru   r‡   z*MobileNetV3Features.set_grad_checkpointing¸  rˆ   r|   r�   c                 ób  — | j                  |«      }| j                  |«      }| j                  |«      }| j                  €¢g }d| j                  v r|j                  |«       t        | j                  «      D ]g  \  }}| j                  r+t        j                  j                  «       st        ||«      }n ||«      }|dz   | j                  v sŒW|j                  |«       Œi |S | j                  |«       | j                  j                  |j                  «      }t        |j!                  «       «      S )z”Forward pass through feature extraction.

        Args:
            x: Input tensor.

        Returns:
            List of feature tensors.
        r   r   )r]   r^   rÍ   rÐ   rÏ   r˜   rœ   r`   r\   r™   rš   r›   r%   Ú
get_outputrH   ÚlistÚvalues)rn   r�   ra   r    ÚbÚouts         ru   r³   zMobileNetV3Features.forward½  sû   € ð �N‰N˜1ÓˆØ�H‰H�Q‹KˆØ�I‰I�a‹LˆØ×ÑÐ%ØˆHØ�D×'Ñ'Ñ'Ø—‘ Ô"Ü! $§+¡+Ó.ò '‘��1Ø×*Ò*´5·9±9×3IÑ3IÔ3KÜ" 1 aÓ(‘Aá˜!›�AØ�q‘5˜D×/Ñ/Ò/Ø—O‘O AÕ&ð'ð ˆOà�K‰K˜ŒNØ×$Ñ$×/Ñ/°·±Ó9ˆCÜ˜Ÿ
™
›Ó%Ð%r|   rµ   )r¶   r·   r¸   r¹   r   r   r	   rº   r¼   r»   r   r   r   r   r½   rX   r™   rš   r¾   r‡   rÀ   r   r³   rÁ   rÂ   s   @ru   r*   r*   [  s~  ø„ ñð ,;Ø$0ØØØ"Ø!#Ø "Ø%3Ø $Ø-1Ø.2Ø,0Ø,0Ø!Ø$&Ø6:ØØñ)TKà!ðTKð ˜s C˜x™ðTKð "ð	TKð
 ðTKð ðTKð ðTKð ðTKð ðTKð #ðTKð ðTKð   	Ñ*ðTKð ! Ñ+ðTKð ˜yÑ)ðTKð ˜yÑ)ðTKð  ð!TKð" "ð#TKð$ %-¨U¡Oõ%TKðl ‡Y�Y×Ññ)¨Tð )¸Tò )ó ð)ð&˜Ÿ™ð &¨$¨u¯|©|Ñ*<÷ &r|   ÚvariantÚ
pretrainedrv   c                 óÖ   — d}t         }d}|j                  dd«      rd|v sd|v rd}n
d}t        }d	}t        || |f|dk(  |d	k7  |d
œ|¤Ž}|d	k(  rt	        |j
                  «      |_        |S )zÝCreate a MobileNetV3 model.

    Args:
        variant: Model variant name.
        pretrained: Load pretrained weights.
        **kwargs: Additional model arguments.

    Returns:
        MobileNetV3 model instance.
    r0   NÚfeatures_onlyFÚfeature_cfgÚfeature_clsÚcfg)r4   r8   Ú	head_convr9   r:   rE   Úcls)rÝ   Úpretrained_strictÚkwargs_filter)r)   Úpopr*   r   r   Údefault_cfg)rÚ   rÛ   ÚkwargsÚfeatures_modeÚ	model_clsrä   Úmodels          ru   Ú_create_mnv3rë   Û  s�   € ð €MÜ€IØ€MØ‡z�z�/ 5Ô)Ø˜FÑ" m°vÑ&=Ø!‰MàqˆMÜ+ˆIØ!ˆMä ØØØðð $ uÑ,Ø'¨5Ñ0Ø#ñð ñ€Eð ˜ÒÜ7¸×8IÑ8IÓJˆÔØ€Lr|   ç      ð?Úchannel_multiplierc                 ó  — dgddgdgg d¢dgdgdgg}t        dt        |«      d	t        t        |¬
«      t        t        j
                  fi t        |«      ¤Žt        |d«      t        t        d¬«      dœ|¤Ž}t        | |fi |¤Ž}|S )ad  Creates a MobileNet-V3 model.

    Ref impl: ?
    Paper: https://arxiv.org/abs/1905.02244

    Args:
        variant: Model variant name.
        channel_multiplier: Multiplier to number of channels per layer.
        pretrained: Load pretrained weights.
        **kwargs: Additional model arguments.

    Returns:
        MobileNetV3 model instance.
    Úds_r1_k3_s1_e1_c16_nre_noskipÚir_r1_k3_s2_e4_c24_nreÚir_r1_k3_s1_e3_c24_nreúir_r3_k5_s2_e3_c40_se0.25_nre©Úir_r1_k3_s2_e6_c80zir_r1_k3_s1_e2.5_c80zir_r2_k3_s1_e2.3_c80úir_r2_k3_s1_e6_c112_se0.25úir_r3_k5_s2_e6_c160_se0.25Úcn_r1_k1_s1_c960F©Ú
multiplierÚ
hard_swishÚhard_sigmoid)Ú
gate_layer)r3   r9   rA   r=   r<   r?   rV   )
r€   r   r   r   rY   r[   r   r   r   rë   ©rÚ   rí   rÛ   rç   Úarch_defÚmodel_kwargsrê   s          ru   Ú_gen_mobilenet_v3_rwr   ÿ  s¨   € ð& 
)Ð)à	!Ð#;Ð<à	(Ð)âNà	%Ð&à	%Ð&à	Ðð€Hô  ð Ü" 8Ó,ØÜœ^Ð8JÔKÜœ2Ÿ>™>ÑE¬_¸VÓ-DÑEÜ# F¨LÓ9Üœ°>ÔBñð ñ€Lô ˜ *Ñ=°Ñ=€EØ€Lr|   Údepth_multiplierÚ
group_sizec                 ó  — d| v r@d}d| v rt        |d«      }dgddgdd	gd
gdgdgg}n`t        |d«      }dgddgddgdgdgdgg}nCd}d| v rt        |d«      }dgddgdgg d¢dgdgdgg}nt        |d«      }dgdd gd!gg d¢d"gd#gdgg}t        t        d$t        j                  t
        ¬%«      }	t        d+t        |||¬&«      |d'|d(k  t        t
        |¬)«      t        t        j                  fi t        |«      ¤Ž||	d*œ|¤Ž}
t        | |fi |
¤Ž}|S ),aÛ  Creates a MobileNet-V3 model.

    Ref impl: ?
    Paper: https://arxiv.org/abs/1905.02244

    Args:
        variant: Model variant name.
        channel_multiplier: Multiplier to number of channels per layer.
        depth_multiplier: Depth multiplier for model scaling.
        group_size: Group size for grouped convolutions.
        pretrained: Load pretrained weights.
        **kwargs: Additional model arguments.

    Returns:
        MobileNetV3 model instance.
    Úsmalli   ÚminimalÚreluÚds_r1_k3_s2_e1_c16zir_r1_k3_s2_e4.5_c24zir_r1_k3_s1_e3.67_c24Úir_r1_k3_s2_e4_c40Úir_r2_k3_s1_e6_c40Úir_r2_k3_s1_e3_c48Úir_r3_k3_s2_e6_c96Úcn_r1_k1_s1_c576rú   zds_r1_k3_s2_e1_c16_se0.25_nrezir_r1_k3_s2_e4.5_c24_nrezir_r1_k3_s1_e3.67_c24_nreúir_r1_k5_s2_e4_c40_se0.25zir_r2_k5_s1_e6_c40_se0.25zir_r2_k5_s1_e3_c48_se0.25zir_r3_k5_s2_e6_c96_se0.25r/   Úds_r1_k3_s1_e1_c16Úir_r1_k3_s2_e4_c24Úir_r1_k3_s1_e3_c24Úir_r3_k3_s2_e3_c40ró   Úir_r2_k3_s1_e6_c112Úir_r3_k3_s2_e6_c160r÷   Úds_r1_k3_s1_e1_c16_nrerð   rñ   rò   rõ   rö   rû   )rü   Úforce_act_layerÚrd_round_fn)r  r  r.   ç      è?rø   )r3   r8   r6   r7   rA   r=   r<   r?   rV   )r   r   r   rY   rZ   r   r€   r   r[   r   rë   )rÚ   rí   r  r  rÛ   rç   r8   r<   rþ   r?   rÿ   rê   s               ru   Ú_gen_mobilenet_v3r  -  s¶  € ð0 �'ÑØˆØ˜ÑÜ)¨&°&Ó9ˆIð &Ð&à'Ð)@ÐAà%Ð';Ð<à%Ð&à%Ð&à#Ð$ð‰Hô *¨&°,Ó?ˆIð 1Ð1à+Ð-HÐIà,Ð.IÐJà,Ð-à,Ð-à#Ð$ð‰Hð ˆØ˜ÑÜ)¨&°&Ó9ˆIð &Ð&à%Ð';Ð<à%Ð&âVà&Ð'à&Ð'à#Ð$ð‰Hô" *¨&°,Ó?ˆIð *Ð*à)Ð+CÐDà0Ð1âVà-Ð.à-Ð.à#Ð$ðˆHô  ”}°ÔQS×QXÑQXÔftÔu€HÜð 
Ü" 8Ð>NÐ[eÔfØ!ØØ# dÑ*Üœ^Ð8JÔKÜœ2Ÿ>™>ÑE¬_¸VÓ-DÑEØØñ
ð ñ
€Lô ˜ *Ñ=°Ñ=€EØ€Lr|   c                 óÞ  — | j                  d«      d   }|dv rd}dgddgdd	gd
dgddgg d¢dgg}n@|dk(  rd}dgddgddgddgddgg d¢dgg}n#|dk(  rd}dgddgd d!gd"d#gd$d%gg d&¢d'gg}nt        ‚t        t        |d(¬)«      }t        t        d*|¬+«      }t        |d,«      }	t        d0t        |«      d-d.||d.t        t        j                  fi t        |«      ¤Ž|	|d/œ	|¤Ž}
t        | |fi |
¤Ž}|S )1aÙ  FBNetV3 model generator.

    Paper: `FBNetV3: Joint Architecture-Recipe Search using Predictor Pretraining`
        - https://arxiv.org/abs/2006.02049
    FIXME untested, this is a preliminary impl of some FBNet-V3 variants.

    Args:
        variant: Model variant name.
        channel_multiplier: Channel width multiplier.
        pretrained: Load pretrained weights.
        **kwargs: Additional model arguments.

    Returns:
        MobileNetV3 model instance.
    Ú_éÿÿÿÿ)ÚarØ   r.   Úds_r2_k3_s1_e1_c16Úir_r1_k5_s2_e4_c24Úir_r3_k5_s1_e2_c24zir_r1_k5_s2_e5_c40_se0.25zir_r4_k5_s1_e3_c40_se0.25Úir_r1_k5_s2_e5_c72Úir_r4_k3_s1_e3_c72zir_r1_k3_s1_e5_c120_se0.25zir_r5_k5_s1_e3_c120_se0.25)zir_r1_k3_s2_e6_c184_se0.25zir_r5_k5_s1_e4_c184_se0.25zir_r1_k5_s1_e6_c224_se0.25Úcn_r1_k1_s1_c1344Údé   Úir_r1_k3_s2_e5_c24Úir_r5_k3_s1_e2_c24r  zir_r4_k3_s1_e3_c40_se0.25Úir_r1_k3_s2_e5_c72zir_r1_k3_s1_e5_c128_se0.25zir_r6_k5_s1_e3_c128_se0.25)zir_r1_k3_s2_e6_c208_se0.25zir_r5_k5_s1_e5_c208_se0.25zir_r1_k5_s1_e6_c240_se0.25Úcn_r1_k1_s1_c1440ÚgrO   Úds_r3_k3_s1_e1_c24Úir_r1_k5_s2_e4_c40Úir_r4_k5_s1_e2_c40zir_r1_k5_s2_e4_c56_se0.25zir_r4_k5_s1_e3_c56_se0.25Úir_r1_k5_s2_e5_c104Úir_r4_k3_s1_e3_c104zir_r1_k3_s1_e5_c160_se0.25zir_r8_k5_s1_e3_c160_se0.25)zir_r1_k3_s2_e6_c264_se0.25zir_r6_k5_s1_e5_c264_se0.25zir_r2_k5_s1_e6_c288_se0.25Úcn_r1_k1_s1_c1728çffffffî?)rù   Úround_limitrû   )rü   r  rú   iÀ  F)	r3   r8   r9   r6   rA   r@   r=   r<   r?   rV   )ÚsplitÚNotImplementedr   r   r   r   r€   r   rY   r[   r   rë   )rÚ   rí   rÛ   rç   Úvlr6   rþ   rA   r?   r<   rÿ   rê   s               ru   Ú_gen_fbnetv3r5  �  s„  € ð  
�‰�sÓ	˜BÑ	€BØ	ˆZÑØˆ	à!Ð"Ø!Ð#7Ð8Ø(Ð*EÐFØ!Ð#7Ð8Ø)Ð+GÐHÚfØ Ð!ð
‰ð 
ˆsŠØˆ	à!Ð"Ø!Ð#7Ð8Ø(Ð*EÐFØ!Ð#7Ð8Ø)Ð+GÐHÚfØ Ð!ð
‰ð 
ˆsŠØˆ	à!Ð"Ø!Ð#7Ð8Ø(Ð*EÐFØ"Ð$9Ð:Ø)Ð+GÐHÚfØ Ð!ð
‰ô ÐÜœ>Ð6HÐVZÔ[€LÜ”}°È\ÔZ€HÜ! &¨,Ó7€IÜð Ü" 8Ó,ØØØØ!ØÜœ2Ÿ>™>ÑE¬_¸VÓ-DÑEØØñð ñ€Lô ˜ *Ñ=°Ñ=€EØ€Lr|   c                 ó&  — dgdgdgddgdgdgg}t        dt        |«      dt        t        |¬	«      t        t        j
                  fi t        |«      ¤Žt        |d
«      t        t        dt        j                  ¬«      ddœ|¤Ž}t        | |fi |¤Ž}|S )aÆ  LCNet model generator.

    Essentially a MobileNet-V3 crossed with a MobileNet-V1

    Paper: `PP-LCNet: A Lightweight CPU Convolutional Neural Network` - https://arxiv.org/abs/2109.15099

    Args:
        variant: Model variant name.
        channel_multiplier: Multiplier to number of channels per layer.
        pretrained: Load pretrained weights.
        **kwargs: Additional model arguments.

    Returns:
        MobileNetV3 model instance.
    Údsa_r1_k3_s1_c32Údsa_r2_k3_s2_c64Údsa_r2_k3_s2_c128Údsa_r1_k3_s2_c256Údsa_r1_k5_s1_c256Údsa_r4_k5_s1_c256zdsa_r2_k5_s2_c512_se0.25r.   rø   rú   rû   )rü   r  r/   )r3   r6   rA   r=   r<   r?   r8   rV   )r€   r   r   r   rY   r[   r   r   r   rZ   rë   rý   s          ru   Ú
_gen_lcnetr=  ä  s±   € ð$ 
Ðà	Ðà	Ðà	Ð1Ð2à	Ðà	#Ð$ð€Hô ð 	Ü" 8Ó,ØÜœ^Ð8JÔKÜœ2Ÿ>™>ÑE¬_¸VÓ-DÑEÜ# F¨LÓ9Üœ°>ÔSU×SZÑSZÔ[Øñ	ð ñ	€Lô ˜ *Ñ=°Ñ=€EØ€Lr|   c                 ó^  — d}d| v rQd}d| v rd}t        |d«      }dgdd	gg d
¢g d¢dgg}	n¡d| v rd}t        |d«      }dgddgg d¢g d¢dgg}	nJ d| › d�«       ‚d}d| v rd}t        |d«      }ddgddgg d¢g d¢dgg}	nOd| v rd}t        |d«      }dgdd	gg d¢g d ¢dgg}	n-d| v rd}t        |d«      }dgddgg d!¢g d"¢dgg}	nJ d| › d�«       ‚t        d(t        |	|¬#«      dd$|||d%k  t        t        |¬&«      t        t
        j                  fi t        |«      ¤Ž||d'œ
|¤Ž}
t        | |fi |
¤Ž}|S ))a�  Creates a MobileNet-V4 model.

    Paper: https://arxiv.org/abs/2404.10518

    Args:
        variant: Model variant name.
        channel_multiplier: Multiplier to number of channels per layer.
        group_size: Group size for grouped convolutions.
        pretrained: Load pretrained weights.
        **kwargs: Additional model arguments.

    Returns:
        MobileNetV3 model instance.
    r/   Úhybridgñhãˆµøä>ÚmediumrO   r  Úer_r1_k3_s2_e4_c48Úuir_r1_a3_k5_s2_e4_c80Úuir_r1_a3_k3_s1_e2_c80)Úuir_r1_a3_k5_s2_e6_c160Úuir_r1_a0_k0_s1_e2_c160Úuir_r1_a3_k3_s1_e4_c160Úuir_r1_a3_k5_s1_e4_c160Úmqa_r1_k3_h4_s1_v2_d64_c160rF  rH  Úuir_r1_a3_k0_s1_e4_c160rH  rF  rH  rI  )Úuir_r1_a5_k5_s2_e6_c256Úuir_r1_a5_k5_s1_e4_c256Úuir_r2_a3_k5_s1_e4_c256Úuir_r1_a0_k0_s1_e2_c256Úuir_r1_a3_k5_s1_e2_c256rM  Úuir_r1_a0_k0_s1_e4_c256Úmqa_r1_k3_h4_s1_d64_c256Úuir_r1_a3_k0_s1_e4_c256rP  rK  rP  Úuir_r1_a5_k0_s1_e4_c256rP  rR  r÷   Úlarger$  ÚgeluÚuir_r1_a3_k5_s2_e4_c96Úuir_r1_a3_k3_s1_e4_c96)Úuir_r1_a3_k5_s2_e4_c192Úuir_r3_a3_k3_s1_e4_c192Úuir_r1_a3_k5_s1_e4_c192Úuir_r2_a5_k3_s1_e4_c192Úmqa_r1_k3_h8_s1_v2_d48_c192Úuir_r1_a5_k3_s1_e4_c192r[  r\  r[  r\  r[  Úuir_r1_a3_k0_s1_e4_c192)Úuir_r4_a5_k5_s2_e4_c512Úuir_r1_a5_k0_s1_e4_c512Úuir_r1_a5_k3_s1_e4_c512Úuir_r2_a5_k0_s1_e4_c512r`  Úuir_r1_a5_k5_s1_e4_c512Úmqa_r1_k3_h8_s1_d64_c512r_  rc  r_  rc  r_  rc  r_  FzUnknown variant ú.Nr  Úcn_r1_k3_s2_e1_c32Úcn_r1_k1_s1_e1_c32Úcn_r1_k3_s2_e1_c96Úcn_r1_k1_s1_e1_c64)Úuir_r1_a5_k5_s2_e3_c96Úuir_r4_a0_k3_s1_e2_c96Úuir_r1_a3_k0_s1_e4_c96)Úuir_r1_a3_k3_s2_e6_c128Úuir_r1_a5_k5_s1_e4_c128Úuir_r1_a0_k5_s1_e4_c128Úuir_r1_a0_k5_s1_e3_c128Úuir_r2_a0_k3_s1_e4_c128)rD  Úuir_r2_a3_k3_s1_e4_c160rG  rF  rI  rE  rI  )	rJ  rK  rL  rO  rQ  rN  rK  Úuir_r2_a0_k0_s1_e4_c256Úuir_r1_a5_k0_s1_e2_c256)rW  rX  rY  Úuir_r5_a5_k3_s1_e4_c192r]  )r^  r_  r`  ra  r`  rb  Úuir_r3_a5_k0_s1_e4_c512)r  Trì   rø   )
r3   r9   r:   r8   r6   r7   rA   r=   r<   rD   rV   )	r   r€   r   r   r   rY   r[   r   rë   )rÚ   rí   r  rÛ   rç   r8   rD   r6   r<   rþ   rÿ   rê   s               ru   Ú_gen_mobilenet_v4rv    sF  € ð* €LØ�7ÑØ!%ÐØ�wÑØˆIÜ)¨&°&Ó9ˆIð )ðð
 -Ø,ðò
òð& 'ððY/‰Hð` ˜ÑØˆIÜ)¨&°&Ó9ˆIð )ðð
 -Ø,ðò
òð$ 'ððW.‰Hð` 8Ð,¨W¨I°QÐ7Ó7�5à!%ÐØ�gÑØˆIÜ)¨&°&Ó9ˆIð )Ø(ðð )Ø(ðò
òð 'ðð5‰Hð< ˜Ñ ØˆIÜ)¨&°&Ó9ˆIð )ðð
 -Ø,ðò
ò
ð 'ððC$‰HðJ ˜ÑØˆIÜ)¨&°&Ó9ˆIð )ðð
 -Ø,ðò
ò	ð 'ðð=!‰HðF 8Ð,¨W¨I°QÐ7Ó7�5äð Ü" 8¸
ÔCØØØ!ØØ# cÑ)Üœ^Ð8JÔKÜœ2Ÿ>™>ÑE¬_¸VÓ-DÑEØØ5ñð ñ€Lô ˜ *Ñ=°Ñ=€EØ€Lr|   r0   Úurlc                 ó2   — | dddddt         t        dddd	œ|¥S )
z»Create default configuration dictionary.

    Args:
        url: Model weight URL.
        **kwargs: Additional configuration options.

    Returns:
        Configuration dictionary.
    r,   )r-   éà   ry  )é   rz  g      ì?Úbilinearr]   rm   z
apache-2.0)rw  r4   Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚmeanÚstdÚ
first_convrm   Úlicense)r   r   )rw  rç   s     ru   Ú_cfgr„    s5   € ð  4°}ÐSYØ¨JÜ%Ô.BØ!°Øñð
 $*ðð r|   zmobilenetv3_large_075.untrained)rw  zmobilenetv3_large_100.ra_in1kÚbicubiczvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv3_large_100_ra-f55367f5.pthztimm/)r  rw  Ú	hf_hub_idz)mobilenetv3_large_100.ra4_e3600_r224_in1kr0  )r-   é   r‡  )r†  r  r€  r�  r~  Útest_input_sizeÚtest_crop_pctz(mobilenetv3_large_100.miil_in21k_ft_in1kr{  )r1   r1   r1   )rì   rì   rì   z+https://github.com/Alibaba-MIIL/ImageNet21KzarXiv:2104.10972v4z€https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/mobilenetv3_large_100_1k_miil_78_0-66471c13.pth)r  r€  r�  Ú
origin_urlÚ	paper_idsrw  r†  z mobilenetv3_large_100.miil_in21kz~https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/mobilenetv3_large_100_in21k_miil-d71cc17b.pthiÕ+  )rw  r†  rŠ  r‹  r  r€  r�  r4   z*mobilenetv3_large_150d.ra4_e3600_r256_in1k)é   rŒ  )r-   é@  r�  )r†  r€  r�  r|  r~  r}  rˆ  r‰  zmobilenetv3_small_050.lamb_in1kzyhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv3_small_050_lambc-4b7bbe87.pth)rw  r†  r  zmobilenetv3_small_075.lamb_in1kzyhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv3_small_075_lambc-384766db.pthzmobilenetv3_small_100.lamb_in1kzxhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv3_small_100_lamb-266a294c.pthzmobilenetv3_rw.rmsp_in1kzmhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv3_100-35495452.pthztf_mobilenetv3_large_075.in1kzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mobilenetv3_large_075-150ee8b0.pth)rw  r†  r€  r�  ztf_mobilenetv3_large_100.in1kzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mobilenetv3_large_100-427764d5.pthz%tf_mobilenetv3_large_minimal_100.in1kz~https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mobilenetv3_large_minimal_100-8596ae28.pthztf_mobilenetv3_small_075.in1kzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mobilenetv3_small_075-da427f52.pthztf_mobilenetv3_small_100.in1kzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mobilenetv3_small_100-37f49e2b.pthz%tf_mobilenetv3_small_minimal_100.in1kz~https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mobilenetv3_small_minimal_100-922a7843.pthzfbnetv3_b.ra2_in1kzkhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/fbnetv3_b_224-ead5d2a1.pth)rw  r†  rˆ  r~  zfbnetv3_d.ra2_in1kzkhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/fbnetv3_d_224-c98bce42.pthzfbnetv3_g.ra2_in1kzkhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/fbnetv3_g_240-0b1df83b.pth)r-   éð   rŽ  )r-   é   r�  )rw  r†  r|  rˆ  r~  r}  zlcnet_035.untrainedzlcnet_050.ra2_in1kzghttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/lcnet_050-f447553b.pthzlcnet_075.ra2_in1kzghttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/lcnet_075-318cad2c.pthzlcnet_100.ra2_in1kzghttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/lcnet_100-a929038c.pthzlcnet_150.untrainedz$mobilenetv4_conv_small_035.untrained)r€  r�  rˆ  r‰  r  z*mobilenetv4_conv_small_050.e3000_r224_in1k)r†  r€  r�  rˆ  r‰  r  z&mobilenetv4_conv_small.e2400_r224_in1k)r†  rˆ  r‰  r  z&mobilenetv4_conv_small.e1200_r224_in1kz&mobilenetv4_conv_small.e3600_r256_in1k)	r†  r€  r�  r|  r}  r~  rˆ  r‰  r  z&mobilenetv4_conv_medium.e500_r256_in1k)r†  r|  r}  r~  rˆ  r‰  r  z&mobilenetv4_conv_medium.e500_r224_in1k)r†  r~  rˆ  r‰  r  z/mobilenetv4_conv_medium.e250_r384_in12k_ft_in1k)r-   é€  r�  )é   r‘  )r†  r|  r}  r~  r  z'mobilenetv4_conv_medium.e180_r384_in12ki-.  )r†  r4   r|  r}  r~  r  z*mobilenetv4_conv_medium.e180_ad_r384_in12kz'mobilenetv4_conv_medium.e250_r384_in12kz%mobilenetv4_conv_large.e600_r384_in1k)r-   éÀ  r’  z%mobilenetv4_conv_large.e500_r256_in1kz1mobilenetv4_hybrid_medium.e200_r256_in12k_ft_in1kz+mobilenetv4_hybrid_medium.ix_e550_r256_in1kz+mobilenetv4_hybrid_medium.ix_e550_r384_in1kz(mobilenetv4_hybrid_medium.e500_r224_in1kz)mobilenetv4_hybrid_medium.e200_r256_in12k)r†  r4   r|  r}  r~  rˆ  r‰  r  z*mobilenetv4_hybrid_large.ix_e600_r384_in1kz'mobilenetv4_hybrid_large.e600_r384_in1kz$mobilenetv4_conv_aa_medium.untrained)r|  r}  r~  r  z+mobilenetv4_conv_blur_medium.e500_r224_in1kz1mobilenetv4_conv_aa_large.e230_r448_in12k_ft_in1k)é   r“  )r-   é   r”  z1mobilenetv4_conv_aa_large.e230_r384_in12k_ft_in1k)r-   éà  r•  z(mobilenetv4_conv_aa_large.e600_r384_in1kz)mobilenetv4_conv_aa_large.e230_r384_in12kz'mobilenetv4_hybrid_medium_075.untrained)r~  r  z&mobilenetv4_hybrid_large_075.untrainedc                 ó    — t        dd| i|¤Ž}|S )ú MobileNet V3 rÛ   )Úmobilenetv3_large_075r  ©r  ©rÛ   rç   rê   s      ru   r˜  r˜    ó   € ô Ñ]È
Ð]ÐV\Ñ]€EØ€Lr|   c                 ó    — t        dd| i|¤Ž}|S )r—  rÛ   )Úmobilenetv3_large_100rì   r™  rš  s      ru   r�  r�    ó   € ô Ñ\ÀzÐ\ÐU[Ñ\€EØ€Lr|   c                 ó"   — t        dd| dœ|¤Ž}|S )r—  g333333ó?)r  rÛ   )Úmobilenetv3_large_150dç      ø?r™  rš  s      ru   r   r     s   € ô ÐsÈcÐ^hÑsÐlrÑs€EØ€Lr|   c                 ó    — t        dd| i|¤Ž}|S )r—  rÛ   )Úmobilenetv3_small_050ç      à?r™  rš  s      ru   r£  r£    r›  r|   c                 ó    — t        dd| i|¤Ž}|S )r—  rÛ   )Úmobilenetv3_small_075r  r™  rš  s      ru   r¦  r¦    r›  r|   c                 ó    — t        dd| i|¤Ž}|S )r—  rÛ   )Úmobilenetv3_small_100rì   r™  rš  s      ru   r¨  r¨  "  rž  r|   c                 óL   — |j                  dt        «       t        dd| i|¤Ž}|S )r—  Úbn_epsrÛ   )Úmobilenetv3_rwrì   )Ú
setdefaultr    r   rš  s      ru   r«  r«  )  s-   € ð ×Ñ�hÔ 1Ô2Ü ÑXÀ:ÐXÐQWÑX€EØ€Lr|   c                 óp   — |j                  dt        «       |j                  dd«       t        dd| i|¤Ž}|S )r—  rª  r;   ÚsamerÛ   )Útf_mobilenetv3_large_075r  ©r¬  r    r  rš  s      ru   r¯  r¯  1  ó=   € ð ×Ñ�hÔ 1Ô2Ø
×Ñ�j &Ô)ÜÑ`È:Ð`ÐY_Ñ`€EØ€Lr|   c                 óp   — |j                  dt        «       |j                  dd«       t        dd| i|¤Ž}|S )r—  rª  r;   r®  rÛ   )Útf_mobilenetv3_large_100rì   r°  rš  s      ru   r³  r³  :  ó=   € ð ×Ñ�hÔ 1Ô2Ø
×Ñ�j &Ô)ÜÑ_È*Ð_ÐX^Ñ_€EØ€Lr|   c                 óp   — |j                  dt        «       |j                  dd«       t        dd| i|¤Ž}|S )r—  rª  r;   r®  rÛ   )Ú tf_mobilenetv3_large_minimal_100rì   r°  rš  s      ru   r¶  r¶  C  ó>   € ð ×Ñ�hÔ 1Ô2Ø
×Ñ�j &Ô)ÜÑgÐR\ÐgÐ`fÑg€EØ€Lr|   c                 óp   — |j                  dt        «       |j                  dd«       t        dd| i|¤Ž}|S )r—  rª  r;   r®  rÛ   )Útf_mobilenetv3_small_075r  r°  rš  s      ru   r¹  r¹  L  r±  r|   c                 óp   — |j                  dt        «       |j                  dd«       t        dd| i|¤Ž}|S )r—  rª  r;   r®  rÛ   )Útf_mobilenetv3_small_100rì   r°  rš  s      ru   r»  r»  U  r´  r|   c                 óp   — |j                  dt        «       |j                  dd«       t        dd| i|¤Ž}|S )r—  rª  r;   r®  rÛ   )Ú tf_mobilenetv3_small_minimal_100rì   r°  rš  s      ru   r½  r½  ^  r·  r|   c                 ó    — t        dd| i|¤Ž}|S )z FBNetV3-B rÛ   )Ú	fbnetv3_b©r5  rš  s      ru   r¿  r¿  g  ó   € ô ÑF°ÐF¸vÑF€EØ€Lr|   c                 ó    — t        dd| i|¤Ž}|S )z FBNetV3-D rÛ   )Ú	fbnetv3_drÀ  rš  s      ru   rÃ  rÃ  n  rÁ  r|   c                 ó    — t        dd| i|¤Ž}|S )z FBNetV3-G rÛ   )Ú	fbnetv3_grÀ  rš  s      ru   rÅ  rÅ  u  rÁ  r|   c                 ó    — t        dd| i|¤Ž}|S )z PP-LCNet 0.35rÛ   )Ú	lcnet_035çffffffÖ?©r=  rš  s      ru   rÇ  rÇ  |  ó   € ô ÑJ°ZÐJÀ6ÑJ€EØ€Lr|   c                 ó    — t        dd| i|¤Ž}|S )z PP-LCNet 0.5rÛ   )Ú	lcnet_050r¤  rÉ  rš  s      ru   rÌ  rÌ  ƒ  ó   € ô ÑI°JÐIÀ&ÑI€EØ€Lr|   c                 ó    — t        dd| i|¤Ž}|S )ú PP-LCNet 1.0rÛ   )Ú	lcnet_075r  rÉ  rš  s      ru   rÐ  rÐ  Š  rÊ  r|   c                 ó    — t        dd| i|¤Ž}|S )rÏ  rÛ   )Ú	lcnet_100rì   rÉ  rš  s      ru   rÒ  rÒ  ‘  rÍ  r|   c                 ó    — t        dd| i|¤Ž}|S )z PP-LCNet 1.5rÛ   )Ú	lcnet_150r¡  rÉ  rš  s      ru   rÔ  rÔ  ˜  rÍ  r|   c                 ó    — t        dd| i|¤Ž}|S )ú MobileNet V4 rÛ   )Úmobilenetv4_conv_small_035rÈ  ©rv  rš  s      ru   r×  r×  Ÿ  ó   € ô ÑbÈZÐbÐ[aÑb€EØ€Lr|   c                 ó    — t        dd| i|¤Ž}|S )rÖ  rÛ   )Úmobilenetv4_conv_small_050r¤  rØ  rš  s      ru   rÛ  rÛ  ¦  rÙ  r|   c                 ó    — t        dd| i|¤Ž}|S )rÖ  rÛ   )Úmobilenetv4_conv_smallrì   rØ  rš  s      ru   rÝ  rÝ  ­  r›  r|   c                 ó    — t        dd| i|¤Ž}|S )rÖ  rÛ   )Úmobilenetv4_conv_mediumrì   rØ  rš  s      ru   rß  rß  ´  s   € ô Ñ^ÈÐ^ÐW]Ñ^€EØ€Lr|   c                 ó    — t        dd| i|¤Ž}|S )rÖ  rÛ   )Úmobilenetv4_conv_largerì   rØ  rš  s      ru   rá  rá  »  r›  r|   c                 ó    — t        dd| i|¤Ž}|S )ú MobileNet V4 Hybrid rÛ   )Úmobilenetv4_hybrid_mediumrì   rØ  rš  s      ru   rä  rä  Â  s   € ô Ñ`È:Ð`ÐY_Ñ`€EØ€Lr|   c                 ó    — t        dd| i|¤Ž}|S )ú MobileNet V4 HybridrÛ   )Úmobilenetv4_hybrid_largerì   rØ  rš  s      ru   rç  rç  É  s   € ô Ñ_È*Ð_ÐX^Ñ_€EØ€Lr|   c                 ó"   — t        d| ddœ|¤Ž}|S )ú MobileNet V4 w/ AvgPool AA r2   ©rÛ   r>   )Úmobilenetv4_conv_aa_mediumrì   rØ  rš  s      ru   rë  rë  Ð  s   € ô ÐqÈJÐafÑqÐjpÑq€EØ€Lr|   c                 ó"   — t        d| ddœ|¤Ž}|S )z MobileNet V4 Conv w/ Blur AA Úblurpcrê  )Úmobilenetv4_conv_blur_mediumrì   rØ  rš  s      ru   rî  rî  ×  s   € ô ÐvÈjÐckÑvÐouÑv€EØ€Lr|   c                 ó"   — t        d| ddœ|¤Ž}|S )ré  r2   rê  )Úmobilenetv4_conv_aa_largerì   rØ  rš  s      ru   rð  rð  Þ  s   € ô ÐpÈ:Ð`eÑpÐioÑp€EØ€Lr|   c                 ó    — t        dd| i|¤Ž}|S )rã  rÛ   )Úmobilenetv4_hybrid_medium_075r  rØ  rš  s      ru   rò  rò  å  s   € ô ÑeÐPZÐeÐ^dÑe€EØ€Lr|   c                 ó    — t        dd| i|¤Ž}|S )ræ  rÛ   )Úmobilenetv4_hybrid_large_075r  rØ  rš  s      ru   rô  rô  ì  s   € ô ÑdÈzÐdÐ]cÑd€EØ€Lr|   )Úmobilenetv3_large_100_miilÚ mobilenetv3_large_100_miil_in21kr´   )rì   F)rì   rì   NF)rì   NF)r0   )hr¹   Ú	functoolsr   Útypingr   r   r   r   r   r	   r
   r™   Útorch.nnrY   Útorch.nn.functionalÚ
functionalr¯   Ú	timm.datar   r   r   r   Útimm.layersr   r   r   r   r   r   Ú_builderr   r   Ú_efficientnet_blocksr   Ú_efficientnet_builderr   r   r   r   r   r   r   r    Ú	_featuresr!   r"   r#   Ú_manipulater$   r%   Ú	_registryr&   r'   r(   Ú__all__r¿   r)   r*   r¼   r»   rë   r½   r   rº   r  r5  r=  rv  r„  Údefault_cfgsr˜  r�  r   r£  r¦  r¨  r«  r¯  r³  r¶  r¹  r»  r½  r¿  rÃ  rÅ  rÇ  rÌ  rÐ  rÒ  rÔ  r×  rÛ  rÝ  rß  rá  rä  rç  rë  rî  rð  rò  rô  r¶   rV   r|   ru   ú<module>r     sZ  ðñõ ß D× DÑ Dã Ý ß Ð ç rÓ rß k× kß GÝ /÷J÷ Jó Jç FÑ Fß 3ß YÑ YàÐ/Ð
0€ô{�"—)‘)ô {ô|	}&˜"Ÿ)™)ô }&ñ@!˜#ð !¨4ð !Àkó !ðJ KPñ+Øð+Ø*/ð+ØCGð+àó+ð` %(Ø"%Ø$(Ø ñmØðmà!ðmð  ðmð ˜S‘Mð	mð
 ðmð ómñ`D˜#ð D°5ð DÈDð DÐgró DñN*˜ð *°ð *È$ð *Ðepó *ð^ %(Ø$(Ø ñ	@Øð@à!ð@ð ˜S‘Mð@ð ð	@ð ó@ñFˆcð  T¨#¨s¨(¡^ó ñ& %ð W&Ø%¡t°¤|ðW&à#¡TØð EØô&ðW&ð 0±ØØÐ&=ÐCYØ }ÀCô2IðW&ð /±Ø  |¸Ø@Ø&ð OØô1ðW&ð  '©ð MØØ@Ø&Ø  |¸ÐSXô)Zð!W&ð, 1±$ØØ$Ð*@Ø ¨4¸6ÐS`Ðpsô3uð-W&ð6 &¡tð HØØô(!ð7W&ð> &¡tð HØØô(!ð?W&ðF &¡tð GØØô(!ðGW&ðP ¡Ø{ØØô!!ðQW&ðZ $¡Tð EØØ$Ð*@ô&Bð[W&ðb $¡Tð EØØ$Ð*@ô&BðcW&ðj ,©Tð MØØ$Ð*@ô.BðkW&ðr $¡Tð EØØ$Ð*@ô&BðsW&ðz $¡Tð FØØ$Ð*@ô&Bð{W&ðB ,©Tð MØØ$Ð*@ô.BðCW&ðL ™$ØyØØ%°ô6ñMW&ðT ™$ØyØØ%°ô6ðUW&ð\ ™$ØyØØ °-È$ÐZ`ôbð]W&ðf ™4›6ðgW&ðh ™$ØuØØôðiW&ðr ™$ØuØØôðsW&ð| ™$ØuØØôð}W&ðF ™4›6ðGW&ðJ +©DØ$Ð*@Ø%°TÈô-TðKW&ðP 1±$ØØ$Ð*@Ø%°TÈô3TðQW&ðX -©dØØ%°TÈô/TðYW&ð^ -©dØØ%°TÈô/Tð_W&ðd -©dØØ$Ð*@Ø ¨F¸TØ%°SÈ	ô	/SðeW&ðn -©dØØ ¨FØ }ÀCÐW`ô/bðoW&ðv -©dØØ }ÀCÐW`ô/bðwW&ð~ 6±tØØ ¨HØ Yô80ðW&ðF .©tØØØ ¨HØ Iô	0/ðGW&ðP 1±$ØØØ ¨HØ Iô	3/òQW&ðZ .©tØØØ ¨HØ Iô	0/ð[W&ðf ,©TØØ ¨HØ }ÀCÐW`ô.bðgW&ðn ,©TØØ ¨FØ }ÀCÐW`ô.bðoW&ðx 8¹ØØ ¨FØ }ÀCÐW`ô:bðyW&ð@ 2±4ØØ ¨FØ }ÀCÐW`ô4bðAW&ðH 2±4ØØ ¨HØ }ÀCÐW`ô4bðIW&ðP /±ØØ }ÀCÐW`ô1bðQW&ðV 0±ØØØ ¨FØ }ÀCÐW`ô	2bðWW&ð` 1±$ØØ ¨HØ }ÀCÐW`ô3bðaW&ðh .©tØØ ¨HØ }ÀCÐW`ô0bðiW&ðt +©Dà ¨F¸TÐQZô-\ðuW&ðz 2±4ØØ }ÀCÐW`ô4bð{W&ð@ 8¹ØØ ¨HØ }ÀCÐW`ô:bðAW&ðH 8¹ØØ ¨HØ }ÀCÐW`ô:bðIW&ðP /±ØØ ¨HØ }ÀCÐW`ô1bðQW&ðX 0±ØØØ ¨HØ }ÀCÐW`ô	2bðYW&ðb .©tà Yô00ñcW&ðh -©dà ¨F¸TÐQZô/\ñiW&ó W€ðt ñ dð Àò ó ðð ñ dð Àò ó ðð
 ñ tð À+ò ó ðð
 ñ dð Àò ó ðð ñ dð Àò ó ðð ñ dð Àò ó ðð ñ˜tð ¸+ò ó ðð ñ¨ð ÀKò ó ðð ñ¨ð ÀKò ó ðð ñ°ð ÈKò ó ðð ñ¨ð ÀKò ó ðð ñ¨ð ÀKò ó ðð ñ°ð ÈKò ó ðð ñ˜$ð °[ò ó ðð ñ˜$ð °[ò ó ðð ñ˜$ð °[ò ó ðð ñ˜$ð °[ò ó ðð ñ˜$ð °[ò ó ðð ñ˜$ð °[ò ó ðð ñ˜$ð °[ò ó ðð ñ˜$ð °[ò ó ðð ñ¨4ð Àkò ó ðð ñ¨4ð Àkò ó ðð ñ tð À+ò ó ðð ñ¨ð À;ò ó ðð ñ tð À+ò ó ðð ñ¨$ð À[ò ó ðð ñ¨ð ÀKò ó ðð ñ¨4ð Àkò ó ðð ñ¨Tð Èò ó ðð ñ¨$ð À[ò ó ðð ñ¨dð Èò ó ðð ñ¨Tð Èò ó ðñ ˜HØ"LØ(Jñ'õ r|   