U
    ¯Ê¹j?u  ã                   @   s,  d Z ddlmZ ddlmZmZmZ ddlZddlm	Z	 ddl
m	  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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%dd„ Z&dd„ Z'd:dd„Z(d;d d!„Z)ee)d"d#�e)d"d#�e)d"d#�e)d"d#�e)d"d#�e)d"d#�e)d"d#�e)d"d$d%d&d'�d(œƒZ*ed<e$d)œd*d+„ƒZ+ed=e$d)œd,d-„ƒZ,ed>e$d)œd.d/„ƒZ-ed?e$d)œd0d1„ƒZ.ed@e$d)œd2d3„ƒZ/edAe$d)œd4d5„ƒZ0edBe$d)œd6d7„ƒZ1edCe$d)œd8d9„ƒZ2dS )DzØ 
CoaT architecture.

Paper: Co-Scale Conv-Attentional Image Transformers - https://arxiv.org/abs/2104.06399

Official CoaT code at: https://github.com/mlpc-ucsd/CoaT

Modified from timm/models/vision_transformer.py
é    )Úpartial)ÚTupleÚListÚUnionN©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Ú
PatchEmbedÚMlpÚDropPathÚ	to_2tupleÚtrunc_normal_Ú_assertÚ	LayerNormé   )Úbuild_model_with_cfg)Úregister_modelÚgenerate_default_cfgsÚCoaTc                       s6   e Zd ZdZ‡ fdd„Zeeef dœdd„Z‡  ZS )ÚConvRelPosEncz+ Convolutional relative position encoding. c           	   	      sÚ   t ƒ  ¡  t|tƒr$||i}|| _nt|tƒr6|| _ntƒ ‚t ¡ | _	g | _
| ¡ D ]j\}}d}||d |d   d }tj|ˆ  |ˆ  ||f||f||f|ˆ  d�}| j	 |¡ | j
 |¡ qT‡ fdd„| j
D ƒ| _dS )aj  
        Initialization.
            Ch: Channels per head.
            h: Number of heads.
            window: Window size(s) in convolutional relative positional encoding. It can have two forms:
                1. An integer of window size, which assigns all attention heads with the same window s
                    size in ConvRelPosEnc.
                2. A dict mapping window size to #attention head splits (
                    e.g. {window size 1: #attention head split 1, window size 2: #attention head split 2})
                    It will apply different window size to the attention head splits.
        r   é   )Úkernel_sizeÚpaddingÚdilationÚgroupsc                    s   g | ]}|ˆ  ‘qS © r   ©Ú.0Úx©Úhead_chsr   úO/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/coat.pyÚ
<listcomp>C   s     z*ConvRelPosEnc.__init__.<locals>.<listcomp>N)ÚsuperÚ__init__Ú
isinstanceÚintÚwindowÚdictÚ
ValueErrorÚnnÚ
ModuleListÚ	conv_listZhead_splitsÚitemsÚConv2dÚappendÚchannel_splits)	Úselfr    Ú	num_headsr'   Z
cur_windowZcur_head_splitr   Zpadding_sizeZcur_conv©Ú	__class__r   r!   r$      s.    



úzConvRelPosEnc.__init__©Úsizec                 C   s  |j \}}}}|\}}	t|d||	  kdƒ |d d …d d …dd …d d …f }
|d d …d d …dd …d d …f }| dd¡ ||| ||	¡}tj|| jdd�}g }t| jƒD ]\}}| 	||| ƒ¡ q¨tj
|dd�}| |||||	 ¡ dd¡}|
| }t |d¡}|S )Nr   Ú éÿÿÿÿéþÿÿÿ©Údim)r   r   r   r   r   r   )Úshaper   Ú	transposeÚreshapeÚtorchÚsplitr0   Ú	enumerater,   r/   ÚcatÚFÚpad)r1   ÚqÚvr6   ÚBr2   ÚNÚCÚHÚWZq_imgZv_imgZ
v_img_listZconv_v_img_listÚiÚconvZ
conv_v_imgZEV_hatr   r   r!   ÚforwardE   s      zConvRelPosEnc.forward©	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   r   r&   rN   Ú__classcell__r   r   r3   r!   r      s   *r   c                       s8   e Zd ZdZd‡ fdd„	Zeeef dœd	d
„Z‡  ZS )ÚFactorAttnConvRelPosEnczK Factorized attention with convolutional relative position encoding class. é   Fç        Nc                    sh   t ƒ  ¡  || _|| }|d | _tj||d |d�| _t |¡| _t ||¡| _	t |¡| _
|| _d S )Ng      à¿é   )Úbias)r#   r$   r2   Úscaler*   ÚLinearÚqkvÚDropoutÚ	attn_dropÚprojÚ	proj_dropÚcrpe)r1   r;   r2   Úqkv_biasr^   r`   Úshared_crpeZhead_dimr3   r   r!   r$   ]   s    	

