
    Ng                        d Z ddlmZ ddl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 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/m0Z0 ddl1m2Z2m3Z3m4Z4 ddgZ5 G d dej6                  Z7 G d dej6                  Z8dde9de:de7fdZ;	 dde9de<de:de7fdZ=	 	 dde9de<de<de:de7f
dZ>dde9de<de:fdZ?dde9de<de:fdZ@	 dde9de<de:de7fdZAdd!e9fd"ZB e2i d# eBd $          d% eBd&d'd()          d* eBd(d&eed+d,d-          d. eBd/d0d1d2d3d4d(5          d6 eBd7d(d2d3d/d0d1d89          d: eBd(eed,d+d;d<d=          d> eBd?d(d&@          dA eBdBd(d&@          dC eBdDd(d&@          dE eBdFd(d&@          dG eBdHd(eeI          dJ eBdKd(eeI          dL eBdMd(eeI          dN eBdOd(eeI          dP eBdQd(eeI          dR eBdSd(eeI          dT eBdUd(d,d+V          i dW eBdXd(d,d+V          dY eBdZd(d[d\d+d;]          d^ eB            d_ eBd`d(d&@          da eBdbd(d&@          dc eBddd(d&@          de eB            df eBeed,d+d&g          dh eBd(eed,d+d&i          dj eBd(d,d+d&k          dl eBd(d,d+d&k          dm eBd(d,d;d+d<dd&n          do eBd(d+d,dd&p          dq eBd(drdsd+dtdd&n          du eBd(d,d;d+d<dd&n          dv eBd(d,d;d+d<dd&n          dw eBd(d,d;d+d<dd&n           eBd(drdsd+dtdd&n           eBd(d+d,dd&p           eBd(dxd,d;d+d<dd&y           eBd(drdsd+dtdd&n           eBd(drdsd+dtdd&n           eBd,d;d+d&z           eBd(d+d,dd&p           eBd(dtd{d+d|dd&n           eBd(drdsd+d}dd&n           eBd(drdsd+d}dd&n           eBd(dxdrdsd+dtdd&y           eBd+d&~           eBd,d;d+d&z          d          ZCe3dde:de7fd            ZDe3dde:de7fd            ZEe3dde:de7fd            ZFe3dde:de7fd            ZGe3dde:de7fd            ZHe3dde:de7fd            ZIe3dde:de7fd            ZJe3dde:de7fd            ZKe3dde:de7fd            ZLe3dde:de7fd            ZMe3dde:de7fd            ZNe3dde:de7fd            ZOe3dde:de7fd            ZPe3dde:de7fd            ZQe3dde:de7fd            ZRe3dde:de7fd            ZSe3dde:de7fd            ZTe3dde:de7fd            ZUe3dde:de7fd            ZVe3dde:de7fd            ZWe3dde:de7fd            ZXe3dde:de7fd            ZYe3dde:de7fd            ZZe3dde:de7fd            Z[e3dde:de7fd            Z\e3dde:de7fd            Z]e3dde:de7fd            Z^e3dde:de7fd            Z_e3dde:de7fd            Z`e3dde:de7fd            Zae3dde:de7fd            Zbe3dde:de7fd            Zce3dde:de7fd            Zd e4eed.d6d           dS )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)CallableListOptionalTupleUnionN)
checkpoint)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)generate_default_cfgsregister_modelregister_model_deprecationsMobileNetV3MobileNetV3Featuresc            '           e Zd ZdZddddddddd	d	d	d	de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  Zej        j        d9d!efd"            Zej        j        d:d#efd$            Zej        j        d%ej        fd&            Zd;dedefd'Z	 	 	 	 	 	 d<d)ej        d*e	eeee         f                  d+ed,ed-ed.ed/ed%eeej                 eej        eej                 f         f         fd0Z	 	 	 	 d=d*eeee         f         d2ed3ed/efd4Zd)ej        d%ej        fd5Zd9d)ej        d6ed%ej        fd7Zd)ej        d%ej        fd8Z  xZ!S )>r'   a   MobiletNet-V3

    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          t          |                                            |
