
    NgC9                     D   d Z ddlmZ ddlmZ ddlZddlmZ ddlm	Z	m
Z
 ddlmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZmZ dgZ G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Zd'dZ  e e d           e d           e dd           e dddd           d!          Z!d(d#Z"ed(d$            Z#ed(d%            Z$ed(d&            Z%dS ))z
InceptionNeXt paper: https://arxiv.org/abs/2303.16900
Original implementation & weights from: https://github.com/sail-sg/inceptionnext
    )partial)OptionalNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)trunc_normal_DropPath	to_2tupleget_paddingSelectAdaptivePool2d   )build_model_with_cfg)checkpoint_seq)register_modelgenerate_default_cfgsMetaNeXtc                   2     e Zd ZdZ	 	 	 	 d fd	Zd Z xZS )	InceptionDWConv2dz% Inception depthwise convolution
                ?r   c                    t                                                       t          ||z            }t          ||          }t          ||          }t	          j        ||||||          | _        t	          j        ||d|fd|fd|f|          | _        t	          j        |||df|df|df|          | _        |d|z  z
  |||f| _	        d S )Ndilation)paddingr   groupsr   r   r   )
super__init__intr   nnConv2d	dwconv_hwdwconv_wdwconv_hsplit_indexes)
selfin_chssquare_kernel_sizeband_kernel_sizebranch_ratior   gcsquare_paddingband_padding	__class__s
            V/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/inception_next.pyr   zInceptionDWConv2d.__init__   s    	,&''$%7(KKK"#3hGGG&"XbB B B 	Q()%HbJ J J 	%q)!1%1bJ J J %q2vor2r:    c                     t          j        || j        d          \  }}}}t          j        ||                     |          |                     |          |                     |          fd          S )Nr   )dim)torchsplitr%   catr"   r#   r$   )r&   xx_idx_hwx_wx_hs         r/   forwardzInceptionDWConv2d.forward1   sw    ${1d.@aHHHdCyNN4  MM#MM#	
 
 
 
 	
r0   )r   r   r   r   )__name__
__module____qualname____doc__r   r;   __classcell__r.   s   @r/   r   r      sd           !; ; ; ; ; ;0
 
 
 
 
 
 
r0   r   c                   @     e Zd ZdZddej        dddf fd	Zd Z xZS )ConvMlpz MLP using 1x1 convs that keeps spatial dims
    copied from timm: https://github.com/huggingface/pytorch-image-models/blob/v0.6.11/timm/models/layers/mlp.py
    NT        c                    t                                                       |p|}|p|}t          |          }t          j        ||d|d                   | _        |r ||          nt          j                    | _         |            | _        t          j	        |          | _
        t          j        ||d|d                   | _        d S )Nr   r   )kernel_sizebias)r   r   r
   r    r!   fc1IdentitynormactDropoutdropfc2)	r&   in_featureshidden_featuresout_features	act_layer
norm_layerrG   rM   r.   s	           r/   r   zConvMlp.__init__A   s     	#2{)8[9[/qtTUwWWW3=PJJ///2;==	9;;Jt$$	9_lPTUVPWXXXr0   c                     |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|S N)rH   rJ   rK   rM   rN   r&   r6   s     r/   r;   zConvMlp.forwardV   sR    HHQKKIIaLLHHQKKIIaLLHHQKKr0   )	r<   r=   r>   r?   r    ReLUr   r;   r@   rA   s   @r/   rC   rC   <   sr          !gY Y Y Y Y Y*      r0   rC   c                        e Zd ZdZdddej         eej        d          ddf fd		Zdde	de
e         fdZddefdZ xZS )MlpClassifierHeadz MLP classification head
      avgr   ư>)epsrD   Tc	                    t                                                       d| _        || _        t	          ||z            x| _        }	|s
