U
    ¯Ê¹jƒ…  ã                   @   s   d Z dgZddlmZ ddlm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 d	d
lmZ d	dlmZ d	dlmZ d	dlmZmZ d\ep¸ep¸e dœdd„Z!d]epÐepÐe e"e"dœdd„Z#e"pîee"df e"� pþee"df 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+ee+ƒ G d%d&„ d&ej%ƒZ,G d'd(„ d(ej%ƒZ-d^e"e"e"e.e/e/e0e/d+œd,d-„Z1G d.d/„ d/ej2ƒZ3G d0d1„ d1ej%ƒZ4G d2d3„ d3ej%ƒZ5G d4d5„ d5ej%ƒZ6G d6d„ dej%ƒZ7G d7d8„ d8ej%ƒZ8d_d:d;„Z9ee9d<d=�e9d<d=�e9d<d>d?d@dA�e9d<dBdCd@dA�e9d<d=�e9d<d>d?d@dA�e9d<dBdCd@dA�e9d<d=�e9d<d>d?d@dA�e9d<dBdCd@dA�e9d<d@dD�e9d<d@dD�e9d<d>d?d@dA�e9d<dBdCd@dA�e9d<dEdFd@dA�e9d<d@dD�e9d<d>d?d@dA�e9d<dGdHd@dA�e9d<dEdFd@dA�dIœƒZ:d`dJdK„Z;dadLdM„Z<edbdNdO„ƒZ=edcdPdQ„ƒZ>edddRdS„ƒZ?ededTdU„ƒZ@edfdVdW„ƒZAedgdXdY„ƒZBedhdZd[„ƒZCdS )ia   EfficientViT (by MIT Song Han's Lab)

Paper: `Efficientvit: Enhanced linear attention for high-resolution low-computation visual recognition`
    - https://arxiv.org/abs/2205.14756

