U
    ¯Ê¹jžv  ã                   @   sê  d Z ddlZddlZddlZddlmZ ddlm  m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 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G dd„ dejƒZ G dd„ dejƒZ!dd„ Z"dYdd„Z#G dd„ dejƒZ$G dd„ dejƒZ%dZd#d$„Z&d[d%d&„Z'G d'd	„ d	ejƒZ(d\d(d)„Z)d]d+d,„Z*ee*d-d.d/d0�e*d-d1d2d3d4�e*d-d5d/d0�e*d-d6d2d3d4�e*d-d7d/d0�e*d-d8d2d9d4�e*d-d:d/d0�e*d-d;d<d9d4�e*d-d=d/d0�e*d-d>d<d9d4�e*d-d?d<d@d4�dAœƒZ+ed^e(dBœdCdD„ƒZ,ed_e(dBœdEdF„ƒZ-ed`e(dBœdGdH„ƒZ.edae(dBœdIdJ„ƒZ/edbe(dBœdKdL„ƒZ0edce(dBœdMdN„ƒZ1edde(dBœdOdP„ƒZ2edee(dBœdQdR„ƒZ3edfe(dBœdSdT„ƒZ4edge(dBœdUdV„ƒZ5edhe(dBœdWdX„ƒZ6dS )ia5   Vision OutLOoker (VOLO) implementation

Paper: `VOLO: Vision Outlooker for Visual Recognition` - https://arxiv.org/abs/2106.13112

Code adapted from official impl at https://github.com/sail-sg/volo, original copyright in comment below

Modifications and additions for timm by / Copyright 2022, Ross Wightman
é    N)Ú
checkpoint©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚDropPathÚMlpÚ	to_2tupleÚ	to_ntupleÚtrunc_normal_é   )Úbuild_model_with_cfg)Úregister_modelÚgenerate_default_cfgsÚVOLOc                       s&   e Zd Zd	‡ fdd„	Zdd„ Z‡  ZS )
ÚOutlookAttentioné   r   Fç        c	           
         sª   t ƒ  ¡  || }	|| _|| _|| _|| _|	d | _tj|||d�| _	t ||d | ¡| _
t |¡| _t ||¡| _t |¡| _tj|||d�| _tj||dd�| _d S )Nç      à¿©Úbiasé   )Úkernel_sizeÚpaddingÚstrideT)r   r   Z	ceil_mode)ÚsuperÚ__init__Ú	num_headsr   r   r   ÚscaleÚnnÚLinearÚvÚattnÚDropoutÚ	attn_dropÚprojÚ	proj_dropZUnfoldÚunfoldZ	AvgPool2dÚpool)
ÚselfÚdimr   r   r   r   Úqkv_biasr#   r%   Úhead_dim©Ú	__class__© úO/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/volo.pyr   (   s    

zOutlookAttention.__init__c           
      C   sp  |j \}}}}|  |¡ dddd¡}t || j ¡t || j ¡ }}|  |¡ || j|| j | j	| j	 || ¡ ddddd¡}|  
| dddd¡¡ dddd¡}	|  |	¡ ||| | j| j	| j	 | j	| j	 ¡ ddddd¡}	|	| j }	|	jdd�}	|  |	¡}	|	|  ddddd¡ ||| j	 | j	 || ¡}tj|||f| j	| j| jd�}|  | dddd¡¡}|  |¡}|S )	Nr   r   r   é   r   éÿÿÿÿ©r)   )Zoutput_sizer   r   r   )Úshaper    ÚpermuteÚmathÚceilr   r&   Úreshaper   r   r'   r!   r   Úsoftmaxr#   ÚFÚfoldr   r$   r%   )
r(   ÚxÚBÚHÚWÚCr    ÚhÚwr!   r.   r.   r/   ÚforwardE   sL    "
  
 þ    þ"
   

þ    þ

0
zOutlookAttention.forward)r   r   r   Fr   r   ©Ú__name__Ú
__module__Ú__qualname__r   rB   Ú__classcell__r.   r.   r,   r/   r   &   s         ÷r   c                       s:   e Zd Zdddddejejdf‡ fdd„	Zdd„ Z‡  ZS )	Ú	Outlookerr   ç      @r   Fc              	      sp   t ƒ  ¡  |
|ƒ| _t|||||||d�| _|dkr<t|ƒnt ¡ | _|
|ƒ| _	t
|| ƒ}t|||	d�| _d S )N)r   r   r   r*   r#   r   ©Úin_featuresÚhidden_featuresÚ	act_layer)r   r   Únorm1r   r!   r   r   ÚIdentityÚ	drop_pathÚnorm2Úintr   Úmlp)r(   r)   r   r   r   r   Ú	mlp_ratior#   rP   rM   Ú
norm_layerr*   Úmlp_hidden_dimr,   r.   r/   r   a   s&    