z FactorAttnConvRelPosEnc.__init__r5   c                 C   sº   |j \}}}|  |¡ ||d| j|| j ¡ ddddd¡}| d¡\}}}	|jdd�}
|
 dd¡|	 }|| }| j||	|d	�}| j	| | }| dd¡ |||¡}|  
|¡}|  |¡}|S )
NrX   r   r   r   é   r:   r8   r9   r5   )r<   r\   r>   r2   ÚpermuteZunbindZsoftmaxr=   ra   rZ   r_   r`   )r1   r   r6   rG   rH   rI   r\   rE   ÚkrF   Z	k_softmaxZ
factor_attra   r   r   r!   rN   s   s    .

zFactorAttnConvRelPosEnc.forward)rV   FrW   rW   NrO   r   r   r3   r!   rU   [   s        ùrU   c                       s8   e Zd ZdZd‡ fdd„	Zeeef dœdd„Z‡  ZS )	Ú
ConvPosEnczz Convolutional Position Encoding. 
        Note: This module is similar to the conditional position encoding in CPVT.
    rX   c                    s.   t t| ƒ ¡  tj|||d|d |d�| _d S )Nr   r   )r   )r#   rg   r$   r*   r.   r_   )r1   r;   rf   r3   r   r!   r$   ‘   s    zConvPosEnc.__init__r5   c                 C   s¢   |j \}}}|\}}t|d||  kdƒ |d d …d d…f |d d …dd …f  }}	|	 dd¡ ||||¡}
|  |
¡|
 }| d¡ dd¡}tj||fdd�}|S )Nr   r7   r   r:   )r<   r   r=   Úviewr_   Úflattenr?   rB   )r1   r   r6   rG   rH   rI   rJ   rK   Ú	cls_tokenÚ
img_tokensZfeatr   r   r!   rN   •   s    *zConvPosEnc.forward)rX   rO   r   r   r3   r!   rg   �   s   rg   c                	       sN   e Zd ZdZdddddejejddf	‡ fdd„	Zee	e	f dœd	d
„Z
‡  ZS )ÚSerialBlockz„ Serial block class.
        Note: In this implementation, each serial block only contains a conv-attention and a FFN (MLP) module. ç      @FrW   Nc                    sv   t ƒ  ¡  |
| _|	|ƒ| _t||||||d�| _|dkr@t|ƒnt ¡ | _	|	|ƒ| _
t|| ƒ}t||||d�| _d S )N©r2   rb   r^   r`   rc   rW   ©Zin_featuresZhidden_featuresÚ	act_layerZdrop)r#   r$   ÚcpeÚnorm1rU   Úfactoratt_crper   r*   ÚIdentityÚ	drop_pathÚnorm2r&   r
   Úmlp)r1   r;   r2   Ú	mlp_ratiorb   r`   r^   ru   rp   Ú
norm_layerÚ
shared_cperc   Úmlp_hidden_dimr3   r   r!   r$   «   s(    

ú
üzSerialBlock.__init__r5   c                 C   sV   |   ||¡}|  |¡}|  ||¡}||  |¡ }|  |¡}|  |¡}||  |¡ }|S ©N)rq   rr   rs   ru   rv   rw   )r1   r   r6   Úcurr   r   r!   rN   Ó   s    


zSerialBlock.forward)rP   rQ   rR   rS   r*   ÚGELUr   r$   r   r&   rN   rT   r   r   r3   r!   rl   ¨   s   ô(rl   c                       s˜   e Zd ZdZg ddddejejdf‡ fdd„	Zee	e
e
f dœdd	„Zee	e
e
f dœd
d„Zee	e
e
f dœdd„Zee	e
e
f  dœdd„Z‡  ZS )ÚParallelBlockz Parallel block class. FrW   Nc                    s\  t ƒ  ¡  |	|d ƒ| _|	|d ƒ| _|	|d ƒ| _t|d |||||
d d�| _t|d |||||
d d�| _t|d |||||
d d�| _|dkržt	|ƒnt
 ¡ | _|	|d ƒ| _|	|d ƒ| _|	|d ƒ| _|d |d   krò|d ksøn t‚|d |d   k�r|d k�s"n t‚t|d |d  ƒ}t|d |||d� | _ | _| _d S )Nr   r   rX   rn   rW   ro   )r#   r$   Únorm12Únorm13Únorm14rU   Úfactoratt_crpe2Úfactoratt_crpe3Úfactoratt_crpe4r   r*   rt   ru   Únorm22Únorm23Únorm24ÚAssertionErrorr&   r
   Úmlp2Úmlp3Úmlp4)r1   Údimsr2   Ú
mlp_ratiosrb   r`   r^   ru   rp   ry   Úshared_crpesr{   r3   r   r!   r$   ä   sR    
úúú&*üzParallelBlock.__init__©Úfactorr6   c                 C   s   | j |||d�S )z Feature map up-sampling. ©Úscale_factorr6   ©Úinterpolate©r1   r   r‘   r6   r   r   r!   Úupsample   s    zParallelBlock.upsamplec                 C   s   | j |d| |d�S )z Feature map down-sampling. ç      ð?r’   r”   r–   r   r   r!   Ú
downsample$  s    zParallelBlock.downsampler’   c                 C   s¶   |j \}}}|\}}t|d||  kdƒ |dd…dd…dd…f }	|dd…dd…dd…f }
|
 dd¡ ||||¡}
