
    ^jʨ                        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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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jV                        Z, G d dejV                        Z- G d dejV                        Z. G d dejV                        Z/ G d  d!ejV                        Z0 G d" d#ejV                        Z1d$d%d$d&d'd'ejd                  ejf                  dddfd(e4d)e4d*e4d+e4d,e5d-e5d.eejV                     d/eejV                     d0eeejV                        fd1Z6d2 Z7d3 Z8d4 Z9	 	 dd5e)d6e:d7e4d8e	e5ef   fd9Z; G d: dejV                        Z<dd;Z= e>di d< e) e&d=d>d?d@A       e(dBdCdDdEdFdGH      I      dJ e) e&dKd$d?d@A       e(dBdCdDdEdFddGL      I      dM e) e&dKd$d?d@A       e(dBdNdDddOdFdGL      I      dP e) e&d=d>d?d@A       e(dBdNdDd%dddFdGQ      I      dR e) e&d%d$dd'A       e(dSdTd&dUdVdWdGdX      I      dY e) e&d%d$dd'A       e(dZdTd[d\d]dd^      I      d_ e) e&d%d$dd'A       e(d`dTd[d\d]dd^      I      da e) e&d%d$dd'A       e(d`dTd&dFddbddc      I      dd e) e&d%d$dd'A       e(dSdTd&dFddd^      I      de e) e&d%d$dd'A       e(dSdTd&dFddGddf      I      dg e*dFdFh      di e*djdkh      dl e*       dm e*dndoh      dp e*dFdFdGq      dr e*djdkdGq      ds e*dGt      du e*dndodGq      dv e*db e>dOw      x      dy e*dbdndoz      d{ e) e&d|d$d&d'A       e(d}dNd&d~dFdFdb      d      d e*dndodd      d e*dndodddb e>dOw            Z?ddZ@ddZA e$i d eAdd      d eA       d eA       d eAdd      d eAdd      d eA       d eA       d eA       d eAddddd      d eAdddd      d eAd      d eAddddd      d eAddddd      d eAdddddd      d eAdddddd      d eAddddd      d eAddddd       eAd       eAddddd       eAddddd       eAd       eAddddd       eAdddddd      d      ZBe#dde<fd       ZCe#dde<fd       ZDe#dde<fd       ZEe#dde<fd       ZFe#dde<fd       ZGe#dde<fd       ZHe#dde<fd       ZIe#dde<fd       ZJe#dde<fd       ZKe#dde<fd       ZLe#dde<fd       ZMe#dde<fd       ZNe#dde<fd       ZOe#dde<fdÄ       ZPe#dde<fdĄ       ZQe#dde<fdń       ZRe#dde<fdƄ       ZSe#dde<fdǄ       ZTe#dde<fdȄ       ZUe#dde<fdɄ       ZVe#dde<fdʄ       ZWe#dde<fd˄       ZXe#dde<fd̄       ZYy)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                       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
        ]/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/cspnet.pyr    r       sd    +-GU3c3h'(-*+FE#uS#X&'+K!GU38_!D(3-r1   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       r2   _pad_argr=   (   sV    a%'DVFJEz!uaeX%%&&r1   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)r8   rB   r"   r=   r$   rH   rJ   rK   rL   rM   rN   rP   rR   rS   rT   rU   )selfr:   s     r2   __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r1   )r*   r+   r,   rB   r   r-   r.   r"   r$   r   rH   rJ   floatrK   rL   boolrM   r
   r/   rN   r   rP   rR   rS   rT   rU   rY   r0   r1   r2   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9r1   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`   r[   rb   r/   rd   re   r
   r0   r1   r2   r]   r]   X   s:    
ND!Is!!J!"Hhsm"r1   r]   rI   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!   ri   r%   r"   r&   r$   r)   rC   )r%   rj   	   r%         ?cs3)
r"   rB   r$   rK   rJ   rL   rM   rN   rP   rR   r^   r_   rb   )r    r   r6   r]   r?   r-   )width_multiplierdepth_multiplierrL   rb   focusrM   rN   rK   rR   stem_cfgcds               r2   _cs3_cfgrw   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                       e Zd ZdZdddej
                  ej                  ddddddfdeded	ed
edede	ej                     de	ej                     dedee	ej                        dee	ej                        def fdZd Zd Z xZS )BottleneckBlockz  ResNe(X)t Bottleneck Block
    r         ?FN        in_chsr"   dilationrK   rH   rb   rd   	attn_lastrM   
drop_block	drop_pathc                 &   ||d}t         |           t        t        ||z              }t	        ||      }|	d uxr |}|	d uxr | }t        ||fddi||| _        t        ||fd|||
d||| _        |r |	|fd|i|nt        j                         | _
        t        ||fddd	||| _        |r |	|fd|i|nt        j                         | _        |rt        |      nt        j                         | _        t        |      | _        y )
Ndevicedtyperb   rd   r&   r   r%   r&   r}   rH   
drop_layerrb   Fr&   	apply_act)super__init__r-   rounddictr   conv1conv2nnIdentityattn2conv3attn3r   r   r   act3)rX   r|   r"   r}   rK   rH   rb   rd   r~   rM   r   r   r   r   ddmid_chsckwargs
attn_first	__class__s                     r2   r   zBottleneckBlock.__init__   s?     /eGl234z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/	r1   c                 ~    t         j                  j                  | j                  j                  j
                         y rW   )r   initzeros_r   bnweightrX   s    r2   r`   zBottleneckBlock.zero_init_last        
tzz}}++,r1   c                     |}| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      |z   }| j                  |      }|S rW   )r   r   r   r   r   r   r   rX   r9   shortcuts      r2   forwardzBottleneckBlock.forward   so    JJqMJJqMJJqMJJqMJJqMNN1( IIaLr1   )r*   r+   r,   __doc__r   ReLUBatchNorm2dr-   rZ   r   Moduler[   r
   r   r`   r   __classcell__r   s   @r2   ry   ry      s     "&)+*,..#4848!&0&0 &0 	&0
  &0 &0 BII&0 RYY&0 &0 !bii1&0 !bii1&0 &0P-r1   ry   c                   
    e Zd ZdZdddej
                  ej                  dddddf
dededed	ed
ede	ej                     de	ej                     dee	ej                        dee	ej                        def fdZd Zd Z xZS )	DarkBlockz DarkNet Block
    r   rn   Nr{   r|   r"   r}   rK   rH   rb   rd   rM   r   r   c                 v   ||d}t         |           t        t        ||z              }t	        ||      }t        ||fddi||| _        | ||fd|i|nt        j                         | _	        t        ||fd|||	d||| _
        |
rt        |
      | _        y t        j                         | _        y )Nr   r   r&   r   rb   r%   r   r   r   r-   r   r   r   r   r   r   attnr   r   r   rX   r|   r"   r}   rK   rH   rb   rd   rM   r   r   r   r   r   r   r   r   s                   r2   r   zDarkBlock.__init__   s     /eGl234zB QaQ7QbQ
FPF\JwB)BrBbdbmbmbo	 	
 !	
 	
 	

 1:),r{{}r1   c                 ~    t         j                  j                  | j                  j                  j
                         y rW   r   r   r   r   r   r   r   s    r2   r`   zDarkBlock.zero_init_last   r   r1   c                     |}| j                  |      }| j                  |      }| j                  |      }| j                  |      |z   }|S rW   r   r   r   r   r   s      r2   r   zDarkBlock.forward   F    JJqMIIaLJJqMNN1(r1   r*   r+   r,   r   r   r   r   r-   rZ   r   r   r
   r   r`   r   r   r   s   @r2   r   r           "%)+*,..4848! M M  M 	 M
   M  M BII M RYY M !bii1 M !bii1 M  MD-r1   r   c                   
    e Zd ZdZdddej
                  ej                  dddddf
dededed	ed
ede	ej                     de	ej                     dee	ej                        dee	ej                        def fdZd Zd Z xZS )	EdgeBlockzZ EdgeResidual / Fused-MBConv / MobileNetV1-like 3x3 + 1x1 block (w/ activated output)
    r   rn   Nr{   r|   r"   r}   rK   rH   rb   rd   rM   r   r   c                 v   ||d}t         |           t        t        ||z              }t	        ||      }t        ||fd|||	d||| _        | ||fd|i|nt        j                         | _	        t        ||fddi||| _
        |
rt        |
      | _        y t        j                         | _        y )Nr   r   r%   r   rb   r&   r   r   r   s                   r2   r   zEdgeBlock.__init__   s     /eGl234zB 	
 !	
 	
 	

 GQF\JwB)BrBbdbmbmbo	 'RqRGRrR
09),r{{}r1   c                 ~    t         j                  j                  | j                  j                  j
                         y rW   r   r   s    r2   r`   zEdgeBlock.zero_init_last  r   r1   c                     |}| j                  |      }| j                  |      }| j                  |      }| j                  |      |z   }|S rW   r   r   s      r2   r   zEdgeBlock.forward  r   r1   r   r   s   @r2   r   r      r   r1   r   c                         e Zd ZdZdddddddddeddfdededed	ed