pt          j        }
|pt          j        }t          ||
          }|pt          }|| _        || _	        d| _
        |s ||          }t          ||dd|	          | _         ||d          | _        t          d|	|||
|||||
  
        }t          j         |||           | _        |j        | _        d	 | j        D             | _        |j        | _        || _        t/          |
          | _        | j        | j                                        z  }|rKt          || j        d|	          | _         || j                  | _        t          j                    | _        nGt          || j        d|	|          | _        t          j                    | _         |
d          | _        |rt          j        d          nt          j                    | _        |dk    rtA          | j        |          nt          j                    | _!        tE          |            dS )a  
        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.
            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.
        Fr+      stridepaddingTinplace    )
output_strider9   r?   r>   r:   r;   r<   r=   rA   rB   c                     g | ]
}|d          S )stage .0fs     S/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/mobilenetv3.py
<listcomp>z(MobileNetV3.__init__.<locals>.<listcomp>w   s    AAA!1W:AAA    	pool_typer   )rH   )rH   biasr   N)#superr'   __init__nnReLUBatchNorm2dr   r   r2   r@   grad_checkpointingr   	conv_stembn1r   
Sequentialblocksfeaturesfeature_info
stage_endsin_chsr6   head_hidden_sizer   rC   	feat_mult	conv_head	norm_headIdentityact2Flattenflattenr   
classifierr   )selfr1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   norm_act_layerbuildernum_pooled_chs	__class__s                          rS   rZ   zMobileNetV3.__init__.   sS   V 	k4  ))+++(	12>
+J	BB,}&""'  	0$Y//I&xAaQYZZZ!>)T::: &%#!)#9
 
 
 mWWY