ù

ýzOutlooker.__init__c                 C   s8   ||   |  |  |¡¡¡ }||   |  |  |¡¡¡ }|S ©N©rP   r!   rN   rS   rQ   ©r(   r;   r.   r.   r/   rB   …   s    zOutlooker.forward©	rD   rE   rF   r   ZGELUÚ	LayerNormr   rB   rG   r.   r.   r,   r/   rH   `   s   ô$rH   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )	Ú	Attentioné   Fr   c                    sb   t ƒ  ¡  || _|| }|d | _tj||d |d�| _t |¡| _t ||¡| _	t |¡| _
d S )Nr   r   r   )r   r   r   r   r   r   Úqkvr"   r#   r$   r%   )r(   r)   r   r*   r#   r%   r+   r,   r.   r/   r   �   s    

zAttention.__init__c                 C   s°   |j \}}}}|  |¡ ||| d| j|| j ¡ ddddd¡}| d¡\}}}	|| dd¡ | j }
|
jdd�}
|  	|
¡}
|
|	  dd¡ ||||¡}|  
|¡}|  |¡}|S )	Nr   r0   r   r   r   éþÿÿÿr1   r2   )r3   r^   r7   r   r4   ÚunbindÚ	transposer   r8   r#   r$   r%   )r(   r;   r<   r=   r>   r?   r^   ÚqÚkr    r!   r.   r.   r/   rB   Ÿ   s    2


zAttention.forward)r]   Fr   r   rC   r.   r.   r,   r/   r\   ‹   s       úr\   c                       s6   e Zd Zddddejejf‡ fdd„	Zdd„ Z‡  ZS )ÚTransformerç      @Fr   c	           
         sj   t ƒ  ¡  ||ƒ| _t||||d�| _|dkr6t|ƒnt ¡ | _||ƒ| _	t
|| ƒ}	t||	|d�| _d S )N)r   r*   r#   r   rJ   )r   r   rN   r\   r!   r   r   rO   rP   rQ   rR   r   rS   )
r(   r)   r   rT   r*   r#   rP   rM   rU   rV   r,   r.   r/   r   ²   s    


zTransformer.__init__c                 C   s8   ||   |  |  |¡¡¡ }||   |  |  |¡¡¡ }|S rW   rX   rY   r.   r.   r/   rB   È   s    zTransformer.forwardrZ   r.   r.   r,   r/   rd   °   s   ÷rd   c                       s&   e Zd Zd	‡ fdd„	Zdd„ Z‡  ZS )
ÚClassAttentionr]   NFr   c                    s¢   t ƒ  ¡  || _|d k	r || _n|| }|| _|d | _tj|| j| j d |d�| _tj|| j| j |d�| _t 	|¡| _
t | j| j |¡| _t 	|¡| _d S )Nr   r0   r   )r   r   r   r+   r   r   r   Úkvrb   r"   r#   r$   r%   )r(   r)   r   r+   r*   r#   r%   r,   r.   r/   r   Ð   s    	

zClassAttention.__init__c                 C   sÚ   |j \}}}|  |¡ ||d| j| j¡ ddddd¡}| d¡\}}|  |d d …d d…d d …f ¡ || jd| j¡}|| j | 	dd¡ }	|	j
dd�}	|  |	¡}	|	|  	dd¡ |d| j| j ¡}
|  |
¡}
|  |
¡}
|
S )	Nr0   r   r   r   r   r_   r1   r2   )r3   rg   r7   r   r+   r4   r`   rb   r   ra   r8   r#   r$   r%   )r(   r;   r<   ÚNr?   rg   rc   r    rb   r!   Ú	cls_embedr.   r.   r/   rB   è   s    *0
"

zClassAttention.forward)r]   NFr   r   rC   r.   r.   r,   r/   rf   Î   s        ùrf   c                       s:   e Zd Zddddddejejf‡ fdd„	Zdd„ Z‡  ZS )	Ú
ClassBlockNre   Fr   c                    sp   t ƒ  ¡  |
|ƒ| _t||||||d�| _|dkr:t|ƒnt ¡ | _|
|ƒ| _	t
|| ƒ}t|||	|d�| _d S )N)r   r+   r*   r#   r%   r   )rK   rL   rM   Údrop)r   r   rN   rf   r!   r   r   rO   rP   rQ   rR   r   rS   )r(   r)   r   r+   rT   r*   rk   r#   rP   rM   rU   rV   r,   r.   r/   r   ú   s&    