edededededee   dedededee	e      de
ej                     f fdZd Z xZS )
CrossStagezCross Stage.rI   r   NFr|   r"   r$   r}   rB   rJ   rK   rS   rH   first_dilationrL   rU   rT   	block_dprblock_fnc                    ||d}t         |           |
xs |}
|r|n|}t        t        ||z              x| _        }t        t        ||z              }t        |j                  d      |j                  d            }|j                  dd       }|dk7  s|
|k7  rx|rYt        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||       |}A t        ||dz  fddi||| _        t        ||fddi||| _        y Nr   rb   rd   r   re   r   r#   r&   r$   rH   r%   r&   r$   r}   rH   re   r   r{   r|   r"   r}   rK   rH   r   r&   r0   )r   r   r-   r   
expand_chsr   getpopr   
Sequential	AvgPool2dr   r   	conv_downconv_expblocksrange
add_moduler/   conv_transition_bconv_transitionrX   r|   r"   r$   r}   rB   rJ   rK   rS   rH   r   rL   rU   rT   r   r   r   r   block_kwargsr   down_chsexp_chsblock_out_chsconv_kwargsre   prev_chsir   s                              r2   r   zCrossStage.__init__*  sG   * /'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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`]_`r1   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)rX   r9   xsxbouts        r2   r   zCrossStage.forward~  s    NN1MM!A-15B[[_##B'224""599b"X1#=>
r1   r*   r+   r,   r   ry   r-   rZ   r
   r[   r	   r   r   r   r   r   r   r   s   @r2   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hr1   r   c                         e Zd ZdZdddddddddeddfdededed	ed
edededededee   dedededee	e      de
ej                     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.
    rI   r   NFr|   r"   r$   r}   rB   rJ   rK   rS   rH   r   rL   rU   rT   r   r   c                 p   ||d}t         |           |
xs |}
|r|n|}t        t        ||z              x| _        }t        t        ||z              }t        |j                  d      |j                  d            }|j                  dd       }|dk7  s|
|k7  rx|rYt        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||       |}A 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   s                              r2   r   zCrossStage3.__init__  s   * /'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mQqQWm[fmjlm"
 "-