J d            t          |d          | _        t          j	        || j        
                                z  |	|          | _         |            | _         ||	          | _        t          j	        |	||          | _        t          j        |          | _        d S )NFCannot disable poolingT	pool_typeflatten)rG   )r   r   use_convrO   r   num_featuresr   global_poolr    Linear	feat_multrH   rK   rJ   rN   rL   rM   )r&   rO   num_classesra   	mlp_ratiorR   rS   rM   rG   rP   r.   s             r/   r   zMlpClassifierHead.__init__c   s     	&.1)k2I.J.JJO222222/)TRRR9[4+;+E+E+G+GG_cddd9;;J//	9_kEEEJt$$			r0   Nrh   ra   c                     |"|s
J d            t          |d          | _        |dk    rt          j        | j        |          nt          j                    | _        d S )Nr_   Tr`   r   )r   re   r    rf   rd   rI   rN   )r&   rh   ra   s      r/   resetzMlpClassifierHead.reset|   sd     6666663iQUVVVD@Ka29T.<<<UWU`UbUbr0   F
pre_logitsc                    |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|r|n|                     |          S rU   )re   rH   rK   rJ   rM   rN   r&   r6   rl   s      r/   r;   zMlpClassifierHead.forward   sj    QHHQKKHHQKKIIaLLIIaLL/qqDHHQKK/r0   rU   F)r<   r=   r>   r?   r    GELUr   	LayerNormr   r   r   strrk   boolr;   r@   rA   s   @r/   rY   rY   _   s          gwr|666% % % % % %2c c c# c c c c0 0T 0 0 0 0 0 0 0 0r0   rY   c                   N     e Zd ZdZdeej        edej        ddf fd	Z	d Z
 xZS )MetaNeXtBlockz MetaNeXtBlock Block
    Args:
        dim (int): Number of input channels.
        drop_path (float): Stochastic depth rate. Default: 0.0
        ls_init_value (float): Init value for Layer Scale. Default: 1e-6.
    r      r\   rD   c
                    t                                                        |||          | _         ||          | _         ||t	          ||z            |          | _        |r)t          j        |t          j	        |          z            nd | _
        |	dk    rt          |	          nt          j                    | _        d S )Nr   )rR   rD   )r   r   token_mixerrJ   r   mlpr    	Parameterr3   onesgammar	   rI   	drop_path)r&   r2   r   rx   rS   	mlp_layerri   rR   ls_init_valuer}   r.   s             r/   r   zMetaNeXtBlock.__init__   s     	&;sX>>>JsOO	9S#i#o"6"6)LLLFS]R\-%*S//"ABBBY]
09B),,,BKMMr0   c                 &   |}|                      |          }|                     |          }|                     |          }| j        0|                    | j                            dddd                    }|                     |          |z   }|S )Nr   )rx   rJ   ry   r|   mulreshaper}   )r&   r6   shortcuts      r/   r;   zMetaNeXtBlock.forward   s    QIIaLLHHQKK:!dj((B15566ANN1(r0   )r<   r=   r>   r?   r   r    BatchNorm2drC   rp   r   r;   r@   rA   s   @r/   ru   ru      sz          )~gR R R R R R(      r0   ru   c            	       B     e Zd Zdddddeej        ddf	 fd	Zd Z xZS )MetaNeXtStage   )r   r   N      ?rv   c                    t                                                       d| _        |dk    s|d         |d         k    rAt          j         |
|          t          j        ||d||d                             | _        nt          j                    | _        |pdg|z  }g }t          |          D ]8}|	                    t          ||d         ||         |||	|
|                     9t          j        | | _        d S )NFr   r   r   )rF   strider   rD   )r2   r   r}   r   rx   rR   rS   ri   )r   r   grad_checkpointingr    
Sequentialr!   
downsamplerI   rangeappendru   blocks)r&   r'   out_chsr   depthr   drop_path_ratesr   rx   rR   rS   ri   stage_blocksir.   s                 r/   r   zMetaNeXtStage.__init__   s#    	"'A::!33 m
6""	 !!%a[  	 	DOO !kmmDO)9bTE\u 
	 
	A!!)!,+'#%#	! 	! 	! 	 	 	 	 m\2r0   c                     |                      |          }| j        r4t          j                                        st          | j        |          }n|                     |          }|S rU   )r   r   r3   jitis_scriptingr   r   rV   s     r/   r;   zMetaNeXtStage.forward   sZ    OOA" 	59+A+A+C+C 	t{A..AAAAr0   )	r<   r=   r>   r   r    rp   r   r;   r@   rA   s   @r/   r   r      sl        
  )g+3 +3 +3 +3 +3 +3Z      r0   r   c                   L    e Zd ZdZddddddeej        ej        dd	d	d
