U
    ¯Ê¹j‡  ã                   @   sx  d Z ddlZddlZddlmZ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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d
l#m$Z$m%Z%m&Z& ddl'm(Z( dgZ)e *e+¡Z,ee-ee-e-f f Z.e	j/ee-e-f e	j/dœdd„Z0eee-e-f e-e-dœdd„ƒZ1e-e-dœdd„Z2G dd„ dej3ƒZ4G dd„ dej3ƒZ5G dd„ dej3ƒZ6G dd„ dej3ƒZ7G dd„ dej3ƒZ8dd „ Z9d\d"d#„Z:d]d%d&„Z;e$e;d'd(d)�e;d'd*d)�e;d'd+d,d-d.d/�e;d'd0d)�e;d'd1d,d-d.d/�e;d'd2d)�e;d'd3d)�e;d'd4d)�e;d'd5d,d-d.d/�e;d'd6d)�e;d'd7d8d9�e;d'd:d8d9�e;d'd;d8d9�e;d'd<d,d-d.d8d=�e;d'd>d8d9�e;d'd?d,d-d.d8d=�e;d'd@d)�e;d'dAd)�e;d'dBd)�dCœƒZ<e%d^e8dDœdEdF„ƒZ=e%d_e8dDœdGdH„ƒZ>e%d`e8dDœdIdJ„ƒZ?e%dae8dDœdKdL„ƒZ@e%dbe8dDœdMdN„ƒZAe%dce8dDœdOdP„ƒZBe%dde8dDœdQdR„ƒZCe%dee8dDœdSdT„ƒZDe%dfe8dDœdUdV„ƒZEe&e+dWdXdYdZd[œƒ dS )gaß   Swin Transformer
A PyTorch impl of : `Swin Transformer: Hierarchical Vision Transformer using Shifted Windows`
    - https://arxiv.org/pdf/2103.14030

Code/weights from https://github.com/microsoft/Swin-Transformer, original copyright/license info below

S3 (AutoFormerV2, https://arxiv.org/abs/2111.14725) Swin weights from
    - https://github.com/microsoft/Cream/tree/main/AutoFormerV2

Modifications and additions for timm hacked together by / Copyright 2021, Ross Wightman
é    N)ÚCallableÚListÚOptionalÚTupleÚUnion©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Ú
PatchEmbedÚMlpÚDropPathÚClassifierHeadÚ	to_2tupleÚ	to_ntupleÚtrunc_normal_Ú_assertÚuse_fused_attnÚresize_rel_pos_bias_tableÚresample_patch_embedÚndgridé   )Úbuild_model_with_cfg)Úregister_notrace_function)Úcheckpoint_seqÚnamed_apply)Úgenerate_default_cfgsÚregister_modelÚregister_model_deprecations)Úget_init_weights_vitÚSwinTransformer)ÚxÚwindow_sizeÚreturnc                 C   sj   | j \}}}}|  |||d  |d ||d  |d |¡} |  dddddd¡ ¡  d|d |d |¡}|S )aU  
    Partition into non-overlapping windows with padding if needed.
    Args:
        x (tensor): input tokens with [B, H, W, C].
        window_size (int): window size.

    Returns:
        windows: windows after partition with [B * num_windows, window_size, window_size, C].
        (Hp, Wp): padded height and width before partition
    r   r   é   é   é   é   éÿÿÿÿ©ÚshapeÚviewÚpermuteÚ
contiguous)r    r!   ÚBÚHÚWÚCÚwindows© r2   ú[/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/swin_transformer.pyÚwindow_partition)   s    ,,r4   )r!   r.   r/   c                 C   s^   | j d }|  d||d  ||d  |d |d |¡}| dddddd¡ ¡  d|||¡}|S )zÛ
    Args:
        windows: (num_windows*B, window_size, window_size, C)
        window_size (int): Window size
        H (int): Height of image
        W (int): Width of image

    Returns:
        x: (B, H, W, C)
    r'   r   r   r#   r$   r%   r&   r(   )r1   r!   r.   r/   r0   r    r2   r2   r3   Úwindow_reverse=   s    
