
    kh);                        d Z ddlm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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dlmZ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#d Z$d'dZ%d(dZ& e e&d       e&dd       e&d       e&d       e&d       e&ddd       e&ddd       e&ddd       e&d       e&dd      d
      Z'ed'de#fd       Z(ed'de#fd       Z)ed'de#fd        Z*ed'de#fd!       Z+ ee,d"d#d$d%d&       y))z
TResNet: High Performance GPU-Dedicated Architecture
https://arxiv.org/pdf/2003.13630.pdf

Original model: https://github.com/mrT23/TResNet

    )OrderedDict)partial)ListOptionalTupleUnionN)SpaceToDepth
BlurPool2dClassifierHeadSEModuleConvNormActDropPath   )build_model_with_cfg)feature_take_indices)
checkpointcheckpoint_seq)register_modelgenerate_default_cfgsregister_model_deprecationsTResNetc                   4     e Zd ZdZ	 	 	 	 	 d fd	Zd Z xZS )
BasicBlockr   c                    t         t        |           || _        || _        t        t        j                  d      }t        ||d|||      | _	        t        ||ddd      | _
        t        j                  d	      | _        t        || j                  z  d
z  d      }	|rt        || j                  z  |	      nd | _        |dkD  rt#        |      | _        y t        j$                         | _        y )NMbP?negative_slope   kernel_sizestride	act_layeraa_layerr   Fr    r!   	apply_actTinplace   @   rd_channelsr   )superr   __init__
downsampler!   r   nn	LeakyReLUr   conv1conv2ReLUactmax	expansionr   ser   Identity	drop_path)selfinplanesplanesr!   r.   use_ser#   drop_path_rater"   rd_chs	__class__s             O/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/tresnet.pyr-   zBasicBlock.__init__   s     	j$(*$BLL>	 6q[dowx
 QqTYZ