f fd	Zd Z	e
j        j        dd            Ze
j        j        dej        fd            Zddedee         fdZe
j        j        dd            Ze
j        j        d             Zd ZddefdZd Z xZS )r   a   MetaNeXt
        A PyTorch impl of : `InceptionNeXt: When Inception Meets ConvNeXt` - https://arxiv.org/abs/2303.16900

    Args:
        in_chans (int): Number of input image channels. Default: 3
        num_classes (int): Number of classes for classification head. Default: 1000
        depths (tuple(int)): Number of blocks at each stage. Default: (3, 3, 9, 3)
        dims (tuple(int)): Feature dimension at each stage. Default: (96, 192, 384, 768)
        token_mixers: Token mixer function. Default: nn.Identity
        norm_layer: Normalization layer. Default: nn.BatchNorm2d
        act_layer: Activation function for MLP. Default: nn.GELU
        mlp_ratios (int or tuple(int)): MLP ratios. Default: (4, 4, 4, 3)
        drop_rate (float): Head dropout rate
        drop_path_rate (float): Stochastic depth rate. Default: 0.
        ls_init_value (float): Init value for Layer Scale. Default: 1e-6.
    r   rZ   r[       r   r   	   r   `        i   )rv   rv   rv   r   rD   r\   c                    t                                                       t          |          }t          |t          t
          f          s|g|z  }t          |
t          t
          f          s|
g|z  }
|| _        || _        || _        g | _	        t          j        t          j        ||d         dd           ||d                             | _        d t          j        d|t!          |                                        |          D             }|d         }d}d}t          j                    | _        t'          |          D ]}|dk    s|dk    rdnd}||k    r|dk    r||z  }d}||z  }|dv rdnd}||         }| j                            t+          |||dk    r|nd||f||         ||         ||	||         ||
|                              |}| xj	        t-          ||d	| 
          gz  c_	        || _        t1          | j        || j        |          | _        | j        j        | _        |                     | j                   d S )Nr   rv   )rF   r   c                 6    g | ]}|                                 S  )tolist).0r6   s     r/   
<listcomp>z%MetaNeXt.__init__.<locals>.<listcomp>  s     eee1AHHJJeeer0   r   r   )r   r   )	r   r   r   r   r   rR   rx   rS   ri   zstages.)num_chs	reductionmodule)ra   rM   )r   r   len
isinstancelisttuplerh   re   	drop_ratefeature_infor    r   r!   stemr3   linspacesumr4   stagesr   r   r   dictrd   rY   headhead_hidden_sizeapply_init_weights)r&   in_chansrh   re   output_stridedepthsdimstoken_mixersrS   rR   
mlp_ratiosr   drop_path_rater   	num_stagedp_ratesprev_chscurr_strider   r   r   first_dilationr   r.   s                          r/   r   zMetaNeXt.__init__   s     	KK	,u66 	6(>I5L*tUm44 	2$	1J&&"MIhQQqAAAJtAw
 
	
 feq.#f++(V(V(\(\]c(d(deee7mooy!! 	g 	gA%**a!eeQQFm++

F"6!K"*f"4"4QQ!N1gGK}!"QvvA((3Qi (+#(O%$Q-         H$x;WdabWdWd"e"e"e!ff$%d&7PTP`gpqqq	 $	 6

4%&&&&&r0   c                     t          |t          j        t          j        f          rDt	          |j        d           |j        )t          j                            |j        d           d S d S d S )Ng{Gz?)stdr   )	r   r    r!   rf   r   weightrG   init	constant_)r&   ms     r/   r   zMetaNeXt._init_weights?  sj    a")RY/00 	-!(,,,,v!!!!&!,,,,,	- 	-!!r0   Fc                 0    t          d|rdnddg          S )Nz^stemz^stages\.(\d+))z^stages\.(\d+)\.downsample)r   )z^stages\.(\d+)\.blocks\.(\d+)N)r   r   )r   )r&   coarses     r/   group_matcherzMetaNeXt.group_matcherE  s5    (. $$585
 
 
 	
