
    khA                     `   d Z ddlmZmZmZ ddlmZ ddlmZ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mZ dd	lmZ dd
lmZmZ ddlm Z m!Z! dgZ"e G d d             Z#d Z$e G d d             Z%e G d d             Z&	 	 	 	 	 	 	 	 	 ddZ' G d dejP                        Z) G d dejP                        Z* G d dejP                        Z+ G d dejP                        Z, G d  d!ejP                        Z- G d" d#ejP                        Z.d$d%d$d&d'd'ej^                  ej`                  df	d(Z1d) Z2d* Z3d+ Z4d,e&d-e5d.e6d/e	e7ef   fd0Z8 G d1 dejP                        Z9dd2Z: e;di d3 e& e#d4d5d6d78       e%d9d:d;d<d=d>?      @      dA e& e#dBd$d6d78       e%d9d:d;d<d=dd>C      @      dD e& e#dBd$d6d78       e%d9dEd;ddFd=d>C      @      dG e& e#d4d5d6d78       e%d9dEd;d%ddd=d>H      @      dI e& e#d%d$dd'8       e%dJdKd&dLdMdNd>dO      @      dP e& e#d%d$dd'8       e%dQdKdRdSdTddU      @      dV e& e#d%d$dd'8       e%dWdKdRdSdTddU      @      dX e& e#d%d$dd'8       e%dWdKd&d=ddYddZ      @      d[ e& e#d%d$dd'8       e%dJdKd&d=dddU      @      d\ e& e#d%d$dd'8       e%dJdKd&d=dd>dd]      @      d^ e'd=d=_      d` e'dadb_      dc e'       dd e'dedf_      dg e'd=d=d>h      di e'dadbd>h      dj e'd>k      dl e'dedfd>h      dm e'dY e;dFn      o      dp e'dYdedfq      dr e& e#dsd$d&d'8       e%dtdEd&dud=d=dYv      dw      dx e'dedfdydz{      d| e'dedfdydzdY e;dFn      }      Z<dd~Z=ddZ> e!i d e>dd      d e>       d e>       d e>dd      d e>dd      d e>       d e>       d e>       d e>ddddd      d e>dddd      d e>d      d e>ddddd      d e>ddddd      d e>dddddd      d e>dddddd      d e>ddddd      d e>ddddd       e>d       e>ddddd       e>ddddd       e>d       e>ddddd       e>dddddd      d      Z?e dde9fd       Z@e dde9fd       ZAe dde9fd       ZBe dde9fd       ZCe dde9fd       ZDe dde9fd       ZEe dde9fd       ZFe dde9fd       ZGe dde9fd       ZHe dde9fd       ZIe dde9fd       ZJe dde9fd       ZKe dde9fd       ZLe dde9fd       ZMe dde9fd       ZNe dde9fd       ZOe dde9fd       ZPe dde9fd       ZQe dde9fd       ZRe dde9fd       ZSe dde9fd       ZTe dde9fd       ZUe dde9fdÄ       ZVy)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OptionalTupleUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)ClassifierHeadConvNormActDropPathget_attncreate_act_layermake_divisible   )build_model_with_cfg)named_applyMATCH_PREV_GROUP)register_modelgenerate_default_cfgsCspNetc                       e Zd ZU dZeeeedf   f   ed<   dZeeeedf   f   ed<   dZ	eed<   dZ
eeef   ed	<   dZee   ed
<   y)
CspStemCfg    .out_chs   stride   kernel_size paddingpoolN)__name__
__module____qualname__r   r   intr
   __annotations__r!   r#   r%   strr&   r	        N/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/cspnet.pyr   r      sd    +-GU3c3h'(-*+FE#uS#X&'+K!GU38_!D(3-r.   r   c                     t        | t        t        f      s| f} t        |       }||z
  }|dk  r| d | S t        | | d   f|z  z         S )Nr   )