tj|
|dddd�}
|
 ||d¡ dd¡}
tj|	|
fdd	�}|S )
z Feature map interpolation. r   r7   Nr   FZbilinear)r“   Zrecompute_scale_factorÚmodeZalign_cornersr8   r:   )r<   r   r=   r>   rC   r•   r?   rB   )r1   r   r“   r6   rG   rH   rI   rJ   rK   rj   rk   Úoutr   r   r!   r•   (  s     ûzParallelBlock.interpolate©Úsizesc                 C   st  |\}}}}	|   |¡}
|  |¡}|  |¡}| j|
|d�}
| j||d�}| j||	d�}| j|d|d�}| j|d|	d�}| j|d|	d�}| j|
d|d�}| j|d|d�}| j|
d|d�}|
| | }
|| | }|| | }||  |
¡ }||  |¡ }||  |¡ }|  	|¡}
|  
|¡}|  |¡}|  |
¡}
|  |¡}|  |¡}||  |
¡ }||  |¡ }||  |¡ }||||fS )Nr5   g       @r�   rm   )r€   r�   r‚   rƒ   r„   r…   r—   r™   ru   r†   r‡   rˆ   rŠ   r‹   rŒ   )r1   Úx1Úx2Úx3Úx4r�   Ú_ZS2ZS3ZS4Zcur2Zcur3Zcur4Zupsample3_2Zupsample4_3Zupsample4_2Zdownsample2_3Zdownsample3_4Zdownsample2_4r   r   r!   rN   ?  s:    








zParallelBlock.forward)rP   rQ   rR   rS   r*   r~   r   r$   Úfloatr   r&   r—   r™   r•   r   rN   rT   r   r   r3   r!   r   â   s   õ<r   c                       sØ   e Zd ZdZdddddddd	d
ddddde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)eejeej f ed œd!d"„Zejd#œd$d%„Z‡  ZS )*r   z CoaT class. éà   é   rX   éè  )é@   é€   é@  é   )rX   rd   é   rX   r   rV   )rd   rd   rd   rd   TrW   FNÚtokenc                    s>  t ƒ  ¡  |dkst‚|p$ddddœ}|ˆ_|ˆ_ˆ ˆ_ˆ d ˆ_|ˆ_|ˆ_t	|ƒ}t
|||ˆ d tjd�ˆ_t
dd	„ |D ƒdˆ d ˆ d
 tjd�ˆ_t