Adapted from official impl at https://github.com/mit-han-lab/efficientvit
ÚEfficientVité    )ÚOptional)ÚpartialN)Ú
_BatchNorm©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚSelectAdaptivePool2dÚcreate_conv2dÚGELUTanhé   )Úbuild_model_with_cfg)Úregister_notrace_module)Úcheckpoint_seq)Úregister_modelÚgenerate_default_cfgs©Úxc                    s,   t ˆ ttfƒrtˆ ƒS ‡ fdd„t|ƒD ƒS )Nc                    s   g | ]}ˆ ‘qS © r   ©Ú.0Ú_r   r   ú[/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/efficientvit_mit.pyÚ
<listcomp>   s     zval2list.<locals>.<listcomp>)Ú
isinstanceÚlistÚtupleÚrange)r   Zrepeat_timer   r   r   Úval2list   s    r   éÿÿÿÿ©r   Zmin_lenÚ
idx_repeatc                    sD   t ˆƒ‰tˆƒdkr<‡ ‡fdd„t|tˆƒ ƒD ƒˆˆ ˆ …< tˆƒS )Nr   c                    s   g | ]}ˆˆ  ‘qS r   r   r   ©r!   r   r   r   r   $   s     zval2tuple.<locals>.<listcomp>)r   Úlenr   r   r    r   r"   r   Ú	val2tuple    s    (r$   .)Úkernel_sizeÚreturnc                 C   s<   t | tƒrtdd„ | D ƒƒS | d dks0tdƒ‚| d S d S )Nc                 S   s   g | ]}t |ƒ‘qS r   )Úget_same_padding)r   Úksr   r   r   r   +   s     z$get_same_padding.<locals>.<listcomp>é   r   z kernel size should be odd number)r   r   ÚAssertionError)r%   r   r   r   r'   )   s    
r'   c                       sB   e Zd Zddddddejejfeedœ‡ fdd„Zdd	„ Z‡  Z	S )
ÚConvNormActé   r   Fç        ©Úin_channelsÚout_channelsc              	      sn   t t| ƒ ¡  tj|dd�| _t|||||||d�| _|	rD|	|d�nt ¡ | _	|
d k	r`|
dd�nt ¡ | _
d S )NF©Zinplace)r%   ÚstrideÚdilationÚgroupsÚbias)Únum_featuresT)Úsuperr+   Ú__init__ÚnnÚDropoutÚdropoutr
   ÚconvÚIdentityÚnormÚact)Úselfr/   r0   r%   r2   r3   r4   r5   r;   Ú
norm_layerÚ	act_layer©Ú	__class__r   r   r8   2   s    ù	zConvNormAct.__init__c                 C   s,   |   |¡}|  |¡}|  |¡}|  |¡}|S ©N)r;   r<   r>   r?   ©r@   r   r   r   r   ÚforwardM   s
    



zConvNormAct.forward)
Ú__name__Ú
__module__Ú__qualname__r9   ÚBatchNorm2dÚReLUÚintr8   rG   Ú__classcell__r   r   rC   r   r+   1   s   õýr+   c                       sF   e Zd Zdddejejfejdffeedœ‡ fdd„Zdd	„ Z‡  Z	S )
ÚDSConvr,   r   FNr.   c              
      sx   t t| ƒ ¡  t|dƒ}t|dƒ}t|dƒ}t||||||d |d |d d�| _t||d|d |d |d d�| _d S )Nr)   r   )r4   rA   rB   r5   r   ©rA   rB   r5   )r7   rO   r8   r$   r+   Ú
depth_convÚ
point_conv)r@   r/   r0   r%   r2   Úuse_biasrA   rB   rC   r   r   r8   V   s,    



ø
úzDSConv.__init__c                 C   s   |   |¡}|  |¡}|S rE   )rQ   rR   rF   r   r   r   rG   x   s    

zDSConv.forward©
rH   rI   rJ   r9   rK   ZReLU6rM   r8   rG   rN   r   r   rC   r   rO   U   s   
øý"rO   c                       sJ   e Zd Zdddddejejfejdffeedœ‡ fdd„Zdd	„ Z‡  Z	S )
Ú	ConvBlockr,   r   NFr.   c
           
   	      sˆ   t t| ƒ ¡  t|dƒ}t|dƒ}t|	dƒ}	|p:t|| ƒ}t|||||d |	d |d d�| _t|||d|d |	d |d d�| _d S )Nr)   r   rP   r   )r7   rU   r8   r$   Úroundr+   Úconv1Úconv2©
r@   r/   r0   r%   r2   Úmid_channelsÚexpand_ratiorS   rA   rB   rC   r   r   r8      s.    


ù	ùzConvBlock.__init__c                 C   s   |   |¡}|  |¡}|S rE   )rW   rX   rF   r   r   r   rG   ¤   s    

zConvBlock.forwardrT   r   r   rC   r   rU   ~   s   
öý%rU   c                	       sR   e Zd Zdddddejejejfejejdffeedœ‡ fdd„Zd	d
„ Z‡  Z	S )ÚMBConvr,   r   Né   Fr.   c
           
   
      s¬   t t| ƒ ¡  t|dƒ}t|dƒ}t|	dƒ}	|p:t|| ƒ}t||dd|d |	d |d d�| _t||||||d |	d |d d�| _t||d|d |	d |d d�| _d S )Nr,   r   r   )r2   rA   rB   r5   ©r2   r4   rA   rB   r5   r)   rP   )	r7   r\   r8   r$   rV   r+   Úinverted_convrQ   rR   rY   rC   r   r   r8   «   s@    


ù	ø
úzMBConv.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S rE   )r_   rQ   rR   rF   r   r   r   rG   Ù   s    


zMBConv.forwardrT   r   r   rC   r   r\   ª   s   öý.r\   c                	       sL   e Zd Zddddddejejfejdffeedœ‡ fdd„Zd	d
„ Z‡  Z	S )ÚFusedMBConvr,   r   Nr]   Fr.   c              
      sˆ   t t| ƒ ¡  t|dƒ}t|	dƒ}	t|
dƒ}
|p:t|| ƒ}t||||||	d |
d |d d�| _t||d|	d |
d |d d�| _d S )Nr)   r   r^   r   rP   )r7   r`   r8   r$   rV   r+   Úspatial_convrR   )r@   r/   r0   r%   r2   rZ   r[   r4   rS   rA   rB   rC   r   r   r8   á   s.    


ø
úzFusedMBConv.__init__c                 C   s   |   |¡}|  |¡}|S rE   )ra   rR   rF   r   r   r   rG     s    