ú	
üzClassBlock.__init__c                 C   sj   |d d …d d…f }||   |  |  |¡¡¡ }||   |  |  |¡¡¡ }tj||d d …dd …f gdd�S )Nr   r2   )rP   r!   rN   rS   rQ   ÚtorchÚcat)r(   r;   ri   r.   r.   r/   rB     s    zClassBlock.forwardrZ   r.   r.   r,   r/   rj   ø   s   õ"rj   c                 K   s   | dkrt f |ŽS d S )NÚca)rj   )Z
block_typeZkargsr.   r.   r/   Ú	get_block#  s    ro   c                 C   s¾   | d | }| d | }t  d| ¡}||  t¡}||  t¡}t j |¡}t j |¡}	t  ||d  d|¡}
t  |	|d  d|¡}t  ||d  d|¡}t  |	|d  d|¡}|
|||fS )zt
    get bounding box as token labeling (https://github.com/zihangJiang/TokenLabeling)
    return: bounding box
    r   r0   ç      ð?r   )ÚnpÚsqrtZastyperR   ÚrandomÚrandintZclip)ÚsizeÚlamr   r>   r=   Zcut_ratZcut_wZcut_hZcxÚcyÚbbx1Úbby1Úbbx2Úbby2r.   r.   r/   Ú	rand_bbox(  s    r|   c                       s*   e Zd ZdZd‡ fd	d
„	Zdd„ Z‡  ZS )Ú
PatchEmbedzs Image to Patch Embedding.
    Different with ViT use 1 conv layer, we use 4 conv layers to do patch embedding
    éà   Fr   r]   r   é@   é€  c                    sÐ   t ƒ  ¡  |dkst‚|r˜t tj||d|ddd�t |¡tjdd�tj||ddddd�t |¡tjdd�tj||ddddd�t |¡tjdd�¡	| _nd | _tj|||| || d	�| _	|| ||  | _
d S )
N)r   r]   é   é   r   F)r   r   r   r   T)Zinplacer   ©r   r   )r   r   ÚAssertionErrorr   Ú
SequentialÚConv2dZBatchNorm2dZReLUÚconvr$   Znum_patches)r(   Úimg_sizeÚ	stem_convÚstem_strideÚ
patch_sizeÚin_chansÚ
hidden_dimÚ	embed_dimr,   r.   r/   r   D  s,    




÷   ÿzPatchEmbed.__init__c                 C   s"   | j d k	r|   |¡}|  |¡}|S rW   )r‡   r$   rY   r.   r.   r/   rB   c  s    


zPatchEmbed.forward)r~   Fr   r]   r   r   r€   ©rD   rE   rF   Ú__doc__r   rB   rG   r.   r.   r,   r/   r}   ?  s          ør}   c                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )Ú
DownsamplezF Image to Patch Embedding, downsampling between stage1 and stage2
    r0   c                    s"   t ƒ  ¡  tj||||d�| _d S )Nrƒ   )r   r   r   r†   r$   )r(   Zin_embed_dimZout_embed_dimr‹   r,   r.   r/   r   n  s    
