U
    ¯Ê¹j\œ  ã                    @   s(  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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„ dƒƒZ$dd„ Z%eG dd„ dƒƒZ&eG dd„ dƒƒZ'dºdd„Z(G dd„ dej)ƒZ*G dd„ dej)ƒZ+G dd „ d ej)ƒZ,G d!d"„ d"ej)ƒZ-G d#d$„ d$ej)ƒZ.G d%d&„ d&ej)ƒZ/d'd(d'd)d*d*ej0ej1df	d+d,„Z2d-d.„ Z3d/d0„ Z4d1d2„ Z5e'e6e7e	e8ef d3œd4d5„Z9G d6d„ dej)ƒZ:d»d7d8„Z;e<e'e$d9d:d;d<d=�e&d>d?d@dAdBdCdD�dE�e'e$dFd'd;d<d=�e&d>d?d@dAdBddCdG�dE�e'e$dFd'd;d<d=�e&d>dHd@ddIdBdCdG�dE�e'e$d9d:d;d<d=�e&d>dHd@d(dddBdCdJ�dE�e'e$d(d'dd*d=�e&dKdLd)dMdNdOdCddP�dE�e'e$d(d'dd*d=�e&dQdLdRdSdTdddU�dE�e'e$d(d'dd*d=�e&dVdLdRdSdTdddU�dE�e'e$d(d'dd*d=�e&dVdLd)dBddWdddX�dE�e'e$d(d'dd*d=�e&dKdLd)dBddddU�dE�e'e$d(d'dd*d=�e&dKdLd)dBddCdddY�dE�e(dBdBdZ�e(d[d\dZ�e(ƒ e(d]d^dZ�e(dBdBdCd_�e(d[d\dCd_�e(dCd`�e(d]d^dCd_�e(dWe<dIda�db�e(dWd]d^dc�e'e$ddd'd)d*d=�e&dedHd)dfdBdBdWdg�ddh�e(d]d^didjdk�e(d]d^didjdWe<dIda�dl�dm�Z=d¼dndo„Z>d½dpdq„Z?e"e?drdsdt�e?ƒ e?ƒ e?drdudt�e?drdvdt�e?ƒ e?ƒ e?ƒ e?drdwdxdyddz�e?drd{dydd|�e?dxd}�e?drd~dxdyddz�e?drd€dxdyddz�e?drd�dxddydd‚�e?dxd}�e?drdƒdxdyddz�e?drd„dxdyddz�e?dxd}�e?drd…dxdyddz�e?drd†dxdyddz�e?dxd}�e?drd‡dxdyddz�e?drdˆdxdd‰dd‚�dŠœƒZ@e!d¾e:d‹œdŒd�„ƒZAe!d¿e:d‹œdŽd�„ƒZBe!dÀe:d‹œd�d‘„ƒZCe!dÁe:d‹œd’d“„ƒZDe!dÂe:d‹œd”d•„ƒZEe!dÃe:d‹œd–d—„ƒZFe!dÄe:d‹œd˜d™„ƒZGe!dÅe:d‹œdšd›„ƒZHe!dÆe:d‹œdœd�„ƒZIe!dÇe:d‹œdždŸ„ƒZJe!dÈe:d‹œd d¡„ƒZKe!dÉe:d‹œd¢d£„ƒZLe!dÊe:d‹œd¤d¥„ƒZMe!dËe:d‹œd¦d§„ƒZNe!dÌe:d‹œd¨d©„ƒZOe!dÍe:d‹œdªd«„ƒZPe!dÎe:d‹œd¬d­„ƒZQe!dÏe:d‹œd®d¯„ƒZRe!dÐe:d‹œd°d±„ƒZSe!dÑe:d‹œd²d³„ƒZTe!dÒe:d‹œd´dµ„ƒZUe!dÓe:d‹œd¶d·„ƒZVe!dÔe:d‹œd¸d¹„ƒZWd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ÚConvNormActAaÚDropPathÚget_attnÚcreate_act_layerÚmake_divisibleé   )Úbuild_model_with_cfg)Únamed_applyÚMATCH_PREV_GROUP)Úregister_modelÚgenerate_default_cfgsÚCspNetc                   @   sv   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   © r,   r,   úQ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/cspnet.pyr      s
   
r   c                 C   sN   t | ttfƒs| f} t| ƒ}|| }|dkr8| d |… S t| | d f|  ƒS )Nr   éÿÿÿÿ)Ú
isinstanceÚtupleÚlistÚlen)ÚxÚnZcurr_nZpad_nr,   r,   r-   Ú_pad_arg(   s    r5   c                   @   sŠ  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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                 C   sÈ   t | jƒ}t | jƒ|kst‚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)r2   r9   r   ÚAssertionErrorr5   r    r?   rA   rB   rC   rD   rE   rG   rI   rJ   rK   rL   )Úselfr4   r,   r,   r-   Ú__post_init__F   s    
zCspStagesCfg.__post_init__)r&   r'   r(   r9   r	   r)   r*   r   r    r
   r?   rA   ÚfloatrB   rC   ÚboolrD   r   r+   rE   r   rG   rI   rJ   rK   rL   rP   r,   r,   r,   r-   r6   3   s   
 r6   c                   @   sR   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_lastZ
leaky_reluÚ	act_layerZ	batchnormÚ
norm_layerNÚaa_layer)r&   r'   r(   r   r*   r6   rV   rR   rW   r+   rX   rY   r   r,   r,   r,   r-   rS   X   s   
rS   r@   FÚsiluÚdarkc	           
         sŒ   |r t tdˆ ƒddddd�}	n"t t‡fdd„dD ƒƒd	ddd
�}	t|	tt‡fdd„dD ƒƒt‡ fdd„dD ƒƒd|d|||d|d�
|d�S )Né@   é   r   r#   )r   r"   r    r$   r%   c                    s   g | ]}t |ˆ  ƒ‘qS r,   ©r   ©Ú.0Úc©Úwidth_multiplierr,   r-   Ú
<listcomp>s   s     z_cs3_cfg.<locals>.<listcomp>©r   r\   r!   ©r   r"   r    r%   c                    s   g | ]}t |ˆ  ƒ‘qS r,   r^   r_   rb   r,   r-   rd   x   s     r:   c                    s   g | ]}t |ˆ  ƒ‘qS r,   )r)   )r`   Úd)Údepth_multiplierr,   r-   rd   y   s     )r!   r]   é	   r!   ç      à?Úcs3)
r   r9   r    rB   rA   rC   rD   rE   rG   rI   ©rT   rU   rW   )r   r   r0   rS   r6   )
rc   rh   rC   rW   ÚfocusrD   rE   rB   rI   Zstem_cfgr,   )rh   rc   r-   Ú_cs3_cfgb   s<    
   þ  þöòrn   c                	       sH   e Zd ZdZdddejejddddf	‡ fdd„	Zd	d
„ Zdd„ Z	‡  Z
S )ÚBottleneckBlockz  ResNe(X)t Bottleneck Block
    r   ç      Ð?FNç        c                    sì   t t| ƒ ¡  tt|| ƒƒ}t||d�}|	d k	o4|}|	d k	oB| }t||fddi|—Ž| _t||fd|||