dd	„ |D ƒdˆ d
 ˆ d tjd�ˆ_t
dd	„ |D ƒdˆ d ˆ d tjd�ˆ_t t d
d
ˆ d ¡¡ˆ_t t d
d
ˆ d
 ¡¡ˆ_t t d
d
ˆ d ¡¡ˆ_t t d
d
ˆ d ¡¡ˆ_tˆ d dd�ˆ_tˆ d
 dd�ˆ_tˆ d dd�ˆ_tˆ d dd�ˆ_tˆ d | ||d�ˆ_tˆ d
 | ||d�ˆ_tˆ d | ||d�ˆ_ tˆ d | ||d�ˆ_!|}|dk�s
t‚t"||
||||d�‰t #‡ ‡‡‡fdd	„t$|d ƒD ƒ¡ˆ_%t #‡ ‡‡‡fdd	„t$|d
 ƒD ƒ¡ˆ_&t #‡ ‡‡‡fdd	„t$|d ƒD ƒ¡ˆ_'t #‡ ‡‡‡fdd	„t$|d ƒD ƒ¡ˆ_(|ˆ_)ˆj)dk�röt #‡ ‡‡‡fdd	„t$|ƒD ƒ¡ˆ_*nd ˆ_*ˆj�söˆj*d k	�r.|ˆ d
 ƒˆ_+|ˆ d ƒˆ_,nd  ˆ_+ˆ_,|ˆ d ƒˆ_-ˆj)dk�rÂˆ d
 ˆ d   k�rxˆ d k�s~n t‚tjj.dd
d
d�ˆ_/t 0|¡ˆ_1|dk�r¶t 2ˆj|¡nt 3¡ ˆ_4n4d ˆ_/t 0|¡ˆ_1|dk�rìt 2ˆj|¡nt 3¡ ˆ_4t5ˆjdd� t5ˆjdd� t5ˆjdd� t5ˆjdd� ˆ 6ˆj7¡ d S )N©r¬   Úavgr   rX   )rX   é   é   r8   r   )Úimg_sizeÚ
patch_sizeÚin_chansZ	embed_dimry   c                 S   s   g | ]}|d  ‘qS )rd   r   r   r   r   r!   r"   Š  s     z!CoaT.__init__.<locals>.<listcomp>r   c                 S   s   g | ]}|d  ‘qS )rV   r   r   r   r   r!   r"   �  s     c                 S   s   g | ]}|d  ‘qS )r¥   r   r   r   r   r!   r"   �  s     )r;   rf   )r    r2   r'   rW   )r2   rb   r`   r^   ru   ry   c              	      s0   g | ](}t f ˆ d  ˆd  ˆjˆjdœˆ—Ž‘qS )r   ©r;   rx   rz   rc   )rl   Úcpe1Úcrpe1©r   r¢   ©Ú
embed_dimsrŽ   r1   Zskwargsr   r!   r"   ²  s   ùüûc              	      s0   g | ](}t f ˆ d  ˆd  ˆjˆjdœˆ—Ž‘qS )r   r´   )rl   Úcpe2Úcrpe2r·   r¸   r   r!   r"   ¾  s   ùüûc              	      s0   g | ](}t f ˆ d  ˆd  ˆjˆjdœˆ—Ž‘qS )r   r´   )rl   Úcpe3Úcrpe3r·   r¸   r   r!   r"   Ê  s   ùüûc              	      s0   g | ](}t f ˆ d  ˆd  ˆjˆjdœˆ—Ž‘qS )rX   r´   )rl   Úcpe4Úcrpe4r·   r¸   r   r!   r"   Ö  s   ùüûc              
      s2   g | ]*}t f ˆ ˆˆjˆjˆjˆjfd œˆ—Ž‘qS ))r�   rŽ   r�   )r   r¶   r»   r½   r¿   r·   r¸   r   r!   r"   ä  s   úýü)Zin_channelsZout_channelsr   ç{®Gáz”?©Ústd)8r#   r$   r‰   Úreturn_interm_layersÚout_featuresr¹   Únum_featuresÚnum_classesÚglobal_poolr   r	   r*   r   Úpatch_embed1Úpatch_embed2Úpatch_embed3Úpatch_embed4Ú	Parameterr?   ZzerosÚ