zDownsample.__init__c                 C   s.   |  dddd¡}|  |¡}|  dddd¡}|S )Nr   r   r   r0   )r4   r$   rY   r.   r.   r/   rB   r  s    
zDownsample.forward)r0   r�   r.   r.   r,   r/   r‘   j  s   r‘   r   r0   rI   Fr   c                 K   sh   g }t || ƒD ]H}||t|d|… ƒ  t|ƒd  }| | |||||||	|
|d�	¡ qtj|Ž }|S )zI
    generate outlooker layer in stage1
    return: outlooker layers
    Nr   )r   r   r   r   rT   r*   r#   rP   ©ÚrangeÚsumÚappendr   r…   )Úblock_fnÚindexr)   Úlayersr   r   r   r   rT   r*   r#   Údrop_path_rateÚkwargsÚblocksÚ	block_idxÚ	block_dprr.   r.   r/   Úoutlooker_blocksy  s     $÷

rž   c	                 K   sb   g }
t || ƒD ]B}||t|d|… ƒ  t|ƒd  }|
 | ||||||d�¡ qtj|
Ž }
|
S )zN
    generate transformer layers in stage2
    return: transformer layers
    Nr   )rT   r*   r#   rP   r’   )r–   r—   r)   r˜   r   rT   r*   r#   r™   rš   r›   rœ   r�   r.   r.   r/   Útransformer_blocksž  s    $ú

rŸ   c                       sÜ   e Zd ZdZddddddddd	d	d
dddddejddddf‡ fdd„	Zdd„ Zej	j
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 d!„ Zd"d#„ Zd$d%„ Zd.ed&œd'd(„Zd)d*„ Z‡  ZS )/r   z7
    Vision Outlooker, the main class of our model
    r~   r   éè  Útokenr]   r   N)TFFFrI   Fr   )rn   rn   Tr0   c                    sx  t ƒ  ¡  t|ƒ}t|ƒˆƒ‰t|ƒ}|| _|| _|| _|| _ˆd | _	|rbd| _
|dksbtdƒ‚d| _tdd|||ˆd d	�| _|d | | |d
 | | f}t t d
|d |d
 ˆd ¡¡| _tj|d�| _g }tt|ƒƒD ]˜}|| �r$tt|ˆ| |ˆ| ˆ| ˆˆ ˆd�	}| |¡ n2tt|ˆ| |ˆ| ˆ| ˆ|ˆ ˆd�
}| |¡ |
| rä| tˆ| ˆ|d
  dƒ¡ qät |¡| _d | _ˆd k	�rðt ‡ ‡‡‡‡‡‡fdd„ttˆƒƒD ƒ¡| _t t d