%C%CD#,AAt/@AAA#N , 0+FFF*T-=-G-G-I-II 		0*>4;PRS]efffDN+^D,ABBDNDII +>4;PRS]eluvvvDN[]]DN!	$///DI(3Frz!}}}HSVW&!6DDD]_]h]j]j!$'''''rU   c                 R   | j         | j        g}|                    | j                   |                    | j        | j        | j        | j        g           |                    t          j	                    t          j
        | j                  | j        g           t          j        | S N)r_   r`   extendrb   rC   ri   rj   rl   r[   rm   Dropoutr@   ro   ra   )rp   layerss     rS   as_sequentialzMobileNetV3.as_sequential   s    .$(+dk"""t'STTTrz||RZ%?%?QRRR}f%%rU   coarsec                 ,    t          d|rdnd          S )Nz^conv_stem|bn1z^blocks\.(\d+)z^blocks\.(\d+)\.(\d+))stemrb   )dict)rp   r{   s     rS   group_matcherzMobileNetV3.group_matcher   s+    "(.L$$4L
 
 
 	
rU   enablec                     || _         d S rv   r^   rp   r   s     rS   set_grad_checkpointingz"MobileNetV3.set_grad_checkpointing       "(rU   returnc                     | j         S rv   )ro   )rp   s    rS   get_classifierzMobileNetV3.get_classifier   s
    rU   c                     || _         t          |          | _        |rt          j        d          nt          j                    | _        |dk    rt          | j        |          nt          j                    | _	        d S )NrV   r   r   )
r2   r   rC   r[   rm   rk   rn   r   rg   ro   )rp   r2   rC   s      rS   reset_classifierzMobileNetV3.reset_classifier   sk    &/+FFF(3Frz!}}}HSVW&!6DDD]_]h]j]jrU   NCHWxindicesnorm
stop_early
output_fmtintermediates_onlyextra_blocksc                 z    |dv s
J d            |r|s
J d            g }|r)t          t           j                  dz   |          \  }	}
n@t          t           j                  |          \  }	}
 fd|	D             }	 j        |
         }
d}                     |          }                     |          }||	v r|                    |           t          j        	                                s|s j        }n j        d|
         }|D ]+}|dz  } ||          }||	v r|                    |           ,|r|S ||fS )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:

        )r   zOutput shape must be NCHW.z/Must use intermediates_only for early stopping.r   c                 *    g | ]}j         |         S rO   )re   )rQ   irp   s     rS   rT   z5MobileNetV3.forward_intermediates.<locals>.<listcomp>   s     EEE1DOA.EEErU   r   N)
r"   lenrb   re   r_   r`   appendtorchjitis_scripting)rp   r   r   r   r   r   r   r   intermediatestake_indices	max_indexfeat_idxrb   blks   `             rS   forward_intermediatesz!MobileNetV3.forward_intermediates   s   . Y&&&(D&&& 	Y%XX'XXXX 	3&:3t{;K;Ka;OQX&Y&Y#L))&:3t;O;OQX&Y&Y#L)EEEEEEEL	2I NN1HHQKK|##  ###9!!## 	-: 	-[FF[),F 	( 	(CMHAA<''$$Q''' 	!  -rU   r   
prune_norm
prune_headc                    |r)t          t          | j                  dz   |          \  }}n2t          t          | j                  |          \  }}| j        |         }| j        d|         | _        |t          | j                  k     r0t	          j                    | _        t	          j                    | _        |rFt	          j                    | _        t	          j                    | _        |                     dd           |S )z@ Prune layers not required for specified intermediates.
        r   Nr   r.   )	r"   r   rb   re   r[   rk   ri   rj   r   )rp   r   r   r   r   r   r   s          rS   prune_intermediate_layersz%MobileNetV3.prune_intermediate_layers   s      	3&:3t{;K;Ka;OQX&Y&Y#L))&:3t;O;OQX&Y&Y#L)	2Ik*9*-s4;''''[]]DN[]]DN 	)[]]DN[]]DN!!!R(((rU   c                     |                      |          }|                     |          }| j        r6t          j                                        st          | j        |d          }n|                     |          }|S )NT)rn   )r_   r`   r^   r   r   r   r#   rb   rp   r   s     rS   forward_featureszMobileNetV3.forward_features   sn    NN1HHQKK" 	59+A+A+C+C 	t{At<<<AAAArU   
pre_logitsc                 ^   |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }| j        dk    r!t          j        || j        | j                  }|r|S | 	                    |          S )Nr/   )ptraining)
rC   ri   rj   rl   rn   r@   Fdropoutr   ro   )rp   r   r   s      rS   forward_headzMobileNetV3.forward_head  s    QNN1NN1IIaLLLLOO>B	!t~FFFA 	Hq!!!rU   c                 Z    |                      |          }|                     |          }|S rv   )r   r   r   s     rS   forwardzMobileNetV3.forward  s-    !!!$$a  rU   FT)r0   )NFFr   FF)r   FTF)"__name__
__module____qualname____doc__r   r   intboolstrr   r   r   floatrZ   rz   r   r   ignorer   r   r[   Moduler   r   Tensorr   r   r   r   r   r   r   r   __classcell__rt   s   @rS   r'   r'      s        $  $" $"#-1.2,0,0 $%3!$&6:$)]( ](!]( ]( 	](
 ]( ]( ]( ]( ]( ](  	*]( !+]( y)]( y)]( ](  #!](" #]($ "%](& %-UO'](( )]( ]( ]( ]( ]( ](~& & & Y
 
D 
 
 
 
 Y) )T ) ) ) ) Y	    k kC kc k k k k 8<$$',!&6  6 |6  eCcN346  	6 
 6  6  !%6  6  
tEL!5tEL7I)I#JJ	K6  6  6  6 t ./$#!& 3S	>*  	
    0%, 5<    
