
    khF              
          d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
 ddlZddlmZ ddlmc 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jH                        Z% G d dejH                        Z& G d dejH                        Z' G d dejH                        Z( G d dejH                        Z) G d dejH                        Z*dee+ejX                  f   dejH                  dee+ejX                  f   fdZ-d+de+dedee+ef   fdZ. e" e.d        e.d        e.d        e.d        e.d        e.d       d!      Z/d,d"e+d#e0dede*fd$Z1e!d,d#e0dede*fd%       Z2e!d,d#e0dede*fd&       Z3e!d,d#e0dede*fd'       Z4e!d,d#e0dede*fd(       Z5e!d,d#e0dede*fd)       Z6e!d,d#e0dede*fd*       Z7y)-a  FasterNet
Run, Don't Walk: Chasing Higher FLOPS for Faster Neural Networks
- paper: https://arxiv.org/abs/2303.03667
- code: https://github.com/JierunChen/FasterNet

@article{chen2023run,
  title={Run, Don't Walk: Chasing Higher FLOPS for Faster Neural Networks},
  author={Chen, Jierun and Kao, Shiu-hong and He, Hao and Zhuo, Weipeng and Wen, Song and Lee, Chul-Ho and Chan, S-H Gary},
  journal={arXiv preprint arXiv:2303.03667},
  year={2023}
}

Modifications by / Copyright 2025 Ryan Hou & Ross Wightman, original copyrights below
    )partial)AnyDictListOptionalSetTupleUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SelectAdaptivePool2dLinearDropPathtrunc_normal_	LayerType   )build_model_with_cfg)feature_take_indices)checkpoint_seq)register_modelgenerate_default_cfgs	FasterNetc                        e Zd Zdededef fdZdej                  dej                  fdZdej                  dej                  fdZ	 xZ
S )	Partial_conv3dimn_divforwardc                 ,   t         |           ||z  | _        || j                  z
  | _        t	        j
                  | j                  | j                  dddd      | _        |dk(  r| j                  | _        y |dk(  r| j                  | _        y t        )N   r   Fbiasslicing	split_cat)super__init__	dim_conv3dim_untouchednnConv2dpartial_conv3forward_slicingr   forward_split_catNotImplementedError)selfr   r   r   	__class__s       Q/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/fasternet.pyr&   zPartial_conv3.__init__$   s~     4>>1YYt~~t~~q!QUZ[i//DL#11DL%%    xreturnc                     |j                         }| j                  |d d d | j                  d d d d f         |d d d | j                  d d d d f<   |S N)cloner+   r'   r/   r3   s     r1   r,   zPartial_conv3.forward_slicing1   sO    GGI&*&8&81ot~~oqRS;S9T&U!_dnn_a
"#r2   c                     t        j                  || j                  | j                  gd      \  }}| j	                  |      }t        j
                  ||fd      }|S )Nr   )r   )torchsplitr'   r(   r+   cat)r/   r3   x1x2s       r1   r-   zPartial_conv3.forward_split_cat7   sP    Q1C1C D!LB#IIr2h"r2   )__name__
__module____qualname__intstrr&   r:   Tensorr,   r-   __classcell__r0   s   @r1   r   r   #   sS    &C & &c & %,, 5<< ELL r2   r   c                        e Zd Z eej
                  d      ej                  dfdededededed	e	d
e	de
f fdZdej                  dej                  fdZ xZS )MLPBlockTinplacer$   r   r   	mlp_ratio	drop_pathlayer_scale_init_value	act_layer
norm_layerpconv_fw_typec	                    t         
|           t        ||z        }	t        j                  t        j
                  ||	dd       ||	       |       t        j
                  |	|dd      g | _        t        |||      | _        |dkD  r3t        j                  |t        j                  |      z  d      | _        nd | _        |dkD  rt        |      | _        y t        j                         | _        y )Nr   Fr!   r   T)requires_grad        )r%   r&   rB   r)   
Sequentialr*   mlpr   spatial_mixing	Parameterr:   oneslayer_scaler   IdentityrL   )r/   r   r   rK   rL   rM   rN   rO   rP   mlp_hidden_dimr0   s             r1   r&   zMLPBlock.__init__@   s     	S9_-==IIc>159~&KIInc159	#
  ,CF!A%!||&S)::$ PD  $D09B),BKKMr2   r3   r4   c                 *   |}| j                  |      }| j                  P|| j                  | j                  j                  d      j                  d      | j	                  |      z        z   }|S || j                  | j	                  |            z   }|S )N)rV   rY   rL   	unsqueezerU   )r/   r3   shortcuts      r1   r   zMLPBlock.forward_   s    "'4>>  **2.88<txx{JL LA  4>>$((1+66Ar2   )r?   r@   rA   r   r)   ReLUBatchNorm2drB   floatr   rC   r&   r:   rD   r   rE   rF   s   @r1   rH   rH   ?   s     $+277D#A$&NN!,RR R 	R
 R %*R !R "R R> %,, r2   rH   c                        e Zd Z eej
                  d      ej                  dddfdedededed	ed