d
ˆd ¡¡| _ t!| j dd� |�r|dk�rt "| j	|¡nt #¡ | _$nd | _$ˆ| j	ƒ| _%t |¡| _&|dk�rPt "| j	|¡nt #¡ | _'t!| jdd� |  (| j)¡ d S )Nr1   rp   r¡   z)return all tokens if mix_token is enabledFTr0   r   )r‰   rŠ   r‹   rŒ   r�   rŽ   r   )Úp)rT   r*   r#   rU   )rT   r*   r™   r#   rU   c                    s4   g | ],}t ˆ| ˆd  ˆd  ˆd  ˆˆ dˆd�‘qS )r1   r   )r)   r   rT   r*   r#   rP   rU   )ro   )Ú.0Úi©Úattn_drop_rateÚ
embed_dimsrT   rU   r   Úpost_layersr*   r.   r/   Ú
<listcomp>"  s   
÷øz!VOLO.__init__.<locals>.<listcomp>ç{®Gáz”?©Ústd)*r   r   Úlenr	   r   Únum_classesÚglobal_poolÚ	mix_tokenÚpooling_scaleÚnum_featuresÚbetar„   Úgrad_checkpointingr}   Úpatch_embedr   Ú	Parameterrl   ZzerosÚ	pos_embedr"   Úpos_dropr“   rž   rH   r•   rŸ   rd   r‘   Z
ModuleListÚnetworkÚpost_networkÚ	cls_tokenr
   r   rO   Úaux_headÚnormÚ	head_dropÚheadÚapplyÚ_init_weights)r(   r˜   rˆ   rŒ   r®   r¯   r‹   Ústem_hidden_dimr§   r   ZdownsamplesZoutlook_attentionrT   r*   Z	drop_rateZpos_drop_rater¦   r™   rU   r¨   Zuse_aux_headZuse_mix_tokenr±   Z
num_layersZ
patch_gridr¹   r¤   Zstager,   r¥   r/   r   Â  sŒ    

ú
 $
÷ö
 


ö
$"zVOLO.__init__c                 C   sD   t |tjƒr@t|jdd� t |tjƒr@|jd k	r@tj |jd¡ d S )Nrª   r«   r   )Ú
isinstancer   r   r
   Úweightr   ÚinitZ	constant_)r(   Úmr.   r.   r/   rÁ   ?  s    zVOLO._init_weightsc                 C   s   ddhS )Nr·   r»   r.   ©r(   r.   r.   r/   Úno_weight_decayE  s    zVOLO.no_weight_decayc                 C   s   t dddgdddgd�S )Nz ^cls_token|pos_embed|patch_embed)z^network\.(\d+)\.(\d+)N)z^network\.(\d+)©r   )z
^cls_tokenrÉ   )z^post_network\.(\d+)N)z^norm)iŸ† )Ústemr›   Zblocks2)Údict)r(   Zcoarser.   r.   r/   Úgroup_matcherI  s    þýúzVOLO.group_matcherc                 C   s
   || _ d S rW   )r´   )r(   Úenabler.   r.   r/   Úset_grad_checkpointingX  s    zVOLO.set_grad_checkpointingc                 C   s   | j S rW   )r¿   rÇ   r.   r.   r/   Úget_classifier\  s    zVOLO.get_classifierc                 C   sb   || _ |d k	r|| _|dkr*t | j|¡nt ¡ | _| jd k	r^|dkrTt | j|¡nt ¡ | _d S )Nr   )r®   r¯   r   r   r²   rO   r¿   r¼   )r(   r®   r¯   r.   r.   r/   Úreset_classifier`  s     
zVOLO.reset_classifierc                 C   st   t | jƒD ]H\}}|dkr.|| j }|  |¡}| jrJtj ¡ sJt||ƒ}q
||ƒ}q
|j	\}}}}| 
|d|¡}|S )Nr0   r1   )Ú	enumerater¹   r·   r¸   r´   rl   ÚjitÚis_scriptingr   r3   r7   )r(   r;   ÚidxÚblockr<   r=   r>   r?   r.   r.   r/   Úforward_tokensh  s    


zVOLO.forward_tokensc                 C   sb   |j \}}}| j |dd¡}tj||gdd�}| jD ](}| jrTtj ¡ sTt	||ƒ}q4||ƒ}q4|S )Nr1   r   r2   )
r3   r»   Úexpandrl   rm   rº   r´   rÒ   rÓ   r   )r(   r;   r<   rh   r?   Z
cls_tokensrÕ   r.   r.   r/   Úforward_clsw  s    

zVOLO.forward_clsc                 C   sV  |   |¡}| dddd¡}| jrò| jròtj | j| j¡}|jd | j |jd | j  }}t	| 
¡ || jd�\}}}}| ¡ }	| j| | j|  }
}| j| | j|  }}| d¡dd…|
|…||…dd…f |	dd…|
|…||…dd…f< |	}nd\}}}}|  |¡}| jdk	�r|  |¡}|  |¡}| jdk�rB|jdd	�}n"| jd
k�r`|dd…df }n|}| jdk�rt|S |  |dd…dd…f ¡}| j�s¬|d| d¡d   S | j�rD| j�rD| |jd |||jd ¡}| ¡ }	| d¡dd…||…||…dd…f |	dd…||…||…dd…f< |	}| |jd || |jd ¡}||||||ffS )zÀ A separate forward fn for training with mix_token (if a train script supports).
        Combining multiple modes in as single forward with different return types is torchscript hell.
        r   r0   r   r   )r   N)r   r   r   r   Úavgr2   r¡   ç      à?r1   )rµ   r4   r°   Ztrainingrq   rs   r³   r3   r±   r|   ru   ÚcloneÚfliprÖ   rº   rØ   r½   r¯   Úmeanr¼   Úmaxr7   )r(   r;   rv   Zpatch_hZpatch_wrx   ry   rz   r{   Ztemp_xZsbbx1Zsbby1Zsbbx2Zsbby2Zx_clsZx_auxr.   r.   r/   Úforward_train‚  sB    
"B


BzVOLO.forward_trainc                 C   sB   |   |¡ dddd¡}|  |¡}| jd k	r4|  |¡}|  |¡}|S )Nr   r0   r   r   )rµ   r4   rÖ   rº   rØ   r½   rY   r.   r.   r/   Úforward_features¶  s    