zFusedMBConv.forwardrT   r   r   rC   r   r`   à   s   
õý&r`   c                	       s\   e Zd ZdZdddddejfdejddf	eeep2ded	œ‡ fd
d„Z	dd„ Z
dd„ Z‡  ZS )ÚLiteMLAz(Lightweight multi-scale linear attentionNç      ð?é   F)NN)é   çñhãˆµøä>)r/   r0   ÚheadsÚheads_ratioc                    sÖ   t t| ƒ ¡  || _ˆ p&t|| | ƒ‰ ˆ | ‰tˆdƒ‰t|dƒ}t|dƒ}|| _t|dˆ dˆd |d |d d�| _t	 
‡ ‡‡fdd„|
D ƒ¡| _|	dd	�| _tˆdt|
ƒ  |dˆd |d |d d�| _d S )
Nr)   r,   r   r   )r5   rA   rB   c                    s^   g | ]V}t  t jd ˆ d ˆ |t|ƒd ˆ ˆd d�t jd ˆ d ˆ dd ˆ  ˆd d�¡‘qS )r,   r   )Úpaddingr4   r5   r   )r4   r5   )r9   Ú
SequentialZConv2dr'   )r   Úscale©rg   Z	total_dimrS   r   r   r   /  s   õú"÷z$LiteMLA.__init__.<locals>.<listcomp>Fr1   )r7   rb   r8   ÚepsrM   r$   Údimr+   Úqkvr9   Z
ModuleListÚaggregÚkernel_funcr#   Úproj)r@   r/   r0   rg   rh   rn   rS   rA   rB   rq   Úscalesrm   rC   rl   r   r8     s8    


úô
úzLiteMLA.__init__c                 C   sj   |j }| ¡ | ¡ | ¡   }}}| dd¡| }|| }|dd d…f |ddd …f | j  }| |¡S )Nr   éþÿÿÿ.)ÚdtypeÚfloatÚ	transposerm   Úto)r@   ÚqÚkÚvru   ÚkvÚoutr   r   r   Ú_attnH  s    &zLiteMLA._attnc              	   C   s  |j \}}}}|  |¡}|g}| jD ]}| ||ƒ¡ q$tj|dd�}| |dd| j || ¡ dd¡}|j	ddd�\}	}
}|  
|	¡}	|  
|
¡}
tj|dddd	�}tj ¡ sÚtj|jjd
d�� |  |	|
|¡}W 5 Q R X n|  |	|
|¡}| dd¡ |d||¡}|  |¡}|S )Nr   )rn   r   r,   rt   )r   r   Zconstantrc   )ÚmodeÚvalueF)Zdevice_typeZenabled)Úshapero   rp   ÚappendÚtorchÚcatZreshapern   rw   Úchunkrq   ÚFÚpadÚjitÚis_scriptingZautocastZdeviceÚtyper~   rr   )r@   r   ÚBr   ÚHÚWro   Zmulti_scale_qkvÚopry   rz   r{   r}   r   r   r   rG   P  s$    

"