,$r5   )Úwin_hÚwin_wc                 C   sÚ   t  tt  | ¡t  |¡ƒ¡}t  |d¡}|d d …d d …d f |d d …d d d …f  }| ddd¡ ¡ }|d d …d d …df  | d 7  < |d d …d d …df  |d 7  < |d d …d d …df  d| d 9  < | d¡S )Nr   r$   r   r'   )ÚtorchÚstackr   ZarangeÚflattenr+   r,   Úsum)r6   r7   ZcoordsZcoords_flattenZrelative_coordsr2   r2   r3   Úget_relative_position_indexO   s    ,""&r<   c                	       sp   e Zd ZU dZejje ed< de	e	e
e	 eeeedœ‡ fdd	„Zejd
œdd„Zde
ej dœdd„Z‡  ZS )ÚWindowAttentionz‰ Window based multi-head self attention (W-MSA) module with relative position bias.
    It supports shifted and non-shifted windows.
    Ú
fused_attnNé   Tç        )ÚdimÚ	num_headsÚhead_dimr!   Úqkv_biasÚ	attn_dropÚ	proj_dropc                    sø   t ƒ  ¡  || _t|ƒ| _| j\}}	||	 | _|| _|p>|| }|| }
|d | _tdd�| _	t
 t d| d d|	 d  |¡¡| _| jdt||	ƒdd� t
j||
d	 |d
�| _t
 |¡| _t
 |
|¡| _t
 |¡| _t| jdd� t
jdd�| _dS )a¶  
        Args:
            dim: Number of input channels.
            num_heads: Number of attention heads.
            head_dim: Number of channels per head (dim // num_heads if not set)
            window_size: The height and width of the window.
            qkv_bias:  If True, add a learnable bias to query, key, value.
            attn_drop: Dropout ratio of attention weight.
            proj_drop: Dropout ratio of output.
        g      à¿T)Zexperimentalr$   r   Úrelative_position_indexF©Ú
persistentr#   ©Zbiasg{®Gáz”?)Ústdr'   )rA   N)ÚsuperÚ__init__rA   r   r!   Úwindow_arearB   Úscaler   r>   ÚnnÚ	Parameterr8   ÚzerosÚrelative_position_bias_tableÚregister_bufferr<   ÚLinearÚqkvZDropoutrE   ÚprojrF   r   ZSoftmaxÚsoftmax)ÚselfrA   rB   rC   r!   rD   rE   rF   r6   r7   Zattn_dim©Ú	__class__r2   r3   rM   a   s$    




(zWindowAttention.__init__©r"   c                 C   s<   | j | j d¡  | j| jd¡}| ddd¡ ¡ }| d¡S )Nr'   r$   r   r   )rS   rG   r*   rN   r+   r,   Ú	unsqueeze)rY   Zrelative_position_biasr2   r2   r3   Ú_get_rel_pos_biasŽ   s    
ÿ  ÿz!WindowAttention._get_rel_pos_bias©Úmaskc                 C   s‚  |j \}}}|  |¡ ||d| jd¡ ddddd¡}| d¡\}}}	| jrÈ|  ¡ }
|dk	r |j d }| d|d||¡ 	|| d| jdd¡}|
| d| j||¡ }
t
jjj|||	|
| jr¾| jjndd	�}nŒ|| j }|| d
d¡ }||  ¡  }|dk	�r8|j d }| d|| j||¡| d¡ d¡ }| d| j||¡}|  |¡}|  |¡}||	 }| dd¡ ||d¡}|  |¡}|  |¡}|S )z«
        Args:
            x: input features with shape of (num_windows*B, N, C)
            mask: (0/-inf) mask with shape of (num_windows, Wh*Ww, Wh*Ww) or None
        r#   r'   r$   r   r   r%   Nr@   )Ú	attn_maskZ	dropout_péþÿÿÿ)r)   rV   ÚreshaperB   r+   Zunbindr>   r^   r*   Úexpandr8   rP   Ú
