
    khC                     d   d Z ddlmZ ddlmZmZmZ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 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       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*ed(d&       Z+y))z
InceptionNeXt paper: https://arxiv.org/abs/2303.16900
Original implementation & weights from: https://github.com/sail-sg/inceptionnext
    )partial)ListOptionalTupleUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)trunc_normal_DropPath	to_2tupleget_paddingSelectAdaptivePool2d   )build_model_with_cfg)feature_take_indices)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
    c                 l   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| _	        y )Ndilation)paddingr   groupsr   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/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/inception_next.pyr    zInceptionDWConv2d.__init__   s     	,&'$%7(K"#3hG&"XbB 		Q()%HbJ 		%q)!1%1bJ %q2vor2r:    c                     t        j                  || j                  d      \  }}}}t        j                  || j	                  |      | j                  |      | j                  |      fd      S )Nr   )dim)torchsplitr'   catr$   r%   r&   )r(   xx_idx_hwx_wx_hs         r1   forwardzInceptionDWConv2d.forward2   se    ${{1d.@.@aHdCyyNN4 MM#MM#	
 
 	
r2   )r      g      ?r   )__name__
__module____qualname____doc__r    r=   __classcell__r0   s   @r1   r   r      s       !;0
r2   r   c                   J     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                 f   t         |           |xs |}|xs |}t        |      }t        j                  ||d|d         | _        |r ||      nt        j                         | _         |       | _        t        j                  |      | _
        t        j                  ||d|d         | _        y )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_layerrJ   rP   r0   s	           r1   r    zConvMlp.__init__B   s     	#2{)8[99[/qtTUwW3=J/2;;=	;JJt$	99_lPTUVPWXr2   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }|S N)rK   rM   rN   rP   rQ   r(   r8   s     r1   r=   zConvMlp.forwardW   sH    HHQKIIaLHHQKIIaLHHQKr2   )	r?   r@   rA   rB   r"   ReLUr    r=   rC   rD   s   @r1   rF   rF   =   s+     !ggY*r2   rF   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   ư>)epsrG   Tc	                    t         
|           d| _        || _        t	        ||z        x| _        }	|sJ d       t        |d      | _        t        j                  || j                  j                         z  |	|      | _         |       | _         ||	      | _        t        j                  |	||      | _        t        j                  |      | _        y )NFCannot disable poolingT	pool_typeflatten)rJ   )r   r    use_convrR   r!   num_featuresr   global_poolr"   Linear	feat_multrK   rN   rM   rQ   rO   rP   )r(   rR   num_classesrd   	mlp_ratiorU   rV   rP   rJ   rS   r0   s             r1   r    zMlpClassifierHead.__init__d   s     	&.1)k2I.JJO222y/)TR99[4+;+;+E+E+GG_cd;/	99_kEJJt$	r2   rk   rd   c                     ||sJ d       t        |d      | _        |dkD  r&t        j                  | j                  |      | _        y t        j
                         | _        y )Nrb   Trc   r   )r   rh   r"   ri   rg   rL   rQ   )r(   rk   rd   s      r1   resetzMlpClassifierHead.reset}   sT     66693iQUVD@Ka299T..<UWU`U`Ubr2   
pre_logitsc                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }|r|S | j                  |      S rX   )rh   rK   rN   rM   rP   rQ   r(   r8   ro   s      r1   r=   zMlpClassifierHead.forward   s[    QHHQKHHQKIIaLIIaLq/DHHQK/r2   rX   F)r?   r@   rA   rB   r"   GELUr   	LayerNormr    r!   r   strrn   boolr=   rC   rD   s   @r1   r\   r\   `   sY     ggr||6%2c c# c0T 0r2   r\   c                   b     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_   rG   c
                 X   t         
|            |||      | _         ||      | _         ||t	        ||z        |      | _        |r+t        j                  |t        j                  |      z        nd | _
        |	dkD  rt        |	      | _        y t        j                         | _        y )Nr   )rU   rG   )r   r    token_mixerrM   r!   mlpr"   	Parameterr5   onesgammar   rL   	drop_path)r(   r4   r   r{   rV   	mlp_layerrl   rU   ls_init_valuer   r0   s             r1   r    zMetaNeXtBlock.__init__   s     	&sX>sO	S#i#o"6)LFSR\\-%**S/"ABY]