zVOLO.forward_features)Ú
pre_logitsc                 C   s’   | j dkr|jdd�}n | j dkr4|d d …df }n|}|  |¡}|rJ|S |  |¡}| jd k	rŽ|  |d d …dd …f ¡}|d| d¡d   }|S )NrÙ   r   r2   r¡   r   rÚ   )r¯   rÝ   r¾   r¿   r¼   rÞ   )r(   r;   rá   ÚoutZauxr.   r.   r/   Úforward_headÂ  s    




zVOLO.forward_headc                 C   s   |   |¡}|  |¡}|S )z1 simplified forward (without mix token training) )rà   rã   rY   r.   r.   r/   rB   Ó  s    

zVOLO.forward)F)T)N)F)rD   rE   rF   r�   r   r[   r   rÁ   rl   rÒ   ÚignorerÈ   rÌ   rÎ   rÏ   rÐ   rÖ   rØ   rß   rà   Úboolrã   rB   rG   r.   r.   r,   r/   r   ½  sN   é}


4c                 K   s$   |  dd ¡rtdƒ‚tt| |f|ŽS )NZfeatures_onlyz<features_only not implemented for Vision Transformer models.)ÚgetÚRuntimeErrorr   r   )ÚvariantÚ
pretrainedrš   r.   r.   r/   Ú_create_voloÚ  s    ýürê   Ú c                 K   s    | ddd dddt tdddœ|–S )	Nr    )r   r~   r~   ç¸…ëQ¸î?ZbicubicTzpatch_embed.conv.0)r¿   r¼   )Úurlr®   Ú
input_sizeZ	pool_sizeÚcrop_pctÚinterpolationZfixed_input_sizerÝ   r¬   Z
first_convÚ
classifierr   )rí   rš   r.   r.   r/   Ú_cfgå  s          ûúrò   ztimm/zLhttps://github.com/sail-sg/volo/releases/download/volo_1/d1_224_84.2.pth.tarrì   )Ú	hf_hub_idrí   rï   zLhttps://github.com/sail-sg/volo/releases/download/volo_1/d1_384_85.2.pth.tarrp   )r   r€   r€   )ró   rí   rï   rî   zLhttps://github.com/sail-sg/volo/releases/download/volo_1/d2_224_85.2.pth.tarzLhttps://github.com/sail-sg/volo/releases/download/volo_1/d2_384_86.0.pth.tarzLhttps://github.com/sail-sg/volo/releases/download/volo_1/d3_224_85.4.pth.tarzLhttps://github.com/sail-sg/volo/releases/download/volo_1/d3_448_86.3.pth.tar)r   éÀ  rô   zLhttps://github.com/sail-sg/volo/releases/download/volo_1/d4_224_85.7.pth.tarzMhttps://github.com/sail-sg/volo/releases/download/volo_1/d4_448_86.79.pth.targffffffò?zMhttps://github.com/sail-sg/volo/releases/download/volo_1/d5_224_86.10.pth.tarzLhttps://github.com/sail-sg/volo/releases/download/volo_1/d5_448_87.0.pth.tarzMhttps://github.com/sail-sg/volo/releases/download/volo_1/d5_512_87.07.pth.tar)r   é   rõ   )zvolo_d1_224.sail_in1kzvolo_d1_384.sail_in1kzvolo_d2_224.sail_in1kzvolo_d2_384.sail_in1kzvolo_d3_224.sail_in1kzvolo_d3_448.sail_in1kzvolo_d4_224.sail_in1kzvolo_d4_448.sail_in1kzvolo_d5_224.sail_in1kzvolo_d5_448.sail_in1kzvolo_d5_512.sail_in1k)Úreturnc                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )ú VOLO-D1 model, Params: 27M ©r   r   r]   r0   ©éÀ   r€   r€   r€   ©é   é   rý   rý   ©r˜   r§   r   Úvolo_d1_224ré   )rÿ   ©rË   rê   ©ré   rš   Z
model_argsÚmodelr.   r.   r/   rÿ      s    rÿ   c                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )r÷   rø   rù   rû   rþ   Úvolo_d1_384ré   )r  r   r  r.   r.   r/   r  (  s    r  c                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )ú VOLO-D2 model, Params: 59M ©rü   r   é
   r   ©é   rõ   rõ   rõ   ©r]   r�   r�   r�   rþ   Úvolo_d2_224ré   )r
  r   r  r.   r.   r/   r
  0  s    r
  c                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )r  r  r  r	  rþ   Úvolo_d2_384ré   )r  r   r  r.   r.   r/   r  8  s    r  c                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )ú VOLO-D3 model, Params: 86M ©r]   r]   r�   r   r  r	  rþ   Úvolo_d3_224ré   )r  r   r  r.   r.   r/   r  @  s    r  c                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )r  r  r  r	  rþ   Úvolo_d3_448ré   )r  r   r  r.   r.   r/   r  H  s    r  c                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )ú VOLO-D4 model, Params: 193M r  ©r€   é   r  r  ©rý   r�   r�   r�   rþ   Úvolo_d4_224ré   )r  r   r  r.   r.   r/   r  P  s    r  c                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )r  r  r  r  rþ   Úvolo_d4_448ré   )r  r   r  r.   r.   r/   r  X  s    r  c                 K   s0   t f ddddddœ|—Ž}td	d| i|—Ž}|S )