functionalZscaled_dot_product_attentionZtrainingrE   ÚprO   Z	transposer]   rX   rW   rF   )rY   r    r`   ZB_ÚNr0   rV   ÚqÚkÚvra   Znum_winÚattnr2   r2   r3   Úforward”   s<    (
&  ý


$



zWindowAttention.forward)Nr?   Tr@   r@   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r8   ÚjitÚFinalÚboolÚ__annotations__Úintr   Ú_int_or_tuple_2_tÚfloatrM   ÚTensorr^   rl   Ú__classcell__r2   r2   rZ   r3   r=   [   s$   
     øø-r=   c                       s”   e Zd ZdZdddddddddejejfeeee	e eee
ee
e
e
eed	œ‡ fd
d„Zeeeef eeef f dœdd„Zdd„ Zdd„ Z‡  ZS )ÚSwinTransformerBlockz Swin Transformer Block.
    r%   Nr?   r   ç      @Tr@   )rA   Úinput_resolutionrB   rC   r!   Ú
shift_sizeÚ	mlp_ratiorD   rF   rE   Ú	drop_pathÚ	act_layerÚ
norm_layerc              	      sJ  t ƒ  ¡  || _|| _|  ||¡\}}|| _|| _| jd | jd  | _|| _||ƒ| _	t
|||t| jƒ||
|	d�| _|dkr†t|ƒnt ¡ | _||ƒ| _t|t|| ƒ||	d�| _|dkrÄt|ƒnt ¡ | _t| jƒ�r2| j\}}t || jd  ¡| jd  }t || jd  ¡| jd  }t d||df¡}d}td| jd  ƒt| jd  | jd  ƒt| jd  dƒfD ]j}td| jd  ƒt| jd  | jd  ƒt| jd  dƒfD ]&}||dd…||dd…f< |d7 }�q²�qrt|| jƒ}| d| j¡}| d¡| d¡ }| |dkt d	ƒ¡ |dkt dƒ¡}nd}| j!d
|dd� dS )aš  
        Args:
            dim: Number of input channels.
            input_resolution: Input resolution.
            window_size: Window size.
            num_heads: Number of attention heads.
            head_dim: Enforce the number of channels per head
            shift_size: Shift size for SW-MSA.
            mlp_ratio: Ratio of mlp hidden dim to embedding dim.
            qkv_bias: If True, add a learnable bias to query, key, value.
            proj_drop: Dropout rate.
            attn_drop: Attention dropout rate.
            drop_path: Stochastic depth rate.
            act_layer: Activation layer.
            norm_layer: Normalization layer.
        r   r   )rB   rC   r!   rD   rE   rF   r@   )Zin_featuresZhidden_featuresr€   ZdropNr'   r$   g      YÀra   FrH   )"rL   rM   rA   r|   Ú_calc_window_shiftr!   r}   rN   r~   Únorm1r=   r   rk   r   rP   ÚIdentityÚ
drop_path1Únorm2r   ru   ÚmlpÚ
drop_path2ÚanyÚmathÚceilr8   rR   Úslicer4   r*   r]   Zmasked_fillrw   rT   )rY   rA   r|   rB   rC   r!   r}   r~   rD   rF   rE   r   r€   r�   ÚwsÚssr.   r/   Zimg_maskZcntÚhÚwZmask_windowsra   rZ   r2   r3   rM   ¿   sb     

ù	

ü
ýý&zSwinTransformerBlock.__init__r\   c                 C   sN   t |ƒ}t |ƒ}dd„ t| j|ƒD ƒ}dd„ t| j||ƒD ƒ}t|ƒt|ƒfS )Nc                 S   s    g | ]\}}||kr|n|‘qS r2   r2   )Ú.0Úrr�   r2   r2   r3   Ú
<listcomp>  s     z;SwinTransformerBlock._calc_window_shift.<locals>.<listcomp>c                 S   s"   g | ]\}}}||krd n|‘qS ©r   r2   )r‘   r’   r�   Úsr2   r2   r3   r“     s     )r   Úzipr|   Útuple)rY   Ztarget_window_sizeZtarget_shift_sizer!   r}   r2   r2   r3   r‚     s
    z'SwinTransformerBlock._calc_window_shiftc              	   C   sV  |j \}}}}t| jƒ}|rBtj|| jd  | jd  fdd�}n|}| jd || jd   | jd  }| jd || jd   | jd  }	tjj |ddd|	d|f¡}|| ||	  }
}t	|| jƒ}| 
d| j|¡}| j|| jd�}| 
d| jd | jd |¡}t|| j|
|ƒ}|d d …d |…d |…d d …f  ¡ }|�rNtj|| jdd�}n|}|S )Nr   r   )r   r$   )ZshiftsZdimsr'   r_   )r)   r‰   r}   r8   Zrollr!   rP   re   Úpadr4   r*   rN   rk   ra   r5   r,   )rY   r    r-   r.   r/   r0   Z	has_shiftZ	shifted_xZpad_hZpad_wZHpZWpZ	x_windowsZattn_windowsr2   r2   r3   Ú_attn  s&    
&""$zSwinTransformerBlock._attnc                 C   sd   |j \}}}}||  |  |  |¡¡¡ }| |d|¡}||  |  |  |¡¡¡ }| ||||¡}|S )Nr'   )r)   r…   r™   rƒ   rc   rˆ   r‡   r†   ©rY   r    r-   r.   r/   r0   r2   r2   r3   rl   A  s    zSwinTransformerBlock.forward)rm   rn   ro   rp   rP   ZGELUÚ	LayerNormru   rv   r   rw   rs   r   rM   r   r‚   r™   rl   ry   r2   r2   rZ   r3   rz   »   s<   òòX&#rz   c                       s>   e Zd ZdZdejfeee edœ‡ fdd„Z	dd„ Z
‡  ZS )ÚPatchMergingz Patch Merging Layer.
    N©rA   Úout_dimr�   c                    sH   t ƒ  ¡  || _|pd| | _|d| ƒ| _tjd| | jdd�| _dS )z³
        Args:
            dim: Number of input channels.
            out_dim: Number of output channels (or 2 * dim if None)
            norm_layer: Normalization layer.
        r$   r%   FrJ   N)rL   rM   rA   rž   ÚnormrP   rU   Ú	reduction)rY   rA   rž   r�   rZ   r2   r3   rM   N  s
    
zPatchMerging.__init__c                 C   sŒ   |j \}}}}t|d dkd|› d�ƒ t|d dkd|› d�ƒ | ||d d|d d|¡ dddddd	¡ d¡}|  |¡}|  |¡}|S )
Nr$   r   z
x height (z) is not even.z	x width (r   r#   r%   r&   )r)   r   rc   r+   r:   rŸ   r    rš   r2   r2   r3   rl   `  s    2