dœ|—Ž| _|rŠ|	||d�nt	 
¡ | _t||fdddœ|—Ž| _|r¾|	||d�nt	 
¡ | _|rÔt|ƒnt	 
¡ | _t|ƒ| _d S )	N©rW   rX   r"   r   r!   ©r"   Údilationr?   Z
drop_layer©rW   F©r"   Z	apply_act)Úsuperro   Ú__init__r)   ÚroundÚdictr   Úconv1Úconv2ÚnnÚIdentityÚattn2Úconv3Úattn3r   Ú	drop_pathr   Úact3)rO   Úin_chsr   rt   rB   r?   rW   rX   Z	attn_lastrD   Ú
drop_blockr‚   Úmid_chsÚckwargsZ
attn_first©Ú	__class__r,   r-   rx   ‹   s,     ÿ  þþzBottleneckBlock.__init__c                 C   s   t j | jjj¡ d S rM   )r}   ÚinitÚzeros_r€   ÚbnÚweight©rO   r,   r,   r-   rV   ©   s    zBottleneckBlock.zero_init_lastc                 C   sR   |}|   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡| }|  |¡}|S rM   )r{   r|   r   r€   r�   r‚   rƒ   ©rO   r3   Zshortcutr,   r,   r-   Úforward¬   s    





zBottleneckBlock.forward©r&   r'   r(   Ú__doc__r}   ÚReLUÚBatchNorm2drx   rV   r�   Ú__classcell__r,   r,   rˆ   r-   ro   ‡   s   ôro   c                       sF   e Zd ZdZdddejejdddf‡ fdd„	Zdd	„ Zd
d„ Z	‡  Z
S )Ú	DarkBlockz DarkNet Block
    r   rj   Nrq   c                    s˜   t t| ƒ ¡  tt|| ƒƒ}t||d�}t||fddi|—Ž| _|d k	rV|||d�nt 	¡ | _