zLiteMLA.forward)rH   rI   rJ   Ú__doc__r9   rK   rL   rM   rv   r8   r~   rG   rN   r   r   rC   r   rb     s$   ôû8rb   c                       s4   e Zd Zdddejejf‡ fdd„	Zdd„ Z‡  ZS )ÚEfficientVitBlockrc   é    é   c              
      s`   t t| ƒ ¡  tt||||d |fd�t ¡ ƒ| _tt|||dd d |f||d fd�t ¡ ƒ| _	d S )N)r/   r0   rh   rn   rA   ©TTF)r/   r0   r[   rS   rA   rB   )
r7   r�   r8   ÚResidualBlockrb   r9   r=   Úcontext_moduler\   Úlocal_module)r@   r/   rh   Úhead_dimr[   rA   rB   rC   r   r   r8   q  s,    	ûø
ú÷zEfficientVitBlock.__init__c                 C   s   |   |¡}|  |¡}|S rE   )r•   r–   rF   r   r   r   rG   ‘  s    

zEfficientVitBlock.forward)	rH   rI   rJ   r9   rK   Ú	Hardswishr8   rG   rN   r   r   rC   r   r�   p  s   ù r�   c                       sB   e Zd Zdeej eej eej dœ‡ fdd„Zdd„ Z‡  ZS )r”   N)ÚmainÚshortcutÚpre_normc                    s4   t t| ƒ ¡  |d k	r|nt ¡ | _|| _|| _d S rE   )r7   r”   r8   r9   r=   r›   r™   rš   )r@   r™   rš   r›   rC   r   r   r8   ˜  s    zResidualBlock.__init__c                 C   s,   |   |  |¡¡}| jd k	r(||  |¡ }|S rE   )r™   r›   rš   )r@   r   Úresr   r   r   rG   £  s    
zResidualBlock.forward)NN)	rH   rI   rJ   r   r9   ÚModuler8   rG   rN   r   r   rC   r   r”   —  s     üür”   FÚdefault©r/   r0   r2   r[   rA   rB   Ú
fewer_normÚ
block_typec           	   
   C   sæ   |dkst ‚|dkrx|dkrJt| |||r,dnd|r:d |fn||d fd�}qât| |||rZdnd|rhd |fn||d fd�}nj|dkr´t| ||||r’dnd|r¢d d |fn|||d fd�}n.t| ||||rÆdnd|rÔd |fn||d fd�}|S )	N)rž   ÚlargeÚfusedr   rž   )TFF)r/   r0   r2   rS   rA   rB   r“   )r/   r0   r2   r[   rS   rA   rB   )r*   rO   rU   r\   r`   )	r/   r0   r2   r[   rA   rB   r    r¡   Úblockr   r   r   Úbuild_local_blockª  sN    

ú	
ú	
ù

ù	r¥   c                       s   e Zd Zd‡ fdd„	Z‡  ZS )ÚStemrž   c           	         sx   t ƒ  ¡  d| _|  dt||dd||d�¡ d}t|ƒD ]:}|  d|› �tt||dd|||d�t 	¡ ƒ¡ |d7 }q8d S )	Nr)   Úin_convr,   )r%   r2   rA   rB   r   rœ   r   )r/   r0   r2   r[   rA   rB   r¡   )
r7   r8   r2   Z
add_moduler+   r   r”   r¥   r9   r=   )	r@   Úin_chsÚout_chsÚdepthrA   rB   r¡   Z
stem_blockr   rC   r   r   r8   á  s8    
    þþù	özStem.__init__)rž   )rH   rI   rJ   r8   rN   r   r   rC   r   r¦   à  s   r¦   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚEfficientVitStageFc	                    s    t t| ƒ ¡  tt||d||||d�d ƒg}	|}|r\t|ƒD ]}
|	 t|||||d�¡ q<n4td|ƒD ](}|	 tt||d|||d�t 	¡ ƒ¡ qftj
|	Ž | _d S )Nr)   )r/   r0   r2   r[   rA   rB   r    ©r/   r—   r[   rA   rB   r   )r/   r0   r2   r[   rA   rB   )r7   r«   r8   r”   r¥   r   r‚   r�   r9   r=   rj   Úblocks)r@   r¨   r©   rª   rA   rB   r[   r—   Ú	vit_stager­   r   ÚirC   r   r   r8   þ  sL    ù	öûÿú÷zEfficientVitStage.__init__c                 C   s
   |   |¡S rE   ©r­   rF   r   r   r   rG   5  s    zEfficientVitStage.forward)F©rH   rI   rJ   r8   rG   rN   r   r   rC   r   r«   ý  s   
 ÷7r«   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚEfficientVitLargeStageFc	                    sÀ   t t| ƒ ¡  tt||d|r dnd|||p,||r4dndd�d ƒg}	|}|rrt|ƒD ]}
|	 t||d||d�¡ qRn>t|ƒD ]4}|	 tt||d	d
||||rœdndd�t 	¡ ƒ¡ qztj
|	Ž | _d S )Nr)   é   é   rž   r£   rŸ   r]   r¬   r   r’   )r7   r²   r8   r”   r¥   r   r‚   r�   r9   r=   rj   r­   )r@   r¨   r©   rª   rA   rB   r—   r®   r    r­   r   r¯   rC   r   r   r8   :  sR    

ø
õûÿ
ø
õzEfficientVitLargeStage.__init__c                 C   s
   |   |¡S rE   r°   rF   r   r   r   rG   t  s    zEfficientVitLargeStage.forward)FFr±   r   r   rC   r   r²   9  s   	  ÷:r²   c                       s>   e Zd Zddejejddf‡ fdd„	Zdedœd	d
