o
    پiF                     @   s  d Z ddl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 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'< dKd(d)Z&dLd*d+Z'ee'dd,e'dd,e'dd,e'd-d.d/d0e'dd,e'd-d.d/d0e'd-d1d1d/d2d3d4d5d6e'dd,e'dd,e'dd,d7
Z(edKd8e#fd9d:Z)edKd8e#fd;d<Z*edKd8e#fd=d>Z+edKd8e#fd?d@Z,edKd8e#fdAdBZ-edKd8e#fdCd&Z.edKd8e#fdDdEZ/edKd8e#fdFdGZ0edKd8e#fdHdIZ1edKd8e#fdJd'Z2dS )Ma   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
    )ListOptionalTupleUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)ConvNormActSeparableConvNormActBatchNormAct2dClassifierHeadDropPathcreate_attncreate_norm_act_layer   )build_model_with_cfg)feature_take_indices)checkpoint_seq)register_modelgenerate_default_cfgsVovNetc                       s<   e Zd Z fddZdejdeej dejfddZ  ZS )SequentialAppendListc                    s   t t| j|  d S N)superr   __init__)selfargs	__class__ F/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/vovnet.pyr      s   zSequentialAppendList.__init__xconcat_listreturnc                 C   sN   t | D ]\}}|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(   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r,||kr,|r J t||dfi || _nd | _g }t|D ] }| jrDt	||fi |}n
t||dfi |}|}|
| q5t| | _|||  }t||fi || _|rrt||nd | _|
| _d S )N
norm_layer	act_layerr      )r   r2   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_blockr8   r9   r?   r5   r6   r@   conv_kwargsnext_in_chs	mid_convsr*   convr   r   r    r   .   s*   

zOsaBlock.__init__c                 C   sn   |g}| j d ur|  |}| ||}| |}| jd ur"| |}| jd ur,| |}| jr5||d  }|S )Nr   )r;   r=   r>   r?   r@   r8   )r   r!   outputr   r   r    r,   Z   s   






zOsaBlock.forward	r-   r.   r/   r   nnReLUr   r,   r1   r   r   r   r    r2   ,   s    ,r2   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 ]6}||d k}|d ur8|| dkr8t|| }nd }|t	|||||oE|dk||rJ|	nd	|
||d

g7 }|}qtj
| | _d S )NFr7      T)kernel_sizestride	ceil_moder           r   r3   )r8   r9   r?   r5   r6   r@   )r   rM   r   grad_checkpointingrK   	MaxPool2dpoolr<   r   r2   
Sequentialblocks)r   rA   rB   rC   block_per_stagerD   
downsampler8   r9   r?   r5   r6   drop_path_ratesrX   r*   
last_blockr@   r   r   r    r   k   s2   


zOsaStage.__init__c                 C   sB   | j d ur
|  |}| jrtj st| j|}|S | |}|S r   )rV   rT   r(   jitis_scriptingr   rX   r   r!   r   r   r    r,      s   


zOsaStage.forwardrJ   r   r   r   r    rM   i   s    	-rM   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ejfddZd,dee fddZ					d-dejdeeeee f  dededededeeej eejeej f f fddZ			d.deeee f ded efd!d"Zd#d$ Zd*d%efd&d'Zd(d) Z  ZS )/r   r7     avg    rS   c
                    s  t t|   || _|| _|dksJ t|fi |
}|dd}|d }|d }|d }|d }|d }t||d	}|d
 }|d rEt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rdnd
 dg| _|}ttd|	t||}|dd |dd  }td|d |d |d d|}g }tdD ]D}|d
kp|dk}|t|| || || || |f||| d|g7 }|| | _||rd
nd9 }|  jt| j|d| dg7  _qt	j
| | _| j| _t| j|||d| _|  D ]&\}}t|t	jr2t	jj|jddd qt|t	jr@t	j|j  qd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
        rb   stem_stride   stem_chsstage_conv_chsstage_out_chsrY   rD   r4   rO   r9   r   r7   rQ   r   zstem.)num_chs	reductionr+   r$   Nr8   r?   )r8   r9   r?   )rZ   r[   zstages.)	pool_type	drop_ratefan_outrelu)modenonlinearityr   )!r   r   r   num_classesrk   r:   getr
   r	   rK   rW   stemfeature_infor(   splitlinspacesumr<   rM   num_featuresstageshead_hidden_sizer   headnamed_modules
isinstanceConv2dinitkaiming_normal_weightLinearzeros_bias)r   cfgin_chansrp   global_pooloutput_strider5   r6   rk   drop_path_ratekwargsrc   re   rf   rg   rY   rD   rE   last_stem_stride	conv_typecurrent_stride	stage_dpr
in_ch_list
stage_argsrx   r*   rZ   nmr   r   r    r      sl   
"