t||fd|||	dœ|—Ž| _|
rŠt|
ƒnt 	¡ | _d S )Nrr   r"   r   ru   r!   rs   )rw   r–   rx   r)   ry   rz   r   r{   r}   r~   Úattnr|   r   r‚   ©rO   r„   r   rt   rB   r?   rW   rX   rD   r…   r‚   r†   r‡   rˆ   r,   r-   rx   ¾   s"     ÿ  þþzDarkBlock.__init__c                 C   s   t j | jjj¡ d S rM   ©r}   rŠ   r‹   r|   rŒ   r�   rŽ   r,   r,   r-   rV   Ö   s    zDarkBlock.zero_init_lastc                 C   s4   |}|   |¡}|  |¡}|  |¡}|  |¡| }|S rM   ©r{   r—   r|   r‚   r�   r,   r,   r-   r�   Ù   s    


zDarkBlock.forwardr‘   r,   r,   rˆ   r-   r–   º   s   õr–   c                       sF   e Zd ZdZdddejejdddf‡ fdd„	Zdd	„ Zd
d„ Z	‡  Z
S )Ú	EdgeBlockzZ EdgeResidual / Fused-MBConv / MobileNetV1-like 3x3 + 1x1 block (w/ activated output)
    r   rj   Nrq   c                    s˜   t t| ƒ ¡  tt|| ƒƒ}t||d�}t||fd|||	dœ|—Ž| _|d k	r\|||d�nt 	¡ | _
t||fddi|—Ž| _|
rŠt|
ƒnt 	¡ | _d S )Nrr   r!   rs   ru   r"   r   )rw   r›   rx   r)   ry   rz   r   r{   r}   r~   r—   r|   r   r‚   r˜   rˆ   r,   r-   rx   æ   s"     ÿ  þþzEdgeBlock.__init__c                 C   s   t j | jjj¡ d S rM   r™   rŽ   r,   r,   r-   rV   þ   s    zEdgeBlock.zero_init_lastc                 C   s4   |}|   |¡}|  |¡}|  |¡}|  |¡| }|S rM   rš   r�   r,   r,   r-   r�     s    


zEdgeBlock.forwardr‘   r,   r,   rˆ   r-   r›   â   s   õr›   c                
       s>   e Zd ZdZdddddddddef
