
    Ng]                        d Z ddlmZmZ ddlZddlZddlZddlmZ ddl	m
Z
 ddlmZmZmZ ddlmZ ddlmZmZmZmZmZmZ dd	lT dd
lmZ g dZ ej        e          ZdZdZdZ  e!ee           Z"eeee#ef                           Z$d Z%d Z&d%dZ'd&dZ(d Z)d Z*d Z+d'dZ,	 	 	 	 	 d(dZ- G d d          Z.d)d"Z/d*d#ej0        fd$Z1dS )+z EfficientNet, 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                  4    t                                           S N)_BN_ARGS_TFcopy     ]/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/_efficientnet_builder.pyget_bn_args_tfr&   +   s    r$   c                 ~    i }|                      dd           }|||d<   |                      dd           }|||d<   |S )Nbn_momentumr   bn_epsr   )pop)kwargsbn_argsr(   r)   s       r%   r   r   /   sQ    G**]D11K)
ZZ$''FNr$   reluc                 H    t          |                     d|                    S )N	act_layer)r   r*   )r+   defaults     r%   r   r   :   s    K99:::r$         ?   ?c                 6    |s| S t          | |z  |||          S )z2Round number of filters based on depth multiplier.)round_limit)r   )channels
multiplierdivisorchannel_minr5   s        r%   r   r   >   s,     (Z/+S^____r$   c                 B    |rt                               |            d S d S r    )_loggerinfo)msg	conditions     r%   _log_info_ifr?   E   s,     S r$   c                     |                                  rt          |           S d |                     d          D             S )Nc                 ,    g | ]}t          |          S r#   )int).0ks     r%   
<listcomp>z _parse_ksize.<locals>.<listcomp>N   s    ...1A...r$   .)isdigitrB   split)sss    r%   _parse_ksizerJ   J   s;    	zz|| /2ww......r$   c                    t          | t                    sJ |                     d          }|d         }|dd         }i }d}|D ]}|dk    rd}|dk    rd}|                    d	          r|d         }|dd         }|d
k    rt	          d          }nY|dk    rt	          d          }nC|dk    rt	          d          }n-|dk    rt	          d          }n|dk    rt	          d          }n|||<   t          j        d|          }	t          |	          dk    r|	dd         \  }}|||<   d	|v r|d	         nd}
d|v rt          |d                   nd}d|v rt          |d                   nd}d|v rt          |d                   nd}t          |d                   }t          |t          |d                   t          |d                   |
          }|dk    r|
                    t          t          |d                   ||t          |d                   t          |                    d d!                    |du t          |                    d"d                    dk    #                     d$|v rt          |d$                   |d%<   n+|d&k    s|d'k    r|
                    t          t          |d                   |t          |                    d d!                    |d'k    |d'k    p|du t          |                    d"d                    dk    (                     n|d)k    rs|
                    t          t          |d                   |t          |d                   |t          |                    d d!                    |du *                     n|d+k    r;|
                    t          t          |d                   |du ,                     n|d-k    rd|v rt          |d                   nd}d|v rt          |d                   nd}|
                    t          |t          |d                   |t          |d                   t          |                    d d!                    |du .                     n'|d/k    rt          |d"                   }|
                    t          t          |d                   t          |d0                   ||t          |                    d1d                    |du 2                     n|d3k    rt          |d"                   }|
                    t          t          |d                   t          |d0                   ||t          |                    d1d                    |du 2                     nJ d4|z              d5|v rt          |d5                   |d6<   ||fS )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rer-   r6relu6hs
