
    RЦiʨ                     
   S r SSKJrJrJr  SSKJr  SSKJrJ	r	J
r
JrJrJrJr  SSKrSSKJr  SSKJrJr  SSKJrJrJrJrJrJrJr  SS	KJr  SS
KJ r J!r!  SSK"J#r#J$r$  S/r%\ " S S5      5       r&S r'\ " S S5      5       r(\ " S S5      5       r)         SS jr* " S S\RV                  5      r, " S S\RV                  5      r- " S S\RV                  5      r. " S S\RV                  5      r/ " S  S!\RV                  5      r0 " S" S#\RV                  5      r1S$S%S$S&S'S'\Rd                  \Rf                  SSS4S(\4S)\4S*\4S+\4S,\5S-\5S.\\RV                     S/\\RV                     S0\\\RV                        4S1 jjr6S2 r7S3 r8S4 r9  SS5\)S6\:S7\4S8\	\5\4   4S9 jjr; " S: S\RV                  5      r<SS; jr=\>" S0 S<\)" \&" S=S>S?S@SA9\(" SBSCSDSESFSGSH9SI9_SJ\)" \&" SKS$S?S@SA9\(" SBSCSDSESFSSGSL9SI9_SM\)" \&" SKS$S?S@SA9\(" SBSNSDSSOSFSGSL9SI9_SP\)" \&" S=S>S?S@SA9\(" SBSNSDS%SSSFSGSQ9SI9_SR\)" \&" S%S$SS'SA9\(" SSSTS&SUSVSWSGSSX9SI9_SY\)" \&" S%S$SS'SA9\(" SZSTS[S\S]SSS^9SI9_S_\)" \&" S%S$SS'SA9\(" S`STS[S\S]SSS^9SI9_Sa\)" \&" S%S$SS'SA9\(" S`STS&SFSSbSSSc9SI9_Sd\)" \&" S%S$SS'SA9\(" SSSTS&SFSSSS^9SI9_Se\)" \&" S%S$SS'SA9\(" SSSTS&SFSSGSSSf9SI9_Sg\*" SFSFSh9_Si\*" SjSkSh9_Sl\*" 5       _Sm\*" SnSoSh9_Sp\*" SFSFSGSq9_Sr\*" SjSkSGSq9_Ss\*" SGSt9_Su\*" SnSoSGSq9_Sv\*" Sb\>" SOSw9Sx9_Sy\*" SbSnSoSz9_S{\)" \&" S|S$S&S'SA9\(" S}SNS&S~SFSFSbS9SS9_S\*" SnSoSSS9_S\*" SnSoSSSb\>" SOSw9S9_6r?SS jr@SS jrA\$" 0 S\A" SSS9_S\A" 5       _S\A" 5       _S\A" SSS9_S\A" SSS9_S\A" 5       _S\A" 5       _S\A" 5       _S\A" SSSSSS9_S\A" SSSSS9_S\A" SS9_S\A" SSSSSS9_S\A" SSSSSS9_S\A" SSSSSSS9_S\A" SSSSSSS9_S\A" SSSSSS9_S\A" SSSSSS9_\A" SS9\A" SSSSSS9\A" SSSSSS9\A" SS9\A" SSSSSS9\A" SSSSSSS9S.E5      rB\#SS\<4S jj5       rC\#SS\<4S jj5       rD\#SS\<4S jj5       rE\#SS\<4S jj5       rF\#SS\<4S jj5       rG\#SS\<4S jj5       rH\#SS\<4S jj5       rI\#SS\<4S jj5       rJ\#SS\<4S jj5       rK\#SS\<4S jj5       rL\#SS\<4S jj5       rM\#SS\<4S jj5       rN\#SS\<4S jj5       rO\#SS\<4S jj5       rP\#SS\<4S jj5       rQ\#SS\<4S jj5       rR\#SS\<4S jj5       rS\#SS\<4S jj5       rT\#SS\<4S jj5       rU\#SS\<4S jj5       rV\#SS\<4S jj5       rW\#SS\<4S jj5       rX\#SS\<4S jj5       rYg)a  PyTorch CspNet

A PyTorch implementation of Cross Stage Partial Networks including:
* CSPResNet50
* CSPResNeXt50
* CSPDarkNet53
* and DarkNet53 for good measure

Based on paper `CSPNet: A New Backbone that can Enhance Learning Capability of CNN` - https://arxiv.org/abs/1911.11929

Reference impl via darknet cfg files at https://github.com/WongKinYiu/CrossStagePartialNetworks

Hacked together by / Copyright 2020 Ross Wightman
    )	dataclassasdictreplace)partial)AnyDictListOptionalTupleTypeUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)ClassifierHeadConvNormActDropPathcalculate_drop_path_ratesget_attncreate_act_layermake_divisible   )build_model_with_cfg)named_applyMATCH_PREV_GROUP)register_modelgenerate_default_cfgsCspNetc                       \ rS rSr% Sr\\\\S4   4   \S'   Sr	\\\\S4   4   \S'   Sr
