U
    ¯Ê¹ju<  ã                   @   s,  d Z ddl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 dd	lmZmZ d
g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eedddgddddgddddgdddddgdddd�edddgddddgddddgdddd d!gdddd�edddgdd"d#d$gd$dd%dgd!ddddgd&d&d'd�edddgddddgddddgd!ddddgd&d&d'd�edddgdd"d#d$gd$dd%dgd!ddddgd&dd'd�edddgddddgddddgd!ddddgd&dd'd�edddgddddgddddgdddddgd&dd'd�edddgddddgddddgdddd d!gd&dd'd�edddgddddgddddgddd!d(d!gd&dd'd�edddgddddgddddgdddddgd&dd)d�d*�
Z e d+ e d,< dJd-d.„Z!dKd/d0„Z"ee"dd1�e"dd1�e"dd1�e"d2d3d4d5�e"dd1�e"d2d3d4d5�e"dd1�e"dd1�e"dd1�e"dd1�d6œ
ƒZ#edLed7œd8d9„ƒZ$edMed7œd:d;„ƒZ%edNed7œd<d=„ƒZ&edOed7œd>d?„ƒZ'edPed7œd@dA„ƒZ(edQed7œdBd+„ƒZ)edRed7œdCdD„ƒZ*edSed7œdEdF„ƒZ+edTed7œdGdH„ƒZ,edUed7œdId,„ƒZ-dS )VaÌ   VoVNet (V1 & V2)

Papers:
* `An Energy and GPU-Computation Efficient Backbone Network` - https://arxiv.org/abs/1904.09730
* `CenterMask : Real-Time Anchor-Free Instance Segmentation` - https://arxiv.org/abs/1911.06667

Looked at  https://github.com/youngwanLEE/vovnet-detectron2 &
https://github.com/stigma0617/VoVNet.pytorch/blob/master/models_vovnet/vovnet.py
for some reference, rewrote most of the code.

Hacked together by / Copyright 2020 Ross Wightman
é    )ÚListN©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚConvNormActÚSeparableConvNormActÚBatchNormAct2dÚClassifierHeadÚDropPathÚcreate_attnÚcreate_norm_act_layeré   )Úbuild_model_with_cfg)Úcheckpoint_seq)Úregister_modelÚgenerate_default_cfgsÚVovNetc                       s8   e Zd Z‡ fdd„Zejeej ejdœdd„Z‡  ZS )ÚSequentialAppendListc                    s   t t| ƒj|Ž  d S ©N)Úsuperr   Ú__init__)ÚselfÚargs©Ú	__class__© úQ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/vovnet.pyr      s    zSequentialAppendList.__init__)ÚxÚconcat_listÚreturnc                 C   sN   t | ƒD ]2\}}|dkr(| ||ƒ¡ q| ||d ƒ¡ qtj|dd�}|S )Nr   éÿÿÿÿr   )Údim)Ú	enumerateÚappendÚtorchÚcat)r   r   r   ÚiÚmoduler   r   r   Úforward!   s    zSequentialAppendList.forward)	Ú__name__Ú
__module__Ú__qualname__r   r$   ZTensorr   r(   Ú__classcell__r   r   r   r   r      s   r   c                       s4   e Zd Zdddeejdf‡ fdd„	Zdd„ Z‡  ZS )ÚOsaBlockFÚ Nc                    sä   t t| ƒ ¡  || _|| _t||	d�}|}| jrT||krT|r@t‚t||df|Ž| _nd | _g }t	|ƒD ]8}| jr€t
||f|Ž}nt||df|Ž}|}| |¡ qft|Ž | _|||  }t||f|Ž| _|rÔt||ƒnd | _|
| _d S )N©Ú
norm_layerÚ	act_layerr   é   )r   r-   r   ÚresidualÚ	depthwiseÚdictÚAssertionErrorr   Úconv_reductionÚranger   r#   r   Úconv_midÚconv_concatr   ÚattnÚ	drop_path)r   Úin_chsÚmid_chsÚout_chsÚlayer_per_blockr3   r4   r;   r0   r1   r<   Úconv_kwargsZnext_in_chsZ	mid_convsr&   Úconvr   r   r   r   -   s*    
zOsaBlock.__init__c                 C   sn   |g}| j d k	r|   |¡}|  ||¡}|  |¡}| jd k	rD|  |¡}| jd k	rX|  |¡}| jrj||d  }|S )Nr   )r7   r9   r:   r;   r<   r3   )r   r   Úoutputr   r   r   r(   Y   s    






zOsaBlock.forward©	r)   r*   r+   r   ÚnnÚReLUr   r(   r,   r   r   r   r   r-   +   s   õ,r-   c                       s6   e Zd Zddddeejdf‡ fdd„	Zdd„ Z‡  ZS )	ÚOsaStageTFÚeseNc                    s¼   t t| ƒ ¡  d| _|r,tjdddd�| _nd | _g }t|ƒD ]l}||d k}|d k	rp|| dkrpt|| ƒ}nd }|t	|||||oŠ|dk||r”|	nd	|
||d
�
g7 }|}q>tj
|Ž | _d S )NFr2   é   T)Zkernel_sizeÚstrideZ	ceil_moder   ç        r   r.   )r3   r4   r;   r0   r1   r<   )r   rG   r   Úgrad_checkpointingrE   Z	MaxPool2dÚpoolr8   r
   r-   Ú