hard_swishswswishmimishz(\d.*)   apfcrcs)
block_typeout_chsstrider/   irrD   ese        d)dw_kernel_sizeexp_kernel_sizepw_kernel_size	exp_ratiose_ratiorM   s2dccnum_expertsdsdsa)rh   rj   rl   pw_actrM   rm   er)ri   rj   rk   force_in_chsrl   rM   cn)kernel_sizerN   uir)dw_kernel_size_startdw_kernel_size_middw_kernel_size_endrk   rl   rM   mhahv)rh   	num_headskey_dim	value_dim	kv_striderM   mqazUnknown block type (%s)gs
group_size)
isinstancestrrH   
startswithr   rP   lenrJ   rB   dictupdatefloatget)	block_stropsr`   optionsrN   opkeyr}   valuesplitsr/   start_kernel_sizeend_kernel_sizert   
num_repeat
block_argskv_dims                    r%   _decode_block_strr   Q   sq   2 i%%%%%
//#

CQJ
abb'CGD % %>>DD6\\DD]]3 	%Q%C122ADyy%f--d%g..d%l33d%g..d%f-- GCLL Xi,,F6{{a#BQBZ
U$ !$wDI69WnnWS\222!477NNl73<000O)-3wt}%%%aLWS\""J GCL!!73<  	  J T$'55-*GCL))7;;tR00115=GKKQ''((1,
 
 
 	 	 	 7??(+GDM(:(:J}%	t		zU22$'55*7;;tR0011&&7$%-GKKQ''((1,
 
 
 	 	 	 	 
t		$(66*GCL))%7;;tR00115=
 
 
 	 	 	 	 
t		$GCL))
 
 
 	 	 	 	 
u		:=..L666a8;w,ws|444A$!2+GCL99.GCL))7;;tR00115=
 
 
 	 	 	 	 
u		WS\""$'55'#,'''++c1--..5=
 
 
 	 	 	 	 
u		WS\""$'55'#,'''++c1--..5=
 
 
 	 	 	 	 	=/*<<<<w#&wt}#5#5
< z!!r$   ceilc                    t          |          }|dk    r!t          dt          ||z                      }n$t          t	          j        ||z                      }g }|ddd         D ]D}t          dt          ||z  |z                      }|                    |           ||z  }||z  }E|ddd         }g }	t          | |          D ]3\  }
|	                    fdt          |
          D                        4|	S )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   Nc                 .    g | ]}t                    S r#   r   )rC   rL   bas     r%   rE   z&_scale_stage_depth.<locals>.<listcomp>
  s    ;;;1(2,,;;;r$   )
summaxr   rB   mathr   appendzipextendrange)
stack_argsrepeatsdepth_multiplierdepth_truncr   num_repeat_scaledrepeats_scaledr]   rs	sa_scaledrepr   s              @r%   _scale_stage_depthr      s6    WJg  56F)F#G#GHH  	*7G*G H HII
 NTTrT]    E1z>,==??@@b!!!a
R#DDbD)N Iz>22 = =C;;;;c

;;;<<<<r$   c           	      :   g }t          |t                    r#t          |          t          |           k    sJ n|ft          |           z  }t          t	          | |                    D ].\  }\  }}	t          |t
                    sJ g }
g }|D ]}t          |t                    sJ t          |          \  }}|                    dd          dk    r|dk    r|dxx         |z  cc<   ||	                    d|           |

                    |           |
                    |           |rC|dk    s|t          |           dz
  k    r'|
                    t          |
|d|                     	|
                    t          |
||	|                     0|S )a6   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
    ro   r   r   Nr   r1   )r   tupler   	enumerater   listr   r   r   
setdefaultr   r   )arch_defr   r   experts_multiplierfix_first_lastr   	arch_args	stack_idxblock_stringsr7   r   r   r   r   r   s                  r%   r   r     s   * I"E** ?#$$H55555,.X>2;CJZ<[<[2\2\ _ _.	.M:-.....
& 	  	 Ii-----'	22GBvvmQ''!++0BQ0F0F=!!!%77!!!%lJ777b!!!NN3 	_yA~~c(mma>O1O1O/
GS+VVWWWW/
GZQ\]]^^^^r$   c                       e Zd ZdZddeddddddddfdeded	ed
ede	e
         de	e
         de	e
         de	e
         dede	e         defdZd Zd ZdS )r   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

         FNrf   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                    || _         || _        || _        || _        || _        || _        || _        t          |          | _        	 |                     dd           d| _	        n# t          $ r
 d| _	        Y nw xY w|	| _        |
| _        |dk    rt                              d           d}|| _        |d	v sJ t           | _        d | _        g | _        d S )
Nr2   r1   rd_ratioTF	depthwisez>feature_location=='depthwise' is deprecated, using 'expansion'	expansion)
bottleneckr   r   )r   r   r   r   r/   r   r   r   r   se_has_ratio	TypeErrorr   r   r;   warningr   _DEBUG_BUILDERverbosein_chsfeatures)selfr   r   r   r   r/   r   r   r   r   r   r   s               r%   __init__zEfficientNetBuilder.__init__E  s     + (&"$  **	&MM!cM*** $D 	& 	& 	& %D	&,&<#{**OO\]]]* 0#BBBBB% s   A& &A:9A:c                    | j         |z  |z  }|                    d          }| j        |d<   |                     |d                   |d<   |                    dd          }|dk    r|dxx         dz  cc<   d|v r&|d         r|                     |d                   |d<   | j        |d<   |d	         |d	         n| j        |d	<   |d	         J | j        |d
<   ||d<   | j        
| j        |d<   |                    dd           }|r]| j	        V| j
        s||                    dd          z  }|dk    r|dz  }| j        rt          | j	        |          |d<   n
| j	        |d<   |dk    rft          d                    |t          |                    | j                   |                    dd          rt#          d(i |nt%          d(i |}n|dk    s|dk    rDt          d                    |t          |                    | j                   t'          d(i |}n|dk    rDt          d                    |t          |                    | j                   t)          d(i |}nN|dk    rDt          d                    |t          |                    | j                   t+          d(i |}n|dk    rLt          d                    |t          |                    | j                   t-          d(i |d| j        i}n|d k    rMt          d!                    |t          |                    | j                   t1          d(i |d"| j        d#}n_|d$k    rLt          d%                    |t          |                    | j                   t1          d(i |d| j        i}nJ d'|z              |d         | _        |S ))Nr`   r   ra   rm   r      rt   r   r/   r   r   r   rl   rk   r1   r   r   r   rc   z  InvertedResidual {}, Args: {}ro   rp   rq   z!  DepthwiseSeparable {}, Args: {}rs   z  EdgeResidual {}, Args: {}ru   z  ConvBnAct {}, Args: {}rw   z(  UniversalInvertedResidual {}, Args: {}r   r   z(  MobileMultiQueryAttention {}, Args: {}T)use_multi_queryr   r{   z'  MobileMultiHeadAttention {}, Args: {}Fz-Unknown block type (%s) while building model.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   btrm   rl   blocks	            r%   _make_blockzEfficientNetBuilder._make_blockn  s"   ,y8;FVVL!!{8))"Y-889ffUA77yMMMQMMMRB~$6!%!2!22n3E!F!FB~:-/_-H"[//dn;+***?<-=$!]BzN66*d++ 
	/1# 5BFF;444axxA  /!(!J!J!J:!%::::AA)SQSWWUUW[Wcddd.0ff]A.F.Fb$**r***L\LbLb_aLbLbEE4ZZ2;;<CCIsSUwwWWY]Yefff*00R00EE4ZZ6==iRQQSWS_``` &&2&&EE4ZZ3::9c"ggNNPTP\]]]OOOOEE5[[CJJ9VYZ\V]V]^^`d`lmmm-gggg4KfgggEE5[[CJJ9VYZ\V]V]^^`d`lmmm#ssbs$W[WrssssEE5[[BII)UXY[U\U\]]_c_klll#]]b]]A\]]]EENIBNNNNmr$   c           	         t          dt          |          z  | j                   || _        t	          d |D                       }d}d}d}g }|d         d         d         dk    r-t          d|d|          }| j                            |           d}	t          |          D ]\  }
}|
dz   t          |          k    }t          d		                    |
          | j                   t          |t                    sJ g }t          |          D ]!\  }}|dz   t          |          k    }t          d
	                    |          | j                   |d         dv sJ |dk    rd|d<   |	s&|                    dd          r|d         dk    sJ d}	|	dk    r/|	dk    r$|d         dk    rd|d<   |dxx         dz  cc<   d}	n|	|d<   d}|r0|