ede	de	de
dedeeeeef   f   f fdZdej                   dej                   fdZ xZS )BlockTrI   r$      r   depthr   rK   rL   rM   rN   rO   rP   	use_merge
merge_sizec                 "   t         |           d| _        t        j                  t        |      D cg c]  }t        |||||   ||||	       c} | _        |
rt        |dz  ||      | _
        y t        j                         | _
        y c c}w )NF)r   r   rK   rL   rM   rO   rN   rP   re   )r   
patch_sizerO   )r%   r&   grad_checkpointingr)   rT   rangerH   blocksPatchMergingrZ   
downsample)r/   r   rf   r   rK   rL   rM   rN   rO   rP   rg   rh   ir0   s                r1   r&   zBlock.__init__k   s     	"'mm 5\&
  ##A,'=%#+	&
 " 	 'q!!
 KKM	 	&
s   Br3   r4   c                     | j                  |      }| j                  r6t        j                  j	                         st        | j                  |      }|S | j                  |      }|S r6   )ro   rk   r:   jitis_scriptingr   rm   r8   s     r1   r   zBlock.forward   sS    OOA""599+A+A+Ct{{A.A  AAr2   )r?   r@   rA   r   r)   r`   ra   rB   rb   r   rC   boolr
   r	   r&   r:   rD   r   rE   rF   s   @r1   rd   rd   j   s     $+277D#A$&NN!,"67!*!* !* 	!*
 !* !* %*!* !!* "!* !* !* c5c?23!*F %,, r2   rd   c                        e Zd Zdej                  fdededeeeeef   f   def fdZ	de
j                  de
j                  fd	Z xZS )

PatchEmbed   in_chans	embed_dimrj   rO   c                 z    t         |           t        j                  ||||d      | _         ||      | _        y )NFr!   )r%   r&   r)   r*   projnorm)r/   rx   ry   rj   rO   r0   s        r1   r&   zPatchEmbed.__init__   s5     	IIh	:zPUV	y)	r2   r3   r4   c                 B    | j                  | j                  |            S r6   )r|   r{   r8   s     r1   r   zPatchEmbed.forward   s    yy1&&r2   r?   r@   rA   r)   ra   rB   r
   r	   r   r&   r:   rD   r   rE   rF   s   @r1   rv   rv      sg    
 78$&NN	*	* 	* c5c?23		*
 "	*' '%,, 'r2   rv   c            	            e Zd Zdej                  fdedeeeeef   f   def fdZ	de
j                  de
j                  fdZ xZS )	rn   re   r   rj   rO   c                     t         |           t        j                  |d|z  ||d      | _         |d|z        | _        y )Nre   Fr!   )r%   r&   r)   r*   	reductionr|   )r/   r   rj   rO   r0   s       r1   r&   zPatchMerging.__init__   s<     	3CZeTq3w'	r2   r3   r4   c                 B    | j                  | j                  |            S r6   )r|   r   r8   s     r1   r   zPatchMerging.forward   s    yy*++r2   r~   rF   s   @r1   rn   rn      s]     78$&NN	(( c5c?23( "	(, ,%,, ,r2   rn   c            #           e Zd Zdddddddddd	d
ddd eej
                  d	      ej                  dfdedededede	ee
edf   f   dedede	ee
eef   f   de	ee
eef   f   dededededededed ef" fd!Zd" Zej"                  j$                  d#efd$       Zej"                  j$                  d8d%ed#eeef   fd&       Zej"                  j$                  d9d'       Zej"                  j$                  d#ej2                  fd(       Zd:dedefd)Z	 	 	 	 	 d;d*ej8                  d+ee	eee   f      d,ed-ed.ed/ed#e	eej8                     e
ej8                  eej8                     f   f   fd0Z	 	 	 d<d+e	eee   f   d1ed2efd3Z d*ej8                  d#ej8                  fd4Z!d8d*ej8                  d5ed#ej8                  fd6Z"d*ej8                  d#ej8                  fd7Z# xZ$S )=r   r      avg`   r   re      re   g       @rw   re   Ti   rS   皙?rI   r$   rx   num_classesglobal_poolry   depths.rK   r   rj   rh   
patch_normfeature_dim	drop_ratedrop_path_raterM   rN   rO   rP   c                    t         |           |dv sJ || _        || _        t	        |t
        t        f      s|}t        |      | _        g | _	        t        ||||