" !"!+!%
" "
" 
"  H!DNH $
 &&	

 
 
 a<mmou 	%AKK""3q68 	,%!)*3*?)A,R	, 	, 	, 	 %H	%  +7G``k`]_`r1   c                    | j                  |      }| j                  |      }|j                  | j                  dz  d      \  }}| j	                  |      }| j                  t        j                  ||gd            }|S r   )r   r   r   r   r   r   r   r   )rX   r9   x1x2r   s        r2   r   zCrossStage3.forward  sn    NN1MM!A-15B[[_""599b"X1#=>
r1   r   r   s   @r2   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br1   r   c                        e Zd ZdZdddddedddf	dededed	ed
ededededee   dede	e
j                     deee      f fdZd Z xZS )	DarkStagezDarkNet stage.rI   r   NFr|   r"   r$   r}   rB   rJ   rK   rH   r   rL   r   r   c                    ||d}t         |           |	xs |}	t        |j                  d      |j                  d            }|j	                  dd       }|
rYt        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||       |}A y )Nr   rb   rd   r   re   r#   r   r   r%   r   r{   r   r0   )r   r   r   r   r   r   r   r   r   r   r   r-   r   r   r   r   r/   )rX   r|   r"   r$   r}   rB   rJ   rK   rH   r   rL   r   r   r   r   r   r   r   re   r   r   r   r   s                         r2   r   zDarkStage.__init__  sy   $ /'38\%5%5k%B|O_O_`lOmn##J5]]#)Q;QBKKMFGi1ViWbifhiDN
 )
 '!
 
 