dz   }|t          |          k    p||         d         d         dk    }|}|d         dk    rV||d         z  }|| j        k    r>||d         z  }d|d<   t          d	                    | j                  | j                   n|}||d<   ||k    r|}|                     |||          }|                    |           |	dk    rd}	|rt          d|
dz   |d|                    | j                  }|                    dd          }|r!d                    d|
 d| |g          |d<   n|sJ d|
 |d<   | j                            |           |dz  }#|                    t'          j        |            |S )aY   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...c                 ,    g | ]}t          |          S r#   )r   )rC   xs     r%   rE   z0EfficientNetBuilder.__call__.<locals>.<listcomp>  s     B B BAQ B B Br$   r   rY   r   rb   bn1)modulenum_chsstage	reductionz	Stack: {}z
 Block: {})r   rY   rm   Frk   r   z=  Converting stride to dilation to maintain output_stride=={}dilation)r   r   r   r   rF   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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__zEfficientNetBuilder.__call__  sT    	=DT@U@UUW[Wcddd B B1A B B BCCAq!(+a//ufAQ_```LM  ... %./?%@%@ H	2 H	2!Iz"Q#.>*?*??J++I66EEEj$/////F)2:)>)> @% @%%	:&]c*oo=
\00;;T\JJJ!(+v5555>>+,Jx(" $z~~eU'C'C $%h/14444"#K??"a''Jx,@A,E,E/0
8,";///14///&',7
5)#(  J%.]N'5=M9N9N'N (J(8;HEI % !1h'!++)7*X:N)N&)D,>>>(8:h;O(O/0
8,$%d%k%k .&0 &015? ? ? ? *<)9
:& $444'4$ ((_FWXXe$$$!##"#K $ 7#' $'!m"0$ $  ,,T-BCC$ $L
 !- 0 02 > >I  G14;\Y;\;\QZ;\;\^g:h1i1iX..))))1F91F1FX.M((6661$MM"-01111r$   )__name__
__module____qualname____doc__r   rB   r   r   boolr   r   r   r   r   r  r#   r$   r%   r   r   <  s         "$%3 %-1.2,0,0$&6:$&' '' ' #	'
 '  	*' !+' y)' y)' "' %-UO' "' ' ' 'R< < <|` ` ` ` `r$   r   r   Tc                    t          | t                    r| j        d         | j        d         z  | j        z  |r
| j        z  t          fd| j        | j                  } || j                   | j	        &t          j                            | j	                   dS dS t          | t          j                  r| j        d         | j        d         z  | j        z  |r
| j        z  t          j                            | j        dt          j        dz                       | j	        &t          j                            | j	                   dS dS t          | t          j                  rJt          j                            | j                   t          j                            | j	                   dS t          | t          j                  r| j                            d          d}d|v r| j                            d          }dt          j        |z             z  }t          j                            | j        | |           t          j                            | j	                   dS dS )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                 p    t           j                            | dt          j        dz                      S )Nr          @)r   initnormal_r   sqrt)wfan_outs    r%   <lambda>z#_init_weight_goog.<locals>.<lambda>   s'    bgooaDIcGm,D,DEE r$   Nr  
routing_fnr1   )r   r   rv   out_channelsgroupsr   ro   weight_shapeweightbiasr   r  zeros_Conv2dr  r   r  BatchNorm2dones_Linearsizeuniform_)mrO   fix_group_fanoutinit_weight_fnfan_in
init_ranger  s         @r%   _init_weight_googr%    s7    !Z   -"Q]1%55F 	! G1EEEEq}VWVdf fqx   6GNN16""""" 	Ary	!	! -"Q]1%55F 	! G
!TYsW}%=%=>>>6GNN16""""" 	Ar~	&	& 

ah
qv	Ary	!	! (--""1X]]1%%F49Vg%5666

J;
;;;
qv r$   modelc                     |pt           }|                                 D ]\  }} |||           t          |           D ])\  }}t          |d          r|                                 *d S )Ninit_weights)r%  r   hasattrr(  )r&  init_fnrO   r   s       r%   r   r   8  s    **G##%%  11 e$$  11n%% 	NN r$   )r-   )r1   r2   Nr3   )r1   r   )r1   r   r   FN)r   Tr    )2r  typingr   r   loggingr   rP   r"   r   	functoolsr   r   r	   r
   torch.nnr   timm.layersr   r   r   r   r   r   _efficientnet_blocks_manipulater   __all__	getLoggerr  r;   r   r   r   r   r!   r   r   r&   r   r   r   r?   rJ   r   r   r   r   r%  Moduler   r#   r$   r%   <module>r5     sx    & % % % % % % %   				             " " " " " " " " " "       p p p p p p p p p p p p p p p p # # # # & & & & & &t t t '
H
%
%  "  d28IJJJd38n%&	    ; ; ; ;` ` ` `  
/ / /T" T" T"n# # # #P + + + +\P P P P P P P Pf& & & &R RY      r$   