a
    du<                     @   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g dg dg ddg dddddeg dg dg ddg dddddeg dg dg ddg dd d d!deg dg dg ddg dd d d!deg dg dg ddg dd dd!deg dg dg ddg dd dd!deg dg dg ddg dd dd!deg dg dg ddg dd dd!deg dg dg ddg d"d dd!deg dg dg ddg dd dd#dd$
Z e d% e d&< dDd'd(Z!dEd)d*Z"ee"dd+e"dd+e"dd+e"d,d-d.d/e"dd+e"d,d-d.d/e"dd+e"dd+e"dd+e"dd+d0
Z#edFed1d2d3Z$edGed1d4d5Z%edHed1d6d7Z&edIed1d8d9Z'edJed1d:d;Z(edKed1d<d%Z)edLed1d=d>Z*edMed1d?d@Z+edNed1dAdBZ,edOed1dCd&Z-dS )Pa   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__ [/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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   )Z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rX||krX|r@J t||dfi || _nd | _g }t|D ]@}| jrt	||fi |}nt||dfi |}|}|
| qjt| | _|||  }t||fi || _|rt||nd | _|
| _d S )N
norm_layer	act_layerr      )r   r,   r   residual	depthwisedictr   conv_reductionranger   r"   r   conv_midconv_concatr   attn	drop_path)r   in_chsmid_chsout_chslayer_per_blockr2   r3   r9   r/   r0   r:   conv_kwargsZnext_in_chsZ	mid_convsr%   convr   r   r   r   -   s*    
zOsaBlock.__init__c                 C   sn   |g}| j d ur|  |}| ||}| |}| jd urD| |}| jd urX| |}| jrj||d  }|S )Nr   )r5   r7   r8   r9   r:   r2   )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 urp|| dkrpt|| }nd }|t	|||||o|dk||r|	nd	|
||d

g7 }|}q>tj
| | _d S )NFr1      T)Zkernel_sizestrideZ	ceil_moder           r   r-   )r2   r3   r9   r/   r0   r:   )r   rE   r   grad_checkpointingrC   Z	MaxPool2dpoolr6   r
   r,   
Sequentialblocks)r   r;   r<   r=   block_per_stager>   
downsampler2   r3   r9   r/   r0   drop_path_ratesrM   r%   Z
last_blockr:   r   r   r   r   j   s"    
zOsaStage.__init__c                 C   s@   | j d ur|  |}| jr2tj s2t| j|}n
| |}|S r   )rK   rJ   r#   jitZis_scriptingr   rM   r   r   r   r   r   r'      s    


zOsaStage.forwardrB   r   r   r   r   rE   h   s   	%rE   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   r1     avg    rI   c
                    s  t t|   || _|| _|dks&J t|fi |
}|dd}|d }|d }|d }|d }|d }t||d	}|d
 }|d rt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 }|| | _||rd
nd9 }|  jt| j|d| dg7  _q~t	j
| | _t| j|||d| _|  D ]J\}}t|t	jrbt	jj|jddd nt|t	jr6t	j|j q6d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
        rU   stem_stride   stem_chsstage_conv_chsstage_out_chsrN   r>   r.   rG   r3   r   r1   rH   r   zstem.)Znum_chsZ	reductionr&   r    Nr2   r9   )r2   r3   r9   )rO   rP   zstages.Z	pool_type	drop_rateZfan_outZrelu)modeZnonlinearity) r   r   r   num_classesr\   r4   getr   r   rC   rL   stemZfeature_infor#   splitZlinspacesumr6   rE   num_featuresstagesr	   headZnamed_modules
isinstanceZConv2dinitZkaiming_normal_ZweightZLinearZzeros_Zbias)r   cfgZin_chansr^   global_poolZoutput_strider/   r0   r\   Zdrop_path_ratekwargsrV   rX   rY   rZ   rN   r>   r?   Zlast_stem_strideZ	conv_typeZcurrent_strideZ	stage_dprZ
in_ch_listZ
stage_argsrd   r%   rO   nmr   r   r   r      sf    
"


&zVovNet.__init__Fc                 C   s   t d|rdnddS )Nz^stemz^stages\.(\d+)z^stages\.(\d+).blocks\.(\d+))r`   rM   )r4   )r   Zcoarser   r   r   group_matcher   s    
zVovNet.group_matcherTc                 C   s   | j D ]
}||_qd S r   )rd   rJ   )r   enablesr   r   r   set_grad_checkpointing   s    
zVovNet.set_grad_checkpointingc                 C   s   | j jS r   )re   Zfc)r   r   r   r   get_classifier   s    zVovNet.get_classifierc                 C   s   t | j||| jd| _d S )Nr[   )r	   rc   r\   re   )r   r^   ri   r   r   r   reset_classifier   s    zVovNet.reset_classifierc                 C   s   |  |}| |S r   )r`   rd   rR   r   r   r   forward_features  s    
zVovNet.forward_features
pre_logitsc                 C   s   | j ||dS )Nrt   )re   )r   r   ru   r   r   r   forward_head  s    zVovNet.forward_headc                 C   s   |  |}| |}|S r   )rs   rv   rR   r   r   r   r'     s    

zVovNet.forward)F)T)rT   )F)r(   r)   r*   r   rC   rD   r   r#   rQ   ignorerm   rp   rq   rr   rs   boolrv   r'   r+   r   r   r   r   r      s&   S

)@   ry      )rz            )      i   i      )r   r   rG   rG   Fr-   )rX   rY   rZ   r>   rN   r2   r3   r9   )r   r   rW   r1   )ry   ry   ry   )ry   P   `   p   )r   r~   i  r   r1   )r   r   r   r   TrF   )r   r1   	   r1   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_cfgsr4   )variant
pretrainedrj   r   r   r   _create_vovnet}  s    r   c                 K   s   | dddddt tddd
|S )	NrS   )r1   r}   r}   )   r   g      ?Zbicubiczstem.0.convzhead.fc)
urlr^   Z
input_sizeZ	pool_sizeZcrop_pctinterpolationmeanZstdZ
first_conv
classifierr   )r   rj   r   r   r   _cfg  s    r   )r   ztimm/)r1      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   rj   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	evonorms0rQ   F)r   )rc   nkwargsr   r   r   norm_act_fn  s    z'ese_vovnet39b_evos.<locals>.norm_act_fnr   )r   r/   )r   r   )r   rj   r   r   r   r   r     s    )F)r-   )F)F)F)F)F)F)F)F)F)F).__doc__typingr   r#   Ztorch.nnrC   Z	timm.datar   r   Ztimm.layersr   r   r   r	   r
   r   r   Z_builderr   Z_manipulater   	_registryr   r   __all__rL   r   Moduler,   rE   r   r4   r   r   r   Zdefault_cfgsr   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s8  $=1w




j

	