" 
"el 
" 
" 
" 
" 
" 
" %,        rU   c            $       8    e Zd ZdZddddddde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	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   rE   r+      
bottleneckr+   r,   FrK   r.   TNr/   r1   out_indices.feature_locationr3   r4   r5   rL   r9   r?   r>   r:   r;   r<   r=   r@   rA   rB   c                    t          t          |                                            |pt          j        }|pt          j        }|pt          }|| _        d| _        |s |	|          }t          ||dd|          | _
         ||          | _         |d          | _        t          |||	|
|||||||          }t          j         |||           | _        t!          |j        |          | _        d | j                                        D             | _        t+          |            d	| _        |d
k    rD| j                            d          }t/          ||                                           | _        d	S d	S )aJ  
        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.
            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.
        Fr+   rE   rF   TrI   )rL   r9   r?   r>   r:   r;   r<   r=   rA   rB   r   c                 ,    i | ]}|d          |d         S )rN   indexrO   rP   s     rS   
<dictcomp>z0MobileNetV3Features.__init__.<locals>.<dictcomp>a  s"    ]]]!qz1W:]]]rU   Nr   )module	hook_type)keys)rY   r(   rZ   r[   r\   r]   r   r@   r^   r   r_   r`   act1r   ra   rb   r    rc   rd   	get_dicts_stage_out_idxr   feature_hooksr!   named_modules)rp   r1   r   r   r3   r4   r5   rL   r9   r?   r>   r:   r;   r<   r=   r@   rA   rB   rr   hooksrt   s                       rS   rZ   zMobileNetV3Features.__init__  s   N 	!4((11333(	12>
,}""'  	0$Y//I&xAaQYZZZ:i((Id+++	 &'%#!)#9-
 
 
 mWWY
