
    Ng                        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j(                  Z) G d dej(                  Z* G d dej(                  Z+ G d d ej(                  Z, G d! d"ej(                  Z- G d# d$ej(                  Z.d%d&d%d'd(d(ej/        ej0        df	d)Z1d* Z2d+ Z3d, Z4d-e&d.e5d/e6d0e	e7ef         fd1Z8 G d2 dej(                  Z9dd3Z: e;di d4 e& e#d5d6d7d89           e%d:d;d<d=d>d?@          A          dB e& e#dCd%d7d89           e%d:d;d<d=d>dd?D          A          dE e& e#dCd%d7d89           e%d:dFd<ddGd>d?D          A          dH e& e#d5d6d7d89           e%d:dFd<d&ddd>d?I          A          dJ e& e#d&d%dd(9           e%dKdLd'dMdNdOd?dP          A          dQ e& e#d&d%dd(9           e%dRdLdSdTdUddV          A          dW e& e#d&d%dd(9           e%dXdLdSdTdUddV          A          dY e& e#d&d%dd(9           e%dXdLd'd>ddZdd[          A          d\ e& e#d&d%dd(9           e%dKdLd'd>dddV          A          d] e& e#d&d%dd(9           e%dKdLd'd>dd?dd^          A          d_ e'd>d>`          da e'dbdc`          dd e'            de e'dfdg`          dh e'd>d>d?i          dj e'dbdcd?i          dk e'd?l          dm e'dfdgd?i          dn e'dZ e;dGo          p          dq e'dZdfdgr          ds e& e#dtd%d'd(9           e%dudFd'dvd>d>dZw          dx          dy e'dfdgdzd{|          d} e'dfdgdzd{dZ e;dGo          ~          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>d          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            ZVdS )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
<   dS )
CspStemCfg    .out_chs   stride   kernel_size paddingpoolN)__name__
__module____qualname__r   r   intr
   __annotations__r!   r#   r%   strr&   r	        N/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/cspnet.pyr   r      s         +-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:   (   sg    a%'' DVVFJEzz!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dS )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        |          | _        d S 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    
OO4<  A%%%%t{A..t{A..#D$4a88$T%6:: 22"4?A66#D$4a88"4?A66"4?A66$T%6::$T%6::#D$4a8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44*+FE#uS#X&'+++*+FE#uS#X&'+++36KueE3J//066646L%uUCZ001666.3HeD%c	**+3338<JsE#s(O345<<<6:K%eDk 123:::).Jc5:o&...)1Jc5:o&111 58L%uUCZ00177727L%eD#I../77716KtU49--.6669 9 9 9 9r.   r<   c                   h    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
<   d	S )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   sn         
ND!Is!!!!J!!!"Hhsm"""""r.   rZ   rF   Fsiludarkc	                 b    |r%t          t          d z            dddd          }	n,t          t           fddD                       ddd	          }	t          |	t	          t           fd
dD                       t          fddD                       d|d|||d|
  
        |          S )N@      r    r$   )r   r#   r!   r%   r&   c                 4    g | ]}t          |z            S r-   r   .0cwidth_multipliers     r/   
<listcomp>z_cs3_cfg.<locals>.<listcomp>s   s'    RRRA>!.>*>??RRRr.   r   rf   r"   r   r#   r!   r&   c                 4    g | ]}t          |z            S r-   ri   rj   s     r/   rn   z_cs3_cfg.<locals>.<listcomp>x   s'    ___A>!.>*>??___r.   r@   c                 4    g | ]}t          |z            S r-   )r*   )rk   ddepth_multipliers     r/   rn   z_cs3_cfg.<locals>.<listcomp>y   s'    IIIqQ!1122IIIr.   )r"   rg   	   r"         ?cs3)
r   r?   r!   rH   rG   rI   rJ   rK   rM   rO   r[   r\   r_   )r   r   r3   rZ   r<   )
rm   rt   rI   r_   focusrJ   rK   rH   rO   stem_cfgs
   ``        r/   _cs3_cfgr{   b   s     ."2(8#899!QR9 9 9 RRRRRRRSS!". . . ____I^___``IIIILIIIJJ%!#!
 
 
    r.   c            	       V     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                 l   t          t          |                                            t          t	          ||z                      }t          ||          }|	d uo|}|	d uo| }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!          |          | _        d S )	Nr_   ra   r#   r   r"   r#   dilationrE   
drop_layerr_   Fr#   	apply_act)superr}   __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__   sh    	ot$$--///eGl23344zBBBd*8y	t+=I
 KKaK7KK
 W.*+hv!. .%,. .
 BL^ZZ9====QSQ\Q^Q^
 ']qE]]U\]]
AJ]ZZ9====PRP[P]P]
09L),,,r{}}$Y//			r.   c                 b    t           j                            | j        j        j                   d S rT   )r   initzeros_r   bnweightrU   s    r/   r]   zBottleneckBlock.zero_init_last   #    
tz}+,,,,,r.   c                 6   |}|                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          |z   }|                     |          }|S rT   )r   r   r   r   r   r   r   rU   r6   shortcuts      r/   forwardzBottleneckBlock.forward   s~    JJqMMJJqMMJJqMMJJqMMJJqMMNN1( IIaLLr.   r'   r(   r)   __doc__r   ReLUBatchNorm2dr   r]   r   __classcell__r   s   @r/   r}   r}      s          g~0 0 0 0 0 0<- - -      r.   r}   c                   T     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   rv   Nr   c                    t          t          |                                            t          t	          ||z                      }t          ||          }t          ||fddi|| _        | |||          nt          j	                    | _
        t          ||fd|||	d|| _        |
rt          |
          nt          j	                    | _        d S )Nr   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344zBBB KKaK7KK
@J@VJJw)<<<<\^\g\i\i	 W.*+hv!. .%,. .
 1:L),,,r{}}r.   c                 b    t           j                            | j        j        j                   d S rT   r   r   r   r   r   r   r   s    r/   r]   zDarkBlock.zero_init_last   r   r.   c                     |}|                      |          }|                     |          }|                     |          }|                     |          |z   }|S rT   r   r   r   r   r   s      r/   r   zDarkBlock.forward   O    JJqMMIIaLLJJqMMNN1(r.   r   r   s   @r/   r   r                g~M M M M M M0- - -      r.   r   c                   T     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   rv   Nr   c                    t          t          |                                            t          t	          ||z                      }t          ||          }t          ||fd|||	d|| _        | |||          nt          j	                    | _
        t          ||fddi|| _        |
rt          |
          nt          j	                    | _        d S )Nr   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344zBBB G.)*Xf!. .%,. .
 AK@VJJw)<<<<\^\g\i\i	 'LLqLGLL
09L),,,r{}}r.   c                 b    t           j                            | j        j        j                   d S rT   r   r   s    r/   r]   zEdgeBlock.zero_init_last   r   r.   c                     |}|                      |          }|                     |          }|                     |          }|                     |          |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          |                                            |
p|}
|r|n|}t          t	          ||z                      x| _        }t          t	          ||z                      }t          |                    d          |                    d                    }|                    dd           }|dk    s|
|k    rt|rVt          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 ]C}| j                            t'          |           |d|||||	|||         ndd|           |}Dt          ||dz  fddi|| _        t          ||fddi|| _        d S Nr_   ra   r   rb   r   r    r#   r!   rE   r"   r#   r!   r   rE   rb   r   r   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)577v$'g.D(E(E$F$FF'E'K"78899\%5%5k%B%B|O_O_`lOmOmnnn##J55Q;;.H44 6!#'-{{BLOOOgQqQWgg[fgg" "
 "-H"623F^dj%"6 "6)4"6 "6  HH[]]DNH
 $Hgp1T`P`ppdoppa<moou 
	% 
	%AK""3q6688 ,%!)*3*?)A,,R, , , ,    %HH "-Xw!|!b!bQR!bVa!b!b*7GZZZkZZr.   c                 l   |                      |          }|                     |          }|                    | j        dz  d          \  }}|                     |          }|                     |                                          }|                     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5B[[__##B''2244""59b"X1#=#=#=>>
r.   r'   r(   r)   r   r}   r   r   r   r   s   @r/   r   r   
  sy         $!?[ ?[ ?[ ?[ ?[ ?[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                    t          t          |                                            |
p|}
|r|n|}t          t	          ||z                      x| _        }t          t	          ||z                      }t          |                    d          |                    d                    }|                    dd           }|dk    s|
|k    rt|rVt          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 ]C}| j                            t'          |           |d|||||	|||         ndd|           |}Dt          ||fddi|| _        d S 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__[  sV   & 	k4  ))+++'38)577v$'g.D(E(E$F$FF'E'K"78899\%5%5k%B%B|O_O_`lOmOmnnn##J55Q;;.H44 6!#'-{{BLOOOgQqQWgg[fgg" "
 "-H"623F^dj%"6 "6)4"6 "6  HH!DNH $Hgp1T`P`ppdoppa<moou 
	% 
	%AK""3q6688 ,%!)*3*?)A,,R, , , ,    %HH  +7GZZZkZZr.   c                    |                      |          }|                     |          }|                    | j        dz  d          \  }}|                     |          }|                     t          j        ||gd                    }|S r   )r   r   r   r   r   r   r   r   )rU   r6   x1x2r   s        r/   r   zCrossStage3.forward  s~    NN1MM!A-155B[[__""59b"X1#=#=#=>>
r.   r   r   s   @r/   r   r   W  s}          $!<[ <[ <[ <[ <[ <[|      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          |                                            |	p|}	t          |                    d          |                    d                    }|                    dd           }|
rVt          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 ]C}| j                            t#          |           |d||||||||         nd
d|           |}Dd S )Nr_   ra   r   rb   r    r   r   r"   r   r   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__  s     	i'')))'38\%5%5k%B%B|O_O_`lOmOmnnn##J55 	2]#)Q;;QBKMMFGc1VccWbcc DNN
 )2-.v_e!2 2%02 2DN E'K"78899moou 
	% 
	%AK""3q6688 ,%!)*3*?)A,,R, , , ,    %HH
	% 
	%r.   c                 Z    |                      |          }|                     |          }|S rT   )r   r   rU   r6   s     r/   r   zDarkStage.forward  s'    NN1KKNNr.   r   r   s   @r/   r   r     sj         $,% ,% ,% ,% ,% ,%\      r.   r   r"   r   r    r$   c	                    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k    s||k    r
|dk    r|sdnd}|dk    r||
                    |           |	                    |t          |||||dk    r|nd||                     ||z  }|}t          ||d                    d	|g          
          }|r|dk    sJ ||
                    |           |O|	                    dt          j        ddd                     |	                    d ||d                     d}n-|	                    dt          j        ddd                     d}|dz  }t          ||d                    d	|g          
          }|
                    |           |	|
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	    sr    =??DLgt}-- )WJYIHA~HKG$$ h h3"1q5NN	FFvzzqH}}RS\`aagh??y4	***	;c; AvvGG2!$
 $
 $
 	 	 	 	{"[SY[dReIfIfggg		 hzzzz 	***OOFBLQqRS$T$T$TUUUOOD((HQ"G"G"GHHHIIOOFBLQqRS$T$T$TUUUIq[SY[dReIfIfggg		"""r.   c                 
   |                      d          }|dv sJ |dk    rJ|                      dd            |                      dd            |                      dd            t          }n|dk    rt          }nt          }|| fS )NrM   )rd   rL   rw   rd   rP   rQ   rR   rL   )r   r   r   r   )