09B),BKKMr2   c                 
   |}| j                  |      }| j                  |      }| j                  |      }| j                  -|j	                  | j                  j                  dddd            }| j                  |      |z   }|S )Nr   )r{   rM   r|   r   mulreshaper   )r(   r8   shortcuts      r1   r=   zMetaNeXtBlock.forward   sv    QIIaLHHQK::!djj((B156ANN1(r2   )r?   r@   rA   rB   r   r"   BatchNorm2drF   rs   r    r=   rC   rD   s   @r1   rx   rx      s5     )~~ggR(r2   rx   c            	       L     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      ?ry   c                    t         |           d| _        |dkD  s|d   |d   k7  r=t        j                   |
|      t        j
                  ||d||d               | _        nt        j                         | _        |xs dg|z  }g }t        |      D ]*  }|j                  t        ||d   ||   |||	|
|             , t        j                  | | _        y )NFr   r   r   )rI   strider   rG   )r4   r   r   r   r{   rU   rV   rl   )r   r    grad_checkpointingr"   
Sequentialr#   
downsamplerL   rangeappendrx   blocks)r(   r)   out_chsr   depthr   drop_path_ratesr   r{   rU   rV   rl   stage_blocksir0   s                 r1   r    zMetaNeXtStage.__init__   s     	"'A:!3 mm6"		 !!%a[	DO !kkmDO)9bTE\u 
	A!!)!,+'#%#	! 	
	 mm\2r2   c                     | j                  |      }| j                  r6t        j                  j	                         st        | j                  |      }|S | j                  |      }|S rX   )r   r   r5   jitis_scriptingr   r   rY   s     r1   r=   zMetaNeXtStage.forward   sS    OOA""599+A+A+Ct{{A.A  AAr2   )	r?   r@   rA   r   r"   rs   r    r=   rC   rD   s   @r1   r   r      s/    
  )gg+3Zr2   r   c                   ~    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&de
j,                  deeeee   f      dededededeee
j,                     ee
j,                  ee
j,                     f   f   fdZ	 	 	 d'deeee   f   dedef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   r]   r^       r   r   	   r   `        i   )ry   ry   ry   r   rG   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               | _        t        j                  d|t!        |            j#                  |      D cg c]  }|j%                          }}|d   }d}d}t        j                         | _        t)        |      D ]  }|dk(  s|dkD  rdnd}||k\  r|dkD  r||z  }d}||z  }|dv rdnd}||   }| j&                  j+                  t-        |||dkD  r|nd||f||   ||   ||	||   ||
|                |}| xj                  t/        ||d| 	      gz  c_	         || _        t3        | j0                  || j                  |
      | _        | j4                  j0                  | _        | j9                  | j:                         y c c}w )Nr   ry   )rI   r   r   r   )r   r   )	r   r   r   r   r   rU   r{   rV   rl   zstages.)num_chs	reductionmodule)rd   rP   )r   r    len
isinstancelisttuplerk   rh   	drop_ratefeature_infor"   r   r#   stemr5   linspacesumr6   toliststagesr   r   r   dictrg   r\   headhead_hidden_sizeapply_init_weights)r(   in_chansrk   rh   output_stridedepthsdimstoken_mixersrV   rU   
mlp_ratiosr   drop_path_rater   	num_stager8   dp_ratesprev_chscurr_strider   r   r   first_dilationr   r0   s                           r1   r    zMetaNeXt.__init__   s8     	K	,u6(>I5L*tUm4$	1J&&"MMIIhQQqAtAw
	
 ).q.#f+(V(\(\]c(de1AHHJee7mmoy! 	gA%*a!eQFm+
F"6!K"*f"4Q!N1gGKK}!"QvA((3Qi (+#(O%$Q-   H$x;Y`ab`cWd"e!ff-	g. %%d&7&7PTP`P`gpq	 $		 6 6

4%%&A fs   H+c                     t        |t        j                  t        j                  f      rOt	        |j
                  d       |j                  +t        j                  j                  |j                  d       y y y )Ng{Gz?)stdr   )	r   r"   r#   ri   r   weightrJ   init	constant_)r(   ms     r1   r   zMetaNeXt._init_weights@  sS    a"))RYY/0!((,vv!!!!&&!, " 1r2   c                 2    t        d|rd      S ddg      S )Nz^stemz^stages\.(\d+))z^stages\.(\d+)\.downsample)r   )z^stages\.(\d+)\.blocks\.(\d+)N)r   r   )r   )r(   coarses     r1   group_matcherzMetaNeXt.group_matcherF  s/    (.$
 	
 685
 	
r2   returnc                 .    | j                   j                  S rX   )r   rQ   r(   s    r1   get_classifierzMetaNeXt.get_classifierP  s    yy}}r2   rk   rh   c                 J    || _         | j                  j                  ||       y rX   )rk   r   rn   )r(   rk   rh   s      r1   reset_classifierzMetaNeXt.reset_classifierT  s    &		[1r2   c                 4    | j                   D ]	  }||_         y rX   )r   r   )r(   enabless      r1   set_grad_checkpointingzMetaNeXt.set_grad_checkpointingX  s     	*A#)A 	*r2   c                     t               S rX   )setr   s    r1   no_weight_decayzMetaNeXt.no_weight_decay]  s	    ur2   r8   indicesrM   
stop_early
output_fmtintermediates_onlyc                 r   |dv sJ d       g }t        t        | j                        |      \  }}	| j                  |      }t        j
                  j                         s|s| j                  }