‡ fdd„	Zdd	„ Z‡  ZS )
Ú
CrossStagezCross Stage.r@   r   NFc                    s¦  t t| ƒ ¡  |
p|}
|r|n|}tt|| ƒƒ | _}tt|| ƒƒ}t| d¡| d¡d�}| dd ¡}|dks||
|krâ|r¼t	 
|dkr–t	 d¡nt	 ¡ t||fdd|	dœ|—Ž¡| _n t||fd||
|	|d	œ|—Ž| _|}nt	 ¡ | _|}t||fd| d
œ|—Ž| _|d }t	 
¡ | _t|ƒD ]F}| j t|ƒ|f |||||	|d k	�rV|| nddœ|—Ž¡ |}�q&t||d fddi|—Ž| _t||fddi|—Ž| _d S ©NrW   rX   rr   rY   r   r   ©r"   r    r?   r!   ©r"   r    rt   r?   rY   rv   rq   ©r„   r   rt   rB   r?   r‚   r"   )rw   rœ   rx   r)   ry   Ú
expand_chsrz   ÚgetÚpopr}   Ú
SequentialÚ	AvgPool2dr~   r   Ú	conv_downr   Úconv_expÚblocksÚrangeÚ
add_moduler+   Úconv_transition_bÚconv_transition©rO   r„   r   r    rt   r9   rA   rB   rJ   r?   Úfirst_dilationrC   rL   rK   Ú	block_dprÚblock_fnÚblock_kwargsZdown_chsZexp_chsÚblock_out_chsÚconv_kwargsrY   Úprev_chsÚirˆ   r,   r-   rx     sZ    þ ÿ   þþ

úù	zCrossStage.__init__c                 C   s`   |   |¡}|  |¡}|j| jd dd�\}}|  |¡}|  |¡ ¡ }|  tj	||gdd�¡}|S ©Nr   r   )Údim)
r¦   r§   Úsplitr¡   r¨   r«   Ú
contiguousr¬   ÚtorchÚcat)rO   r3   ZxsÚxbÚoutr,   r,   r-   r�   M  s    


zCrossStage.forward©r&   r'   r(   r’   ro   rx   r�   r•   r,   r,   rˆ   r-   rœ   
  s   ðArœ   c                
       s>   e Zd ZdZdddddddddef
‡ fdd„	Zdd	„ Z‡  ZS )
ÚCrossStage3z`Cross Stage 3.
    Similar to CrossStage, but with only one transition conv for the output.
    r@   r   NFc                    s†  t t| ƒ ¡  |
p|}
|r|n|}tt|| ƒƒ | _}tt|| ƒƒ}t| d¡| d¡d�}| dd ¡}|dks||
|krâ|r¼t	 
|dkr–t	 d¡nt	 ¡ t||fdd|	dœ|—Ž¡| _n t||fd||
|	|d	œ|—Ž| _|}n
d | _|}t||fd| d
œ|—Ž| _|d }t	 
¡ | _t|ƒD ]F}| j t|ƒ|f |||||	|d k	�rR|| nddœ|—Ž¡ |}�q"t||fddi|—Ž| _d S r�   )rw   r¿   rx   r)   ry   r¡   rz   r¢   r£   r}   r¤   r¥   r~   r   r¦   r   r§   r¨   r©   rª   r+   r¬   r­   rˆ   r,   r-   rx   [  sX    þ ÿ   þþ
úù	zCrossStage3.__init__c                 C   sR   |   |¡}|  |¡}|j| jd dd�\}}|  |¡}|  tj||gdd�¡}|S r¶   )r¦   r§   r¸   r¡   r¨   r¬   rº   r»   )rO   r3   Úx1Zx2r½   r,   r,   r-   r�   ™  s    