zPatchMerging.forward)rm   rn   ro   rp   rP   r›   ru   r   r   rM   rl   ry   r2   r2   rZ   r3   rœ   J  s   üürœ   c                       sx   e Zd ZdZdddddddddejf
eeeeef eeee	e e
eeeeeee ef edœ‡ fd	d
„Zdd„ Z‡  ZS )ÚSwinTransformerStagez3 A basic Swin Transformer layer for one stage.
    Tr%   Nr?   r{   r@   ©rA   rž   r|   ÚdepthÚ
downsamplerB   rC   r!   r~   rD   rF   rE   r   r�   c                    s¼   t ƒ  ¡  |ˆ	_|ˆ	_|r,tdd„ |D ƒƒn|ˆ	_|ˆ	_dˆ	_tˆƒ‰tdd„ ˆD ƒƒ‰
|rnt	|ˆˆd�ˆ	_
n|ˆkszt‚t ¡ ˆ	_
tj‡ ‡‡‡‡‡‡‡‡‡	‡
‡fdd„t|ƒD ƒŽ ˆ	_dS )	aò  
        Args:
            dim: Number of input channels.
            out_dim: Number of output channels.
            input_resolution: Input resolution.
            depth: Number of blocks.
            downsample: Downsample layer at the end of the layer.
            num_heads: Number of attention heads.
            head_dim: Channels per head (dim // num_heads if not set)
            window_size: Local window size.
            mlp_ratio: Ratio of mlp hidden dim to embedding dim.
            qkv_bias: If True, add a learnable bias to query, key, value.
            proj_drop: Projection dropout rate.
            attn_drop: Attention dropout rate.
            drop_path: Stochastic depth rate.
            norm_layer: Normalization layer.
        c                 s   s   | ]}|d  V  qdS )r$   Nr2   ©r‘   Úir2   r2   r3   Ú	<genexpr>“  s     z0SwinTransformerStage.__init__.<locals>.<genexpr>Fc                 S   s   g | ]}|d  ‘qS ©r$   r2   )r‘   r�   r2   r2   r3   r“   —  s     z1SwinTransformerStage.__init__.<locals>.<listcomp>r�   c                    sP   g | ]H}t ˆˆ	jˆˆˆ|d  dkr&dnˆ