n| j                  d|	dz    }
t        |
      D ]#  \  }} ||      }||v s|j                  |       % |r|S ||fS )a   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
        Returns:

        )NCHWzOutput shape must be NCHW.Nr   )	r   r   r   r   r5   r   r   	enumerater   )r(   r8   r   rM   r   r   r   intermediatestake_indices	max_indexr   feat_idxstages                r1   forward_intermediateszMetaNeXt.forward_intermediatesa  s    * Y&D(DD&"6s4;;7G"Qi IIaL99!!#:[[F[[)a-0F(0 	(OHeaA<'$$Q'	(
   -r2   
prune_norm
prune_headc                     t        t        | j                        |      \  }}| j                  d|dz    | _        |r| j                  dd       |S )z@ Prune layers not required for specified intermediates.
        Nr   r   r^   )r   r   r   r   )r(   r   r   r   r   r   s         r1   prune_intermediate_layersz"MetaNeXt.prune_intermediate_layers  sM     #7s4;;7G"Qikk.9q=1!!!U+r2   c                 J    | j                  |      }| j                  |      }|S rX   )r   r   rY   s     r1   forward_featureszMetaNeXt.forward_features  s!    IIaLKKNr2   ro   c                 N    |r| j                  ||      S | j                  |      S )N)ro   )r   rq   s      r1   forward_headzMetaNeXt.forward_head  s%    6@tyyzy2RdiiPQlRr2   c                 J    | j                  |      }| j                  |      }|S rX   )r   r   rY   s     r1   r=   zMetaNeXt.forward  s'    !!!$a r2   rr   rX   )T)NFFr   F)r   FT)!r?   r@   rA   rB   r   r"   r   rs   r    r   r5   r   ignorer   Moduler   r!   r   ru   r   r   r   Tensorr   r   rv   r   r   r   r   r   r=   rC   rD   s   @r1   r   r      s   & $*~~gg#A'F- YY
 
 YY		  2C 2hsm 2 YY* * YY  8<$$',( ||(  eCcN34(  	( 
 (  (  !%(  
tELL!5tELL7I)I#JJ	K( X ./$#	3S	>*  	
S$ Sr2   c                 0    | dddddt         t        ddd
|S )	Nr]   )r      r   )   r   g      ?bicubiczstem.0zhead.fc2)
urlrk   
input_size	pool_sizecrop_pctinterpolationmeanr   
first_conv
classifierr   )r   kwargss     r1   _cfgr    s0    =vI%.Bj  r2   ztimm/)	hf_hub_idgffffff?)r  r   )r   r   r   )   r  r   )r  r   r   r   )zinception_next_atto.sail_in1kzinception_next_tiny.sail_in1kzinception_next_small.sail_in1kzinception_next_base.sail_in1kz!inception_next_base.sail_in1k_384c                 D    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       r1   _create_inception_nextr    s3     ':\dK E
 Lr2   c           	      l    t        ddt        t        dd            }t        dd| it        |fi |S )	N)r   r      r   )(   P      i@  r   g      ?)r+   r,   r   r   r   r	  )inception_next_atto)r   r   r   r  r	  r   
model_argss      r1   r  r    sB    "4.QUVJ "mJmRVWaRlekRlmmr2   c           	      T    t        ddt              }t        dd| it        |fi |S )Nr   r   r  r	  )inception_next_tinyr   r   r  r  s      r1   r  r    s7    "5&J "mJmRVWaRlekRlmmr2   c           	      T    t        ddt              }t        dd| it        |fi |S )Nr   r      r   r   r  r	  )inception_next_smallr  r  s      r1   r  r    s7    #6&J "nZnSWXbSmflSmnnr2   c           	      T    t        ddt              }t        dd| it        |fi |S )Nr  )      i   i   r  r	  )inception_next_baser  r  s      r1   r  r    s7    #8&J "mJmRVWaRlekRlmmr2   ) rr   ),rB   	functoolsr   typingr   r   r   r   r5   torch.nnr"   	timm.datar	   r
   timm.layersr   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__r   r   rF   r\   rx   r   r   r  default_cfgsr  r  r  r  r   r2   r1   <module>r-     s[  
  / /   A ] ] * + ' <,$
		 $
N bii  F*0		 *0Z$BII $N4BII 4nyryy yx %%)& &*& '+' &*&
 *. Hs*%& 4 n n n n o o n nr2   