isinstancetuplelistlen)xncurr_npad_ns       r/   _pad_argr:   (   sV    a%'DVFJEz!uaeX%%&&r.   c                      e Zd ZU dZeedf   ed<   dZeedf   ed<   dZe	eeedf   f   ed<   dZ
e	eeedf   f   ed	<   d
Ze	eeedf   f   ed<   d
Ze	eeedf   f   ed<   dZe	eeedf   f   ed<   dZee	eeedf   f      ed<   dZee	eee   f      ed<   dZe	eee   f   ed<   dZe	eee   f   ed<   d
Ze	eeedf   f   ed<   dZe	eeedf   f   ed<   dZe	eeedf   f   ed<   d Zy)CspStagesCfg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                    t        | j                        }t        | j                        |k(  sJ t        | j                  |      | _        t        | j
                  |      | _        t        | j                  |      | _        t        | j                  |      | _        t        | j                  |      | _        t        | j                  |      | _	        t        | j                  |      | _
        t        | j                  |      | _        t        | j                  |      | _        t        | j                  |      | _        t        | j                  |      | _        t        | j                  |      | _        y N)r5   r?   r   r:   r!   rE   rG   rH   rI   rJ   rK   rM   rO   rP   rQ   rR   )selfr7   s     r/   __post_init__z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r.   )r'   r(   r)   r?   r
   r*   r+   r   r!   r   rE   rG   floatrH   rI   boolrJ   r	   r,   rK   r   rM   rO   rP   rQ   rR   rV   r-   r.   r/   r<   r<   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9r.   r<   c                   `    e Zd ZU eed<   eed<   dZeed<   dZe	ed<   dZ
e	ed<   d	Zee	   ed
<   y	)CspModelCfgstemstagesTzero_init_last
leaky_relu	act_layer	batchnorm
norm_layerNaa_layer)r'   r(   r)   r   r+   r<   r]   rX   r_   r,   ra   rb   r	   r-   r.   r/   rZ   rZ   X   s:    
ND!Is!!J!"Hhsm"r.   rZ   rF   siludarkc	                    |rt        t        d| z        dddd      }	n2t        t        dD 
cg c]  }
t        |
| z         c}
      ddd      }	t        |	t	        t        d	D 
cg c]  }
t        |
| z         c}
      t        d
D cg c]  }t        ||z         c}      d|d|||d|
      |      S c c}
w c c}
w c c}w )N@      r    r$   )r   r#   r!   r%   r&   r   rf   r"   r   r#   r!   r&   r@   )r"   rg   	   r"         ?cs3)
r   r?   r!   rH   rG   rI   rJ   rK   rM   rO   r[   r\   r_   )r   r   r3   rZ   r<   r*   )width_multiplierdepth_multiplierrI   r_   focusrJ   rK   rH   rO   stem_cfgcds               r/   _cs3_cfgrt   b   s     "2(8#89!QR9 RA>!.>*>?RS!". I^_A>!.>*>?_`LIqQ!112IJ%!#!
   S
 `Is   B9&B>
Cc            	       j     e Zd ZdZdddej
                  ej                  ddddf	 fd	Zd Zd	 Z	 xZ
S )
BottleneckBlockz  ResNe(X)t Bottleneck Block
    r         ?FN        c                    t         t        |           t        t	        ||z              }t        ||      }|	d uxr |}|	d uxr | }t        ||fddi|| _        t        ||fd|||
d|| _        |r
 |	||      nt        j                         | _        t        ||fddd|| _        |r
 |	||      nt        j                         | _        |rt        |      nt        j                         | _        t!        |      | _        y )	Nr_   ra   r#   r   r"   r#   dilationrE   
drop_layerr_   Fr#   	apply_act)superrv   __init__r*   rounddictr   conv1conv2nnIdentityattn2conv3attn3r   	drop_pathr   act3)rU   in_chsr   r|   rH   rE   r_   ra   	attn_lastrJ   
drop_blockr   mid_chsckwargs
attn_first	__class__s                  r/   r   zBottleneckBlock.__init__   s    	ot-/eGl234zBd*8y	t+=I
 KaK7K
 W.*+hv!.%,.
 BLZ9=QSQ\Q\Q^
 ']qE]U\]
AJZ9=PRP[P[P]
09),r{{}$Y/	r.   c                 ~    t         j                  j                  | j                  j                  j
                         y rT   )r   initzeros_r   bnweightrU   s    r/   r]   zBottleneckBlock.zero_init_last        
tzz}}++,r.   c                     |}| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      |z   }| j                  |      }|S rT   )r   r   r   r   r   r   r   rU   r6   shortcuts      r/   forwardzBottleneckBlock.forward   so    JJqMJJqMJJqMJJqMJJqMNN1( IIaLr.   r'   r(   r)   __doc__r   ReLUBatchNorm2dr   r]   r   __classcell__r   s   @r/   rv   rv      s<     gg~~0<-r.   rv   c                   h     e Zd ZdZdddej
                  ej                  dddf fd	Zd Zd Z	 xZ
S )		DarkBlockz DarkNet Block
    r   rk   Nrx   c                 j   t         t        |           t        t	        ||z              }t        ||      }t        ||fddi|| _        |
 |||      nt        j                         | _
        t        ||fd|||	d|| _        |
rt        |
      | _        y t        j                         | _        y )Nrz   r#   r   r~   r"   r{   )r   r   r   r*   r   r   r   r   r   r   attnr   r   r   rU   r   r   r|   rH   rE   r_   ra   rJ   r   r   r   r   r   s                r/   r   zDarkBlock.__init__   s     	i')eGl234zB KaK7K
@J@VJw)<\^\g\g\i	 W.*+hv!.%,.
 1:),r{{}r.   c                 ~    t         j                  j                  | j                  j                  j
                         y rT   r   r   r   r   r   r   r   s    r/   r]   zDarkBlock.zero_init_last   r   r.   c                     |}| j                  |      }| j                  |      }| j                  |      }| j                  |      |z   }|S rT   r   r   r   r   r   s      r/   r   zDarkBlock.forward   F    JJqMIIaLJJqMNN1(r.   r   r   s   @r/   r   r      :     gg~~M0-r.   r   c                   h     e Zd ZdZdddej
                  ej                  dddf fd	Zd Zd Z	 xZ
S )		EdgeBlockzZ EdgeResidual / Fused-MBConv / MobileNetV1-like 3x3 + 1x1 block (w/ activated output)
    r   rk   Nrx   c                 j   t         t        |           t        t	        ||z              }t        ||      }t        ||fd|||	d|| _        |
 |||      nt        j                         | _
        t        ||fddi|| _        |
rt        |
      | _        y t        j                         | _        y )Nrz   r"   r{   r~   r#   r   )r   r   r   r*   r   r   r   r   r   r   r   r   r   r   r   s                r/   r   zEdgeBlock.__init__   s     	i')eGl234zB G.)*Xf!.%,.
 AK@VJw)<\^\g\g\i	 'LqLGL
09),r{{}r.   c                 ~    t         j                  j                  | j                  j                  j
                         y rT   r   r   s    r/   r]   zEdgeBlock.zero_init_last   r   r.   c                     |}| j                  |      }| j                  |      }| j                  |      }| j                  |      |z   }|S rT   r   r   s      r/   r   zEdgeBlock.forward  r   r.   r   r   s   @r/   r   r      r   r.   r   c            
       >     e Zd ZdZdddddddddef
 fd	Zd Z xZS )
CrossStagezCross Stage.rF   r   NFc                    t         t        |           |
xs |}
|r|n|}t        t	        ||z              x| _        }t        t	        ||z              }t        |j                  d      |j                  d            }|j                  dd       }|dk7  s|
|k7  rt|rWt        j                  |dk(  rt        j                  d      nt        j                         t        ||fdd|	d|      | _        nt        ||fd||
|	|d	|| _        |}nt        j                         | _        |}t        ||fd| d
|| _        |dz  }t        j                         | _        t#        |      D ]=  }| j                   j%                  t'        |       |d|||||	|||   ndd|       |}? t        ||dz  fddi|| _        t        ||fddi|| _        y Nr_   ra   rz   rb   r   r    r#   r!   rE   r"   r#   r!   r|   rE   rb   r   rx   r   r   r|   rH   rE   r   r#   r-   )r   r   r   r*   r   
expand_chsr   getpopr   
Sequential	AvgPool2dr   r   	conv_downconv_expblocksrange
add_moduler,   conv_transition_bconv_transitionrU   r   r   r!   r|   r?   rG   rH   rP   rE   first_dilationrI   rR   rQ   	block_dprblock_fnblock_kwargsdown_chsexp_chsblock_out_chsconv_kwargsrb   prev_chsir   s                           r/   r   zCrossStage.__init__  s   & 	j$(*'38)7v$'g.D(E$FF'E'K"789\%5%5k%B|O_O_`lOmn##J5Q;.H4!#'-{BLLOgQqQWg[fg"
 "-H"623F^dj%"6)4"6  H[[]DNH
 $Hgp1T`P`pdopa<mmou 
	%AKK""3q68 ,%!)*3*?)A,R, ,  %H
	% "-Xw!|!bQR!bVa!b*7GZZkZr.   c                 @   | j                  |      }| j                  |      }|j                  | j                  dz  d      \  }}| j	                  |      }| j                  |      j                         }| j                  t        j                  ||gd            }|S Nr    r   )dim)