ˆˆˆˆ tˆtƒrBˆ| nˆˆd�‘qS )r$   r   )rA   r|   rB   rC   r!   r}   r~   rD   rF   rE   r   r�   )rz   Úoutput_resolutionÚ
isinstanceÚlistr¥   ©rE   r   rC   r~   r�   rB   rž   rF   rD   rY   r}   r!   r2   r3   r“   ¥  s   òôN)rL   rM   rA   r|   r—   r©   r£   Úgrad_checkpointingr   rœ   r¤   ÚAssertionErrorrP   r„   Ú
SequentialÚrangeÚblocks)rY   rA   rž   r|   r£   r¤   rB   rC   r!   r~   rD   rF   rE   r   r�   rZ   r¬   r3   rM   n  s&    "
ý

$ñzSwinTransformerStage.__init__c                 C   s6   |   |¡}| jr(tj ¡ s(t| j|ƒ}n
|  |¡}|S ©N)r¤   r­   r8   rq   Zis_scriptingr   r±   ©rY   r    r2   r2   r3   rl   ¶  s
    

zSwinTransformerStage.forward)rm   rn   ro   rp   rP   r›   ru   r   rs   r   rv   rw   r   r   r   rM   rl   ry   r2   r2   rZ   r3   r¡   j  s8   	ñ
ñHr¡   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ejdfeeeee	ee
edf e
edf ee eeeeeeeeee	ef e	dœ‡ fdd„Zejjd)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d$œd%d&„Zd'd(„ Z‡  ZS ).r   z§ Swin Transformer

    A PyTorch impl of : `Swin Transformer: Hierarchical Vision Transformer using Shifted Windows`  -
          https://arxiv.org/pdf/2103.14030
    éà   r%   r#   éè  Úavgé`   ©r$   r$   é   r$   ©r#   r¹   é   é   Nr?   r{   Tr@   gš™™™™™¹?Ú .)Úimg_sizeÚ
patch_sizeÚin_chansÚnum_classesÚglobal_poolÚ	embed_dimÚdepthsrB   rC   r!   r~   rD   Ú	drop_rateÚproj_drop_rateÚattn_drop_rateÚdrop_path_rateÚembed_layerr�   Úweight_initc                    s0  t ƒ  ¡  |dkst‚|| _|| _d| _t|ƒ| _ˆ | _t	ˆ d| jd   ƒ| _
g | _tˆ ttfƒs|‡ fdd„t| jƒD ƒ‰ ||||ˆ d |dd�| _| jj| _t| jƒ|	ƒ}	t|
ttfƒsÌt| jƒ|
ƒ}
nt|
ƒdkrä|
f| j }
t|
ƒ| jksöt‚t| jƒ|ƒ}d	d„ t d|t|ƒ¡ |¡D ƒ}g }ˆ d }d}t| jƒD ]¦}ˆ | }|t||| jd | | jd | f|| |dk|| |	| |
| || ||||| |d
�g7 }|}|dk�rÀ|d9 }|  jt|d| d|› �d�g7  _�q@tj|Ž | _|| j
ƒ| _t| j
|||| jd�| _|dk�r,|   |¡ dS )a~  
        Args:
            img_size: Input image size.
            patch_size: Patch size.
            in_chans: Number of input image channels.
            num_classes: Number of classes for classification head.
            embed_dim: Patch embedding dimension.
            depths: Depth of each Swin Transformer layer.
            num_heads: Number of attention heads in different layers.
            head_dim: Dimension of self-attention heads.
            window_size: Window size.
            mlp_ratio: Ratio of mlp hidden dim to embedding dim.
            qkv_bias: If True, add a learnable bias to query, key, value.
            drop_rate: Dropout rate.
            attn_drop_rate (float): Attention dropout rate.
            drop_path_rate (float): Stochastic depth rate.
            embed_layer: Patch embedding layer.
            norm_layer (nn.Module): Normalization layer.
        )r½   r¶   ZNHWCr$   r   c                    s   g | ]}t ˆ d |  ƒ‘qS r¨   )ru   r¥   ©rÃ   r2   r3   r“   ý  s     z,SwinTransformer.__init__.<locals>.<listcomp>r   )r¾   r¿   rÀ   rÃ   r�   Ú