„Z‡  Z	S )ÚClassifierHeadéè  r-   Úavgrf   c	           	         s    t t| ƒ ¡  t||d d||d�| _t|ddd�| _t tj	|d |d dd�tj
|d |d	�|d k	rr|dd
�nt ¡ tj|dd
�tj	|d |dd�¡| _d S )Nr   r   )rA   rB   TZNCHW)Ú	pool_typeÚflattenZ	input_fmtF)r5   ©rm   r1   )r7   rµ   r8   r+   r§   r	   Úglobal_poolr9   rj   ZLinearZ	LayerNormr=   r:   Ú
classifier)	r@   r/   ÚwidthsÚ	n_classesr;   rA   rB   r»   Únorm_epsrC   r   r   r8   y  s    ûzClassifierHead.__init__F©Ú
pre_logitsc                 C   s*   |   |¡}|  |¡}|r|S |  |¡}|S rE   )r§   r»   r¼   ©r@   r   rÁ   r   r   r   rG   �  s    


zClassifierHead.forward)F)
rH   rI   rJ   r9   rK   r˜   r8   ÚboolrG   rN   r   r   rC   r   rµ   x  s   ÷rµ   c                       s–   e Zd Zdddddejejdd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   r,   r   r‘   r’   r·   r-   r¶   c                    s:  t t| ƒ ¡  d| _|| _|| _t||d |d ||ƒ| _| jj}g | _	t
 ¡ | _|d }tt|dd … |dd … ƒƒD ]\\}\}}| j t||||||||dkd�¡ |d9 }|}|  j	t||d|› �d�g7  _	qx|| _|	| _|
| _|dk�rt| j| j|| j| jd�| _n&| jd	k�r,t|d
d�| _n
t
 ¡ | _d S )NFr   r   r)   )rª   rA   rB   r[   r—   r®   ústages.©Znum_chsZ	reductionÚmodule©r¾   r;   r»   r·   T©r¸   r¹   )r7   r   r8   Úgrad_checkpointingr»   Únum_classesr¦   Ústemr2   Úfeature_infor9   rj   ÚstagesÚ	enumerateÚzipr‚   r«   Údictr6   Úhead_widthsÚhead_dropoutrµ   Úheadr	   r=   )r@   Úin_chansr½   Údepthsr—   r[   rA   rB   r»   rÑ   Ú	drop_raterÊ   r2   r/   r¯   ÚwÚdrC   r   r   r8   ™  sJ    
*ø
"
û
zEfficientVit.__init__Fc                 C   s   t d|rdnddgd�}|S ©Nz^stemz^stages\.(\d+))z^stages\.(\d+).downsample)r   )z^stages\.(\d+)\.\w+\.(\d+)N)rË   r­   ©rÐ   ©r@   ZcoarseZmatcherr   r   r   Úgroup_matcherÔ  s    þþzEfficientVit.group_matcherTc                 C   s
   || _ d S rE   ©rÉ   ©r@   Úenabler   r   r   Úset_grad_checkpointingß  s    z#EfficientVit.set_grad_checkpointingc                 C   s   | j jd S ©Nr   ©rÓ   r¼   ©r@   r   r   r   Úget_classifierã  s    zEfficientVit.get_classifierNc                 C   sd   || _ |d k	r|| _|dkr:t| j| j|| j| jd�| _n&| jdkrVt| jdd�| _n
t 	¡ | _d S )Nr   rÇ   r·   TrÈ   )
rÊ   r»   rµ   r6   rÑ   rÒ   rÓ   r	   r9   r=   ©r@   rÊ   r»   r   r   r   Úreset_classifierç  s    û

zEfficientVit.reset_classifierc                 C   s6   |   |¡}| jr(tj ¡ s(t| j|ƒ}n
|  |¡}|S rE   ©rË   rÉ   rƒ   rˆ   r‰   r   rÍ   rF   r   r   r   Úforward_featuresù  s
    

zEfficientVit.forward_featuresrÀ   c                 C   s   |r| j ||d�S |   |¡S ©NrÀ   ©rÓ   rÂ   r   r   r   Úforward_head  s    zEfficientVit.forward_headc                 C   s   |   |¡}|  |¡}|S rE   ©rè   rë   rF   r   r   r   rG     s    