r   r   splitr   r   r   
contiguousr   torchcat)rU   r6   xsxbouts        r/   r   zCrossStage.forwardM  s    NN1MM!A-15B[[_##B'224""599b"X1#=>
r.   r'   r(   r)   r   rv   r   r   r   r   s   @r/   r   r   
  s2     $!?[Br.   r   c            
       >     e Zd ZdZdddddddddef
 fd	Zd Z xZS )CrossStage3z`Cross Stage 3.
    Similar to CrossStage, but with only one transition conv for the output.
    rF   r   NFc                 Z   t         t        |           |
xs |}
|r|n|}t        t	        ||z              x| _        }t        t	        ||z              }t        |j                  d      |j                  d            }|j                  dd       }|dk7  s|
|k7  rt|rWt        j                  |dk(  rt        j                  d      nt        j                         t        ||fdd|	d|      | _        nt        ||fd||
|	|d	|| _        |}n	d | _        |}t        ||fd| d
|| _        |dz  }t        j                         | _        t#        |      D ]=  }| j                   j%                  t'        |       |d|||||	|||   ndd|       |}? t        ||fddi|| _        y r   )r   r   r   r*   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r,   r   r   s                           r/   r   zCrossStage3.__init__[  s   & 	k4)+'38)7v$'g.D(E$FF'E'K"789\%5%5k%B|O_O_`lOmn##J5Q;.H4!#'-{BLLOgQqQWg[fg"
 "-H"623F^dj%"6)4"6  H!DNH $Hgp1T`P`pdopa<mmou 
	%AKK""3q68 ,%!)*3*?)A,R, ,  %H
	%  +7GZZkZr.   c                    | j                  |      }| j                  |      }|j                  | j                  dz  d      \  }}| j	                  |      }| j                  t        j                  ||gd            }|S r   )r   r   r   r   r   r   r   r   )rU   r6   x1x2r   s        r/   r   zCrossStage3.forward  sn    NN1MM!A-15B[[_""599b"X1#=>
r.   r   r   s   @r/   r   r   W  s4     $!<[|r.   r   c                   8     e Zd ZdZdddddedf fd	Zd Z xZS )	DarkStagezDarkNet stage.rF   r   NFc                    t         t        |           |	xs |}	t        |j	                  d      |j	                  d            }|j                  dd       }|
rWt        j                  |dk(  rt        j                  d      nt        j                         t        ||fdd|d|      | _        nt        ||fd||	||d	|| _        |}t        t        ||z              }t        j                         | _        t        |      D ]=  }| j                  j!                  t#        |       |d||||||||   nd
d|       |}? y )Nr_   ra   rz   rb   r    r   r   r"   r   rx   r   r-   )r   r   r   r   r   r   r   r   r   r   r   r   r*   r   r   r   r   r,   )rU   r   r   r!   r|   r?   rG   rH   rE   r   rI   r   r   r   r   rb   r   r   r   r   s                      r/   r   zDarkStage.__init__  sP     	i')'38\%5%5k%B|O_O_`lOmn##J5]]#)Q;QBKKMFGc1VcWbcDN
 )2-.v_e!2%02DN E'K"789mmou 
	%AKK""3q68 ,%!)*3*?)A,R, ,  %H
	%r.   c                 J    | j                  |      }| j                  |      }|S rT   )r   r   rU   r6   s     r/   r   zDarkStage.forward  s"    NN1KKNr.   r   r   s   @r/   r   r     s(     $,%\r.   r   r"   r   r    r$   c	                 d   t        j                         }	g }