774(Vdnn,126KQ(6DNN2GW[5Ca5G.1R[[]    c                    | j                   | j                  |      }n|}| j                  |      }| j                  |      }| j                  | j                  |      }| j	                  |      |z   }| j                  |      }|S N)r.   r1   r2   r7   r9   r4   r:   xshortcutouts       rA   forwardzBasicBlock.forward2   su    ??&q)HHjjmjjo77''#,CnnS!H,hhsm
rB   )r   NTN        __name__
__module____qualname__r6   r-   rI   __classcell__r@   s   @rA   r   r      s$    I [.rB   r   c                   6     e Zd ZdZ	 	 	 	 	 	 d fd	Zd Z xZS )
Bottleneckr(   c	                 
   t         t        |           || _        || _        |xs t        t        j                  d      }t        ||dd|      | _	        t        ||d|||      | _
        t        || j                  z  dz  d      }	|rt        ||		      nd | _        t        ||| j                  z  ddd
      | _        |dkD  rt!        |      nt        j"                         | _        t        j&                  d      | _        y )Nr   r   r   )r    r!   r"   r   r      r)   r*   Fr$   r   Tr&   )r,   rR   r-   r.   r!   r   r/   r0   r   r1   r2   r5   r6   r   r7   conv3r   r8   r9   r3   r4   )r:   r;   r<   r!   r.   r=   r"   r#   r>   reduction_chsr@   s             rA   r-   zBottleneck.__init__C   s     	j$(*$Kd!K	 f!AL
 F&IX`b
 FT^^3q8"=AG(6}=T FT^^+1PUW
 6Da5G.1R[[]774(rB   c                 0   | j                   | j                  |      }n|}| j                  |      }| j                  |      }| j                  | j                  |      }| j	                  |      }| j                  |      |z   }| j                  |      }|S rD   )r.   r1   r2   r7   rU   r9   r4   rE   s       rA   rI   zBottleneck.forwarda   s    ??&q)HHjjmjjo77''#,CjjonnS!H,hhsm
rB   )r   NTNNrJ   rK   rP   s   @rA   rR   rR   @   s&    I )<rB   rR   c                       e Zd Z	 	 	 	 	 	 	 d fd	ZddZej                  j                  d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	 	 	 	 	 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   c	                    || _         || _        d| _        t        t        |           t        }	t        j                  }
t        d|z        | _
        t        d|z        | _        |r.| j                  dz  dz  | _
        | j                  dz  dz  | _        t        j                  d|t        |            j                  |      D cg c]  }|j!                          }}t#        |dz  | j                  dd|
      }| j%                  |rt&        nt(        | j                  |d   dd	|	|d   
      }| j%                  |rt&        nt(        | j                  dz  |d   dd	|	|d   
      }| j%                  t&        | j                  dz  |d   dd	|	|d   
      }| j%                  t&        | j                  dz  |d   dd|	|d   
      }t        j*                  t-        dt/               fd|fd|fd|fd|fd|fg            | _        t3        | j                  dd      t3        | j                  |rt&        j4                  ndz  dd      t3        | j                  dz  |rt&        j4                  ndz  dd      t3        | j                  dz  t&        j4                  z  dd      t3        | j                  dz  t&        j4                  z  dd      g| _        | j                  dz  t&        j4                  z  x| _        | _        t=        | j8                  |||      | _        | jA                         D ]  }tC        |t        jD                        r,t        jF                  jI                  |jJ                  dd       tC        |t        jL                        sd|jJ                  jN                  jQ                  dd        | jA                         D ]  }tC        |t(              r=t        jF                  jS                  |jT                  jV                  jJ                         tC        |t&              sat        jF                  jS                  |jX                  jV                  jJ                          y c c}w )NFr)   rT   r      r   r   )r!   r    r"   T)r!   r=   r#   r>      r(   s2dr1   layer1layer2layer3layer4 )num_chs	reductionmodulezbody.layer1zbody.layer2zbody.layer3    zbody.layer4)	pool_type	drop_ratefan_out
leaky_relu)modenonlinearityg{Gz?)-num_classesrg   grad_checkpointingr,   r   r-   r
   r/   r0   intr;   r<   torchlinspacesumsplittolistr   _make_layerrR   r   
Sequentialr   r	   bodydictr6   feature_infonum_featureshead_hidden_sizer   headmodules
isinstanceConv2dinitkaiming_normal_weightLineardatanormal_zeros_r2   bnrU   )r:   layersin_chansrl   width_factorv2global_poolrg   r>   r#   r"   rF   dprr1   r]   r^   r_   r`   mr@   s                      rA   r-   zTResNet.__init__q   s    '""'gt%'LL	 B-."|+, MMQ.2DM++*Q.DK#(>>!^S[#Q#W#WX^#_`aqxxz``HrM4;;qa[de!!J*KK1TH]`ab]c " e !!J*KK!OVAYqadefag " i !!KK!OVAYqadefag " i !!KK!OVAYqbefgbh " j
 MM+LN#evvvv/
 # 	 "=