cls_token1Ú
cls_token2Ú
cls_token3Ú
cls_token4rg   rµ   rº   r¼   r¾   r   r¶   r»   r½   r¿   r(   r+   ÚrangeÚserial_blocks1Úserial_blocks2Úserial_blocks3Úserial_blocks4Úparallel_depthÚparallel_blocksrv   Únorm3Únorm4ZConv1dÚ	aggregater]   Ú	head_dropr[   rt   Úheadr   ÚapplyÚ_init_weights)r1   r±   r²   r³   rÆ   r¹   Úserial_depthsrÖ   r2   rŽ   rb   Z	drop_rateZproj_drop_rateZattn_drop_rateZdrop_path_ratery   rÃ   rÄ   Zcrpe_windowrÇ   Zdprr3   r¸   r!   r$   d  sÂ    

   þ   þ   þ   þú

ø

ø

ø

ø
ù
*$"zCoaT.__init__c                 C   sr   t |tjƒrBt|jdd� t |tjƒrn|jd k	rntj |jd¡ n,t |tjƒrntj |jd¡ tj |jd¡ d S )NrÀ   rÁ   r   r˜   )	r%   r*   r[   r   ÚweightrY   ÚinitZ	constant_r   )r1   Úmr   r   r!   rÞ     s    zCoaT._init_weightsc                 C   s   ddddhS )NrÍ   rÎ   rÏ   rÐ   r   ©r1   r   r   r!   Úno_weight_decay  s    zCoaT.no_weight_decayc                 C   s   |rt dƒ‚d S )Nz$gradient checkpointing not supported)r‰   )r1   Úenabler   r   r!   Úset_grad_checkpointing  s    zCoaT.set_grad_checkpointingc                 C   s"   t ddddddddd	d
gd�	}|S )Nz#^cls_token1|patch_embed1|crpe1|cpe1z^serial_blocks1\.(\d+)z#^cls_token2|patch_embed2|crpe2|cpe2z^serial_blocks2\.(\d+)z#^cls_token3|patch_embed3|crpe3|cpe3z^serial_blocks3\.(\d+)z#^cls_token4|patch_embed4|crpe4|cpe4z^serial_blocks4\.(\d+))z^parallel_blocks\.(\d+)N)z^norm|aggregate)iŸ† )	Zstem1rÒ   Zstem2rÓ   Zstem3rÔ   Zstem4rÕ   r×   )r(   )r1   ZcoarseZmatcherr   r   r!   Úgroup_matcher  s    þ÷zCoaT.group_matcherc                 C   s   | j S r|   )rÜ   rã   r   r   r!   Úget_classifier/  s    zCoaT.get_classifierc                 C   sD   || _ |d k	r |dkst‚|| _|dkr6t | j|¡nt ¡ | _d S )Nr­   r   )rÆ   r‰   rÇ   r*   r[   rÅ   rt   rÜ   )r1   rÆ   rÇ   r   r   r!   Úreset_classifier3  s
    zCoaT.reset_classifierc                 C   s¶  |j d }|  |¡}| jj\}}t|| jƒ}| jD ]}||||fd�}q2t|ƒ |||d¡ dddd¡ 	¡ }|  