zEfficientVit.forward)F)T)N)F)rH   rI   rJ   r9   rK   r˜   r8   rƒ   rˆ   ÚignorerÜ   rà   rä   ræ   rè   rÃ   rë   rG   rN   r   r   rC   r   r   ˜  s,   ô;


c                       s”   e Zd Zddddejeddd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 ) ÚEfficientVitLarger,   r   r‘   r·   r-   r¶   gH¯¼šò×z>c                    s\  t t| ƒ ¡  d| _|| _|
| _|| _t|| jd�}t||d |d ||dd�| _	| j	j
}g | _t ¡ | _|d }tt|dd … |dd … ƒƒD ]`\}\}}| j t|||||||dk|dkd	�¡ |d9 }|}|  jt||d
|› �d�g7  _q�|| _|| _|	| _|
dk�r2t| j| j|
| j| j|| jd�| _n&| jdk�rNt|dd�| _n
t ¡ | _d S )NFrº   r   r¢   )r¡   r   r,   r)   )rª   rA   rB   r—   r®   r    rÄ   rÅ   )r¾   r;   r»   rB   r¿   r·   TrÈ   )r7   rî   r8   rÉ   r»   rÊ   r¿   r   r¦   rË   r2   rÌ   r9   rj   rÍ   rÎ   rÏ   r‚   r²   rÐ   r6   rÑ   rÒ   rµ   rÓ   r	   r=   )r@   rÔ   r½   rÕ   r—   rA   rB   r»   rÑ   rÖ   rÊ   r¿   r2   r/   r¯   r×   rØ   rC   r   r   r8     sR    
*ø
"
ù

zEfficientVitLarge.__init__Fc                 C   s   t d|rdnddgd�}|S rÙ   rÚ   rÛ   r   r   r   rÜ   J  s    þþzEfficientVitLarge.group_matcherTc                 C   s
   || _ d S rE   rÝ   rÞ   r   r   r   rà   U  s    z(EfficientVitLarge.set_grad_checkpointingc                 C   s   | j jd S rá   râ   rã   r   r   r   rä   Y  s    z EfficientVitLarge.get_classifierNc                 C   sh   || _ |d k	r|| _|dkr>t| j| j|| j| j| jd�| _n&| jdkrZt| jdd�| _n
t	 
¡ | _d S )Nr   )r¾   r;   r»   r¿   r·   TrÈ   )rÊ   r»   rµ   r6   rÑ   rÒ   r¿   rÓ   r	   r9   r=   rå   r   r   r   ræ   ]  s    ú
	
z"EfficientVitLarge.reset_classifierc                 C   s6   |   |¡}| jr(tj ¡ s(t| j|ƒ}n
|  |¡}|S rE   rç   rF   r   r   r   rè   p  s
    

z"EfficientVitLarge.forward_featuresrÀ   c                 C   s   |r| j ||d�S |   |¡S ré   rê   rÂ   r   r   r   rë   x  s    zEfficientVitLarge.forward_headc                 C   s   |   |¡}|  |¡}|S rE   rì   rF   r   r   r   rG   {  s    

zEfficientVitLarge.forward)F)T)N)F)rH   rI   rJ   r9   rK   r   r8   rƒ   rˆ   rí   rÜ   rà   rä   ræ   rè   rÃ   rë   rG   rN   r   r   rC   r   rî   
  s,   ô?


rî   Ú c              
   K   s   | dt tddddddœ	|–S )Nr¶   zstem.in_conv.convzhead.classifier.4gffffffî?)r,   éà   rð   )é   rñ   )	ÚurlrÊ   ZmeanZstdZ
first_convr¼   Úcrop_pctÚ
input_sizeÚ	pool_sizer   )rò   Úkwargsr   r   r   Ú_cfg�  s    ÷
ör÷   ztimm/)Ú	hf_hub_id)r,   é   rù   )rd   rd   rc   )rø   rô   rõ   ró   )r,   é   rú   )é	   rû   )rø   ró   )r,   é€  rü   )é   rý   )r,   é@  rþ   )é
   rÿ   )zefficientvit_b0.r224_in1kzefficientvit_b1.r224_in1kzefficientvit_b1.r256_in1kzefficientvit_b1.r288_in1kzefficientvit_b2.r224_in1kzefficientvit_b2.r256_in1kzefficientvit_b2.r288_in1kzefficientvit_b3.r224_in1kzefficientvit_b3.r256_in1kzefficientvit_b3.r288_in1kzefficientvit_l1.r224_in1kzefficientvit_l2.r224_in1kzefficientvit_l2.r256_in1kzefficientvit_l2.r288_in1kzefficientvit_l2.r384_in1kzefficientvit_l3.r224_in1kzefficientvit_l3.r256_in1kzefficientvit_l3.r320_in1kzefficientvit_l3.r384_in1kc                 K   s0   |  dd¡}tt| |fdtd|d�i|—Ž}|S ©NÚout_indices)r   r   r)   r,   Zfeature_cfgT)Zflatten_sequentialr  )Úpopr   r   rÐ   ©ÚvariantÚ
pretrainedrö   r  Úmodelr   r   r   Ú_create_efficientvitë  s    ý
üûr  c                 K   s0   |  dd¡}tt| |fdtd|d�i|—Ž}|S r   )r  r   rî   rÐ   r  r   r   r   Ú_create_efficientvit_large÷  s    ý
üûr  c                 K   s*   t ddddd�}tdd| it |f|Ž—ŽS )	N)rd   r´   r‘   é@   é€   )r   r)   r)   r)   r)   r´   )é   i   ©r½   rÕ   r—   rÑ   Úefficientvit_b0r  )r  ©rÐ   r  ©r  rö   Z
model_argsr   r   r   r    s       ÿr  c                 K   s*   t ddddd�}tdd| it |f|Ž—ŽS )	N)r´   r‘   r	  r
  rù   )r   r)   r,   r,   r’   r´   )i   i@  r  Úefficientvit_b1r  )r  r  r  r   r   r   r  
  s       ÿr  c                 K   s*   t ddddd�}tdd| it |f|Ž—ŽS )	N)r³   é0   é`   éÀ   rü   )r   r,   r’   r’   r]   r‘   ©i 	  i 
  r  Úefficientvit_b2r  )r  r  r  r   r   r   r    s       ÿr  c                 K   s*   t ddddd�}tdd| it |f|Ž—ŽS )	N©r‘   r	  r
  rù   é   )r   r’   r]   r]   rû   r‘   r  r  Úefficientvit_b3r  )r  r  r  r   r   r   r    s       ÿr  c                 K   s*   t ddddd�}tdd| it |f|Ž—ŽS )	Nr  )r   r   r   r]   r]   r‘   ©i   i€  r  Úefficientvit_l1r  )r  ©rÐ   r  r  r   r   r   r    s       ÿr  c                 K   s*   t ddddd�}tdd| it |f|Ž—ŽS )	Nr  ©r   r)   r)   rd   rd   r‘   r  r  Úefficientvit_l2r  )r  r  r  r   r   r   r  &  s       ÿr  c                 K   s*   t ddddd�}tdd| it |f|Ž—ŽS )	N)r	  r
  rù   r  r  r  r‘   )i   i   r  Úefficientvit_l3r  )r  r  r  r   r   r   r  -  s       ÿr  )r   )r   r   )Frž   )rï   )F)F)F)F)F)F)F)F)F)Dr�   Ú__all__Útypingr   Ú	functoolsr   rƒ   Ztorch.nnr9   Ztorch.nn.functionalZ
functionalr†   Ztorch.nn.modules.batchnormr   Z	timm.datar   r   Ztimm.layersr	   r
   r   Z_builderr   Z_features_fxr   Z_manipulater   Ú	_registryr   r   r   r   Úanyr   rM   r$   r'   r�   r+   rO   rU   r\   r`   rb   r�   r”   rv   ÚstrrÃ   r¥   rj   r¦   r«   r²   rµ   r   rî   r÷   Zdefault_cfgsr  r  r  r  r  r  r  r  r  r   r   r   r   Ú<module>   s<  	*$),6-`'  øø6<? rw
ÿÿ  þ  þÿ  þ  þÿ  þ  þþþ  þ  þ  þþ  þ  þ  þ»[