t        |t        t        f      s|g}t        |      }|sJ |dv sJ d }| }|dz
  }d}t        |      D ]  \  }}d|dz    }|dk(  r|dkD  s||k(  r	|dkD  r|sdnd}|dkD  r||
j                  |       |	j                  |t        |||||dk(  r|nd||             ||z  }|}t        ||dj                  d	|g      
      } |r|dkD  sJ ||
j                  |       |E|	j                  dt        j                  ddd             |	j                  d ||d             d}n*|	j                  dt        j                  ddd             d}|dz  }t        ||dj                  d	|g      
      }|
j                  |       |	|
fS )N)r   r       r   convr   r    r$   )r!   r%   r_   ra   .r[   num_chs	reductionmoduler&   r"   )r#   r!   r%   aa)channelsr!   )r   r   r2   r3   r4   r5   	enumerateappendr   r   r   join	MaxPool2d)in_chansr   r#   r!   r&   r%   r_   ra   rb   r[   feature_info
stem_depth	prev_featr   last_idxstem_strider   chs	conv_nameconv_stride	pool_names                        r/   create_csp_stemr    s    ==?DLgt}-)WJ:YIHA~HKG$ h31q5'N	FvzqH}RS\`agh?y4	*	;c; AvG2!$
 	 	{"[SY[dReIfg	h zz 	*OOFBLLQqRS$TUOOD(HQ"GHIOOFBLLQqRS$TUIq[SY[dReIfg		"r.   c                     | j                  d      }|dv sJ |dk(  r@| j                  dd        | j                  dd        | j                  dd        t        }|| fS |dk(  r
t        }|| fS t        }|| fS )NrM   )rd   rL   rl   rd   rP   rQ   rR   rL   )r   r   r   r   )
stage_argsrM   stage_fns      r/   _get_stage_fnr    s    -J////V~t,~t,}d+
 Z	 