zCrossStage3.forwardr¾   r,   r,   rˆ   r-   r¿   W  s   
ð>r¿   c                       s8   e Zd ZdZdddddedf‡ fdd„	Zdd	„ Z‡  ZS )
Ú	DarkStagezDarkNet stage.r@   r   NFc                    s  t t| ƒ ¡  |	p|}	t| d¡| d¡d�}| dd ¡}|
rzt |dkrTt d¡nt 	¡ t
||fdd|dœ|—Ž¡| _n t
||fd||	||d	œ|—Ž| _|}tt|| ƒƒ}t ¡ | _t|ƒD ]B}| j t|ƒ|f ||||||d k	rî|| nd
dœ|—Ž¡ |}qÀd S )NrW   rX   rr   rY   r   r   rž   r!   rŸ   rq   r    )rw   rÁ   rx   rz   r¢   r£   r}   r¤   r¥   r~   r   r¦   r)   ry   r¨   r©   rª   r+   )rO   r„   r   r    rt   r9   rA   rB   r?   r®   rC   r°   r¯   r±   r³   rY   r´   r²   rµ   rˆ   r,   r-   rx   ¥  sH    þ ÿ   þþ
úù	zDarkStage.__init__c                 C   s   |   |¡}|  |¡}|S rM   )r¦   r¨   ©rO   r3   r,   r,   r-   r�   Ó  s    

zDarkStage.forwardr¾   r,   r,   rˆ   r-   rÁ   ¢  s   	ó.rÁ   r!   r   r   r#   c	                 C   s¶  t  ¡ }	g }
t|ttfƒs |g}t|ƒ}|s0t‚|dks<t‚d }| }|d }d}t|ƒD ]ª\}}d|d › �}|dkr~|dks’||kr–|dkr–|s–dnd}|dkr´|d k	r´|
 |¡ |	 	|t
|||||dkrÐ|nd||d�¡ ||9 }|}t||d d	|g¡d
�}qX|�r¤|dk�st‚|d k	�r,|
 |¡ |d k	�rh|	 	dt jdddd�¡ |	 	d||dd�¡ d}n|	 	dt jdddd�¡ d}|d9 }t||d d	|g¡d
�}|
 |¡ |	|
fS )N)r   r   é   r   Úconvr   r   r#   )r    r$   rW   rX   Ú.rT   ©Únum_chsÚ	reductionÚmoduler%   r!   )r"   r    r$   Zaa)Zchannelsr    )r}   r¤   r/   r0   r1   r2   rN   Ú	enumerateÚappendrª   r   rz   ÚjoinZ	MaxPool2d)Úin_chansr   r"   r    r%   r$   rW   rX   rY   rT   Úfeature_infoZ
stem_depthÚ	prev_featr´   Zlast_idxZstem_striderµ   ZchsZ	conv_nameZconv_strideZ	pool_namer,   r,   r-   Úcreate_csp_stemÙ  sT    ,
  û