r|nt        j                        | _        t        j                  d|t!        |            D cg c]  }|j#                          }}g }t%        | j                        D ]  }t'        |d|z  z        }t)        |||   |||t!        |d |       t!        |d |dz           |||||dk(  rdnd|	      }|j+                  |       | xj                  t-        |d|dz   z  d	| 
      gz  c_	         t        j.                  | | _        t'        |d| j                  dz
  z  z        x| _        }|x| _        }t7        |      | _        t        j:                  ||dddd      | _         |       | _        |rt        j@                  d      nt        j                         | _!        |dkD  rtE        ||d      nt        j                         | _#        | jI                          y c c}w )N)r$   r#   )rx   ry   rj   rO   r   re   r   FT)r   rf   r   rK   rL   rM   rO   rN   rP   rg   rh   zstages.)num_chsr   module	pool_typer!   )%r%   r&   r   r   
isinstancelisttuplelen
num_stagesfeature_inforv   r)   rZ   patch_embedr:   linspacesumitemrl   rB   rd   appenddictrT   stagesnum_featureshead_hidden_sizer   r   r*   	conv_headactFlattenflattenr   
classifier_initialize_weights)r/   rx   r   r   ry   r   rK   r   rj   rh   r   r   r   r   rM   rN   rO   rP   r3   dprstages_listrp   r   stageprev_chsout_chsr0   s                             r1   r&   zFasterNet.__init__   s.   ( 	 9999&"&4-0Ff+%!%/zR[[	
 "'>3v;!OPAqvvxPP t' 	_Ai!q&()CQi#c&!*oc&!a%..AB'=%#+#$6%t%E u%$sa!A#hQXYZX[}"]!^^!	_" mm[1 (+9qT__q=P7Q+Q'RRH*55/+F8WaAEJ;(3rzz!}EPST_&+DAZ\ZeZeZg  "? Qs   I
c                    | j                         D ]  \  }}t        |t        j                        rjt	        |j
                  d       t        |t        j                        sR|j                  _t        j                  j                  |j                  d       t        |t        j                        st	        |j
                  d       |j                  t        j                  j                  |j                  d        y )N{Gz?)stdr   )
named_modulesr   r)   r   r   weightr"   init	constant_r*   )r/   namems      r1   r   zFasterNet._initialize_weights   s    ))+ 	1GD!!RYY'ahhC0a+0BGG%%affa0Aryy)ahhC066%GG%%affa0	1r2   r4   c                     t               S r6   )setr/   s    r1   no_weight_decayzFasterNet.no_weight_decay  s	    ur2   coarsec                 ,    t        d|rdng d      }|S )Nz^patch_embedz^stages\.(\d+)))z^stages\.(\d+).downsample)r   )z^stages\.(\d+)\.blocks\.(\d+)N)z
^conv_head)i )stemrm   )r   )r/   r   matchers      r1   group_matcherzFasterNet.group_matcher  s!     (.$ 5
 r2   c                 4    | j                   D ]	  }||_         y r6   )r   rk   )r/   enabless      r1   set_grad_checkpointingz FasterNet.set_grad_checkpointing  s     	*A#)A 	*r2   c                     | j                   S r6   )r   r   s    r1   get_classifierzFasterNet.get_classifier  s    r2   c                    || _         t        |      | _        |rt        j                  d      nt        j
                         | _        |dkD  rt        | j                  |      | _	        y t        j
                         | _	        y )Nr   r   r   )