%C%CD'(8+FF]]t?P?Z?Z?\?\]]]!$''' "|++%//5L/MME!-eT5G5G5I5I!J!JD ,+rU   r   c                     || _         d S rv   r   r   s     rS   r   z*MobileNetV3Features.set_grad_checkpointingk  r   rU   r   r   c                 t   |                      |          }|                     |          }|                     |          }| j        g }d| j        v r|                    |           t          | j                  D ]g\  }}| j        r/t          j
                                        st          ||          }n ||          }|dz   | j        v r|                    |           h|S |                     |           | j                            |j                  }t          |                                          S )Nr   r   )r_   r`   r   r   r   r   	enumeraterb   r^   r   r   r   r	   
get_outputdevicelistvalues)rp   r   rc   r   bouts         rS   r   zMobileNetV3Features.forwardo  s!   NN1HHQKKIIaLL%HD'''"""!$+.. ' '1* 593I3I3K3K "1a((AA!Aq5D///OOA&&&OKKNNN$//99C

%%%rU   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rZ   r   r   r   r   r   r   r   r   r   s   @rS   r(   r(     s         ,;$0"!# "%3 $-1.2,0,0!$&6:%MK MK!MK sCxMK "	MK
 MK MK MK MK MK #MK MK  	*MK !+MK y)MK y)MK  !MK" "#MK$ %-UO%MK MK MK MK MK MK^ Y) )T ) ) ) )& &$u|*< & & & & & & & &rU   Fvariant
pretrainedr   c                     d}t           }d }|                    dd          rd|v sd|v rd}nd}t          }d}t          || |f|dk    |dk    |d	|}|dk    rt	          |j                  |_        |S )
Nr.   features_onlyFfeature_cfgfeature_clscfg)r2   r6   	head_convr7   r8   rC   cls)r   pretrained_strictkwargs_filter)r'   popr(   r   r   default_cfg)r   r   kwargsfeatures_mode	model_clsr   models          rS   _create_mnv3r     s    MIMzz/5)) "F""mv&=&=!MMqM+I!M  $u,'50#   E 78IJJLrU         ?channel_multiplierc                 6   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 )Creates a MobileNet-V3 model.

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

    Args:
      channel_multiplier: multiplier to number of channels per layer.
    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)r1   r7   r?   r;   r:   r=   rO   )
r~   r   r   r   r[   r]   r   r   r   r   r   r   r   r   arch_defmodel_kwargsr   s          rS   _gen_mobilenet_v3_rwr    s     
))	!#;<	()NNN	%&	%&	H   "8,,^8JKKK2>EE_V-D-DEE#FL99>BBB   L *====ELrU   depth_multiplierc                 \   d| v rHd}d| v r!t          |d          }dgddgdd	gd
gdgdgg}nlt          |d          }dgddgddgdgdgdgg}nKd}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 ),r   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  
group_sizer,         ?r   )r1   r6   r4   r5   r?   r;   r:   r=   rO   )r   r   r   r[   r\   r   r~   r   r]   r   r   )r   r   r  r  r   r   r6   r:   r   r=   r  r   s               rS   _gen_mobilenet_v3r    s    ')&&99I &&')@A%';<%&%&#$HH *&,??I 11+-HI,.IJ,-,-#$HH )&&99I &&%';<%&VVV&'&'#$HH" *&,??I **)+CD01VVV-.-.#$H  }QSQXftuuuH 
"8>N[efff!#d*^8JKKK2>EE_V-D-DEE
 
 
 
L *====ELrU   c                    |                      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}nC|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 )1z FBNetV3
    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.
    _)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grK   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_c1728ffffff?)r   round_limitr   )r   r  r   i  F)	r1   r6   r7   r4   r?   r>   r;   r:   r=   rO   )splitNotImplementedr   r   r   r   r~   r   r[   r]   r   r   )r   r   r   r   vlr4   r   r?   r=   r:   r  r   s               rS   _gen_fbnetv3r7  +  s    
s		B	B	Z	!"!#78(*EF!#78)+GHfff !
 
s	!"!#78(*EF!#78)+GHfff !
 
s	!"!#78(*EF"$9:)+GHfff !
 >6HVZ[[[L}\ZZZH!&,77I "8,,!2>EE_V-D-DEE   L *====ELrU   c                 H   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
    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:
      channel_multiplier: multiplier to number of channels per layer.
    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-   )r1   r4   r?   r;   r:   r=   r6   rO   )r~   r   r   r   r[   r]   r   r   r   r\   r   r   s          rS   
_gen_lcnetr?  h  s     
			12		#$H  	"8,,^8JKKK2>EE_V-D-DEE#FL99>SUSZ[[[	 	 	 	L *====ELrU   c                    d}d| v r\d}d| v r"d}t          |d          }dgdd	gg d
g ddgg}	nd| v r"d}t          |d          }dgddgg dg ddgg}	nJ d|  d            d}d| v r#d}t          |d          }ddgddgg dg ddgg}	nZd| v r"d}t          |d          }dgdd	gg dg d dgg}	n4d| 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 ))zCreates a MobileNet-V4 model.

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

    Args:
      channel_multiplier: multiplier to number of channels per layer.
    r-   hybridgh㈵>mediumrK   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_c160rH  rJ  uir_r1_a3_k0_s1_e4_c160rJ  rH  rJ  rK  )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_c256rO  uir_r1_a0_k0_s1_e4_c256mqa_r1_k3_h4_s1_d64_c256uir_r1_a3_k0_s1_e4_c256rR  rM  rR  uir_r1_a5_k0_s1_e4_c256rR  rT  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_c512rb  uir_r1_a5_k5_s1_e4_c512mqa_r1_k3_h8_s1_d64_c512ra  re  ra  re  ra  re  ra  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)rF  uir_r2_a3_k3_s1_e4_c160rI  rH  rK  rG  rK  )	rL  rM  rN  rQ  rS  rP  rM  uir_r2_a0_k0_s1_e4_c256uir_r1_a5_k0_s1_e2_c256)rY  rZ  r[  uir_r5_a5_k3_s1_e4_c192r_  )r`  ra  rb  rc  rb  rd  uir_r3_a5_k0_s1_e4_c512)r  Tr   r   )