output_fmtc                 S   s   g | ]}|  ¡ ‘qS r2   )Útolist)r‘   r    r2   r2   r3   r“     s     r¢   r%   úlayers.)Znum_chsr    Úmodule)Ú	pool_typerÅ   Z	input_fmtÚskipN)!rL   rM   r®   rÁ   rÂ   rÌ   ÚlenZ
num_layersrÃ   ru   Znum_featuresZfeature_inforª   r—   r«   r°   Úpatch_embedZ	grid_sizeZ
patch_gridr   r8   Zlinspacer;   Úsplitr¡   ÚdictrP   r¯   ÚlayersrŸ   r   ÚheadÚinit_weights)rY   r¾   r¿   rÀ   rÁ   rÂ   rÃ   rÄ   rB   rC   r!   r~   rD   rÅ   rÆ   rÇ   rÈ   rÉ   r�   rÊ   ÚkwargsZdprrÖ   Zin_dimrO   r¦   rž   rZ   rË   r3   rM   Ç  s„    *

ú
"þï

(û
zSwinTransformer.__init__c                 C   s<   |dkst ‚d|kr"t | j¡ nd}tt||d�| ƒ d S )N)ZjaxZjax_nlhbZmocor½   Znlhbr@   )Ú	head_bias)r®   rŠ   ÚlogrÁ   r   r   )rY   ÚmoderÚ   r2   r2   r3   rØ   <  s    zSwinTransformer.init_weightsc                 C   s.   t ƒ }|  ¡ D ]\}}d|kr| |¡ q|S )NrS   )ÚsetZnamed_parametersÚadd)rY   ZnwdÚnÚ_r2   r2   r3   Úno_weight_decayB  s
    zSwinTransformer.no_weight_decayFc                 C   s   t d|rdndddgd�S )Nz^patch_embedz^layers\.(\d+))z^layers\.(\d+).downsampler”   )z^layers\.(\d+)\.\w+\.(\d+)N)z^norm)iŸ† )Ústemr±   )rÕ   )rY   Zcoarser2   r2   r3   Úgroup_matcherJ  s    ýþzSwinTransformer.group_matcherc                 C   s   | j D ]
}||_qd S r²   )rÖ   r­   )rY   ÚenableÚlr2   r2   r3   Úset_grad_checkpointingU  s    
z&SwinTransformer.set_grad_checkpointingc                 C   s   | j jS r²   )r×   Úfc)rY   r2   r2   r3   Úget_classifierZ  s    zSwinTransformer.get_classifierc                 C   s   || _ | jj||d� d S )N)rÐ   )rÁ   r×   Úreset)rY   rÁ   rÂ   r2   r2   r3   Úreset_classifier^  s    z SwinTransformer.reset_classifierc                 C   s"   |   |¡}|  |¡}|  |¡}|S r²   )rÓ   rÖ   rŸ   r³   r2   r2   r3   Úforward_featuresb  s    


z SwinTransformer.forward_features©Ú
pre_logitsc                 C   s   |r| j |dd�S |   |¡S )NTrì   )r×   )rY   r    rí   r2   r2   r3   Úforward_headh  s    zSwinTransformer.forward_headc                 C   s   |   |¡}|  |¡}|S r²   )rë   rî   r³   r2   r2   r3   rl   k  s    

zSwinTransformer.forward)r½   )F)T)N)F)rm   rn   ro   rp   r
   rP   r›   rv   ru   Ústrr   r   rw   rs   r   r   rM   r8   rq   ÚignorerØ   rá   rã   ræ   rè   rê   rë   rî   rl   ry   r2   r2   rZ   r3   r   À  sn   ì


ìu



c           
         s.  d}d| krd}ddl }i }|  d| ¡} |  d| ¡} |  ¡ D ]ì\‰ }t‡ fdd	„d