|¡}| j
j\}	}
t|| jƒ}| jD ]}|||	|
fd�}q”t|ƒ ||	|
d¡ dddd¡ 	¡ }|  |¡}| jj\}}t|| jƒ}| jD ]}||||fd�}qöt|ƒ |||d¡ dddd¡ 	¡ }|  |¡}| jj\}}t|| jƒ}| jD ]}||||fd�}�qXt|ƒ |||d¡ dddd¡ 	¡ }| jd k�rtj ¡ �s| j�ri }d| jk�rÌ||d< d| jk�rà||d< d	| jk�rô||d	< d
| jk�r||d
< |S |  |¡}|S | jD ]l}|  ||	|
f¡|  |||f¡|  |||f¡  }}}|||||||f|	|
f||f||fgd�\}}}}�q tj ¡ �sŠ| j�rŠi }d| jk�rÞt|ƒ |||d¡ dddd¡ 	¡ }||d< d| jk�rt|ƒ ||	|
d¡ dddd¡ 	¡ }||d< d	| jk�rNt|ƒ |||d¡ dddd¡ 	¡ }||d	< d
| jk�r†t|ƒ |||d¡ dddd¡ 	¡ }||d
< |S |  |¡}|  |¡}|  |¡}|||gS d S )Nr   r5   r8   rX   r   r   Úx1_noclsÚx2_noclsÚx3_noclsÚx4_noclsrœ   )r<   rÈ   Z	grid_sizeÚ
insert_clsrÍ   rÒ   Ú
remove_clsr>   re   Ú
contiguousrÉ   rÎ   rÓ   rÊ   rÏ   rÔ   rË   rÐ   rÕ   r×   r?   ÚjitÚis_scriptingrÃ   rÄ   rÙ   rº   r¼   r¾   rv   rØ   )r1   Zx0rG   rž   ZH1ZW1Zblkrê   rŸ   ZH2ZW2rë   r    ZH3ZW3rì   r¡   ZH4ZW4rí   Zfeat_outr   r   r!   Úforward_features:  sz    


$

$

$

$

46$$$$


zCoaT.forward_features)Úx_featÚ
pre_logitsc                 C   sº   t |tƒrh| jd k	st‚| jdkr<tjdd„ |D ƒdd�}ntjdd„ |D ƒdd�}|  |¡jdd�}n6| jdkrŽ|d d …dd …f j	dd�n|d d …df }|  
|¡}|r°|S |  |¡S )Nr®   c                 S   s*   g | ]"}|d d …dd …f j ddd�‘qS )Nr   T)r;   Zkeepdim)Úmean©r   Zxlr   r   r!   r"   �  s     z%CoaT.forward_head.<locals>.<listcomp>r   r:   c                 S   s   g | ]}|d d …df ‘qS )Nr   r   r÷   r   r   r!   r"   ‘  s     r   )r%   ÚlistrÚ   r‰   rÇ   r?   rB   ÚstackZsqueezerö   rÛ   rÜ   )r1   rô   rõ   r   r   r   r!   Úforward_head‹  s    

6
zCoaT.forward_head©Úreturnc                 C   s6   t j ¡ s| jr|  |¡S |  |¡}|  |¡}|S d S r|   )r?   rñ   rò   rÃ   ró   rú   )r1   r   rô   r   r   r!   rN   ˜  s
    


zCoaT.forward)T)F)N)F)rP   rQ   rR   rS   r   r$   rÞ   r?   rñ   Úignorerä   ræ   rç   rè   ré   ró   r   ZTensorr   Úboolrú   rN   rT   r   r   r3   r!   r   b  sF   ì )	