r0   returnc                     | j         j        S rU   )r   rN   r&   s    r/   get_classifierzMetaNeXt.get_classifierO  s    y}r0   Nrh   re   c                 J    || _         | j                            ||           d S rU   )rh   r   rk   )r&   rh   re   s      r/   reset_classifierzMetaNeXt.reset_classifierS  s&    &	[11111r0   Tc                 (    | j         D ]	}||_        
d S rU   )r   r   )r&   enabless      r/   set_grad_checkpointingzMetaNeXt.set_grad_checkpointingW  s(     	* 	*A#)A  	* 	*r0   c                     t                      S rU   )setr   s    r/   no_weight_decayzMetaNeXt.no_weight_decay\  s    uur0   c                 Z    |                      |          }|                     |          }|S rU   )r   r   rV   s     r/   forward_featureszMetaNeXt.forward_features`  s%    IIaLLKKNNr0   rl   c                 ^    |r|                      ||          n|                      |          S )N)rl   )r   rn   s      r/   forward_headzMetaNeXt.forward_heade  s-    6@Rtyyzy222diiPQllRr0   c                 Z    |                      |          }|                     |          }|S rU   )r   r   rV   s     r/   r;   zMetaNeXt.forwardh  s-    !!!$$a  r0   ro   rU   )T)r<   r=   r>   r?   r   r    r   rp   r   r   r3   r   ignorer   Moduler   r   r   rr   r   r   r   r   rs   r   r;   r@   rA   s   @r/   r   r      s        & $*~g#A' A' A' A' A' A'F- - - Y
 
 
 
 Y	    2 2C 2hsm 2 2 2 2 Y* * * * Y    
S S$ S S S S      r0    c                 4    | dddddt           t          ddd
|S )	NrZ   )r      r   )   r   g      ?bicubiczstem.0zhead.fc2)
urlrh   
input_size	pool_sizecrop_pctinterpolationmeanr   
first_conv
classifierr   )r   kwargss     r/   _cfgr   n  s5    =vI%.Bj   r0   ztimm/)	hf_hub_idgffffff?)r   r   )r   r   r   )   r   r   )r   r   r   r   )zinception_next_tiny.sail_in1kzinception_next_small.sail_in1kzinception_next_base.sail_in1kz!inception_next_base.sail_in1k_384Fc                 P    t          t          | |fdt          dd          i|}|S )Nfeature_cfg)r   r   r   r   T)out_indicesflatten_sequential)r   r   r   )variant
pretrainedr   models       r/   _create_inception_nextr     sC     ': \dKKK  E
 Lr0   c           	      b    t          ddt                    }t          dd| it          |fi |S )Nr   r   r   r   r   inception_next_tinyr   )r   r   r   r   r   r   
model_argss      r/   r   r     sM    "5&  J "mmJmRVWaRlRlekRlRlmmmr0   c           	      b    t          ddt                    }t          dd| it          |fi |S )Nr   r      r   r   r   inception_next_smallr   )r  r   r   s      r/   r  r    sM    #6&  J "nnZnSWXbSmSmflSmSmnnnr0   c           	      b    t          ddt                    }t          dd| it          |fi |S )Nr  )      i   i   r   inception_next_baser   )r	  r   r   s      r/   r	  r	    sM    #8&  J "mmJmRVWaRlRlekRlRlmmmr0   )r   ro   )&r?   	functoolsr   typingr   r3   torch.nnr    	timm.datar   r   timm.layersr   r	   r
   r   r   _builderr   _manipulater   	_registryr   r   __all__r   r   rC   rY   ru   r   r   r   default_cfgsr   r   r  r	  r   r0   r/   <module>r     s   
                    A A A A A A A A ] ] ] ] ] ] ] ] ] ] ] ] ] ] * * * * * * ' ' ' ' ' ' < < < < < < < <,$
 $
 $
 $
 $
	 $
 $
 $
N         bi      F*0 *0 *0 *0 *0	 *0 *0 *0Z$ $ $ $ $BI $ $ $N4 4 4 4 4BI 4 4 4nA A A A Ary A A AH    %$%)T& & & '+d' ' ' &*T& & &
 *. Hs* * *& &  ,    n n n n o o o o n n n n n nr0   