rÐ   c                 C   sb   |   d¡}|dkst‚|dkrH|   dd ¡ |   dd ¡ |   dd ¡ t}n|dkrVt}nt}|| fS )NrG   )r[   rF   rk   r[   rJ   rK   rL   rF   )r£   rN   rÁ   rœ   r¿   )Ú
stage_argsrG   Ústage_fnr,   r,   r-   Ú_get_stage_fn  s    
rÓ   c                 C   sB   |   d¡}|dkst‚|dkr&t| fS |dkr6t| fS t| fS d S )NrI   )r[   ÚedgerH   r[   rÔ   )r£   rN   r–   r›   ro   )rÑ   rI   r,   r,   r-   Ú_get_block_fn  s    
rÕ   c                 C   sB   |   d¡}|   dd ¡pi }|d k	r:t|ƒ}|r:t|f|Ž}|| fS )NrD   rE   )r£   r   r   )rÑ   rD   rE   r,   r,   r-   Ú_get_attn_fn)  s    
rÖ   )ÚcfgÚdrop_path_rateÚoutput_strideÚ	stem_featc                    sˆ  t | jƒ‰ t| jjƒ}|s$d g| n(dd„ t d|t| jjƒ¡ | jj¡D ƒˆ d< ‡ fdd„tˆ  	¡ Ž D ƒ}t
| j| jd�}d}|d }|d	 }	|}
g }g }t|ƒD ]Ê\}}t|ƒ\}}t|ƒ\}}t|ƒ\}}| d
¡}|dkrð|
rð| |
¡ ||k�r|dk�r||9 }d}||9 }|dk�r&dnd}|||	f|||||| j|dœ|—Žg7 }|d }	t
|	|d|› �d�}
q¤| |
¡ tj|Ž |fS )Nc                 S   s   g | ]}|  ¡ ‘qS r,   )Útolist)r`   r3   r,   r,   r-   rd   <  s     z%create_csp_stages.<locals>.<listcomp>r   r¯   c                    s   g | ]}t tˆ  ¡ |ƒƒ‘qS r,   )rz   ÚzipÚkeys)r`   Úvalues©Zcfg_dictr,   r-   rd   =  s     rr   r   rÈ   rÇ   r    ©r   r   r   )r    r®   rt   r°   rY   rD   r   zstages.rÆ   )r   rU   r2   r9   rº   ZlinspaceÚsumr¸   rÜ   rÞ   rz   rW   rX   rÊ   rÓ   rÕ   rÖ   r£   rË   rY   r}   r¤   )r×   rØ   rÙ   rÚ   Z
num_stagesrÑ   r±   rt   Z
net_strider´   rÏ   rÎ   rU   Z	stage_idxrÒ   r°   Zattn_fnr    r®   r,   rß   r-   Úcreate_csp_stages3  sZ    
(ÿþ

ÿø	÷

râ   c                       s†   e Zd ZdZdedœ‡ fd	d
„Zejjddd„ƒZ	ejjddd„ƒZ
ejjdd„ ƒZddd„Zdd„ Zdedœdd„Zdd„ Z‡  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   Úavgrq   T)r×   c	                    sØ   t ƒ  ¡  || _|| _|dks"t‚t|f|	Ž}t|j|j|j	d�}
g | _
t|ft|jƒ|
—Ž\| _}| j
 |dd… ¡ t||||d d�\| _}|d d }| j
 |¡ || _t||||d�| _ttt|d�| ƒ 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   )rW   rX   rY   Nr.   )rØ   rÙ   rÚ   rÇ   )Zin_featuresÚnum_classesÚ	pool_typeÚ	drop_rate)rV   )rw   rx   rç   ré   rN   r   rz   rW   rX   rY   rÎ   rÐ   r   rT   Úextendrâ   rU   Únum_featuresr   Úheadr   r   Ú_init_weights)rO   r×   rÍ   rç   rÙ   Úglobal_poolré   rØ   rV   ÚkwargsZ
layer_argsZstem_feat_infoZstage_feat_infor´   rˆ   r,   r-   rx   r  s:    
ýü   ÿzCspNet.__init__Fc                 C   s"   t d|rdnddtfdgd�}|S )Nz^stemú^stages\.(\d+))z^stages\.(\d+)\.blocks\.(\d+)Nz^stages\.(\d+)\..*transition)rð   )r   )rT   r¨   )rz   r   )rO   ZcoarseZmatcherr,   r,   r-   Úgroup_matcher¬  s    ýþzCspNet.group_matcherc                 C   s   |rt dƒ‚d S )Nz$gradient checkpointing not supported)rN   )rO   Úenabler,   r,   r-   Úset_grad_checkpointing¸  s    zCspNet.set_grad_checkpointingc                 C   s   | j jS rM   )rì   ÚfcrŽ   r,   r,   r-   Úget_classifier¼  s    zCspNet.get_classifierc                 C   s   t | j||| jd�| _d S )N)rè   ré   )r   rë   ré   rì   )rO   rç   rî   r,   r,   r-   Úreset_classifierÀ  s    zCspNet.reset_classifierc                 C   s   |   |¡}|  |¡}|S rM   ©rT   rU   rÂ   r,   r,   r-   Úforward_featuresÃ  s    