(<(<JVW`mnqBJ,@,@ANZ[dqrq:+?+??2Vcdq:+?+??2Vcd
 6:[[1_
H\H\4\\D1"4#4#4k[dmn	  	/A!RYY'''y|'\!RYY'%%a.		/  	2A!Z(qwwzz001!Z(qwwzz001		2[ as   Q(c                 &   d }|dk7  s| j                   ||j                  z  k7  rlg }	|dk(  r(|	j                  t        j                  dddd             |	t        | j                   ||j                  z  ddd      gz  }	t        j                  |	 }g }	t        |      D ]a  }
|	j                   || j                   ||
dk(  r|nd|
dk(  r|nd ||t        |t              r||
   n|             ||j                  z  | _         c t        j                  |	 S )	Nr   r[   TF)r    r!   	ceil_modecount_include_padr$   r   )r!   r.   r=   r#   r>   )
r;   r6   appendr/   	AvgPool2dr   ru   ranger}   list)r:   blockr<   blocksr!   r=   r#   r>   r.   r   is              rA   rt   zTResNet._make_layer   s   
Q;$--6EOO+CCF{bllqdfklm{v7Qq\ac d dF/Jv 
	5AMM%!"avQ)*a:T!4>~t4T~a0Zh  #U__4DM
	5 }}f%%rB   c                 (    t        d|rdnd      }|S )Nz^body\.conv1z^body\.layer(\d+)z^body\.layer(\d+)\.(\d+))stemr   )rw   )r:   coarsematchers      rA   group_matcherzTResNet.group_matcher   s    OF4HXstrB   c                     || _         y rD   )rm   )r:   enables     rA   set_grad_checkpointingzTResNet.set_grad_checkpointing   s
    "(rB   returnc                 .    | j                   j                  S rD   )r{   fc)r:   s    rA   get_classifierzTResNet.get_classifier   s    yy||rB   rl   r   c                 L    || _         | j                  j                  ||       y )N)rf   )rl   r{   reset)r:   rl   r   s      rA   reset_classifierzTResNet.reset_classifier   s    &		{;rB   rF   indicesnorm
stop_early
output_fmtintermediates_onlyc                    |dv sJ d       g }g d}t        t        |      |      \  }	}
|	D cg c]  }||   	 }	}||
   }
t        j                  j	                         s|s| j
                  }n| j
                  d|
dz    }t        |      D ]Z  \  }}| j                  r+t        j                  j	                         st        ||      }n ||      }||	v sJ|j                  |       \ |r|S ||fS c c}w )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.r   r[   r   r(      Nr   )
r   lenro   jitis_scriptingrv   	enumeraterm   r   r   )r:   rF   r   r   r   r   r   intermediates
stage_endstake_indices	max_indexr   stagesfeat_idxstages                  rA   forward_intermediateszTResNet.forward_intermediates   s    * Y&D(DD&$
"6s:"Pi/;<!
1<<y)	99!!#:YYFYY~	A.F(0 	(OHe&&uyy/E/E/Gua(!H<'$$Q'	(   -' =s   C0
prune_norm
prune_headc                     g d}t        t        |      |      \  }}||   }| j                  d|dz    | _        |r| j                  dd       |S )z@ Prune layers not required for specified intermediates.
        r   Nr   r   ra   )r   r   rv   r   )r:   r   r   r   r   r   r   s          rA   prune_intermediate_layersz!TResNet.prune_intermediate_layers  sW     %
"6s:"Piy)	IIny1}-	!!!R(rB   c                    | j                   rt        j                  j                         s| j                  j                  |      }| j                  j                  |      }t        | j                  j                  | j                  j                  | j                  j                  | j                  j                  g|d      }|S | j	                  |      }|S )NT)flatten)rm   ro   r   r   rv   r\   r1   r   r]   r^   r_   r`   r:   rF   s     rA   forward_featureszTResNet.forward_features&  s    ""599+A+A+C		a A		"A		  		  		  		  	 "
 4!A  		!ArB   
pre_logitsc                 N    |r| j                  ||      S | j                  |      S )N)r   )r{   )r:   rF   r   s      rA   forward_headzTResNet.forward_head4  s%    6@tyyzy2RdiiPQlRrB   c                 J    | j                  |      }| j                  |      }|S rD   )r   r   r   s     rA   rI   zTResNet.forward7  s'    !!!$a rB   )r           ?FfastrJ   rJ   )r   TNrJ   F)TrD   )NFFr   F)r   FT)rL   rM   rN   r-   rt   ro   r   ignorer   r   r/   Moduler   rn   r   strr   Tensorr   r   boolr   r   r   r   r   rI   rO   rP   s   @rA   r   r   p   s    K2Z&2 YY  YY) ) YY		  <C <hsm < 8<$$',, ||,  eCcN34,  	, 
 ,  ,  !%,  
tELL!5tELL7I)I#JJ	K, ` ./$#	3S	>*  	 S$ SrB   c                    d| v r| S dd l }| j                  d|       } | j                  d|       } i }| j                         D ]  \  }}|j                  dd |      }|j                  dd |      }|j                  d	d
 |      }|j                  dd |      }|j                  dd |      }|j                  dd |      }|j	                  d      r|j                         j                  d      }|||<    |S )Nzbody.conv1.conv.weightr   model