u	 Z Zr.   c                 t    | j                  d      }|dv sJ |dk(  rt        | fS |dk(  rt        | fS t        | fS )NrO   )rd   edgerN   rd   r  )r   r   r   rv   )r  rO   s     r/   _get_block_fnr	    sP    -J3333V*$$	v	*$$
**r.   c                     | j                  d      }| j                  dd       xs i }|t        |      }|rt        |fi |}|| fS )NrJ   rK   )r   r   r   )r  rJ   rK   s      r/   _get_attn_fnr  )  sR    -J..5;Kj)
 ;{;Jz!!r.   cfgdrop_path_rateoutput_stride	stem_featc                 *   t        | j                        }t        | j                  j                        }|sd g|z  nrt	        j
                  d|t        | j                  j                              j                  | j                  j                        D cg c]  }|j                          c}|d<   t        |j                          D cg c]%  }t        t        |j                         |            ' }}t        | j                  | j                        }	d}
|d   }|d   }|}g }g }t        |      D ]  \  }}t!        |      \  }}t#        |      \  }}t%        |      \  }}|j'                  d      }|dk7  r|r|j)                  |       ||k\  r|dkD  r|
|z  }
d}||z  }|
dv rdnd	}| ||fi ||||
|| j*                  |d
|	gz  }|d   }t        ||d|       } |j)                  |       t-        j.                  | |fS c c}w c c}w )Nr   r   rz   r   r   r   r!   r   r    r    )r!   r   r|   r   rb   rJ   r   zstages.r   )r   r\   r5   r?   r   linspacesumr   tolistzipvaluesr   keysr_   ra   r   r  r	  r  r   r   rb   r   r   )r  r  r  r  cfg_dict
num_stagesr6   r  r  r   r|   
net_strider   r   r   r\   	stage_idxr  r   attn_fnr!   r   s                         r/   create_csp_stagesr  3  s2    cjj!HSZZ%%&J7ETFZ/"^^A~s3::CSCS?TU[[\_\f\f\l\lmnn [CFHYCZ[$s8==?F34[J[-->>L
 H;'J#HILF!*:!6 _	:,Z8*,Z8**:6)Q;9	*&6A:HFf
&&0a8



 )\\

 

 
 
	 i(Z'R[Q\H]^	3_6 	"==&!<//S 	o[s   H*Hc                   0    e Zd ZdZ	 	 	 	 	 	 	 ddef f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 ZddefdZd Z xZS )r   a  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  c	                 J   t         |           || _        || _        |dv sJ t	        |fi |	}t        |j                  |j                  |j                        }
g | _	        t        |fi t        |j                        |
\  | _        }| j                  j                  |dd        t        ||||d         \  | _        }|d   d   }| j                  j                  |       |x| _        | _        t%        ||||      | _        t)        t+        t,        |      |        y)	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_   ra   rb   Nr1   )r  r  r  r   )in_featuresnum_classes	pool_type	drop_rate)r]   )r   r   r#  r%  r   r   r_   ra   rb   r   r  r   r[   extendr  r\   num_featureshead_hidden_sizer   headr   r   _init_weights)rU   r  r   r#  r  global_poolr%  r  r]   kwargs
layer_argsstem_feat_infostage_feat_infor   r   s                 r/   r   zCspNet.__init__r  s-   0 	&"+++c$V$mm~~\\


  %4H$_sxx@P$_T^$_!	>  !45 (9)'$R(	(