DN E'K"789mmou 	%AKK""3q68 	,%!)*3*?)A,R	, 	, 	, 	 %H	%r1   c                 J    | j                  |      }| j                  |      }|S rW   )r   r   rX   r9   s     r2   r   zDarkStage.forward#  s"    NN1KKNr1   )r*   r+   r,   r   ry   r-   rZ   r
   r[   r   r   r   r	   r   r   r   r   s   @r2   r   r     s     "$"$,0"(7/38%8% 8% 	8%
 8% 8% 8%  8% 8% %SM8% 8% 299o8%  U,8%tr1   r   r%   r!   r#   r'   in_chansr"   r&   r$   r)   r(   rb   rd   re   c                 r   |	|
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        |||f||dk(  r|nd||d|       ||z  }|}t        ||d	j                  d
|g            } |r|dkD  sJ ||j                  |       |F|j                  dt        j                  ddd             |j                  d |d|dd|       d}n*|j                  dt        j                  ddd             d}|dz  }t        ||d	j                  d
|g            }|j                  |       ||fS )Nr   )r   r#      r   convr   r#   r'   )r$   r(   rb   rd   .r^   num_chs	reductionmoduler)   r%   )r&   r$   r(   aa)channelsr$   r0   )r   r   r5   r6   r7   r8   	enumerateappendr   r   r   join	MaxPool2d)r   r"   r&   r$   r)   r(   rb   rd   re   r   r   r   r^   feature_info
stem_depth	prev_featr   last_idxstem_strider   chs	conv_nameconv_stride	pool_names                           r2   create_csp_stemr
  )  s
    U	+B==?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("MHQ"M""MNIOOFBLLQqRS$TUIq[SY[dReIfg		"r1   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 )NrP   )rg   rO   ro   rg   rS   rT   rU   rO   )r   r   r   r   )
stage_argsrP   stage_fns      r2   _get_stage_fnr  c  s    -J////V~t,~t,}d+
 Z	 
u	 Z Zr1   c                 t    | j                  d      }|dv sJ |dk(  rt        | fS |dk(  rt        | fS t        | fS )NrR   )rg   edgerQ   rg   r  )r   r   r   ry   )r  rR   s     r2   _get_block_fnr  r  sP    -J3333V*$$	v	*$$
**r1   c                     | j                  d      }| j                  dd       xs i }|t        |      }|rt        |fi |}|| fS )NrM   rN   )r   r   r   )r  rM   rN   s      r2   _get_attn_fnr  }  sR    -J..5;Kj)
 ;{;Jz!!r1   cfgdrop_path_rateoutput_stride	stem_featc                    ||d}t        | j                        }t        | j                  j                        }|sd g|z  n!t	        || j                  j                  d      |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 )Nr   T)	stagewiser   r   r   r   r   r$   r   r#   r#   )r$   r   r}   r   re   rM   r"   zstages.r   )r   r_   r8   rB   r   zipvaluesr   keysrb   rd   r   r  r  r  r   r   re   r   r   )r  r  r  r  r   r   r   cfg_dict