state_dictzconv(\d+)\.0.0c                 >    dt        | j                  d             dS Nconvr   .convrn   grouprF   s    rA   <lambda>z&checkpoint_filter_fn.<locals>.<lambda>F  s    $s1771:6Gu0M rB   zconv(\d+)\.0.1c                 >    dt        | j                  d             dS Nr   r   .bnr   r   s    rA   r   z&checkpoint_filter_fn.<locals>.<lambda>G  s    $s1771:6Gs0K rB   zconv(\d+)\.0c                 >    dt        | j                  d             dS r   r   r   s    rA   r   z&checkpoint_filter_fn.<locals>.<lambda>H  s    S_4EU.K rB   zconv(\d+)\.1c                 >    dt        | j                  d             dS r   r   r   s    rA   r   z&checkpoint_filter_fn.<locals>.<lambda>I  s    S_4ES.I rB   zdownsample\.(\d+)\.0c                 >    dt        | j                  d             dS )Ndownsample.r   r   r   r   s    rA   r   z&checkpoint_filter_fn.<locals>.<lambda>J  s    CPQ
OCTTY6Z rB   zdownsample\.(\d+)\.1c                 >    dt        | j                  d             dS )Nr   r   r   r   r   s    rA   r   z&checkpoint_filter_fn.<locals>.<lambda>K  s    CPQ
OCTTW6X rB   z	bn.weightgh㈵>)regetitemssubendswithabsadd)r   r   r   out_dictkvs         rA   checkpoint_filter_fnr   =  s    :-4Jj9JH  " 
1FF$&MqQFF$&KQOFF?$KQOFF?$I1MFF*,Z\]^FF*,XZ[\::k"D!A
 OrB   c                 J    t        t        | |ft        t        dd      d|S )N)r   r[   r   r(   T)out_indicesflatten_sequential)pretrained_filter_fnfeature_cfg)r   r   r   rw   )variant
pretrainedkwargss      rA   _create_tresnetr   S  s6     2\dK  rB   c                      | ddddddddd	d

|S )Nr   )r      r   )   r   g      ?bilinear)rJ   rJ   rJ   )r   r   r   zbody.conv1.convzhead.fc)
urlrl   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifier )r   r   s     rA   _cfgr  ^  s/    4}SYJ\'y	
  rB   ztimm/)	hf_hub_idi+  )r  rl   )r     r  )   r	  )r   r   r  )
ztresnet_m.miil_in21k_ft_in1ktresnet_m.miil_in21kztresnet_m.miil_in1kztresnet_l.miil_in1kztresnet_xl.miil_in1ktresnet_m.miil_in1k_448tresnet_l.miil_in1k_448tresnet_xl.miil_in1k_448ztresnet_v2_l.miil_in21k_ft_in1kztresnet_v2_l.miil_in21kr   c           	      L    t        g d      }t        dd| it        |fi |S )N)r   r(      r   )r   r   )	tresnet_mrw   r   r   r   
model_argss      rA   r  r  }  s*    ]+J\:\jA[TZA[\\rB   c           	      N    t        g dd      }t        dd| it        |fi |S )N)r(   r      r   g333333?r   r   r   )	tresnet_lr  r  s      rA   r  r    s,    ]=J\:\jA[TZA[\\rB   c           	      N    t        g dd      }t        dd| it        |fi |S )N)r(   r      r   g?r  r   )
tresnet_xlr  r  s      rA   r  r    s,    ]=J]J]$zB\U[B\]]rB   c           	      P    t        g ddd      }t        dd| it        |fi |S )N)r   r(      r   r   T)r   r   r   r   )tresnet_v2_lr  r  s      rA   r  r    s.    ]FJ_j_DD^W]D^__rB   r
  r  r  r  )tresnet_m_miil_in21ktresnet_m_448tresnet_l_448tresnet_xl_448r   )ra   )-__doc__collectionsr   	functoolsr   typingr   r   r   r   ro   torch.nnr/   timm.layersr	   r
   r   r   r   r   _builderr   	_featuresr   _manipulater   r   	_registryr   r   r   __all__r   r   rR   r   r   r   r  default_cfgsr  r  r  r  rL   r  rB   rA   <module>r.     s   $  / /   a a * + 3 Y Y+% %P- -`Jbii JZ, %$(7$; 7F'2'2 73# H   $ H  !% H! (,g'>#g5I#& * ]W ] ]
 ]W ] ]
 ^g ^ ^
 ` ` `
 H2..0	' rB   