$_ #2&y1  1 5=<D1" #!	
	 	GM.I4Pr.   c                 :    t        d|rdn
ddt        fdg      }|S )Nz^stem^stages\.(\d+))z^stages\.(\d+)\.blocks\.(\d+)Nz^stages\.(\d+)\..*transition)r1  )r   )r[   r   )r   r   )rU   coarsematchers      r/   group_matcherzCspNet.group_matcher  s0    (.$802BC)5
 r.   c                     |rJ d       y )Nz$gradient checkpointing not supportedr-   )rU   enables     r/   set_grad_checkpointingzCspNet.set_grad_checkpointing  s    AAAz6r.   returnc                 .    | j                   j                  S rT   )r)  fcr   s    r/   get_classifierzCspNet.get_classifier  s    yy||r.   r#  r+  c                 J    || _         | j                  j                  ||       y rT   )r#  r)  reset)rU   r#  r+  s      r/   reset_classifierzCspNet.reset_classifier  s    &		[1r.   c                 J    | j                  |      }| j                  |      }|S rT   r[   r\   r   s     r/   forward_featureszCspNet.forward_features  s!    IIaLKKNr.   
pre_logitsc                 N    |r| j                  ||      S | j                  |      S )N)rB  )r)  )rU   r6   rB  s      r/   forward_headzCspNet.forward_head  s%    6@tyyzy2RdiiPQlRr.   c                 J    | j                  |      }| j                  |      }|S rT   )rA  rD  r   s     r/   r   zCspNet.forward  s'    !!!$a r.   )r"     r   avgrx   rx   TF)TrT   )r'   r(   r)   r   rZ   r   r   jitignorer4  r7  r   Moduler;  r*   r	   r,   r>  rA  rX   rD  r   r   r   s   @r/   r   r   h  s     <Q<Q| YY	 	 YYB B YY		  2C 2hsm 2
S$ Sr.   c                 8   t        | t        j                        rct        j                  j	                  | j
                  dd       | j                  *t        j                  j                  | j                         y y t        | t        j                        rct        j                  j                  | j
                  dd       | j                  *t        j                  j                  | j                         y y |rt        | d      r| j                          y y y )Nfan_outrelu)modenonlinearityrx   g{Gz?)meanstdr]   )r2   r   Conv2dr   kaiming_normal_r   biasr   Linearnormal_hasattrr]   )r   namer]   s      r/   r*  r*    s    &"))$