stage_argsrM   stage_fns      r/   _get_stage_fnr    s    --J/////V~t,,,~t,,,}d+++	u		Zr.   c                     |                      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   r}   )r  rO   s     r/   _get_block_fnr    s\    --J33333V*$$	v		*$$
**r.   c                     |                      d          }|                      dd           pi }|t          |          }|rt          |fi |}|| fS )NrJ   rK   )r   r   r   )r  rJ   rK   s      r/   _get_attn_fnr  )  sf    --J..55;Kj))
 	< ;;{;;Jz!!r.   cfgdrop_path_rateoutput_stride	stem_featc                    t          | j                  t          | j        j                  }|sd g|z  nSd t	          j        d|t          | j        j                                                | j        j                  D             d<   fdt          	                                 D             }t          | j        | j                  }d}|d         }|d         }	|}
g }g }t          |          D ]\  }}t          |          \  }}t          |          \  }}t!          |          \  }}|                    d	          }|dk    r|
r|                    |
           ||k    r|dk    r||z  }d}||z  }|d
v rdnd}| ||	fi |||||| j        |d|gz  }|d         }	t          |	|d|           }
|                    |
           t)          j        | |fS )Nc                 6    g | ]}|                                 S r-   )tolist)rk   r6   s     r/   rn   z%create_csp_stages.<locals>.<listcomp><  s     nnnnnnr.   r   r   c                 n    g | ]1}t          t                                          |                    2S r-   )r   zipkeys)rk   valuescfg_dicts     r/   rn   z%create_csp_stages.<locals>.<listcomp>=  s3    [[[$s8==??F3344[[[r.   r   r   r   r   r!   r   r    r    )r!   r   r   r   rb   rJ   r   zstages.r   )r   r\   r5   r?   r   linspacesumr   r  r  r   r_   ra   r   r  r  r  r   r   rb   r   r   )r  r  r  r  
num_stagesr  r   r   
net_strider   r  r   r\   	stage_idxr  r   attn_fnr!   r   r  s                      @r/   create_csp_stagesr&  3  si    cj!!HSZ%&&J7E oTFZ//nnU^A~s3:CS?T?TUU[[\_\f\lmmnnn [[[[[3HYHYCZ[[[J->  L
 H;'J#HILF!*:!6!6 _ _	:,Z88*,Z88**:66))Q;;9;	***&&6A::HFf
&&00a88

 



 )\

 

 

 

 

 
 
	 i(ZH]R[H]H]^^^			"""=&!<//r.   c                       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"     r   avgr   Tr  c	                    t                                                       || _        || _        |dv sJ t	          |fi |	}t          |j        |j        |j                  }
g | _	        t          |fi t          |j                  |
\  | _        }| j	                            |dd                    t          ||||d                   \  | _        }|d         d         }| j	                            |           |x| _        | _        t%          ||||          | _        t)          t+          t,          |          |            dS )	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.  r0  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_poolr0  r  r]   kwargs
layer_argsstem_feat_infostage_feat_infor   r   s                 r/   r   zCspNet.__init__r  sz   0 	&"++++c$$V$$m~\
 
 


  %4H$_$_sx@P@P$_T^$_$_!	>  !4555 (9)'$R(	(
 (
 (
$_ #2&y1  111 5=<D1" #!	
 
 
	 	GM.III4PPPPPr.   Fc                 D    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)r<  )r   )r[   r   )r   r   )rU   coarsematchers      r/   group_matcherzCspNet.group_matcher  sB    (. $$802BC)5
 
 
 r.   c                     |r
J d            d S )Nz$gradient checkpointing not supportedr-   )rU   enables     r/   set_grad_checkpointingzCspNet.set_grad_checkpointing  s    AAAAAAAAr.   returnc                     | j         j        S rT   )r4  fcr   s    r/   get_classifierzCspNet.get_classifier  s    y|r.   Nr.  r6  c                 J    || _         | j                            ||           d S rT   )r.  r4  reset)rU   r.  r6  s      r/   reset_classifierzCspNet.reset_classifier  s&    &	[11111r.   c                 Z    |                      |          }|                     |          }|S rT   r[   r\   r   s     r/   forward_featureszCspNet.forward_features  s%    IIaLLKKNNr.   
pre_logitsc                 ^    |r|                      ||          n|                      |          S )N)rM  )r4  )rU   r6   rM  s      r/   forward_headzCspNet.forward_head  s-    6@Rtyyzy222diiPQllRr.   c                 Z    |                      |          }|                     |          }|S rT   )rL  rO  r   s     r/   r   zCspNet.forward  s-    !!!$$a  r.   )r"   r(  r   r)  r   r   TF)TrT   )r'   r(   r)   r   rZ   r   r   jitignorer?  rB  r   ModulerF  r*   r	   r,   rI  rL  rX   rO  r   r   r   s   @r/   r   r   h  sb         <Q <Q<Q <Q <Q <Q <Q <Q| Y	 	 	 	 YB B B B Y	    2 2C 2hsm 2 2 2 2  
S S$ S S S S      r.   c                    t          | t          j                  rVt          j                            | j        dd           | j        &t          j                            | j                   d S d S t          | t          j                  rVt          j        	                    | j        dd           | j        &t          j                            | j                   d S d S |r&t          | d          r|                                  d S d S d S )Nfan_outrelu)modenonlinearityr   g{Gz?)meanstdr]   )r2   r   Conv2dr   kaiming_normal_r   biasr   Linearnormal_hasattrr]   )r   namer]   s      r/   r5  r5    s   &")$$ 	 
IFSSS;"GNN6;''''' #"	FBI	&	&  
CT:::;"GNN6;''''' #"	  GF,<==         r.   cspresnet50rf      r   maxrp   r=   r@   r         @rv   T)r?   r   r!   rP   rH   rQ   rK  cspresnet50d)r   r   rf   )r?   r   r!   rP   rH   rG   rQ   cspresnet50w)rB   rC   rD   i   r~   cspresnext50)r?   r   r!   rE   rP   rH   rG   rQ   cspdarknet53)r   r    r+  r+  r   )rf   rA   rB   rC   rD   )rf  rF   )rv   rF   )rF   rv   )r?   r   r!   rP   rH   rG   rR   rO   	darknet17)r   r   r   r   r   )r    )rv   )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)rm   rt   cs3darknet_mg      ?gq=
ףp?cs3darknet_lcs3darknet_xg      ?gHzG?cs3darknet_focus_s)rm   rt   ry   cs3darknet_focus_mcs3darknet_focus_l)ry   cs3darknet_focus_xcs3sedarknet_l)rd_ratio)rJ   rK   cs3sedarknet_x)rJ   rm   rt   cs3sedarknet_xdwro   )r"   rg      r   )r   r   rB   rC   )r?   r   r!   rE   rH   rG   rJ   rx   cs3edgenet_xg      ?r  )rm   rt   rH   rO   cs3se_edgenet_x)rm   rt   rH   rO   rJ   rK   c                     |                      d          s|                      d          rd}nd}|                    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_sequentialr  )	model_cfgfeature_cfg)
startswithr   r   r   
model_cfgsr   )variant
pretrainedr7  default_out_indicesr  s        r/   _create_cspnetr    s    )$$ .(:(:<(H(H .0-**],?@@KW%DkJJJ  	  r.   c                 4    | dddddt           t          ddd
|S )	Nr(  )r"   rB   rB   )r+  r+  gMb?bilinearzstem.conv1.convzhead.fc)
urlr.  
input_size	pool_sizecrop_pctinterpolationrZ  r[  
first_conv
classifierr   )r  r7  s     r/   _cfgr    s5    =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.untrainedz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)r"   @  r  )zcs3darknet_focus_x.untrainedzcs3sedarknet_l.c2ns_in1kzcs3sedarknet_x.c2ns_in1kzcs3sedarknet_xdw.untrainedzcs3edgenet_x.c2_in1kzcs3se_edgenet_x.c2ns_in1krC  c                     t          dd| i|S )Nrc  r  )rc  r  r  r7  s     r/   rc  rc        IIJI&IIIr.   c                     t          dd| i|S )Nrg  r  )rg  r  r  s     r/   rg  rg        JJZJ6JJJr.   c                     t          dd| i|S )Nrh  r  )rh  r  r  s     r/   rh  rh    r  r.   c                     t          dd| i|S )Nri  r  )ri  r  r  s     r/   ri  ri    r  r.   c                     t          dd| i|S )Nrj  r  )rj  r  r  s     r/   rj  rj    r  r.   c                     t          dd| i|S )Nrk  r  )rk  r  r  s     r/   rk  rk         GG*GGGGr.   c                     t          dd| i|S )Nrl  r  )rl  r  r  s     r/   rl  rl    r  r.   c                     t          dd| i|S )Nrm  r  )rm  r  r  s     r/   rm  rm  
  r  r.   c                     t          dd| i|S )Nro  r  )ro  r  r  s     r/   ro  ro    r  r.   c                     t          dd| i|S )Nrp  r  )rp  r  r  s     r/   rp  rp    r  r.   c                     t          dd| i|S )Nrq  r  )rq  r  r  s     r/   rq  rq    r  r.   c                     t          dd| i|S )Nrr  r  )rr  r  r  s     r/   rr  rr    r  r.   c                     t          dd| i|S )Nrs  r  )rs  r  r  s     r/   rs  rs  #  r  r.   c                     t          dd| i|S )Nrt  r  )rt  r  r  s     r/   rt  rt  (  r  r.   c                     t          dd| i|S )Nru  r  )ru  r  r  s     r/   ru  ru  -      PP:PPPPr.   c                     t          dd| i|S )Nrv  r  )rv  r  r  s     r/   rv  rv  2  r  r.   c                     t          dd| i|S )Nrw  r  )rw  r  r  s     r/   rw  rw  7  r  r.   c                     t          dd| i|S )Nrx  r  )rx  r  r  s     r/   rx  rx  <  r  r.   c                     t          dd| i|S )Nry  r  )ry  r  r  s     r/   ry  ry  A      LLzLVLLLr.   c                     t          dd| i|S )Nr{  r  )r{  r  r  s     r/   r{  r{  F  r  r.   c                     t          dd| i|S )Nr|  r  )r|  r  r  s     r/   r|  r|  K  s    NNNvNNNr.   c                     t          dd| i|S )Nr~  r  )r~  r  r  s     r/   r~  r~  P  r  r.   c                     t          dd| i|S )Nr  r  )r  r  r  s     r/   r  r  U  s    MM
MfMMMr.   )	rF   rF   Frc   FNNrF   rd   rQ  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   r{   rT  r}   r   r   r   r   r   r   r   r	  r  r  r  rW   r*   r,   r&  r   r5  r   r  r  r  default_cfgsrc  rg  rh  ri  rj  rk  rl  rm  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  r{  r|  r~  r  r-   r.   r/   <module>r     s    3 2 2 2 2 2 2 2 2 2       4 4 4 4 4 4 4 4 4 4 4 4 4 4        A A A A A A A A i i i i i i i i i i i i i i i i * * * * * * 6 6 6 6 6 6 6 6 < < < < < < < <*        ' ' ' !9 !9 !9 !9 !9 !9 !9 !9H # # # # # # # # " " " "J0 0 0 0 0bi 0 0 0f% % % % %	 % % %P% % % % %	 % % %PJ J J J J J J JZH H H H H") H H HV4 4 4 4 4	 4 4 4p '>3 3 3 3l     + + +" " "202020 20 S>	20 20 20 20jk k k k kRY k k k\
  
  
  
  T ^ ^ ^Z!%HHH|)
 
 

 
 
 
^ Z!AERRR|)
 
 
   ^0 Z!AERRR|*
 
 
   1^H Z!%HHH|*	
 	
 	
   I^b Z!"EEE|!-&'&	
 	
 	
   c^| kZ!"EEE|-
 
 
   }^T kZ!"EEE|!-	
 	
 	
   U^n Z!"EEE|!-

 

 

   o^J kZ!"EEE|!-
 
 
   K^b Z!"EEE|!-	
 	
 	
   c^~ 3EEEE^@ 4$GGGGA^B C^D 4$GGGGE^H  xsRVWWWWI^J  xTXYYYYK^L  xd++++M^N  xTXYYYYO^R 8ts9K9K9KLLLLS^T 8tdUYZZZZU^X ![ZaKKK|*#
 
 
    Y^t 4$UXekllllu^v H3SYTT3%7%7%79 9 9 9w^
B       %$ G&44z| | |G& ddff	G&
 ddffG& DD  G& DDA A AG& 4466G& 4466G&  TTVV!G&" 44 CcS S S#G&* TT A%S: : :+G&4 dd;;;5G&6 dd Bd  7G&@ dd BdT T TAG&H dd B$]`b b bIG&R #DDy$A$A$ASG&T #DD Hd%T %T %TUG&\ #DD Hd%T %T %T]G&d %)Dy$A$A$A $ Dd!T !T !T !% Dc!S !S !S
 #'$Y"?"?"? DcS S S "& E$]`"b "b "bGG& G& G& G GT J Jv J J J J K K K K K K K K K K K K K K K K K K K K K K K K H HV H H H H H HV H H H H J Jv J J J J H HV H H H H J Jv J J J J K K K K K K K K K K K K K K K K K K K K K K K K Q Qf Q Q Q Q Q Qf Q Q Q Q Q Qf Q Q Q Q Q Qf Q Q Q Q M M& M M M M M M& M M M M O OF O O O O K K K K K K N N6 N N N N N Nr.   