r   r   r   r)   r   rZ   r   r   r   r   )r/   r   r   s      r1   reset_classifierzFasterNet.reset_classifier   s[    &/+F(3rzz!}HSVW&!6!6D]_]h]h]jr2   r3   indicesr|   
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   r:   rr   rs   	enumerater   )r/   r3   r   r|   r   r   r   intermediatestake_indices	max_indexr   feat_idxr   s                r1   forward_intermediateszFasterNet.forward_intermediates'  s    * Y&D(DD&"6s4;;7G"Qi Q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   s         r1   prune_intermediate_layersz#FasterNet.prune_intermediate_layersQ  sM     #7s4;;7G"Qikk.9q=1!!!R(r2   c                 J    | j                  |      }| j                  |      }|S r6   )r   r   r8   s     r1   forward_featureszFasterNet.forward_features_  s$    QKKNr2   
pre_logitsc                 *   | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  dkD  r,t        j                  || j                  | j                        }|r|S | j                  |      S )NrS   )ptraining)	r   r   r   r   r   Fdropoutr   r   )r/   r3   r   s      r1   forward_headzFasterNet.forward_headd  sv    QNN1HHQKLLO>>B		!t~~FAq6DOOA$66r2   c                 J    | j                  |      }| j                  |      }|S r6   )r   r   r8   s     r1   r   zFasterNet.forwardm  s'    !!!$a r2   F)T)r   )NFFr   F)r   FT)%r?   r@   rA   r   r)   r`   ra   rB   rC   r
   r	   rb   rt   r   r&   r   r:   rr   ignorer   r   r   r   r   r   Moduler   r   rD   r   r   r   r   r   r   r   rE   rF   s   @r1   r   r      s$    #$2>!6767##!$',.#*277D#A$&NN!,%C#C# C# 	C#
 C# #uS#X./C# C# C# c5c?23C# c5c?23C# C# C# C# "C# %*C#  !!C#" "#C#$ %C#J	1 YY   YY	D 	T#s(^ 	 	 YY* * YY		  kC kc k 8<$$',( ||(  eCcN34(  	( 
 (  (  !%(  
tELL!5tELL7I)I#JJ	K( X ./$#	3S	>*  	%,, 5<< 
7ell 7 7 7 %,, r2   
state_dictmodelr4   c                     | S r6    )r   r   s     r1   checkpoint_filter_fnr   s  s
    2 r2   urlkwargsc                 8    | ddddddt         t        ddd	d
dd|S )Nr   )r       r   )   r   g      ?bicubicg?zpatch_embed.projr   zarXiv:2303.03667z@Run, Don't Walk: Chasing Higher FLOPS for Faster Neural Networksz'https://github.com/JierunChen/FasterNet)r   r   
input_size	pool_sizecrop_pctinterpolationtest_crop_pctmeanr   
first_convr   	paper_ids
paper_name
origin_urlr   )r   r   s     r1   _cfgr     s;    4}SY)c%.B('X?	 	 	r2   ztimm/)	hf_hub_id)zfasternet_t0.in1kzfasternet_t1.in1kzfasternet_t2.in1kzfasternet_s.in1kzfasternet_m.in1kzfasternet_l.in1kvariant
pretrainedc                 N    t        t        | |ft        t        dd      d|}|S )N)r   r   re   r    T)out_indicesflatten_sequential)pretrained_filter_fnfeature_cfg)r   r   r   r   )r   r   r   r   s       r1   _create_fasternetr    s6     7J1\dK 	E Lr2   c           	      j    t        dddt        j                        }t        dd| it        |fi |S )N(   r   rS   ry   r   r   rN   r   )fasternet_t0r   r)   GELUr  r   r   
model_argss      r1   r
  r
    s7    <WYW^W^_Ja
ad:F`Y_F`aar2   c           	      j    t        dddt        j                        }t        dd| it        |fi |S )N@   r   r   r	  r   )fasternet_t1r  r  s      r1   r  r    s7    <XZX_X_`Ja
ad:F`Y_F`aar2   c           	      L    t        ddd      }t        dd| it        |fi |S )Nr   r   g?ry   r   r   r   )fasternet_t2r   r  r  s      r1   r  r    s.    <MJa
ad:F`Y_F`aar2   c           	      L    t        ddd      }t        dd| it        |fi |S )N   )r   re      re   r   r  r   )fasternet_sr  r  s      r1   r  r    .    M#NJ`z`T*E_X^E_``r2   c           	      L    t        ddd      }t        dd| it        |fi |S )N   r    rw      r    g?r  r   )fasternet_mr  r  s      r1   r  r    r  r2   c           	      L    t        ddd      }t        dd| it        |fi |S )N   r  g333333?r  r   )fasternet_lr  r  s      r1   r"  r"    r  r2   )r   r   )8__doc__	functoolsr   typingr   r   r   r   r   r	   r
   r:   torch.nnr)   torch.nn.functional
functionalr   	timm.datar   r   timm.layersr   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__r   r   rH   rd   rv   rn   r   rC   rD   r   r   default_cfgsrt   r  r
  r  r  r  r  r"  r   r2   r1   <module>r1     s  "  ? ? ?     A X X * + ' <-BII 8(ryy (V*BII *Z' ' ,299 ,z		 zzT#u||*;%< RYY SWX[]b]i]iXiSj 8
c 
# 
$sCx. 
 %     +& 8s   PY  bT bS bY b b
 bT bS bY b b
 bT bS bY b b
 aD aC aI a a
 aD aC aI a a
 aD aC aI a ar2   