\\S'   S	r\\\4   \S
'   S	r\\   \S'   Srg)
CspStemCfg       .out_chs   stride   kernel_size paddingpool N)__name__
__module____qualname____firstlineno__r#   r   intr   __annotations__r%   r'   r)   strr*   r
   __static_attributes__r+       Q/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/cspnet.pyr    r       sd    +-GU3c3h'(-*+FE#uS#X&'+K!GU38_!D(3-r4   r    c                     [        U [        [        45      (       d  U 4n [        U 5      nX-
  nUS::  a  U S U $ [        X S   4U-  -   5      $ )Nr   )
isinstancetuplelistlen)xncurr_npad_ns       r5   _pad_argr@   (   sU    a%''DVFJEz!ueX%%&&r4   c                      \ rS rSr% Sr\\S4   \S'   Sr\\S4   \S'   Sr	\
\\\S4   4   \S'   S	r\
\\\S4   4   \S
'   Sr\
\\\S4   4   \S'   Sr\
\\\S4   4   \S'   Sr\
\\\S4   4   \S'   Sr\\
\\\S4   4      \S'   Sr\\
\\\   4      \S'   Sr\
\\\   4   \S'   Sr\
\\\   4   \S'   Sr\
\\\S4   4   \S'   Sr\
\\\S4   4   \S'   Sr\
\\\S4   4   \S'   S rSrg)CspStagesCfg3   r&   r&      r$   .depth            r#   r$   r%   r   groups      ?block_ratiobottle_ratioFavg_downN
attn_layerattn_kwargscsp
stage_typebottle
block_typeexpand_ratiocross_lineardown_growthc                    [        U R                  5      n[        U R                  5      U:X  d   e[        U R                  U5      U l        [        U R
                  U5      U l        [        U R                  U5      U l        [        U R                  U5      U l        [        U R                  U5      U l        [        U R                  U5      U l	        [        U R                  U5      U l
        [        U R                  U5      U l        [        U R                  U5      U l        [        U R                  U5      U l        [        U R                  U5      U l        [        U R                  U5      U l        g N)r;   rF   r#   r@   r%   rL   rN   rO   rP   rQ   rR   rT   rV   rW   rX   rY   )selfr=   s     r5   __post_init__CspStagesCfg.__post_init__F   s   

O4<< A%%%t{{A.t{{A.#D$4$4a8$T%6%6: 2"4??A6#D$4$4a8"4??A6"4??A6$T%6%6:$T%6%6:#D$4$4a8r4   )rR   rQ   rP   rN   rV   rO   rX   rY   rW   rL   rT   r%   )r,   r-   r.   r/   rF   r   r0   r1   r#   r%   r   rL   rN   floatrO   rP   boolrQ   r
   r2   rR   r   rT   rV   rW   rX   rY   r]   r3   r+   r4   r5   rB   rB   3   s   )E5c?)4GU38_4*+FE#uS#X&'+*+FE#uS#X&'+36KueE3J//0646L%uUCZ0016.3HeD%c	**+38<JsE#s(O345<6:K%eDk 123:).Jc5:o&.)1Jc5:o&1 58L%uUCZ001727L%eD#I../716KtU49--.69r4   rB   c                   h    \ rS rSr% \\S'   \\S'   Sr\\S'   Sr	\
\S'   Sr\
\S	'   S
r\\
   \S'   Srg
)CspModelCfgX   stemstagesTzero_init_last
leaky_relu	act_layer	batchnorm
norm_layerNaa_layerr+   )r,   r-   r.   r/   r    r1   rB   rf   r`   rh   r2   rj   rk   r
   r3   r+   r4   r5   rb   rb   X   s:    
ND!Is!!J!"Hhsm"r4   rb   rM   siludarkc	                    U(       a  [        [        SU -  5      SSSSS9n	O1[        [        S V
s/ s H  n
[        X-  5      PM     sn
5      SSSS9n	[        U	[	        [        S	 V
s/ s H  n
[        X-  5      PM     sn
5      [        S
 Vs/ s H  n[        X-  5      PM     sn5      SUSUUUSUS9
US9$ s  sn
f s  sn
f s  snf )N@      r$   r(   )r#   r'   r%   r)   r*   r"   ro   r&   r#   r'   r%   r*   rG   )r&   rp   	   r&         ?cs3)
r#   rF   r%   rO   rN   rP   rQ   rR   rT   rV   rd   re   rh   )r    r   r9   rb   rB   r0   )width_multiplierdepth_multiplierrP   rh   focusrQ   rR   rO   rV   stem_cfgcds               r5   _cs3_cfgr}   b   s     "2(8#89!QR9 RA>!*>?RS!". I^_I^A>!*>?I^_`LILqQ12LIJ%!#!
   S
 `Is   B8'B=Cc                     ^  \ rS rSrSrSSS\R                  \R                  SSSSSS4S\S	\S
\S\	S\S\
\R                     S\
\R                     S\S\\
\R                        S\\
\R                        S\	4U 4S jjjrS rS rSrU =r$ )BottleneckBlock   zResNe(X)t Bottleneck Block
    r         ?FN        in_chsr#   dilationrO   rL   rh   rj   	attn_lastrQ   
drop_block	drop_pathc                 V  > XS.n[         TU ]  5         [        [        X$-  5      5      n[	        XgS9nU	S L=(       a    UnU	S L=(       a    U(       + n[        X4SS0UDUD6U l        [        UU4SUUU
S.UDUD6U l        U(       a  U	" U4SU0UD6O[        R                  " 5       U l
        [        X4SSS	.UDUD6U l        U(       a  U	" U4SU0UD6O[        R                  " 5       U l        U(       a  [        U5      O[        R                  " 5       U l        [        U5      U l        g )
Ndevicedtyperh   rj   r'   r   r&   r'   r   rL   
drop_layerrh   Fr'   	apply_act)super__init__r0   rounddictr   conv1conv2nnIdentityattn2conv3attn3r   r   r   act3)r\   r   r#   r   rO   rL   rh   rj   r   rQ   r   r   r   r   ddmid_chsckwargs
attn_first	__class__s                     r5   r   BottleneckBlock.__init__   s5     /eG234Bd*8y	t+=I
 QaQ7QbQ
 	
 !	
 	
 	

 HRZC9CCWYWbWbWd
 cqEcU\c`bc
GPZC9CCVXVaVaVc
09),r{{}$Y/	r4   c                 ~    [         R                  R                  U R                  R                  R
                  5        g r[   )r   initzeros_r   bnweightr\   s    r5   rf   BottleneckBlock.zero_init_last        
tzz}}++,r4   c                     UnU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      U-   nU R                  U5      nU$ r[   )r   r   r   r   r   r   r   r\   r<   shortcuts      r5   forwardBottleneckBlock.forward   so    JJqMJJqMJJqMJJqMJJqMNN1( IIaLr4   )r   r   r   r   r   r   r   )r,   r-   r.   r/   __doc__r   ReLUBatchNorm2dr0   r_   r   Moduler`   r
   r   rf   r   r3   __classcell__r   s   @r5   r   r      s     "&)+*,..#4848!&0&0 &0 	&0
  &0 &0 BII&0 RYY&0 &0 !bii1&0 !bii1&0 &0 &0P- r4   r   c                     ^  \ rS rSrSrSSS\R                  \R                  SSSSS4
S\S\S	\S
\	S\S\
\R                     S\
\R                     S\\
\R                        S\\
\R                        S\	4U 4S jjjrS rS rSrU =r$ )	DarkBlock   zDarkNet Block
    r   rt   Nr   r   r#   r   rO   rL   rh   rj   rQ   r   r   c                 x  > XS.n[         TU ]  5         [        [        X$-  5      5      n[	        XgS9n[        X4SS0UDUD6U l        Ub  U" U4SU0UD6O[        R                  " 5       U l	        [        UU4SUUU	S.UDUD6U l
        U
(       a  [        U
5      U l        g [        R                  " 5       U l        g )Nr   r   r'   r   rh   r&   r   r   r   r0   r   r   r   r   r   r   attnr   r   r   r\   r   r#   r   rO   rL   rh   rj   rQ   r   r   r   r   r   r   r   r   s                   r5   r   DarkBlock.__init__   s     /eG234B QaQ7QbQ
FPF\JwB)BrBbdbmbmbo	 	
 !	
 	
 	

 1:),r{{}r4   c                 ~    [         R                  R                  U R                  R                  R
                  5        g r[   r   r   r   r   r   r   r   s    r5   rf   DarkBlock.zero_init_last   r   r4   c                     UnU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      U-   nU$ r[   r   r   r   r   r   s      r5   r   DarkBlock.forward   F    JJqMIIaLJJqMNN1(r4   r   r   r   r   r,   r-   r.   r/   r   r   r   r   r0   r_   r   r   r
   r   rf   r   r3   r   r   s   @r5   r   r           "%)+*,..4848! M M  M 	 M
   M  M BII M RYY M !bii1 M !bii1 M  M  MD- r4   r   c                     ^  \ rS rSrSrSSS\R                  \R                  SSSSS4
S\S\S	\S
\	S\S\
\R                     S\
\R                     S\\
\R                        S\\
\R                        S\	4U 4S jjjrS rS rSrU =r$ )	EdgeBlock   zYEdgeResidual / Fused-MBConv / MobileNetV1-like 3x3 + 1x1 block (w/ activated output)
    r   rt   Nr   r   r#   r   rO   rL   rh   rj   rQ   r   r   c                 x  > XS.n[         TU ]  5         [        [        X$-  5      5      n[	        XgS9n[        UU4SUUU	S.UDUD6U l        Ub  U" U4SU0UD6O[        R                  " 5       U l	        [        X4SS0UDUD6U l
        U
(       a  [        U
5      U l        g [        R                  " 5       U l        g )Nr   r   r&   r   rh   r'   r   r   r   s                   r5   r   EdgeBlock.__init__   s     /eG234B 	
 !	
 	
 	

 GQF\JwB)BrBbdbmbmbo	 RqRGRrR
09),r{{}r4   c                 ~    [         R                  R                  U R                  R                  R
                  5        g r[   r   r   s    r5   rf   EdgeBlock.zero_init_last  r   r4   c                     UnU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      U-   nU$ r[   r   r   s      r5   r   EdgeBlock.forward  r   r4   r   r   r   s   @r5   r   r      r   r4   r   c                       ^  \ rS rSrSrSSSSSSSSS\SS4S\S\S	\S
\S\S\S\S\S\S\\   S\	S\	S\	S\\
\      S\\R                     4U 4S jjjrS rSrU =r$ )
CrossStagei(  zCross Stage.rM   r   NFr   r#   r%   r   rF   rN   rO   rW   rL   first_dilationrP   rY   rX   	block_dprblock_fnc                   > UUS.n[         TU ]  5         U
=(       d    Un
U(       a  UOUn[        [        X(-  5      5      =U l        n[        [        X&-  5      5      n[        UR                  S5      UR                  S5      S9nUR                  SS 5      nUS:w  d  X:w  a  U(       a\  [        R                  " US:X  a  [        R                  " S5      O[        R                  " 5       [        X4SSU	S.UDUD65      U l        O[        UU4S	UU
U	US
.UDUD6U l        UnO[        R                  " 5       U l        Un[        UU4SU(       + S.UDUD6U l        US-  n[        R                  " 5       U l        [!        U5       HA  nU R                  R#                  [%        U5      U" SUUUUU	Ub  UU   OSS.UDUD65        UnMC     [        UUS-  4SS0UDUD6U l        [        UU4SS0UDUD6U l        g Nr   rh   rj   r   rk   r   r$   r'   r%   rL   r&   r'   r%   r   rL   rk   r   r   r   r#   r   rO   rL   r   r'   r+   )r   r   r0   r   
expand_chsr   getpopr   
Sequential	AvgPool2dr   r   	conv_downconv_expblocksrange
add_moduler2   conv_transition_bconv_transitionr\   r   r#   r%   r   rF   rN   rO   rW   rL   r   rP   rY   rX   r   r   r   r   block_kwargsr   down_chsexp_chsblock_out_chsconv_kwargsrk   prev_chsir   s                              r5   r   CrossStage.__init__*  s:   * /'38)7v$'g.D(E$FF'E'"789\%5%5k%B|O_O_`lOmn##J5Q;.4!#'-{BLLOmQqQWm[fmjlm"
 "-
" !"!+!%
" "
" 
"  H[[]DNH
 $
 &&	

 
 
 a<mmouAKK""3q68 	,%!)*3*?)A,R	, 	, 	, 	 %H  "-Xw!|!hQR!hVa!heg!h*7G``k`]_`r4   c                 2   U R                  U5      nU R                  U5      nUR                  U R                  S-  SS9u  p#U R	                  U5      nU R                  U5      R                  5       nU R                  [        R                  " X#/SS95      nU$ Nr$   r   )dim)
r   r   splitr   r   r   
contiguousr   torchcat)r\   r<   xsxbouts        r5   r   CrossStage.forward~  s    NN1MM!A-15[[_##B'224""599bX1#=>
r4   )r   r   r   r   r   r   r,   r-   r.   r/   r   r   r0   r_   r
   r`   r	   r   r   r   r   r   r3   r   r   s   @r5   r   r   (  s    "$"$"$,0" %!&/3(7%RaRa Ra 	Ra
 Ra Ra Ra  Ra  Ra Ra %SMRa Ra Ra Ra  U,Ra  299o!Ra Rah r4   r   c                       ^  \ rS rSrSrSSSSSSSSS\SS4S\S\S	\S
\S\S\S\S\S\S\\   S\	S\	S\	S\\
\      S\\R                     4U 4S jjjrS rSrU =r$ )CrossStage3i  zXCross Stage 3.
Similar to CrossStage, but with only one transition conv for the output.
rM   r   NFr   r#   r%   r   rF   rN   rO   rW   rL   r   rP   rY   rX   r   r   c                   > UUS.n[         TU ]  5         U
=(       d    Un
U(       a  UOUn[        [        X(-  5      5      =U l        n[        [        X&-  5      5      n[        UR                  S5      UR                  S5      S9nUR                  SS 5      nUS:w  d  X:w  a  U(       a\  [        R                  " US:X  a  [        R                  " S5      O[        R                  " 5       [        X4SSU	S.UDUD65      U l        O[        UU4S	UU
U	US
.UDUD6U l        UnO	S U l        Un[        UU4SU(       + S.UDUD6U l        US-  n[        R                  " 5       U l        [!        U5       HA  nU R                  R#                  [%        U5      U" SUUUUU	Ub  UU   OSS.UDUD65        UnMC     [        UU4SS0UDUD6U l        g r   )r   r   r0   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r   r   s                              r5   r   CrossStage3.__init__  s   * /'38)7v$'g.D(E$FF'E'"789\%5%5k%B|O_O_`lOmn##J5Q;.4!#'-{BLLOmQqQWm[fmjlm"
 "-
" !"!+!%
" "
" 
"  H!DNH $
 &&	

 
 
 a<mmouAKK""3q68 	,%!)*3*?)A,R	, 	, 	, 	 %H   +7G``k`]_`r4   c                     U R                  U5      nU R                  U5      nUR                  U R                  S-  SS9u  p#U R	                  U5      nU R                  [        R                  " X#/SS95      nU$ r   )r   r   r   r   r   r   r   r   )r\   r<   x1x2r   s        r5   r   CrossStage3.forward  sj    NN1MM!A-15[[_""599bX1#=>
r4   )r   r   r   r   r   r   r   s   @r5   r   r     s    "$"$"$,0" %!&/3(7%OaOa Oa 	Oa
 Oa Oa Oa  Oa  Oa Oa %SMOa Oa Oa Oa  U,Oa  299o!Oa Oab r4   r   c                      ^  \ rS rSrSrSSSSS\SSS4	S\S\S	\S
\S\S\S\S\S\\   S\	S\
\R                     S\\\      4U 4S jjjrS rSrU =r$ )	DarkStagei  zDarkNet stage.rM   r   NFr   r#   r%   r   rF   rN   rO   rL   r   rP   r   r   c                   > XS.n[         TU ]  5         U	=(       d    Un	[        UR                  S5      UR                  S5      S9nUR	                  SS 5      nU
(       a\  [
        R                  " US:X  a  [
        R                  " S5      O[
        R                  " 5       [        X4SSUS.UDUD65      U l
        O[        UU4S	UU	UUS
.UDUD6U l
        Un[        [        X&-  5      5      n[
        R                  " 5       U l        [        U5       HA  nU R                  R                  [!        U5      U" SUUUUUUb  UU   OSS.UDUD65        UnMC     g )Nr   rh   rj   r   rk   r$   r   r   r&   r   r   r   r+   )r   r   r   r   r   r   r   r   r   r   r   r0   r   r   r   r   r2   )r\   r   r#   r%   r   rF   rN   rO   rL   r   rP   r   r   r   r   r   r   r   rk   r   r   r   r   s                         r5   r   DarkStage.__init__  sn   $ /'38\%5%5k%B|O_O_`lOmn##J5]]#)Q;QBKKMFi1ViWbifhiDN
 )
 '!
 
 
DN E'"789mmouAKK""3q68 	,%!)*3*?)A,R	, 	, 	, 	 %H r4   c                 J    U R                  U5      nU R                  U5      nU$ r[   )r   r   r\   r<   s     r5   r   DarkStage.forward#  s"    NN1KKNr4   )r   r   )r,   r-   r.   r/   r   r   r0   r_   r
   r`   r   r   r   r	   r   r   r3   r   r   s   @r5   r  r    s     "$"$,0"(7/38%8% 8% 	8%
 8% 8% 8%  8% 8% %SM8% 8% 299o8%  U,8% 8%t r4   r  r&   r"   r$   r(   in_chansr#   r'   r%   r*   r)   rh   rj   rk   c                    XS.n[         R                  " 5       n/ n[        U[        [        45      (       d  U/n[        U5      nU(       d   eUS;   d   eS nU nUS-
  nSn[        U5       H  u  nnSUS-    3nUS:X  a  US:  d  UU:X  a  US:  a	  U(       d  SOSnUS:  a  Ub  UR                  U5        UR                  U[        UUU4UUS:X  a  UOSUUS.UD65        UU-  nUn[        UUS	R                  S
U/5      S9nM     U(       a  US:  d   eUb  UR                  U5        UbD  UR                  S[         R                  " SSSS95        UR                  SU" SUSS.UD65        SnO(UR                  S[         R                  " SSSS95        SnUS-  n[        UUS	R                  S
U/5      S9nUR                  U5        X4$ )Nr   )r   r$      r   convr   r$   r(   )r%   r)   rh   rj   .rd   num_chs	reductionmoduler*   r&   )r'   r%   r)   aa)channelsr%   r+   )r   r   r8   r9   r:   r;   	enumerateappendr   r   r   join	MaxPool2d)r  r#   r'   r%   r*   r)   rh   rj   rk   r   r   r   rd   feature_info
stem_depth	prev_featr   last_idxstem_strider   chs	conv_nameconv_stride	pool_names                           r5   create_csp_stemr#  )  s    	+B==?DLgt}--)WJ:YIHA~HKG$31q5'N	FvzqH}RS\`agh?y4	*	;c;$
 AvG2!$
 $
 	 	{"[SY[dReIfg	 %  zz 	*OOFBLLQqRS$TUOOD("MHQ"M""MNIOOFBLLQqRS$TUIq[SY[dReIfg		"r4   c                     U R                  S5      nUS;   d   eUS:X  a?  U R                  SS 5        U R                  SS 5        U R                  SS 5        [        nX 4$ US:X  a	  [        nX 4$ [        nX 4$ )NrT   )rm   rS   ru   rm   rW   rX   rY   rS   )r   r  r   r   )
stage_argsrT   stage_fns      r5   _get_stage_fnr'  c  s    -J////V~t,~t,}d+
 	 
u	  r4   c                 |    U R                  S5      nUS;   d   eUS:X  a  [        U 4$ US:X  a  [        U 4$ [        U 4$ )NrV   )rm   edgerU   rm   r)  )r   r   r   r   )r%  rV   s     r5   _get_block_fnr*  r  sP    -J3333V*$$	v	*$$
**r4   c                     U R                  S5      nU R                  SS 5      =(       d    0 nUb  [        U5      nU(       a  [        U40 UD6nX4$ )NrQ   rR   )r   r   r   )r%  rQ   rR   s      r5   _get_attn_fnr,  }  sP    -J..5;Kj)
 ;{;J!!r4   cfgdrop_path_rateoutput_stride	stem_featc                    XES.n[        U R                  5      n[        U R                  R                  5      nU(       d  S /U-  O[	        XR                  R                  SS9US'   [        UR                  5       6  V	s/ s H&  n	[        [        UR                  5       U	5      5      PM(     n
n	[        U R                  U R                  S9nSnUS   nUS   nUn/ n/ n[        U
5       H  u  nn
[        U
5      u  nn
[        U
5      u  nn
[        U
5      u  nn
U
R                  S	5      nUS:w  a  U(       a  UR!                  U5        X:  a  US:  a  UU-  nSnUU-  nUS
;   a  SOSnUU" U40 U
DUUUUU R"                  US.DUDUD6/-  nU
S   n[        XSU 3S9nM     UR!                  U5        [$        R&                  " U6 U4$ s  sn	f )Nr   T)	stagewiser   r   r   r  r  r%   r   r$   r$   )r%   r   r   r   rk   rQ   r#   zstages.r  )r   re   r;   rF   r   zipvaluesr   keysrh   rj   r  r'  r*  r,  r   r  rk   r   r   )r-  r.  r/  r0  r   r   r   cfg_dict
num_stagesr5  r%  r   r   
net_strider   r  r  re   	stage_idxr&  r   attn_fnr%   r   s                           r5   create_csp_stagesr<    s    	+Bcjj!HSZZ%%&J7ETFZ/!.**2B2BdS [CFHYCZ[CZ$s8==?F34CZJ[-->>L
 H;'J#HILF!*:!6	:,Z8*,Z8**:6)Q;9	*&6A:HFf
&&0a8

 )\\
 
 
  	 i('R[Q\H]^	5 "78 	"==&!<//S \s   ?-G	c                   l  ^  \ rS rSrSr         SS\S\S\S\S\S\S	\S
\	4U 4S jjjr
\R                  R                  SS j5       r\R                  R                  SS j5       r\R                  R                  S\R"                  4S j5       rSS\S\\   4S jjrS rSS\	4S jjrS rSrU =r$ )r   i  aw  Cross Stage Partial base model.

Paper: `CSPNet: A New Backbone that can Enhance Learning Capability of CNN` - https://arxiv.org/abs/1911.11929
Ref Impl: https://github.com/WongKinYiu/CrossStagePartialNetworks

NOTE: There are differences in the way I handle the 1x1 'expansion' conv in this impl vs the
darknet impl. I did it this way for simplicity and less special cases.
r-  r  num_classesr/  global_pool	drop_rater.  rf   c                 Z  > [         TU ]  5         XS.nX0l        X l        X`l        US;   d   e[        U40 UD6n[        UR                  UR                  UR                  S9n/ U l
        [        U40 [        UR                  5      DUDUD6u  U l        nU R                  R                  USS 5        [        U4UUUS   S.UD6u  U l        nUS   S   nU R                  R                  U5        U=U l        U l        ['        S
UUUUS.UD6U l        [+        [-        [.        US	9U 5        g)a>  
Args:
    cfg (CspModelCfg): Model architecture configuration
    in_chans (int): Number of input channels (default: 3)
    num_classes (int): Number of classifier classes (default: 1000)
    output_stride (int): Output stride of network, one of (8, 16, 32) (default: 32)
    global_pool (str): Global pooling type (default: 'avg')
    drop_rate (float): Dropout rate (default: 0.)
    drop_path_rate (float): Stochastic depth drop-path rate (default: 0.)
    zero_init_last (bool): Zero-init last weight of residual path
    kwargs (dict): Extra kwargs overlayed onto cfg
r   )      r"   )rh   rj   rk   Nr7   )r.  r/  r0  r  )in_featuresr>  	pool_typer@  )rf   r+   )r   r   r>  r  r@  r   r   rh   rj   rk   r  r#  r   rd   extendr<  re   num_featureshead_hidden_sizer   headr   r   _init_weights)r\   r-  r  r>  r/  r?  r@  r.  rf   r   r   kwargsr   
layer_argsstem_feat_infostage_feat_infor   r   s                    r5   r   CspNet.__init__  sZ   4 	/& "+++c$V$mm~~\\


  %4H$esxx@P$eT^$ebd$e!	>  !45 (9(
)'$R(	(

 (
$_ #2&y1  1 5=<D1" 
 #!	

 
	 	GM.I4Pr4   c                 >    [        SU(       a  SO
SS[        4S/S9nU$ )Nz^stem^stages\.(\d+))z^stages\.(\d+)\.blocks\.(\d+)Nz^stages\.(\d+)\..*transition)rQ  )r   )rd   r   )r   r   )r\   coarsematchers      r5   group_matcherCspNet.group_matcher  s0    (.$802BC)5
 r4   c                      U(       a   S5       eg )Nz$gradient checkpointing not supportedr+   )r\   enables     r5   set_grad_checkpointingCspNet.set_grad_checkpointing  s    AAAz6r4   returnc                 .    U R                   R                  $ r[   )rI  fcr   s    r5   get_classifierCspNet.get_classifier  s    yy||r4   c                 F    Xl         U R                  R                  X5        g r[   )r>  rI  reset)r\   r>  r?  s      r5   reset_classifierCspNet.reset_classifier"  s    &		1r4   c                 J    U R                  U5      nU R                  U5      nU$ r[   rd   re   r	  s     r5   forward_featuresCspNet.forward_features&  s!    IIaLKKNr4   
pre_logitsc                 P    U(       a  U R                  XS9$ U R                  U5      $ )N)rg  )rI  )r\   r<   rg  s      r5   forward_headCspNet.forward_head+  s#    6@tyyy2RdiiPQlRr4   c                 J    U R                  U5      nU R                  U5      nU$ r[   )re  ri  r	  s     r5   r   CspNet.forward.  s'    !!!$a r4   )	r@  r  rI  rH  r  r>  rG  re   rd   )	r&     r"   avgr   r   TNNF)Tr[   )r,   r-   r.   r/   r   rb   r0   r2   r_   r`   r   r   jitignorerT  rX  r   r   r]  r
   ra  re  ri  r   r3   r   r   s   @r5   r   r     s-    #!#$!$&#'BQBQ BQ 	BQ
 BQ BQ BQ "BQ !BQ BQH YY	 	 YYB B YY		  2C 2hsm 2
S$ S r4   c                 X   [        U [        R                  5      (       aa  [        R                  R	                  U R
                  SSS9  U R                  b*  [        R                  R                  U R                  5        g g [        U [        R                  5      (       aa  [        R                  R                  U R
                  SSS9  U R                  b*  [        R                  R                  U R                  5        g g U(       a#  [        U S5      (       a  U R                  5         g g g )Nfan_outrelu)modenonlinearityr   g{Gz?)meanstdrf   )r8   r   Conv2dr   kaiming_normal_r   biasr   Linearnormal_hasattrrf   )r  namerf   s      r5   rJ  rJ  4  s    &"))$$
IFS;;"GGNN6;;' #	FBII	&	&
CT:;;"GGNN6;;' #	GF,<== >r4   cspresnet50ro      r  maxrr   rD   rG   r3         @rt   T)rF   r#   r%   rW   rO   rX   rd  cspresnet50d)r"   r"   ro   )rF   r#   r%   rW   rO   rN   rX   cspresnet50w)rI   rJ   rK   i   r   cspresnext50)rF   r#   r%   rL   rW   rO   rN   rX   cspdarknet53)r   r$   rB  rB  r  )ro   rH   rI   rJ   rK   )r  rM   )rt   rM   )rM   rt   )rF   r#   r%   rW   rO   rN   rY   rV   	darknet17)r   r   r   r   r   )r$   )rt   )rM   )rF   r#   r%   rO   rN   rT   rV   	darknet21)r   r   r   r$   r$   sedarknet21se)rF   r#   r%   rO   rN   rQ   rT   rV   	darknet53darknetaa53)rF   r#   r%   rO   rN   rP   rT   rV   cs3darknet_s)rw   rx   cs3darknet_mg      ?gq=
ףp?cs3darknet_lcs3darknet_xg      ?gHzG?cs3darknet_focus_s)rw   rx   ry   cs3darknet_focus_mcs3darknet_focus_l)ry   cs3darknet_focus_xcs3sedarknet_l)rd_ratio)rQ   rR   cs3sedarknet_x)rQ   rw   rx   cs3sedarknet_xdwrq   )r&   rp      r  )r   r   rI   rJ   )rF   r#   r%   rL   rO   rN   rQ   rv   cs3edgenet_xg      ?r)  )rw   rx   rO   rV   cs3se_edgenet_x)rw   rx   rO   rV   rQ   rR   c           	          U R                  S5      (       d  U R                  S5      (       a  SnOSnUR                  SU5      n[        [        X4[        U    [        SUS9S.UD6$ )	Ndarknet
cspdarknet)r   r   r$   r&   r  rE   )r   r   r$   r&   r  out_indicesT)flatten_sequentialr  )	model_cfgfeature_cfg)
startswithr   r   r   
model_cfgsr   )variant
pretrainedrK  default_out_indicesr  s        r5   _create_cspnetr    ss    )$$(:(:<(H(H0-**],?@KW%DkJ 	 r4   c                 2    U SSSSS[         [        SSSS	.UE$ )
Nrm  )r&   rI   rI   )rB  rB  gMb?bilinearzstem.conv1.convzhead.fcz
apache-2.0)urlr>  
input_size	pool_sizecrop_pctinterpolationrw  rx  
first_conv
classifierlicenser   )r  rK  s     r5   _cfgr    s2    =vJ%.B'y\  r4   zcspresnet50.ra_in1kztimm/zlhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/cspresnet50_ra-d3e8d487.pth)	hf_hub_idr  zcspresnet50d.untrainedzcspresnet50w.untrainedzcspresnext50.ra_in1kzqhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/cspresnext50_ra_224-648b4713.pthzcspdarknet53.ra_in1kzqhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/cspdarknet53_ra_256-d05c7c21.pthzdarknet17.untrainedzdarknet21.untrainedzsedarknet21.untrainedzdarknet53.c2ns_in1kzthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/darknet53_256_c2ns-3aeff817.pthbicubic)r&      r  )r  r  r  test_input_sizetest_crop_pctzdarknetaa53.c2ns_in1kzrhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/darknetaa53_c2ns-5c28ec8a.pth)r  r  r  r  zcs3darknet_s.untrained)r  zcs3darknet_m.c2ns_in1kzshttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/cs3darknet_m_c2ns-43f06604.pthgffffff?zcs3darknet_l.c2ns_in1kzshttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/cs3darknet_l_c2ns-16220c5d.pthzcs3darknet_x.c2ns_in1kzshttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/cs3darknet_x_c2ns-4e4490aa.pth)r  r  r  r  r  r  z&cs3darknet_focus_s.ra4_e3600_r256_in1k)rt   rt   rt   )r&   @  r  )r  rw  rx  r  r  r  zcs3darknet_focus_m.c2ns_in1kzyhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/cs3darknet_focus_m_c2ns-e23bed41.pthzcs3darknet_focus_l.c2ns_in1kzyhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/cs3darknet_focus_l_c2ns-65ef8888.pthzuhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/cs3sedarknet_l_c2ns-e8d1dc13.pthzuhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/cs3sedarknet_x_c2ns-b4d0abc0.pthzqhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/cs3edgenet_x_c2-2e1610a9.pthzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/cs3se_edgenet_x_c2ns-76f8e3ac.pth)zcs3darknet_focus_x.untrainedzcs3sedarknet_l.c2ns_in1kzcs3sedarknet_x.c2ns_in1kzcs3sedarknet_xdw.untrainedzcs3edgenet_x.c2_in1kzcs3se_edgenet_x.c2ns_in1krZ  c                     [        SSU 0UD6$ )Nr  )r  r  r  rK  s     r5   r  r  H      IJI&IIr4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r  M      JZJ6JJr4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r  R  r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r  W  r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r  \  r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r  a      G*GGGr4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r  f  r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r  k  r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r  p  r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r  u  r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r  z  r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r    r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r    r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r    r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r        P:PPPr4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r    r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r    r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r    r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r        LzLVLLr4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r    r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r    s    NNvNNr4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r    r  r4   c                     [        SSU 0UD6$ )Nr  )r  r  r  s     r5   r  r    s    M
MfMMr4   )	rM   rM   Frl   FNNrM   rm   )NNro  r+   )r(   )Zr   dataclassesr   r   r   	functoolsr   typingr   r   r	   r
   r   r   r   r   torch.nnr   	timm.datar   r   timm.layersr   r   r   r   r   r   r   _builderr   _manipulater   r   	_registryr   r   __all__r    r@   rB   rb   r}   r   r   r   r   r   r   r  r   r   r0   r2   r#  r'  r*  r,  r_   r<  r   rJ  r   r  r  r  default_cfgsr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r+   r4   r5   <module>r     s   3 2  @ @ @   A E  E  E * 6 <*   ' !9 !9 !9H # # # "J:bii :z/		 /d/		 /d] ]@[")) [|@		 @H %'WW&(nn.2777 7 	7
 7 7 		?7 O7 4		?+7t +" 606060 60 S>	60rqRYY qh
   ^!%H)

^ !AER)
^0 !AER*
1^H !%H*	
I^b !"E!-&'&	
c^| !"E-
}^T !"E!-	
U^n !"E!-

o^J !"E!-
K^b !"E!-	
c^~ 3E^@ 4$GA^B C^D 4$GE^H  sRVWI^J  TXYK^L  d+M^N  TXYO^R ts9KLS^T tdUYZU^X !aK*#
 Y^t 4$UXeklu^v 3SYT3%79w^
B % J&4z|J& df	J&
 dfJ& DJ& DAJ& 46J& 46J&  TV!J&" 4 CcS#J&* T A%S:+J&4 d;5J&6 d Bd7J&@ d BdTAJ&H d B$]`bIJ&R -d/c/SSJ&Z #D Hd%T[J&b #D Hd%TcJ&j %)y$A $ Dd!T !% Dc!S
 #'Y"? cS "& E$]`"bMJ& JZ Jv J J K K K K K K K K K K K K HV H H HV H H Jv J J HV H H Jv J J K K K K K K K K K K K K Qf Q Q Qf Q Q Qf Q Q Qf Q Q M& M M M& M M OF O O K K K N6 N Nr4   