D ƒƒr\q<dˆ krª|jjjj\}}}}|jd |ks”|jd |krªt|||fdddd�}ˆ  	d¡rü| 
ˆ dd… ¡}	|j|	jjksè|	jd |	jd krüt||	j|	jjd�}|�r | ddd„ ˆ ¡‰ ˆ  dd¡‰ ||ˆ < q<|S )zJ convert patch embedding weight from manual patchify + linear proj to convTzhead.fc.weightFr   NÚmodelÚ
state_dictc                    s   g | ]}|ˆ k‘qS r2   r2   )r‘   rß   ©ri   r2   r3   r“   {  s     z(checkpoint_filter_fn.<locals>.<listcomp>)rG   ra   zpatch_embed.proj.weightrb   r'   Úbicubic)ÚinterpolationZ	antialiasÚverboserS   iãÿÿÿr   )Znew_window_sizeZnew_bias_shapezlayers.(\d+).downsamplec                 S   s   dt |  d¡ƒd › d�S )NrÎ   r   z.downsample)ru   Úgroup)r    r2   r2   r3   Ú<lambda>“  ó    z&checkpoint_filter_fn.<locals>.<lambda>zhead.zhead.fc.)ÚreÚgetÚitemsr‰   rÓ   rW   Úweightr)   r   ÚendswithZget_submodulerS   r!   r   ÚsubÚreplace)
rò   rñ   Zold_weightsrú   Zout_dictrj   rà   r.   r/   Úmr2   ró   r3   Úcheckpoint_filter_fnq  sB    û
"ý
r  Fc                 K   sP   t dd„ t| dd¡ƒD ƒƒ}| d|¡}tt| |fttd|d�dœ|—Ž}|S )	Nc                 s   s   | ]\}}|V  qd S r²   r2   )r‘   r¦   rà   r2   r2   r3   r§   ›  s     z+_create_swin_transformer.<locals>.<genexpr>rÄ   )r   r   r#   r   Úout_indicesT)Zflatten_sequentialr  )Zpretrained_filter_fnZfeature_cfg)r—   Ú	enumeraterû   Úpopr   r   r  rÕ   )ÚvariantÚ
pretrainedrÙ   Zdefault_out_indicesr  rñ   r2   r2   r3   Ú_create_swin_transformerš  s      ÿ
ýür  r½   c                 K   s"   | ddddddt tddd	d
œ|–S )Nrµ   )r#   r´   r´   )r?   r?   gÍÌÌÌÌÌì?rô   Tzpatch_embed.projzhead.fcZmit)ÚurlrÁ   Ú
input_sizeÚ	pool_sizeÚcrop_pctrõ   Zfixed_input_sizeZmeanrK   Z
first_convÚ
classifierÚlicenser   )r	  rÙ   r2   r2   r3   Ú_cfg§  s          úúr  ztimm/zvhttps://github.com/SwinTransformer/storage/releases/download/v1.0.8/swin_small_patch4_window7_224_22kto1k_finetune.pth)Ú	hf_hub_idr	  zlhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window7_224_22kto1k.pthzmhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window12_384_22kto1k.pth)r#   é€  r  )r»   r»   g      ð?)r  r	  r
  r  r  zmhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window7_224_22kto1k.pthznhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window12_384_22kto1k.pthzdhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pthzehttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_small_patch4_window7_224.pthzdhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window7_224.pthzehttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window12_384.pthzuhttps://github.com/SwinTransformer/storage/releases/download/v1.0.8/swin_tiny_patch4_window7_224_22kto1k_finetune.pthzhhttps://github.com/SwinTransformer/storage/releases/download/v1.0.8/swin_tiny_patch4_window7_224_22k.pthiQU  )r  r	  rÁ   zihttps://github.com/SwinTransformer/storage/releases/download/v1.0.8/swin_small_patch4_window7_224_22k.pthzhhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window7_224_22k.pthzihttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window12_384_22k.pth)r  r	  r
  r  r  rÁ   zihttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window7_224_22k.pthzjhttps://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window12_384_22k.pthzbhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/s3_t-1d53f6a8.pthzbhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/s3_s-3bb4c69d.pthzbhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/s3_b-a1e95db4.pth)z.swin_small_patch4_window7_224.ms_in22k_ft_in1kz-swin_base_patch4_window7_224.ms_in22k_ft_in1kz.swin_base_patch4_window12_384.ms_in22k_ft_in1kz.swin_large_patch4_window7_224.ms_in22k_ft_in1kz/swin_large_patch4_window12_384.ms_in22k_ft_in1kz$swin_tiny_patch4_window7_224.ms_in1kz%swin_small_patch4_window7_224.ms_in1kz$swin_base_patch4_window7_224.ms_in1kz%swin_base_patch4_window12_384.ms_in1kz-swin_tiny_patch4_window7_224.ms_in22k_ft_in1kz%swin_tiny_patch4_window7_224.ms_in22kz&swin_small_patch4_window7_224.ms_in22kú%swin_base_patch4_window7_224.ms_in22kú&swin_base_patch4_window12_384.ms_in22kú&swin_large_patch4_window7_224.ms_in22kú'swin_large_patch4_window12_384.ms_in22kzswin_s3_tiny_224.ms_in1kzswin_s3_small_224.ms_in1kzswin_s3_base_224.ms_in1kr\   c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