r1   r7   r8   r6   r4   r5   r?   r;   r:   rB   rO   )	r   r~   r   r   r   r[   r]   r   r   )r   r   r  r   r   r6   rB   r4   r:   r   r  r   s               rS   _gen_mobilenet_v4rx    s    L7!%wI)&&99I )
 -,
    & 'Y/HH` I)&&99I )
 -,
    $ 'W.HH` 87W777777!%gI)&&99I )( )(
     '5HH<   I)&&99I )
 -,
  
 
 
 'C$HHJ I)&&99I )
 -,
  	 	 	 '=!HHF 87W777777 "8
CCC!#c)^8JKKK2>EE_V-D-DEE5   L *====ELrU   r.   urlc                 4    | dddddt           t          ddd
|S )	Nr*   )r+      r{  )   r|  g      ?bilinearr_   ro   )
ry  r2   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_convro   )r
   r   )ry  r   s     rS   _cfgr    s5    4}SYJ%.B!	 
  rU   zmobilenetv3_large_075.untrained)ry  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  ry  	hf_hub_idz)mobilenetv3_large_100.ra4_e3600_r224_in1kr2  )r+      r  )r  r  r  r  r  test_input_sizetest_crop_pctz(mobilenetv3_large_100.miil_in21k_ft_in1kr}  )r/   r/   r/   )r   r   r   z+https://github.com/Alibaba-MIIL/ImageNet21KzarXiv:2104.10972v4zhttps://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_idsry  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+  )ry  r  r  r  r  r  r  r2   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)ry  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)ry  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)ry  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  )ry  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_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_large.e600_r384_in1k)r+     r  )   r  )r+     r  z%mobilenetv4_conv_large.e500_r256_in1kz1mobilenetv4_hybrid_medium.e200_r256_in12k_ft_in1kz+mobilenetv4_hybrid_medium.ix_e550_r256_in1ki-.  )r  r2   r~  r  r  r  r  r  )r~  r  r  r  )   r  )r+      r  )r+     r  )r  r  )z+mobilenetv4_hybrid_medium.ix_e550_r384_in1kz(mobilenetv4_hybrid_medium.e500_r224_in1kz)mobilenetv4_hybrid_medium.e200_r256_in12kz*mobilenetv4_hybrid_large.ix_e600_r384_in1kz'mobilenetv4_hybrid_large.e600_r384_in1kz$mobilenetv4_conv_aa_medium.untrainedz+mobilenetv4_conv_blur_medium.e500_r224_in1kz1mobilenetv4_conv_aa_large.e230_r448_in12k_ft_in1kz1mobilenetv4_conv_aa_large.e230_r384_in12k_ft_in1kz(mobilenetv4_conv_aa_large.e600_r384_in1kz)mobilenetv4_conv_aa_large.e230_r384_in12kz'mobilenetv4_hybrid_medium_075.untrainedz&mobilenetv4_hybrid_large_075.untrainedc                 "    t          dd| i|}|S ) MobileNet V3 mobilenetv3_large_075r  r   )r  r  r  r   r   r   s      rS   r  r  Q  "     ]]
]V\]]ELrU   c                 "    t          dd| i|}|S )r  mobilenetv3_large_100r   r   )r  r   r  r  s      rS   r  r  X  "     \\z\U[\\ELrU   c                 $    t          dd| d|}|S )r  mobilenetv3_large_150d      ?g333333?)r  r   )r  r  r  r  s      rS   r  r  ^  s%     sc^hsslrssELrU   c                 "    t          dd| i|}|S )r  mobilenetv3_small_050      ?r   )r  r  r  r  s      rS   r  r  d  r  rU   c                 "    t          dd| i|}|S )r  mobilenetv3_small_075r  r   )r  r  r  r  s      rS   r  r  k  r  rU   c                 "    t          dd| i|}|S )r  mobilenetv3_small_100r   r   )r  r   r  r  s      rS   r  r  r  r  rU   c                 X    |                     dt                     t          dd| i|}|S )r  bn_epsmobilenetv3_rwr   r   )r  r   )
setdefaultr   r  r  s      rS   r  r  y  s9     h 1222 XX:XQWXXELrU   c                     |                     dt                     |                     dd           t          dd| i|}|S )r  r  r9   sametf_mobilenetv3_large_075r  r   )r  r  r  r   r  r  s      rS   r  r    O     h 1222
j&)))``:`Y_``ELrU   c                     |                     dt                     |                     dd           t          dd| i|}|S )r  r  r9   r  tf_mobilenetv3_large_100r   r   )r  r   r  r  s      rS   r  r    O     h 1222
j&)))__*_X^__ELrU   c                     |                     dt                     |                     dd           t          dd| i|}|S )r  r  r9   r   tf_mobilenetv3_large_minimal_100r   r   )r  r   r  r  s      rS   r  r    P     h 1222
j&)))ggR\g`fggELrU   c                     |                     dt                     |                     dd           t          dd| i|}|S )r  r  r9   r  tf_mobilenetv3_small_075r  r   )r  r  r  r  s      rS   r  r    r  rU   c                     |                     dt                     |                     dd           t          dd| i|}|S )r  r  r9   r  tf_mobilenetv3_small_100r   r   )r  r   r  r  s      rS   r  r    r  rU   c                     |                     dt                     |                     dd           t          dd| i|}|S )r  r  r9   r   tf_mobilenetv3_small_minimal_100r   r   )r  r   r  r  s      rS   r  r    r  rU   c                 "    t          dd| i|}|S )z FBNetV3-B 	fbnetv3_br   )r  r7  r  s      rS   r  r    !     FFFvFFELrU   c                 "    t          dd| i|}|S )z FBNetV3-D 	fbnetv3_dr   )r  r  r  s      rS   r  r    r  rU   c                 "    t          dd| i|}|S )z FBNetV3-G 	fbnetv3_gr   )r  r  r  s      rS   r  r    r  rU   c                 "    t          dd| i|}|S )z PP-LCNet 0.35	lcnet_035ffffff?r   )r  r  r?  r  s      rS   r  r    !     JJZJ6JJELrU   c                 "    t          dd| i|}|S )z PP-LCNet 0.5	lcnet_050r  r   )r  r  r  r  s      rS   r  r    !     IIJI&IIELrU   c                 "    t          dd| i|}|S ) PP-LCNet 1.0	lcnet_075r  r   )r  r  r  r  s      rS   r  r    r  rU   c                 "    t          dd| i|}|S )r  	lcnet_100r   r   )r  r   r  r  s      rS   r  r    r  rU   c                 "    t          dd| i|}|S )z PP-LCNet 1.5	lcnet_150r  r   )r  r  r  r  s      rS   r  r    r  rU   c                 "    t          dd| i|}|S ) MobileNet V4 mobilenetv4_conv_small_035r  r   )r  r  rx  r  s      rS   r  r    "     bbZb[abbELrU   c                 "    t          dd| i|}|S )r  mobilenetv4_conv_small_050r  r   )r  r  r  r  s      rS   r  r    r  rU   c                 "    t          dd| i|}|S )r  mobilenetv4_conv_smallr   r   )r  r   r  r  s      rS   r  r    r  rU   c                 "    t          dd| i|}|S )r  mobilenetv4_conv_mediumr   r   )r  r   r  r  s      rS   r  r    s"     ^^^W]^^ELrU   c                 "    t          dd| i|}|S )r  mobilenetv4_conv_larger   r   )r  r   r  r  s      rS   r  r    r  rU   c                 "    t          dd| i|}|S ) MobileNet V4 Hybrid mobilenetv4_hybrid_mediumr   r   )r  r   r  r  s      rS   r  r    s"     ``:`Y_``ELrU   c                 "    t          dd| i|}|S ) MobileNet V4 Hybridmobilenetv4_hybrid_larger   r   )r  r   r  r  s      rS   r  r    s"     __*_X^__ELrU   c                 $    t          d| dd|}|S ) MobileNet V4 w/ AvgPool AA mobilenetv4_conv_aa_mediumr   r0   r   r<   )r  r   r  r  s      rS   r  r     s%     qJafqqjpqqELrU   c                 $    t          d| dd|}|S )z MobileNet V4 Conv w/ Blur AA mobilenetv4_conv_blur_mediumr   blurpcr  )r  r   r  r  s      rS   r  r  '  s%     vjckvvouvvELrU   c                 $    t          d| dd|}|S )r  mobilenetv4_conv_aa_larger   r0   r  )r  r   r  r  s      rS   r  r  .  s%     p:`eppioppELrU   c                 "    t          dd| i|}|S )r  mobilenetv4_hybrid_medium_075r  r   )r  r  r  r  s      rS   r  r  5  s#     eePZe^deeELrU   c                 "    t          dd| i|}|S )r  mobilenetv4_hybrid_large_075r  r   )r  r  r  r  s      rS   r  r  <  s"     ddzd]cddELrU   )mobilenetv3_large_100_miil mobilenetv3_large_100_miil_in21kr   )r   F)r   r   NF)r   NF)r.   )fr   	functoolsr   typingr   r   r   r   r   r   torch.nnr[   torch.nn.functional
functionalr   torch.utils.checkpointr	   	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#   	_registryr$   r%   r&   __all__r   r'   r(   r   r   r   r   r  r  r7  r?  rx  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   rO   rU   rS   <module>r     s          9 9 9 9 9 9 9 9 9 9 9 9 9 9                 - - - - - - r r r r r r r r r r r r k k k k k k k k k k k k k k k k G G G G G G G G / / / / / /J J J J J J J J J J J J J J J J J J J J F F F F F F F F F F ' ' ' ' ' ' Y Y Y Y Y Y Y Y Y Y/
0t t t t t") t t tnm& m& m& m& m&") m& m& m&` # 4 k    6 KP% %%*/%CG%% % % %R RU,1a aa*/aINa%)a a a a aH: :# :5 :D : : : :z# # # #$ # # # #N \av vv*/vTXvv v v vr c     %$ }&%tt|||}&#TT E& & &}& 0&=CY}C2I 2I 2I}& / |@& O1 1 1}&  ' M@& |SX)Z )Z )Z!}&, 1$$$*@ 46S`ps3u 3u 3u-}&6 &tt H(! (! (!7}&> &tt H(! (! (!?}&F &tt G(! (! (!G}&P {!! !! !!Q}&Z $TT E$*@&B &B &B[}&b $TT E$*@&B &B &Bc}&j ,TT M$*@.B .B .Bk}&r $TT E$*@&B &B &Bs}&z $TT F$*@&B &B &B{}&B ,TT M$*@.B .B .BC}&L $$y%6 6 6M}& }&T $$y%6 6 6U}&\ $$y -$Z`b b b]}&f 4466g}&h $$u  i}&r $$u  s}&| $$u  }}&F 4466G}&J +DD$*@%T-T -T -TK}&P 1$$$*@%T3T 3T 3TQ}&X -dd%T/T /T /TY}&^ -dd%T/T /T /T_}&d -dd F}CW`/b /b /be}&l -dd}CW`/b /b /bm}&r ,TT H}CW`.b .b .bs}&z ,TT F}CW`.b .b .b{}&D 8 F}CW`:b :b :bE}&L 244 F}CW`4b 4b 4bM}& }&T 484 H}CW`4b 4b 4b 15}CW`1b 1b 1b 26 F}CW`	2b 2b 2b
 37$ H}CW`3b 3b 3b 04t H}CW`0b 0b 0b -1D FTQZ-\ -\ -\ 484}CW`4b 4b 4b :> H}CW`:b :b :b :> H}CW`:b :b :b 15 H}CW`1b 1b 1b 26 H}CW`	2b 2b 2b
 04tY00 00 00 /3d FTQZ/\ /\ /\u}& }& }& } }@  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' '     rU   