SequentialÚblocks)r   r=   r>   r?   Úblock_per_stager@   Ú
downsampler3   r4   r;   r0   r1   Údrop_path_ratesrO   r&   Z
last_blockr<   r   r   r   r   j   s2        
 
   þ
zOsaStage.__init__c                 C   s@   | j d k	r|   |¡}| jr2tj ¡ s2t| j|ƒ}n
|  |¡}|S r   )rM   rL   r$   ÚjitZis_scriptingr   rO   ©r   r   r   r   r   r(   �   s    


zOsaStage.forwardrD   r   r   r   r   rG   h   s   	ó%rG   c                       sŽ   e Zd Zddddeejddf‡ 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   r2   éè  Úavgé    rK   c
                    s‚  t t| ƒ ¡  || _|| _|dks&t‚t|f|
Ž}| dd¡}|d }|d }|d }|d }|d }t||d	�}|d
 }|d r†tnt	}t
jt	||d dfdd
i|—Ž||d |d dfddi|—Ž||d |d
 dfd|i|—ŽgŽ | _t|d d
d|dk�rdnd
› �d�g| _|}t t d|	t|ƒ¡|¡}|dd… |dd…  }tf |d |d |d dœ|—Ž}g }tdƒD ]Ž}|d
k�pŽ|dk}|t|| || || || |f||| dœ|—Žg7 }|| | _||�rÞd
nd9 }|  jt| j|d|› �d�g7  _�qzt
j|Ž | _t| j|||d�| _|  ¡ D ]J\}}t|t
jƒ�r^t
jj|jddd� nt|t
jƒ�r2t
j |j ¡ �q2dS )aÉ  
        Args:
            cfg (dict): Model architecture configuration
            in_chans (int): Number of input channels (default: 3)
            num_classes (int): Number of classifier classes (default: 1000)
            global_pool (str): Global pooling type (default: 'avg')
            output_stride (int): Output stride of network, one of (8, 16, 32) (default: 32)
            norm_layer (Union[str, nn.Module]): normalization layer
            act_layer (Union[str, nn.Module]): activation layer
            drop_rate (float): Dropout rate (default: 0.)
            drop_path_rate (float): Stochastic depth drop-path rate (default: 0.)
            kwargs (dict): Extra kwargs overlayed onto cfg
        rW   Ústem_strideé   Ústem_chsÚstage_conv_chsÚstage_out_chsrP   r@   r/   rI   r4   r   r2   rJ   r   zstem.)Znum_chsZ	reductionr'   r    Nr3   r;   )r3   r4   r;   )rQ   rR   zstages.©Z	pool_typeÚ	drop_rateZfan_outZrelu)ÚmodeZnonlinearity)!r   r   r   Únum_classesr^   r6   r5   Úgetr   r   rE   rN   ÚstemZfeature_infor$   ÚsplitZlinspaceÚsumr8   rG   Únum_featuresÚstagesr	   ÚheadZnamed_modulesÚ