z+ Swin-T @ 224x224, trained ImageNet-1k
    r%   r?   r·   r¸   rº   ©r¿   r!   rÃ   rÄ   rB   Úswin_tiny_patch4_window7_224r  )r  ©rÕ   r  ©r  rÙ   Z
model_argsr2   r2   r3   r  ý  s     ÿÿ
ÿr  c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
z Swin-S @ 224x224
    r%   r?   r·   ©r$   r$   é   r$   rº   r  Úswin_small_patch4_window7_224r  )r  r  r  r2   r2   r3   r    s     ÿÿ
ÿr  c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
z Swin-B @ 224x224
    r%   r?   é€   r  ©r%   é   é   é    r  Úswin_base_patch4_window7_224r  )r"  r  r  r2   r2   r3   r"    s     ÿÿ
ÿr"  c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
z Swin-B @ 384x384
    r%   r»   r  r  r  r  Úswin_base_patch4_window12_384r  )r#  r  r  r2   r2   r3   r#    s     ÿÿ
ÿr#  c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
z Swin-L @ 224x224
    r%   r?   éÀ   r  ©r¹   r»   r¼   é0   r  Úswin_large_patch4_window7_224r  )r'  r  r  r2   r2   r3   r'  !  s     ÿÿ
ÿr'  c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
z Swin-L @ 384x384
    r%   r»   r$  r  r%  r  Úswin_large_patch4_window12_384r  )r(  r  r  r2   r2   r3   r(  *  s     ÿÿ
ÿr(  c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
z; Swin-S3-T @ 224x224, https://arxiv.org/abs/2111.14725
    r%   ©r?   r?   é   r?   r·   r¸   rº   r  Úswin_s3_tiny_224r  )r+  r  r  r2   r2   r3   r+  3  s        ÿr+  c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
z; Swin-S3-S @ 224x224, https://arxiv.org/abs/2111.14725
    r%   )r*  r*  r*  r?   r·   r  rº   r  Úswin_s3_small_224r  )r,  r  r  r2   r2   r3   r,  <  s        ÿr,  c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
z; Swin-S3-B @ 224x224, https://arxiv.org/abs/2111.14725
    r%   r)  r·   )r$   r$   é   r$   rº   r  Úswin_s3_base_224r  )r.  r  r  r2   r2   r3   r.  E  s        ÿr.  r  r  r  r  )Z"swin_base_patch4_window7_224_in22kZ#swin_base_patch4_window12_384_in22kZ#swin_large_patch4_window7_224_in22kZ$swin_large_patch4_window12_384_in22k)F)r½   )F)F)F)F)F)F)F)F)F)Frp   ÚloggingrŠ   Útypingr   r   r   r   r   r8   Ztorch.nnrP   Z	timm.datar   r	   Ztimm.layersr
   r   r   r   r   r   r   r   r   r   r   r   Z_builderr   Z_features_fxr   Z_manipulater   r   Ú	_registryr   r   r   Zvision_transformerr   Ú__all__Ú	getLoggerrm   Z_loggerru   rv   rx   r4   r5   r<   ÚModuler=   rz   rœ   r¡   r   r  r  r  Zdefault_cfgsr  r  r"  r#  r'  r(  r+  r,  r.  r2   r2   r2   r3   Ú<module>   s6  8

ý`  V 2)

þþ  ýþ  ýþþþ  ýþýýý   ýý   ýþþþ»Kü