$zVovNet.__init__Fc                 C   s   t d|rddS ddS )Nz^stemz^stages\.(\d+)z^stages\.(\d+).blocks\.(\d+))rr   rX   )r:   )r   coarser   r   r    group_matcher   s   zVovNet.group_matcherTc                 C   s   | j D ]}||_qd S r   )rx   rT   )r   enablesr   r   r    set_grad_checkpointing   s   
zVovNet.set_grad_checkpointingr#   c                 C   s   | j jS r   )rz   fc)r   r   r   r    get_classifier  s   zVovNet.get_classifierNr   c                 C   s   || _ | j|| d S r   )rp   rz   reset)r   rp   r   r   r   r    reset_classifier  s   zVovNet.reset_classifierNCHWr!   indicesnorm
stop_early
output_fmtintermediates_onlyc                 C   s   |dv sJ dg }t d|\}}	d}
| jdd |}|
|v r%|| | jd |}tj s3|s7| j}n| jd|	 }t|ddD ]\}
}||}|
|v rU|| qD|rZ|S ||fS )	a   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to compatible intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
        Returns:

        )r   zOutput shape must be NCHW.   r   Nr$   r   )start)r   rr   r'   r(   r]   r^   rx   r&   )r   r!   r   r   r   r   r   intermediatestake_indices	max_indexfeat_idxrx   stager   r   r    forward_intermediates  s&   

zVovNet.forward_intermediatesr   
prune_norm
prune_headc                 C   s2   t d|\}}| jd| | _|r| dd |S )z@ Prune layers not required for specified intermediates.
        r   Nr   r3   )r   rx   r   )r   r   r   r   r   r   r   r   r    prune_intermediate_layers;  s
   z VovNet.prune_intermediate_layersc                 C   s   |  |}| |S r   )rr   rx   r_   r   r   r    forward_featuresI  s   

zVovNet.forward_features
pre_logitsc                 C   s   |r	| j ||dS |  |S )N)r   )rz   )r   r!   r   r   r   r    forward_headM  s   zVovNet.forward_headc                 C   s   |  |}| |}|S r   )r   r   r_   r   r   r    r,   P  s   

zVovNet.forwardF)Tr   )NFFr   F)r   FT)r-   r.   r/   r   rK   rL   r   r(   r]   ignorer   r   Moduler   r   strr   r0   r   intr   boolr   r   r   r   r   r,   r1   r   r   r   r    r      sd    T 
1
)@   r      )r            )      i   i   r   )r   r   rO   rO   Fr3   )re   rf   rg   rD   rY   r8   r9   r?   )r   r   rd   r7   )r   r   r   )r   P   `   p   )r   r   i  r   r7   )r   r   r   r   TrN   )r   r7   	   r7   eca)
	vovnet39a	vovnet57aese_vovnet19b_slim_dwese_vovnet19b_dwese_vovnet19b_slim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)flatten_sequential)	model_cfgfeature_cfg)r   r   
model_cfgsr:   )variant
pretrainedr   r   r   r    _create_vovnet  s   r   c                 K   s   | dddddt tddd
|S )	Nr`   )r7   r   r   )   r   g      ?bicubiczstem.0.convzhead.fc)
urlrp   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierr   )r   r   r   r   r    _cfg  s   r   )r   ztimm/)r7      r   gffffff?)	hf_hub_idtest_input_sizetest_crop_pct)      ?r   r   )r7   r   r   )   r   )r7   @  r   g      ?)r   r   r   r   r   r   r   r   )
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.ra4_e3600_r256_in1kzese_vovnet99b.untrainedzeca_vovnet39b.untrainedzese_vovnet39b_evos.untrainedr#   c                 K      t dd| i|S )Nr   r   )r   r   r   r   r   r   r    r        r   c                 K   r   )Nr   r   )r   r   r   r   r   r    r     r   r   c                 K   r   )Nr   r   )r   r   r   r   r   r    r     r   r   c                 K   r   )Nr   r   )r   r   r   r   r   r    r     r   r   c                 K   r   )Nr   r   )r   r   r   r   r   r    r     r   r   c                 K   r   )Nr   r   )r   r   r   r   r   r    r   	  r   c                 K   r   )Nr   r   )r   r   r   r   r   r    r     r   r   c                 K   r   )Nr   r   )r   r   r   r   r   r    r     r   r   c                 K   r   )Nr   r   )r   r   r   r   r   r    r     r   r   c                 K   s   dd }t d| |d|S )Nc                 [   s   t d| fddi|S )N	evonorms0r]   F)r   )rw   nkwargsr   r   r    norm_act_fn!  s   z'ese_vovnet39b_evos.<locals>.norm_act_fnr   )r   r5   )r   r   )r   r   r   r   r   r    r     s   r   )r3   )3__doc__typingr   r   r   r   r(   torch.nnrK   	timm.datar   r   timm.layersr	   r
   r   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__rW   r   r   r2   rM   r   r:   r   r   r   default_cfgsr   r   r   r   r   r   r   r   r   r   r   r   r   r    <module>   sH   $=9 7




j

	