isinstanceZConv2dÚinitZkaiming_normal_ÚweightZLinearZzeros_Zbias)r   ÚcfgZin_chansr`   Úglobal_poolZoutput_strider0   r1   r^   Zdrop_path_rateÚkwargsrX   rZ   r[   r\   rP   r@   rA   Zlast_stem_strideZ	conv_typeZcurrent_strideZ	stage_dprZ
in_ch_listZ
stage_argsrf   r&   rQ   ÚnÚmr   r   r   r   ›   sj    ý  ÿ
"ûùø


&zVovNet.__init__Fc                 C   s   t d|rdndd�S )Nz^stemz^stages\.(\d+)z^stages\.(\d+).blocks\.(\d+))rb   rO   )r5   )r   Zcoarser   r   r   Úgroup_matcherî   s    
þzVovNet.group_matcherTc                 C   s   | j D ]
}||_qd S r   )rf   rL   )r   ÚenableÚsr   r   r   Úset_grad_checkpointingõ   s    
zVovNet.set_grad_checkpointingc                 C   s   | j jS r   )rg   Úfc)r   r   r   r   Úget_classifierú   s    zVovNet.get_classifierc                 C   s   t | j||| jd�| _d S )Nr]   )r	   re   r^   rg   )r   r`   rl   r   r   r   Úreset_classifierþ   s    zVovNet.reset_classifierc                 C   s   |   |¡}|  |¡S r   )rb   rf   rT   r   r   r   Úforward_features  s    
zVovNet.forward_features©Ú
pre_logitsc                 C   s   | j ||d�S )Nrx   )rg   )r   r   ry   r   r   r   Úforward_head  s    zVovNet.forward_headc                 C   s   |   |¡}|  |¡}|S r   )rw   rz   rT   r   r   r   r(     s    

zVovNet.forward)F)T)rV   )F)r)   r*   r+   r   rE   rF   r   r$   rS   Úignorerp   rs   ru   rv   rw   Úboolrz   r(   r,   r   r   r   r   r   ™   s&   öS

é@   é€   é    éÀ   éà   é   i   i   i   é   rI   Fr.   )rZ   r[   r\   r@   rP   r3   r4   r;   rY   r2   éP   é`   ép   i€  TrH   é	   Zeca)
Ú	vovnet39aÚ	vovnet57aÚese_vovnet19b_slim_dwÚese_vovnet19b_dwÚese_vovnet19b_slimZese_vovnet19bÚese_vovnet39bÚese_vovnet57bÚese_vovnet99bÚeca_vovnet39br�   Úese_vovnet39b_evosc                 K   s$   t t| |ft|  tdd�dœ|—ŽS )NT)Zflatten_sequential)Z	model_cfgZfeature_cfg)r   r   Ú
model_cfgsr5   )ÚvariantÚ
pretrainedrm   r   r   r   Ú_create_vovnet}  s    ýûúr•   c                 K   s   | dddddt tdddœ
|–S )	NrU   )r2   r�   r�   )é   r–   g      ì?Zbicubiczstem.0.convzhead.fc)
Úurlr`   Z
input_sizeZ	pool_sizeZcrop_pctÚinterpolationZmeanZstdZ
first_convÚ
classifierr   )r—   rm   r   r   r   Ú_cfgˆ  s          üürš   )r—   ztimm/)r2   é   r›   gffffffî?)Z	hf_hub_idZtest_input_sizeZtest_crop_pct)
zvovnet39a.untrainedzvovnet57a.untrainedzese_vovnet19b_slim_dw.untrainedzese_vovnet19b_dw.ra_in1kzese_vovnet19b_slim.untrainedzese_vovnet39b.ra_in1kzese_vovnet57b.untrainedzese_vovnet99b.untrainedzeca_vovnet39b.untrainedzese_vovnet39b_evos.untrained)r   c                 K   s   t dd| i|—ŽS )Nrˆ   r”   )rˆ   ©r•   ©r”   rm   r   r   r   rˆ   £  s    rˆ   c                 K   s   t dd| i|—ŽS )Nr‰   r”   )r‰   rœ   r�   r   r   r   r‰   ¨  s    r‰   c                 K   s   t dd| i|—ŽS )NrŠ   r”   )rŠ   rœ   r�   r   r   r   rŠ   ­  s    rŠ   c                 K   s   t dd| i|—ŽS )Nr‹   r”   )r‹   rœ   r�   r   r   r   r‹   ²  s    r‹   c                 K   s   t dd| i|—ŽS )NrŒ   r”   )rŒ   rœ   r�   r   r   r   rŒ   ·  s    rŒ   c                 K   s   t dd| i|—ŽS )Nr�   r”   )r�   rœ   r�   r   r   r   r�   ¼  s    c                 K   s   t dd| i|—ŽS )NrŽ   r”   )rŽ   rœ   r�   r   r   r   rŽ   Á  s    rŽ   c                 K   s   t dd| i|—ŽS )Nr�   r”   )r�   rœ   r�   r   r   r   r�   Æ  s    r�   c                 K   s   t dd| i|—ŽS )Nr�   r”   )r�   rœ   r�   r   r   r   r�   Ë  s    r�   c                 K   s   dd„ }t d| |dœ|—ŽS )Nc                 [   s   t d| fddi|—ŽS )NZ	evonorms0rS   F)r   )re   Únkwargsr   r   r   Únorm_act_fnÔ  s    z'ese_vovnet39b_evos.<locals>.norm_act_fnr‘   )r”   r0   )r‘   rœ   )r”   rm   rŸ   r   r   r   r‘   Ò  s    )F)r.   )F)F)F)F)F)F)F)F)F)F).Ú__doc__Útypingr   r$   Ztorch.nnrE   Z	timm.datar   r   Ztimm.layersr   r   r   r	   r
   r   r   Z_builderr   Z_manipulater   Ú	_registryr   r   Ú__all__rN   r   ÚModuler-   rG   r   r5   r’   r•   rš   Zdefault_cfgsrˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r   r   r   r   Ú<module>   s<  $=1w


ø



ø


ø


ø



ø



ø


ø



ø


ø



ø¡j

	 þ þò