úh VOLO-D5 model, Params: 296M
    stem_hidden_dim=128, the dim in patch embedding is 128 for VOLO-D5
    ©rý   rý   é   r   r  r  r   é€   ©r˜   r§   r   rT   rÂ   Úvolo_d5_224ré   )r  r   r  r.   r.   r/   r  `  s       þþr  c                 K   s0   t f ddddddœ|—Ž}td	d| i|—Ž}|S )
r  r  r  r  r   r  r  Úvolo_d5_448ré   )r  r   r  r.   r.   r/   r  l  s       þþr  c                 K   s0   t f ddddddœ|—Ž}td	d| i|—Ž}|S )
r  r  r  r  r   r  r  Úvolo_d5_512ré   )r  r   r  r.   r.   r/   r  x  s       þþr  )r   )r   r   r   r0   rI   Fr   r   )rI   Fr   r   )F)rë   )F)F)F)F)F)F)F)F)F)F)F)7r�   r5   Únumpyrq   rl   Ztorch.nnr   Ztorch.nn.functionalZ
functionalr9   Ztorch.utils.checkpointr   Z	timm.datar   r   Ztimm.layersr   r   r   r	   r
   Z_builderr   Ú	_registryr   r   Ú__all__ÚModuler   rH   r\   rd   rf   rj   ro   r|   r}   r‘   rž   rŸ   r   rê   rò   Zdefault_cfgsrÿ   r  r
  r  r  r  r  r  r  r  r  r.   r.   r.   r/   Ú<module>   sú   :+%*+
+        ô
+    ÷
  

ý ýý ýý ýý ýý ý ý×0