num_stagesr  r  r   r}   
net_strider   r  r  r_   	stage_idxr  r   attn_fnr$   r   s                           r2   create_csp_stagesr#    s    U	+Bcjj!HSZZ%%&J7ETFZ/!.#**2B2BdS [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]^	5_8 	"==&!<//S \s   ?*Gc                   P    e Zd ZdZ	 	 	 	 	 	 	 	 	 ddedededededede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  r   num_classesr  global_pool	drop_rater  r`   c                 j   t         |           |	|
d}|| _        || _        || _        |dv sJ t        |fi |}t        |j                  |j                  |j                        }g | _
        t        |fi t        |j                        ||\  | _        }| j                  j                  |dd        t        |f|||d   d|\  | _        }|d   d   }| j                  j                  |       |x| _        | _        t'        d
||||d|| _        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!   )rb   rd   re   Nr4   )r  r  r  r   )in_featuresr%  	pool_typer'  )r`   r0   )r   r   r%  r   r'  r   r   rb   rd   re   r  r
  r   r^   extendr#  r_   num_featureshead_hidden_sizer   headr   r   _init_weights)rX   r  r   r%  r  r&  r'  r  r`   r   r   kwargsr   
layer_argsstem_feat_infostage_feat_infor   r   s                    r2   r   zCspNet.__init__  sb   4 	/& "+++c$V$mm~~\\


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

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

 
	 	GM.I4Pr1   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)r7  )r   )r^   r   )r   r   )rX   coarsematchers      r2   group_matcherzCspNet.group_matcher  s0    (.$802BC)5
 r1   c                     |rJ d       y )Nz$gradient checkpointing not supportedr0   )rX   enables     r2   set_grad_checkpointingzCspNet.set_grad_checkpointing  s    AAAz6r1   returnc                 .    | j                   j                  S rW   )r0  fcr   s    r2   get_classifierzCspNet.get_classifier  s    yy||r1   c                 J    || _         | j                  j                  ||       y rW   )r%  r0  reset)rX   r%  r&  s      r2   reset_classifierzCspNet.reset_classifier"  s    &		[1r1   c                 J    | j                  |      }| j                  |      }|S rW   r^   r_   r   s     r2   forward_featureszCspNet.forward_features&  s!    IIaLKKNr1   
pre_logitsc                 N    |r| j                  ||      S | j                  |      S )N)rH  )r0  )rX   r9   rH  s      r2   forward_headzCspNet.forward_head+  s%    6@tyyzy2RdiiPQlRr1   c                 J    | j                  |      }| j                  |      }|S rW   )rG  rJ  r   s     r2   r   zCspNet.forward.  s'    !!!$a r1   )	r%     r!   avgr{   r{   TNNF)TrW   )r*   r+   r,   r   r]   r-   r/   rZ   r[   r   r   jitignorer:  r=  r   r   rA  r
   rD  rG  rJ  r   r   r   s   @r2   r   r     s!    #!#$!$&#'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r1   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nonlinearityr{   g{Gz?)meanstdr`   )r5   r   Conv2dr   kaiming_normal_r   biasr   Linearnormal_hasattrr`   )r   namer`   s      r2   r1  r1  4  s    &"))$