IFS;;"GGNN6;;' #	FBII	&
CT:;;"GGNN6;;' #	GF,<= >r.   cspresnet50rf      r   maxri   r=   r@   r         @rk   T)r?   r   r!   rP   rH   rQ   r@  cspresnet50d)r   r   rf   )r?   r   r!   rP   rH   rG   rQ   cspresnet50w)rB   rC   rD   i   rw   cspresnext50)r?   r   r!   rE   rP   rH   rG   rQ   cspdarknet53)r   r    r   r   r   )rf   rA   rB   rC   rD   )r]  rF   )rk   rF   )rF   rk   )r?   r   r!   rP   rH   rG   rR   rO   	darknet17)r   r   r   r   r   )r    )rk   )rF   )r?   r   r!   rH   rG   rM   rO   	darknet21)r   r   r   r    r    sedarknet21se)r?   r   r!   rH   rG   rJ   rM   rO   	darknet53darknetaa53)r?   r   r!   rH   rG   rI   rM   rO   cs3darknet_s)rn   ro   cs3darknet_mg      ?gq=
ףp?cs3darknet_lcs3darknet_xg      ?gHzG?cs3darknet_focus_s)rn   ro   rp   cs3darknet_focus_mcs3darknet_focus_l)rp   cs3darknet_focus_xcs3sedarknet_l)rd_ratio)rJ   rK   cs3sedarknet_x)rJ   rn   ro   cs3sedarknet_xdwrh   )r"   rg      r   )r   r   rB   rC   )r?   r   r!   rE   rH   rG   rJ   rm   cs3edgenet_xg      ?r  )rn   ro   rH   rO   cs3se_edgenet_x)rn   ro   rH   rO   rJ   rK   c                     | j                  d      s| j                  d      rd}nd}|j                  d|      }t        t        | |ft        |    t        d|      d|S )	Ndarknet
cspdarknet)r   r   r    r"   r   r>   )r   r   r    r"   r   out_indicesT)flatten_sequentialrz  )	model_cfgfeature_cfg)
startswithr   r   r   
model_cfgsr   )variant
pretrainedr,  default_out_indicesrz  s        r/   _create_cspnetr    so    )$(:(:<(H0-**],?@KW%DkJ 	 r.   c                 0    | dddddt         t        ddd
|S )	NrF  )r"   rB   rB   )r   r   gMb?bilinearzstem.conv1.convzhead.fc)
urlr#  
input_size	pool_sizecrop_pctinterpolationrQ  rR  
first_conv
classifierr   )r  r,  s     r/   _cfgr    s0    =vJ%.B'y  r.   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)rk   rk   rk   )r"   @  r  )r  rQ  rR  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_in1kr8  c                     t        dd| i|S )Nr  )rZ  r  r  r,  s     r/   rZ  rZ        IJI&IIr.   c                     t        dd| i|S )Nr  )r^  r  r  s     r/   r^  r^        JZJ6JJr.   c                     t        dd| i|S )Nr  )r_  r  r  s     r/   r_  r_    r  r.   c                     t        dd| i|S )Nr  )r`  r  r  s     r/   r`  r`    r  r.   c                     t        dd| i|S )Nr  )ra  r  r  s     r/   ra  ra    r  r.   c                     t        dd| i|S )Nr  )rb  r  r  s     r/   rb  rb        G*GGGr.   c                     t        dd| i|S )Nr  )rc  r  r  s     r/   rc  rc    r  r.   c                     t        dd| i|S )Nr  )rd  r  r  s     r/   rd  rd    r  r.   c                     t        dd| i|S )Nr  )rf  r  r  s     r/   rf  rf    r  r.   c                     t        dd| i|S )Nr  )rg  r  r  s     r/   rg  rg    r  r.   c                     t        dd| i|S )Nr  )rh  r  r  s     r/   rh  rh    r  r.   c                     t        dd| i|S )Nr  )ri  r  r  s     r/   ri  ri  !  r  r.   c                     t        dd| i|S )Nr  )rj  r  r  s     r/   rj  rj  &  r  r.   c                     t        dd| i|S )Nr  )rk  r  r  s     r/   rk  rk  +  r  r.   c                     t        dd| i|S )Nr  )rl  r  r  s     r/   rl  rl  0      P:PPPr.   c                     t        dd| i|S )Nr  )rm  r  r  s     r/   rm  rm  5  r  r.   c                     t        dd| i|S )Nr  )rn  r  r  s     r/   rn  rn  :  r  r.   c                     t        dd| i|S )Nr  )ro  r  r  s     r/   ro  ro  ?  r  r.   c                     t        dd| i|S )Nr  )rp  r  r  s     r/   rp  rp  D      LzLVLLr.   c                     t        dd| i|S )Nr  )rr  r  r  s     r/   rr  rr  I  r  r.   c                     t        dd| i|S )Nr  )rs  r  r  s     r/   rs  rs  N  s    NNvNNr.   c                     t        dd| i|S )Nr  )ru  r  r  s     r/   ru  ru  S  r  r.   c                     t        dd| i|S )Nr  )rv  r  r  s     r/   rv  rv  X  s    M
MfMMr.   )	rF   rF   Frc   FNNrF   rd   rH  r-   )r$   )Wr   dataclassesr   r   r   	functoolsr   typingr   r   r	   r
   r   r   torch.nnr   	timm.datar   r   timm.layersr   r   r   r   r   r   _builderr   _manipulater   r   	_registryr   r   __all__r   r:   r<   rZ   rt   rK  rv   r   r   r   r   r   r   r   r  r  r	  r  rW   r*   r,   r  r   r*  r   r  r  r  default_cfgsrZ  r^  r_  r`  ra  rb  rc  rd  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rr  rs  ru  rv  r-   r.   r/   <module>r     sz
   3 2  4 4   A i i * 6 <*   ' !9 !9 !9H # # # "J0bii 0f%		 %P%		 %PJ JZH")) HV4		 4p ''>>3l +"202020 20 S>	20jkRYY k\
   ^!%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r.   