
    RЦi]                        S r SSKJrJr  SSKrSSKrSSKrSSKJr  SSK	J
r
  SSKJrJrJr  SSKJr  SSKJrJrJrJrJrJr  SS	K7  SS
KJr  / SQr\R6                  " \5      rSrSrSr \!" \\ S9r"\\\\#\4         r$S r%S r&SS jr'SS jr(S r)S r*S r+S S jr,     S!S jr- " S S5      r.S"S jr/S#S\R`                  4S jjr1g)$zEfficientNet, MobileNetV3, etc Builder

Assembles EfficieNet and related network feature blocks from string definitions.
Handles stride, dilation calculations, and selects feature extraction points.

Hacked together by / Copyright 2019, Ross Wightman
    )CallableOptionalN)deepcopy)partial)AnyDictList)
CondConv2dget_condconv_initializerget_act_layerget_attnmake_divisible	LayerType   )*)named_modules)	EfficientNetBuilder	BlockArgsdecode_arch_defefficientnet_init_weightsresolve_bn_argsresolve_act_layerround_channelsBN_MOMENTUM_TF_DEFAULTBN_EPS_TF_DEFAULTFgGz?gMbP?)momentumepsc                  *    [         R                  5       $ N)_BN_ARGS_TFcopy     `/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/_efficientnet_builder.pyget_bn_args_tfr%   +   s    r#   c                 n    0 nU R                  SS 5      nUb  X!S'   U R                  SS 5      nUb  X1S'   U$ )Nbn_momentumr   bn_epsr   )pop)kwargsbn_argsr'   r(   s       r$   r   r   /   sG    G**]D1K)
ZZ$'FNr#   c                 8    [        U R                  SU5      5      $ )N	act_layer)r   r)   )r*   defaults     r$   r   r   :   s    K9::r#   c                 .    U(       d  U $ [        X-  X#US9$ )z2Round number of filters based on depth multiplier.)round_limit)r   )channels
multiplierdivisorchannel_minr0   s        r$   r   r   >   s    (/S^__r#   c                 >    U(       a  [         R                  U 5        g g r   )_loggerinfo)msg	conditions     r$   _log_info_ifr:   E   s    S r#   c                     U R                  5       (       a  [        U 5      $ U R                  S5       Vs/ s H  n[        U5      PM     sn$ s  snf )N.)isdigitintsplit)ssks     r$   _parse_ksizerB   J   s:    	zz||2w ".1A...s   Ac                 	   [        U [        5      (       d   eU R                  S5      nUS   nUSS n0 nSnU H  nUS:X  a  SnM  US:X  a  SnM  UR                  S	5      (       al  US   nUSS nUS
:X  a  [	        S5      nOJUS:X  a  [	        S5      nO8US:X  a  [	        S5      nO&US:X  a  [	        S5      nOUS:X  a  [	        S5      nOM  XU'   M  [
        R                  " SU5      n	[        U	5      S:  d  M  U	SS u  phXU'   M     S	U;   a  US	   OSn
SU;   a  [        US   5      OSnSU;   a  [        US   5      OSnSU;   a  [        US   5      OSn[        US   5      n[        U[        US   5      [        US   5      U
S9nUS:X  a  UR                  [        [        US   5      UU[        US   5      [        UR                  S S!5      5      USL [        UR                  S"S5      5      S:  S#95        S$U;   a  [        US$   5      US%'   GO[US&:X  d  US':X  aq  UR                  [        [        US   5      U[        UR                  S S!5      5      US':H  US':H  =(       d    USL [        UR                  S"S5      5      S:  S(95        GOUS):X  aR  UR                  [        [        US   5      U[        US   5      U[        UR                  S S!5      5      USL S*95        GOUS+:X  a)  UR                  [        [        US   5      USL S,95        GOWUS-:X  a}  SU;   a  [        US   5      OSnSU;   a  [        US   5      OSnUR                  [        U[        US   5      U[        US   5      [        UR                  S S!5      5      USL S.95        OUS/:X  a_  [        US"   5      nUR                  [        [        US   5      [        US0   5      UU[        UR                  S1S5      5      USL S295        OoUS3:X  a_  [        US"   5      nUR                  [        [        US   5      [        US0   5      UU[        UR                  S1S5      5      USL S295        O
 S4U-  5       eS5U;   a  [        US5   5      US6'   X4$ )7a  Decode block definition string

Gets a list of block arg (dicts) through a string notation of arguments.
E.g. ir_r2_k3_s2_e1_i32_o16_se0.25_noskip

All args can exist in any order with the exception of the leading string which
is assumed to indicate the block type.

leading string - block type (
  ir = InvertedResidual, ds = DepthwiseSep, dsa = DeptwhiseSep with pw act, cn = ConvBnAct)
r - number of repeat blocks,
k - kernel size,
s - strides (1-9),
e - expansion ratio,
c - output channels,
se - squeeze/excitation ratio
n - activation fn ('re', 'r6', 'hs', or 'sw')
Args:
    block_str: a string representation of block arguments.
Returns:
    A list of block args (dicts)
Raises:
    ValueError: if the string def not properly specified (TODO)
_r   r   NnoskipFskipTnrerelur6relu6hs
hard_swishswswishmimishz(\d.*)   apfcrcs)
block_typeout_chsstrider-   irrA   ese        d)dw_kernel_sizeexp_kernel_sizepw_kernel_size	exp_ratiose_ratiorE   s2dccnum_expertsdsdsa)ra   rc   re   pw_actrE   rf   er)rb   rc   rd   force_in_chsre   rE   cn)kernel_sizerF   uir)dw_kernel_size_startdw_kernel_size_middw_kernel_size_endrd   re   rE   mhahv)ra   	num_headskey_dim	value_dim	kv_striderE   mqazUnknown block type (%s)gs
group_size)
isinstancestrr?   
startswithr   rH   lenrB   r>   dictupdatefloatget)	block_stropsrY   optionsrF   opkeyrv   valuesplitsr-   start_kernel_sizeend_kernel_sizerm   
num_repeat
block_argskv_dims                    r$   _decode_block_strr   Q   s   2 i%%%%
//#
CQJ
ab'CGD>D6\D]]3Q%C12ADy%f-d%g.d%l3d%g.d%f- CL XXi,F6{a#BQZ
$9 > !$wDI69WnWS\2!477Nl73<0O)-3wt}%aLWS\"J GCL!73< 	J T$'5-*GCL)7;;tR015=GKKQ'(1,
 	 7?(+GDM(:J}%	t	zU2$'5*7;;tR01&&7$%-GKKQ'(1,
 	 
t	$(6*GCL)%7;;tR015=
 	 
t	$GCL)
 	 
u	:=.L6a8;w,ws|4A$!2+GCL9.GCL)7;;tR015=
 	 
u	WS\"$'5'#,''++c1-.5=
 	 
u	WS\"$'5'#,''++c1-.5=
 	 	=/*<<uw#&wt}#5
< !!r#   c           	         [        U5      nUS:X  a  [        S[        XB-  5      5      nO![        [        R
                  " XB-  5      5      n/ nUSSS2    H6  n[        S[        Xt-  U-  5      5      nUR                  U5        XG-  nXX-  nM8     USSS2   n/ n	[        X5       H9  u  pU	R                  [        U5       Vs/ s H  n[        U
5      PM     sn5        M;     U	$ s  snf )a  Per-stage depth scaling
Scales the block repeats in each stage. This depth scaling impl maintains
compatibility with the EfficientNet scaling method, while allowing sensible
scaling for other models that may have multiple block arg definitions in each stage.
roundr   N)summaxr   r>   mathceilappendzipextendranger   )
stack_argsrepeatsdepth_multiplierdepth_truncr   num_repeat_scaledrepeats_scaledrV   rs	sa_scaledbareprD   s                r$   _scale_stage_depthr      s     WJg  5)F#GH  		**G HI
 NTrT]E1>,==?@b!
	 
 $DbD)N Iz2c
;
1(2,
;< 3 <s   C#
c           	         / n[        U[        5      (       a  [        U5      [        U 5      :X  d   eOU4[        U 5      -  n[        [	        X5      5       GH	  u  nu  p[        U[
        5      (       d   e/ n
/ nU H  n[        U[        5      (       d   e[        U5      u  pUR                  SS5      S:  a  US:  a  US==   U-  ss'   Ub  UR                  SU5        U
R                  U5        UR                  U5        M     U(       a6  US:X  d  U[        U 5      S-
  :X  a  UR                  [        XSU5      5        M  UR                  [        XX5      5        GM     U$ )a  Decode block architecture definition strings -> block kwargs

Args:
    arch_def: architecture definition strings, list of list of strings
    depth_multiplier: network depth multiplier
    depth_trunc: networ depth truncation mode when applying multiplier
    experts_multiplier: CondConv experts multiplier
    fix_first_last: fix first and last block depths when multiplier is applied
    group_size: group size override for all blocks that weren't explicitly set in arch string

Returns:
    list of list of block kwargs
rh   r   r   r}         ?)r~   tupler   	enumerater   listr   r   r   
setdefaultr   r   )arch_defr   r   experts_multiplierfix_first_lastr}   	arch_args	stack_idxblock_stringsr2   r   r   r   r   r   s                  r$   r   r     sO   * I"E**#$H555,.X>2;C<[2\.	.M-....
&Ii----'	2GBvvmQ'!+0BQ0F=!%77!%lJ7b!NN3 ' yA~c(ma>O1O/
S+VW/
Z]^! 3]" r#   c                       \ rS rSrSrSS\SSSSSSSSSS4S\S	\S
\S\	S\
\   S\
\   S\
\   S\
\   S\S\
\   S\4S jjrS rS rSrg)r   i<  a  Build Trunk Blocks

This ended up being somewhat of a cross between
https://github.com/tensorflow/tpu/blob/master/models/official/mnasnet/mnasnet_models.py
and
https://github.com/facebookresearch/maskrcnn-benchmark/blob/master/maskrcnn_benchmark/modeling/backbone/fbnet_builder.py

     FNr_   output_stridepad_typeround_chs_fnse_from_expr-   
norm_layeraa_layerse_layerdrop_path_ratelayer_scale_init_valuefeature_locationc                    Xl         X l        X0l        X@l        XPl        X`l        Xpl        [        U5      U l         U R                  SSS9  SU l	        Xl        Xl        US:X  a  [        R                  S5        SnXl        US	;   d   eXS
.U l        ["        U l        S U l        / U l        g ! [         a
    SU l	         Nmf = f)N   r   rd_ratioTF	depthwisez>feature_location=='depthwise' is deprecated, using 'expansion'	expansion)
bottleneckr   r   )devicedtype)r   r   r   r   r-   r   r   r   r   se_has_ratio	TypeErrorr   r   r6   warningr   dd_DEBUG_BUILDERverbosein_chsfeatures)selfr   r   r   r   r-   r   r   r   r   r   r   r   r   s                 r$   __init__EfficientNetBuilder.__init__E  s      + (&"$  *	&MM!cM* $D -&<#{*OO\]* 0#BBBB#4%   	& %D	&s   B- -C Cc                    U R                   U-  U-  nUR                  S5      nU R                  US'   U R                  US   5      US'   UR	                  SS5      nUS:  a  US==   S-  ss'   SU;   a!  US   (       a  U R                  US   5      US'   U R
                  US'   US	   b  US	   OU R                  US	'   US	   c   eU R                  US
'   XAS'   U R                  b  U R                  US'   UR                  SS 5      nU(       au  U R                  bh  U R                  (       d  XqR	                  SS5      -  nUS:X  a  US-  nU R                  (       a  [        U R                  US9US'   OU R                  US'   UR                  U R                  5        US:X  a^  [        SR!                  U[#        U5      5      U R$                  5        UR	                  SS5      (       a  ['        S'0 UD6O
[)        S'0 UD6nGOUS:X  d  US:X  a<  [        SR!                  U[#        U5      5      U R$                  5        [+        S'0 UD6nGO{US:X  a<  [        SR!                  U[#        U5      5      U R$                  5        [-        S'0 UD6nGO9US:X  a;  [        SR!                  U[#        U5      5      U R$                  5        [/        S'0 UD6nOUS:X  aI  [        SR!                  U[#        U5      5      U R$                  5        [1        S'0 UDSU R2                  0D6nOUS :X  aJ  [        S!R!                  U[#        U5      5      U R$                  5        [5        S'0 UDS"U R2                  S#.D6nOYUS$:X  aI  [        S%R!                  U[#        U5      5      U R$                  5        [5        S'0 UDSU R2                  0D6nO
 S&U-  5       eUS   U l        U$ )(NrY   r   rZ   rf   r      rm   r   r-   r   r   r   re   rd   r   r   r   r   r\   z  InvertedResidual {}, Args: {}rh   ri   rj   z!  DepthwiseSeparable {}, Args: {}rl   z  EdgeResidual {}, Args: {}rn   z  ConvBnAct {}, Args: {}rp   z(  UniversalInvertedResidual {}, Args: {}r   r{   z(  MobileMultiQueryAttention {}, Args: {}T)use_multi_queryr   rt   z'  MobileMultiHeadAttention {}, Args: {}z-Unknown block type (%s) while building model.r"   )r   r)   r   r   r   r   r-   r   r   r   r   r   r   r   r   r:   formatr   r   CondConvResidualInvertedResidualDepthwiseSeparableConvEdgeResidual	ConvBnActUniversalInvertedResidualr   MobileAttention)	r   r   	block_idxblock_countr   btrf   re   blocks	            r$   _make_blockEfficientNetBuilder._make_blockq  sr   ,,y8;FVVL!{{8))"Y-89ffUA7yMQMRB~$6!%!2!22n3E!FB~:-/_-H"[/dnn;+***??<-==$!]]BzN66*d+1##FF;44axA  !(!J:!%:
		$''::AA)SQSWUW[WcWcd.0ff]A.F.F$*r*L\Lb_aLbE4Z2;<CCIsSUwWY]YeYef*0R0E4Z6==iRQSWS_S_` &2&E4Z3::9c"gNPTP\P\]OOE5[CJJ9VYZ\V]^`d`l`lm-gg4KfKfgE5[CJJ9VYZ\V]^`d`l`lm#sbs$W[WrWrsE5[BII)UXY[U\]_c_k_kl#]b]A\A\]ENIBNN5mr#   c           	      x   [        S[        U5      -  U R                  5        Xl        [	        U Vs/ s H  n[        U5      PM     sn5      nSnSnSn/ nUS   S   S   S:  a'  [        SUSUS9n	U R                  R                  U	5        Sn
[        U5       GH  u  pUS-   [        U5      :H  n[        SR                  U5      U R                  5        [        U[        5      (       d   e/ n[        U5       GH  u  nnUS-   [        U5      :H  n[        S	R                  U5      U R                  5        US   S
;   d   eUS:  a  SUS'   U
(       d$  UR                  SS5      (       a  US   S:X  d   eSn
U
S:  a)  U
S:X  a  US   S:X  a  SUS'   US==   S-  ss'   Sn
OU
US'   SnU(       a(  US-   nU[        U5      :  =(       d    UU   S   S   S:  nUnUS   S:  aW  UUS   -  nUU R                  :  a=  UUS   -  nSUS'   [        SR                  U R                  5      U R                  5        OUnUUS'   UU:w  a  UnU R                  UXT5      nUR                  U5        U
S:X  a  Sn
U(       a  [        SUS-   US.UR                  U R                   5      D6n	U	R#                  SS5      nU(       a  SR%                  SU SU 3U/5      U	S'   OU(       d   eSU 3U	S'   U R                  R                  U	5        US-  nGM     UR                  [&        R(                  " U6 5        GM     U$ s  snf )a   Build the blocks
Args:
    in_chs: Number of input-channels passed to first block
    model_block_args: A list of lists, outer list defines stages, inner
        list contains strings defining block configuration(s)
Return:
     List of block stacks (each stack wrapped in nn.Sequential)
z&Building model trunk with %d stages...r   rR   r   r[   bn1)modulenum_chsstage	reductionz	Stack: {}z
 Block: {})r   rR   rf   Frd   r   z=  Converting stride to dilation to maintain output_stride=={}dilation)r   r   r   r   r<   zblocks.r"   )r:   r   r   r   r   r   r   r   r   r   r~   r   r)   r   r   feature_infor   r   joinnn
Sequential)r   r   model_block_argsxtotal_block_counttotal_block_idxcurrent_stridecurrent_dilationstagesr   space2depthr   r   
last_stackblocksr   r   
last_blockextract_featuresnext_stack_idxnext_dilationnext_output_strider   	leaf_names                           r$   __call__EfficientNetBuilder.__call__  s    	=DT@UUW[WcWcd1A B1AAQ1A BCAq!(+a/ufAQ_`LMM  . %./?%@!I"Q#.>*??J++I6Ej$////F)2:)>%	:&]c*o=
\00;T\\J!(+v555>+,Jx("z~~eU'C'C%h/1444"#K?"a'Jx,@A,E/0
8,";/14/&',7
5)#( %.]N'5=M9N'N (J(8;HEI % !1h'!+)7*X:N)N&)D,>,>>(8:h;O(O/0
8,$%d%k%k ..&015? *<)9
:& $44'4$ ((_Xe$!#"#K $#' $'!m"0$  ,,T-B-BC$L
 !- 0 02 >I 14WYKqQZP[;\^g:h1iX.))z3:9+1FX.MM((61$A *?B MM"--01Q &AR k !Cs   L7)r   r-   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname____firstlineno____doc__r   r>   r   r   boolr   r   r   r   r   r  __static_attributes__r"   r#   r$   r   r   <  s     "$%3 %-1.2,0,0$&6:$&** * #	*
 *  	** !+* y)* y)* "* %-UO* "*X>@`r#   r   c                   ^ [        U [        5      (       a  U R                  S   U R                  S   -  U R                  -  mU(       a  TU R                  -  m[        U4S jU R                  U R                  5      nU" U R                  5        U R                  b*  [        R                  R                  U R                  5        gg[        U [        R                  5      (       a  U R                  S   U R                  S   -  U R                  -  mU(       a  TU R                  -  m[        R                  R                  U R                  S[        R                   " ST-  5      5        U R                  b*  [        R                  R                  U R                  5        gg[        U [        R"                  5      (       aS  [        R                  R%                  U R                  5        [        R                  R                  U R                  5        g[        U [        R&                  5      (       a  U R                  R)                  S5      mSnSU;   a  U R                  R)                  S5      nS[        R                   " UT-   5      -  n[        R                  R+                  U R                  U* U5        [        R                  R                  U R                  5        gg)a  Weight initialization as per Tensorflow official implementations.

Args:
    m (nn.Module): module to init
    n (str): module name
    fix_group_fanout (bool): enable correct (matching Tensorflow TPU impl) fanout calculation w/ group convs

Handles layers in EfficientNet, EfficientNet-CondConv, MixNet, MnasNet, MobileNetV3, etc:
* https://github.com/tensorflow/tpu/blob/master/models/official/mnasnet/mnasnet_model.py
* https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/efficientnet_model.py
r   r   c                 t   > [         R                  R                  U S[        R                  " ST-  5      5      $ )Nr          @)r   initnormal_r   sqrt)wfan_outs    r$   <lambda>#_init_weight_goog.<locals>.<lambda>%  s#    bggooaDIIcGm,DEr#   Nr  
routing_fnr   )r~   r
   ro   out_channelsgroupsr   rh   weight_shapeweightbiasr   r  zeros_Conv2dr  r   r  BatchNorm2dones_Linearsizeuniform_)mrG   fix_group_fanoutinit_weight_fnfan_in
init_ranger  s         @r$   _init_weight_googr'    s    !Z  --"Q]]1%55F G1Eq}}VWVdVdfqxx 66GGNN166" 	Aryy	!	!--"Q]]1%55F G
!TYYsW}%=>66GGNN166" 	Ar~~	&	&
ahh
qvv	Aryy	!	!((--"1XX]]1%F499Vg%566

J;
;
qvv 
"r#   modelc                     U=(       d    [         nU R                  5        H  u  p#U" X25        M     [        U 5       H(  u  p#[        US5      (       d  M  UR                  5         M*     g )Ninit_weights)r'  r   hasattrr*  )r(  init_fnrG   r"  s       r$   r   r   =  sS    **G##% & e$1n%%NN %r#   )rI   )r   r   Ng?)r   r   )r   r   r   FN)r   Tr   )2r  typingr   r   loggingr   rH   r!   r   	functoolsr   r   r   r	   torch.nnr   timm.layersr
   r   r   r   r   r   _efficientnet_blocks_manipulater   __all__	getLoggerr  r6   r   r   r   r   r    r   r   r%   r   r   r   r:   rB   r   r   r   r   r'  Moduler   r"   r#   r$   <module>r7     s    &   	   " "  p p # &t 

H
%  "  28IJd38n%&	;`
/T"n#P +\U Up&RRYY r#   