IFS;;"GGNN6;;' #	FBII	&
CT:;;"GGNN6;;' #	GF,<= >r1   cspresnet50ri      r   maxrl   r@   rC   r         @rn   T)rB   r"   r$   rS   rK   rT   rF  cspresnet50d)r!   r!   ri   )rB   r"   r$   rS   rK   rJ   rT   cspresnet50w)rE   rF   rG   i   rz   cspresnext50)rB   r"   r$   rH   rS   rK   rJ   rT   cspdarknet53)r   r#   r)  r)  r   )ri   rD   rE   rF   rG   )rb  rI   )rn   rI   )rI   rn   )rB   r"   r$   rS   rK   rJ   rU   rR   	darknet17)r   r   r   r   r   )r#   )rn   )rI   )rB   r"   r$   rK   rJ   rP   rR   	darknet21)r   r   r   r#   r#   sedarknet21se)rB   r"   r$   rK   rJ   rM   rP   rR   	darknet53darknetaa53)rB   r"   r$   rK   rJ   rL   rP   rR   cs3darknet_s)rq   rr   cs3darknet_mg      ?gq=
ףp?cs3darknet_lcs3darknet_xg      ?gHzG?cs3darknet_focus_s)rq   rr   rs   cs3darknet_focus_mcs3darknet_focus_l)rs   cs3darknet_focus_xcs3sedarknet_l)rd_ratio)rM   rN   cs3sedarknet_x)rM   rq   rr   cs3sedarknet_xdwrk   )r%   rj      r   )r   r   rE   rF   )rB   r"   r$   rH   rK   rJ   rM   rp   cs3edgenet_xg      ?r  )rq   rr   rK   rR   cs3se_edgenet_x)rq   rr   rK   rR   rM   rN   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   rA   )r   r   r#   r%   r   out_indicesT)flatten_sequentialr  )	model_cfgfeature_cfg)
startswithr   r   r   
model_cfgsr   )variant
pretrainedr2  default_out_indicesr  s        r2   _create_cspnetr    so    )$(:(:<(H0-**],?@KW%DkJ 	 r1   c                 2    | dddddt         t        dddd	|S )
NrL  )r%   rE   rE   )r)  r)  gMb?bilinearzstem.conv1.convzhead.fcz
apache-2.0)urlr%  
input_size	pool_sizecrop_pctinterpolationrV  rW  
first_conv
classifierlicenser   )r  r2  s     r2   _cfgr    s2    =vJ%.B'y\  r1   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)rn   rn   rn   )r%   @  r  )r  rV  rW  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_in1kr>  c                     t        dd| i|S )Nr  )r_  r  r  r2  s     r2   r_  r_  H      IJI&IIr1   c                     t        dd| i|S )Nr  )rc  r  r  s     r2   rc  rc  M      JZJ6JJr1   c                     t        dd| i|S )Nr  )rd  r  r  s     r2   rd  rd  R  r  r1   c                     t        dd| i|S )Nr  )re  r  r  s     r2   re  re  W  r  r1   c                     t        dd| i|S )Nr  )rf  r  r  s     r2   rf  rf  \  r  r1   c                     t        dd| i|S )Nr  )rg  r  r  s     r2   rg  rg  a      G*GGGr1   c                     t        dd| i|S )Nr  )rh  r  r  s     r2   rh  rh  f  r  r1   c                     t        dd| i|S )Nr  )ri  r  r  s     r2   ri  ri  k  r  r1   c                     t        dd| i|S )Nr  )rk  r  r  s     r2   rk  rk  p  r  r1   c                     t        dd| i|S )Nr  )rl  r  r  s     r2   rl  rl  u  r  r1   c                     t        dd| i|S )Nr  )rm  r  r  s     r2   rm  rm  z  r  r1   c                     t        dd| i|S )Nr  )rn  r  r  s     r2   rn  rn    r  r1   c                     t        dd| i|S )Nr  )ro  r  r  s     r2   ro  ro    r  r1   c                     t        dd| i|S )Nr  )rp  r  r  s     r2   rp  rp    r  r1   c                     t        dd| i|S )Nr  )rq  r  r  s     r2   rq  rq        P:PPPr1   c                     t        dd| i|S )Nr  )rr  r  r  s     r2   rr  rr    r  r1   c                     t        dd| i|S )Nr  )rs  r  r  s     r2   rs  rs    r  r1   c                     t        dd| i|S )Nr  )rt  r  r  s     r2   rt  rt    r  r1   c                     t        dd| i|S )Nr  )ru  r  r  s     r2   ru  ru        LzLVLLr1   c                     t        dd| i|S )Nr  )rw  r  r  s     r2   rw  rw    r  r1   c                     t        dd| i|S )Nr  )rx  r  r  s     r2   rx  rx    s    NNvNNr1   c                     t        dd| i|S )Nr  )rz  r  r  s     r2   rz  rz    r  r1   c                     t        dd| i|S )Nr  )r{  r  r  s     r2   r{  r{    s    M
MfMMr1   )	rI   rI   Frf   FNNrI   rg   )NNrN  r0   )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=   r?   r]   rw   r   ry   r   r   r   r   r   r   r   r-   r/   r
  r  r  r  rZ   r#  r   r1  r   r  r  r  default_cfgsr_  rc  rd  re  rf  rg  rh  ri  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rw  rx  rz  r{  r0   r1   r2   <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r1   