Q"c                 C   s*   |  | jd dd¡}tj|| fdd�} | S )z Insert CLS token. r   r8   r   r:   )Úexpandr<   r?   rB   )r   rj   Z
cls_tokensr   r   r!   rî   £  s    rî   c                 C   s   | dd…dd…dd…f S )z Remove CLS token. Nr   r   )r   r   r   r!   rï   ª  s    rï   c                 C   s¼   i }|   d| ¡} |  ¡ D ]ž\}}| d¡s| d¡rDt|dd ƒd ks| d¡r^t|dd ƒd ks| d¡rxt|dd ƒd ks| d¡r’t|dd ƒd ks| d¡r®t|dd ƒd kr®q|||< q|S )NÚmodelrr   rv   rØ   rÙ   rÚ   rÜ   )Úgetr-   Ú
startswithÚgetattr)Z
state_dictr   Zout_dictrf   rF   r   r   r!   Úcheckpoint_filter_fn¯  s6    
ÿÿþþýýüüûû
r  Fc                 K   s0   |  dd ¡rtdƒ‚tt| |fdti|—Ž}|S )NZfeatures_onlyz<features_only not implemented for Vision Transformer models.Zpretrained_filter_fn)r  ÚRuntimeErrorr   r   r  )ÚvariantÚ
pretrainedZdefault_cfgÚkwargsr   r   r   r!   Ú_create_coat¿  s    ýüûr	  r7   c                 K   s    | ddd dddt tdddœ|–S )	Nr¦   )rX   r¤   r¤   gÍÌÌÌÌÌì?ZbicubicTzpatch_embed1.projrÜ   )ÚurlrÆ   Ú
input_sizeZ	pool_sizeÚcrop_pctÚinterpolationZfixed_input_sizerö   rÂ   Z
first_convÚ
classifierr   )r
  r  r   r   r!   Ú	_cfg_coatÍ  s          ûúr  ztimm/)Ú	hf_hub_id)rX   é€  r  r˜   Zsquash)r  r  r  Z	crop_mode)zcoat_tiny.in1kzcoat_mini.in1kzcoat_small.in1kzcoat_lite_tiny.in1kzcoat_lite_mini.in1kzcoat_lite_small.in1kzcoat_lite_medium.in1kzcoat_lite_medium_384.in1krû   c                 K   s>   t dddddgddddgdd�}tdd| it |f|Ž—Ž}|S )	Nrd   é˜   r   r«   ©r²   r¹   rß   rÖ   Ú	coat_tinyr  )r  ©r(   r	  ©r  r  Z	model_cfgr   r   r   r!   r  ç  s     
 
 ÿr  c                 K   s>   t dddddgddddgdd�}td	d| it |f|Ž—Ž}|S )
Nrd   r  éØ   r   r«   r  Ú	coat_minir  )r  r  r  r   r   r!   r  ï  s     
 
 ÿr  c                 K   sF   t f dddddgddddgddœ|—Ž}td	d| it |f|Ž—Ž}|S )
Nrd   r  r©   r   r«   r  Ú
coat_smallr  )r  r  r  r   r   r!   r  ÷  s     
 
 ÿÿr  c                 K   sF   t dddddgddddgddddgd�}tdd
| it |f|Ž—Ž}|S )Nrd   r§   r¨   é   r©   r   rV   ©r²   r¹   rß   rŽ   Úcoat_lite_tinyr  )r  r  r  r   r   r!   r  ÿ  s     
 
 
ÿr  c                 K   sF   t dddddgddddgddddgd�}tdd
| it |f|Ž—Ž}|S )Nrd   r§   r¨   r©   rª   r   rV   r  Úcoat_lite_minir  )r  r  r  r   r   r!   r    s     
 
 
ÿr  c                 K   sF   t dddddgddddgddddgd	�}tdd| it |f|Ž—Ž}|S )Nrd   r§   r¨   r©   rª   rX   r«   rV   r  Úcoat_lite_smallr  )r  r  r  r   r   r!   r    s     
 
 
ÿr  c                 K   s<   t dddddgdddd	gd
�}tdd| it |f|Ž—Ž}|S )Nrd   r¨   r  r©   rª   rX   r«   é
   rV   )r²   r¹   rß   Úcoat_lite_mediumr  )r   r  r  r   r   r!   r     s     
 
ÿr   c                 K   s>   t ddddddgddd	d
gd�}tdd| it |f|Ž—Ž}|S )Nr  rd   r¨   r  r©   rª   rX   r«   r  rV   )r±   r²   r¹   rß   Úcoat_lite_medium_384r  )r!  r  r  r   r   r!   r!    s      
 
ÿr!  )FN)r7   )F)F)F)F)F)F)F)F)3rS   Ú	functoolsr   Útypingr   r   r   r?   Ztorch.nnr*   Ztorch.nn.functionalZ
functionalrC   Z	timm.datar   r   Ztimm.layersr	   r
   r   r   r   r   r   Z_builderr   Ú	_registryr   r   Ú__all__ÚModuler   rU   rg   rl   r   r   rî   rï   r  r	  r  Zdefault_cfgsr  r  r  r  r  r  r   r!  r   r   r   r!   Ú<module>   sn   	$B2:   C

  þø