zCspNet.forward_features©Ú
pre_logitsc                 C   s   | j ||d�S )Nrù   )rì   )rO   r3   rú   r,   r,   r-   Úforward_headÈ  s    zCspNet.forward_headc                 C   s   |   |¡}|  |¡}|S rM   )rø   rû   rÂ   r,   r,   r-   r�   Ë  s    

zCspNet.forward)r!   rã   r   rä   rq   rq   T)F)T)rä   )F)r&   r'   r(   r’   rS   rx   rº   ZjitÚignorerñ   ró   rõ   rö   rø   rR   rû   r�   r•   r,   r,   rˆ   r-   r   h  s*          ÷þ:

c                 C   sŽ   t | tjƒr:tjj| jddd� | jd k	rŠtj | j¡ nPt | tjƒrttjj	| jddd� | jd k	rŠtj | j¡ n|rŠt
| dƒrŠ|  ¡  d S )NZfan_outZrelu)ÚmodeZnonlinearityrq   g{®Gáz„?)ÚmeanÚstdrV   )r/   r}   ZConv2drŠ   Zkaiming_normal_r�   Zbiasr‹   ZLinearZnormal_ÚhasattrrV   )rÉ   ÚnamerV   r,   r,   r-   rí   Ñ  s    

rí   r\   é   rÃ   Úmaxrf   r7   r:   rà   ç       @rj   T)r9   r   r    rJ   rB   rK   r÷   )r   r   r\   )r9   r   r    rJ   rB   rA   rK   )r<   r=   r>   i   rp   )r9   r   r    r?   rJ   rB   rA   rK   )r   r   rå   rå   rÃ   )r\   r;   r<   r=   r>   )r  r@   )rj   r@   )r@   rj   )r9   r   r    rJ   rB   rA   rL   rI   )r   r   r   r   r   )r   )rj   )r@   )r9   r   r    rB   rA   rG   rI   )r   r   r   r   r   Úse)r9   r   r    rB   rA   rD   rG   rI   )r9   r   r    rB   rA   rC   rG   rI   )rc   rh   g      è?gq=
×£på?g      ô?gHáz®Gõ?)rc   rh   rm   )rm   )Zrd_ratio)rD   rE   )rD   rc   rh   re   )r!   r]   é   rÃ   )r   r   r<   r=   )r9   r   r    r?   rB   rA   rD   rl   g      ø?rÔ   )rc   rh   rB   rI   )rc   rh   rB   rI   rD   rE   )Úcspresnet50Úcspresnet50dÚcspresnet50wÚcspresnext50Úcspdarknet53Ú	darknet17Ú	darknet21Úsedarknet21Ú	darknet53Údarknetaa53Úcs3darknet_sÚcs3darknet_mÚcs3darknet_lÚcs3darknet_xÚcs3darknet_focus_sÚcs3darknet_focus_mÚcs3darknet_focus_lÚcs3darknet_focus_xÚcs3sedarknet_lÚcs3sedarknet_xÚcs3sedarknet_xdwÚcs3edgenet_xÚcs3se_edgenet_xc                 K   sP   |   d¡s|   d¡rd}nd}| d|¡}tt| |ft|  td|d�dœ|—ŽS )	NZdarknetZ
cspdarknet)r   r   r   r!   rÃ   r8   )r   r   r   r!   rÃ   Úout_indicesT)Zflatten_sequentialr  )Z	model_cfgZfeature_cfg)Ú
startswithr£   r   r   Ú
model_cfgsrz   )ÚvariantÚ
pretrainedrï   Zdefault_out_indicesr  r,   r,   r-   Ú_create_cspnet  s      ÿ
ýür#  c                 K   s   | dddddt tdddœ
|–S )	Nrã   )r!   r<   r<   )rå   rå   gü©ñÒMbì?Zbilinearzstem.conv1.convzhead.fc)
Úurlrç   Z
input_sizeZ	pool_sizeÚcrop_pctÚinterpolationrþ   rÿ   Z
first_convÚ
classifierr   )r$  rï   r,   r,   r-   Ú_cfg�  s         ûúr(  ztimm/zlhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/cspresnet50_ra-d3e8d487.pth)Ú	hf_hub_idr$  zqhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/cspresnext50_ra_224-648b4713.pthzqhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/cspdarknet53_ra_256-d05c7c21.pthzthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/darknet53_256_c2ns-3aeff817.pthZbicubic)r!   é   r*  )r)  r$  r&  Útest_input_sizeÚtest_crop_pctzrhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/darknetaa53_c2ns-5c28ec8a.pth)r)  r$  r+  r,  )r&  zshttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/cs3darknet_m_c2ns-43f06604.pthgffffffî?zshttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/cs3darknet_l_c2ns-16220c5d.pthzshttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/cs3darknet_x_c2ns-4e4490aa.pth)r)  r$  r&  r%  r+  r,  zyhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/cs3darknet_focus_m_c2ns-e23bed41.pthzyhttps://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cspresnet50.ra_in1kzcspresnet50d.untrainedzcspresnet50w.untrainedzcspresnext50.ra_in1kzcspdarknet53.ra_in1kzdarknet17.untrainedzdarknet21.untrainedzsedarknet21.untrainedzdarknet53.c2ns_in1kzdarknetaa53.c2ns_in1kzcs3darknet_s.untrainedzcs3darknet_m.c2ns_in1kzcs3darknet_l.c2ns_in1kzcs3darknet_x.c2ns_in1kzcs3darknet_focus_s.untrainedzcs3darknet_focus_m.c2ns_in1kzcs3darknet_focus_l.c2ns_in1kzcs3darknet_focus_x.untrainedzcs3sedarknet_l.c2ns_in1kzcs3sedarknet_x.c2ns_in1kzcs3sedarknet_xdw.untrainedzcs3edgenet_x.c2_in1kzcs3se_edgenet_x.c2ns_in1k)Úreturnc                 K   s   t dd| i|—ŽS )Nr  r"  )r  ©r#  ©r"  rï   r,   r,   r-   r  â  s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r  ç  s    r  c                 K   s   t dd| i|—ŽS )Nr	  r"  )r	  r/  r0  r,   r,   r-   r	  ì  s    r	  c                 K   s   t dd| i|—ŽS )Nr
  r"  )r
  r/  r0  r,   r,   r-   r
  ñ  s    r
  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r  ö  s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r  û  s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r     s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r    s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r  
  s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r    s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r    s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r    s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r    s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r  #  s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r  (  s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r  -  s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r  2  s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r  7  s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r  <  s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r  A  s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r  F  s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r  K  s    r  c                 K   s   t dd| i|—ŽS )Nr  r"  )r  r/  r0  r,   r,   r-   r  P  s    r  )	r@   r@   FrZ   FNNr@   r[   )F)F)r#   )F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)Xr’   Údataclassesr   r   r   Ú	functoolsr   Útypingr   r   r   r	   r
   rº   Ztorch.nnr}   Z	timm.datar   r   Ztimm.layersr   r   r   r   r   r   r   Z_builderr   Z_manipulater   r   Ú	_registryr   r   Ú__all__r   r5   r6   rS   rn   ÚModulero   r–   r›   rœ   r¿   rÁ   r“   r”   rÐ   rÓ   rÕ   rÖ   rQ   r)   r+   râ   r   rí   rz   r   r#  r(  Zdefault_cfgsr  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r,   r,   r,   r-   Ú<module>   sÔ  $$
         ÷
%3((MK8÷
6
ü5i
úþùþùþøþøþùþùþøþùþøþ


ù	õ    þ€ å "

þþþ  ý ý  ý  ý   ý  ý  ý  ý  ý  ý   ý½J