U
    ¯Ê¹jÄ†  ã                   @   sL  d Z ddlZddlmZmZmZ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  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 ddlm Z  ddl!m"Z" dd	l#m$Z$m%Z%m&Z& d
gZ'ee(ee(e(f f Z)e	j*ee(e(f e	j*dœdd„Z+e"e	j*ee(e(f ee(e(f e	j*dœdd„ƒZ,G dd„ dej-ƒZ.G dd„ dej-ƒZ/G dd„ dej-ƒZ0G dd„ dej-ƒZ1G dd
„ d
ej-ƒZ2dd„ Z3dYdd„Z4dZd d!„Z5e$e5d"d#d$�e5d"d%d&d'd(d)�e5d"d*d$�e5d"d+d&d'd(d)�e5d"d,d$�e5d"d-d$�e5d"d.d$�e5d"d/d$�e5d"d0d$�e5d"d1d$�e5d"d2d3d4d5d6�e5d"d7d3d4d5d6�d8œƒZ6e%d[e2d9œd:d;„ƒZ7e%d\e2d9œd<d=„ƒZ8e%d]e2d9œd>d?„ƒZ9e%d^e2d9œd@dA„ƒZ:e%d_e2d9œdBdC„ƒZ;e%d`e2d9œdDdE„ƒZ<e%dae2d9œdFdG„ƒZ=e%dbe2d9œdHdI„ƒZ>e%dce2d9œdJdK„ƒZ?e%dde2d9œdLdM„ƒZ@e%dee2d9œdNdO„ƒZAe%dfe2d9œdPdQ„ƒZBe&eCdRdSdTdUdVdWdXœƒ dS )gaK   Swin Transformer V2
A PyTorch impl of : `Swin Transformer V2: Scaling Up Capacity and Resolution`
    - https://arxiv.org/abs/2111.09883

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

Modifications and additions for timm hacked together by / Copyright 2022, Ross Wightman
é    N)ÚCallableÚOptionalÚTupleÚUnionÚSetÚDict©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)	Ú
PatchEmbedÚMlpÚDropPathÚ	to_2tupleÚtrunc_normal_Ú_assertÚClassifierHeadÚresample_patch_embedÚndgridé   )Úbuild_model_with_cfg)Úregister_notrace_function)Úgenerate_default_cfgsÚregister_modelÚregister_model_deprecationsÚSwinTransformerV2)ÚxÚwindow_sizeÚreturnc                 C   sj   | j \}}}}|  |||d  |d ||d  |d |¡} |  dddddd¡ ¡  d|d |d |¡}|S )zš
    Args:
        x: (B, H, W, C)
        window_size (int): window size

    Returns:
        windows: (num_windows*B, window_size, window_size, C)
    r   r   é   é   é   é   éÿÿÿÿ©ÚshapeÚviewÚpermuteÚ
contiguous)r   r   ÚBÚHÚWÚCÚwindows© r-   ú^/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/swin_transformer_v2.pyÚwindow_partition#   s    	,,r/   )r,   r   Úimg_sizer   c                 C   sf   |\}}| j d }|  d||d  ||d  |d |d |¡}| dddddd¡ ¡  d|||¡}|S )zÝ
    Args:
        windows: (num_windows * B, window_size[0], window_size[1], C)
        window_size (Tuple[int, int]): Window size
        img_size (Tuple[int, int]): Image size

    Returns:
        x: (B, H, W, C)
    r"   r   r   r   r   r    r!   r#   )r,   r   r0   r)   r*   r+   r   r-   r-   r.   Úwindow_reverse2   s
    
,$r1   c                
       sd   e Zd ZdZdeeeef eeeeeeef ddœ‡ fdd„Zde	j
ee	j
 e	j
d	œd
d„Z‡  ZS )ÚWindowAttentiona©   Window based multi-head self attention (W-MSA) module with relative position bias.
    It supports both of shifted and non-shifted window.

    Args:
        dim (int): Number of input channels.
        window_size (tuple[int]): The height and width of the window.
        num_heads (int): Number of attention heads.
        qkv_bias (bool, optional):  If True, add a learnable bias to query, key, value. Default: True
        attn_drop (float, optional): Dropout ratio of attention weight. Default: 0.0
        proj_drop (float, optional): Dropout ratio of output. Default: 0.0
        pretrained_window_size (tuple[int]): The height and width of the window in pre-training.
    Tç        ©r   r   N)Údimr   Ú	num_headsÚqkv_biasÚ	attn_dropÚ	proj_dropÚpretrained_window_sizer   c              
      sž  t ƒ  ¡  || _|| _|| _|| _t t 	dt 
|ddf¡ ¡¡| _t tjdddd�tjdd�tjd|dd�¡| _t | jd	 d  | jd	 ¡ tj¡}t | jd d  | jd ¡ tj¡}	t t||	ƒ¡}
|
 ddd	¡ ¡  d	¡}
|d	 d	k�rP|
d d …d d …d d …d	f  |d	 d   < |
d d …d d …d d …df  |d d   < n\|
d d …d d …d d …d	f  | jd	 d   < |
d d …d d …d d …df  | jd d   < |
d
9 }
t |
¡t t |
¡d ¡ t d
¡ }
| jd|
dd� t | jd	 ¡}t | jd ¡}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  | jd	 d 7  < |d d …d d …df  | jd d 7  < |d d …d d …d	f  d| jd  d 9  < | d¡}| jd|dd� tj||d dd�| _|�rTt t  |¡¡| _!| jdt  |¡dd� t t  |¡¡| _"nd | _!d | _#d | _"t $|¡| _%t ||¡| _&t $|¡| _'tj(dd�| _)d S )Né
   r   r   i   T©Úbias)ZinplaceFr   é   ç      ð?Úrelative_coords_table©Ú
persistentr"   Úrelative_position_indexr   Úk_bias©r5   )*ÚsuperÚ__init__r5   r   r:   r6   ÚnnÚ	ParameterÚtorchÚlogZonesÚlogit_scaleÚ
SequentialÚLinearZReLUÚcpb_mlpZarangeÚtoZfloat32Ústackr   r&   r'   Ú	unsqueezeÚsignÚlog2ÚabsÚmathÚregister_bufferÚflattenÚsumÚqkvÚzerosÚq_biasÚv_biasrD   ZDropoutr8   Úprojr9   ZSoftmaxÚsoftmax)Úselfr5   r   r6   r7   r8   r9   r:   Zrelative_coords_hZrelative_coords_wr@   Zcoords_hZcoords_wZcoordsZcoords_flattenZrelative_coordsrC   ©Ú	__class__r-   r.   rG   R   sd    

"
ý&&,...ÿÿ,((,
zWindowAttention.__init__)r   Úmaskr   c                 C   sÖ  |j \}}}d}| jdk	r0t | j| j| jf¡}tj|| jj	|d�}| 
||d| jd¡ ddddd¡}| d¡\}}	}
tj|dd	�tj|	dd	� d
d¡ }tj| jt d¡d� ¡ }|| }|  | j¡ d| j¡}|| j d¡  | jd | jd  | jd | jd  d¡}| ddd¡ ¡ }dt |¡ }|| d¡ }|dk	�r�|j d }| d|| j||¡| d¡ d¡ }| d| j||¡}|  |¡}n
|  |¡}|  |¡}||
  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
        N)ÚinputÚweightr=   r   r"   r   r   r   r    rE   éþÿÿÿg      Y@)Úmaxé   )!r$   r\   rJ   ÚcatrD   r]   ÚFZlinearrZ   re   Úreshaper6   r&   ZunbindÚ	normalizeZ	transposeÚclamprL   rV   rK   ÚexprO   r@   r%   rC   r   r'   ZsigmoidrR   r_   r8   r^   r9   )r`   r   rc   ZB_ÚNr+   r7   rZ   ÚqÚkÚvÚattnrL   Zrelative_position_bias_tableZrelative_position_biasZnum_winr-   r-   r.   Úforward—   s<    
"$  ÿ

$



zWindowAttention.forward)Tr3   r3   r4   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úintr   ÚboolÚfloatrG   rJ   ÚTensorr   rt   Ú__classcell__r-   r-   ra   r.   r2   D   s        ø

÷Er2   c                       s°   e Zd ZdZdddddddejejdf
eeeeee	e
e	e	e	ejejeddœ‡ fd	d
„Zeeeeeef eeef f dœdd„Zejejdœdd„Zejejdœdd„Z‡  ZS )ÚSwinTransformerV2Blockz Swin Transformer Block.
    é   r   ç      @Tr3   N)r5   Úinput_resolutionr6   r   Ú
shift_sizeÚ	mlp_ratior7   r9   r8   Ú	drop_pathÚ	act_layerÚ
norm_layerr:   r   c              	      s  t ƒ  ¡  || _t|ƒ| _|| _|  ||¡\}}|| _|| _| jd | jd  | _	|| _
t|t| jƒ|||	|t|ƒd�| _||ƒ| _|
dkr”t|
ƒnt ¡ | _t|t|| ƒ||d�| _||ƒ| _|
dkrÒt|
ƒnt ¡ | _t| jƒ�r| j\}}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„�qDt|| 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.
            num_heads: Number of attention heads.
            window_size: Window size.
            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.
            pretrained_window_size: Window size in pretraining.
        r   r   )r   r6   r7   r8   r9   r:   r3   )Zin_featuresZhidden_featuresr…   ZdropNr"   r   g      YÀÚ	attn_maskFrA   )!rF   rG   r5   r   r�   r6   Ú_calc_window_shiftr   r‚   Úwindow_arearƒ   r2   rs   Únorm1r   rH   ÚIdentityÚ
drop_path1r   ry   ÚmlpÚnorm2Ú
drop_path2ÚanyrJ   r[   Úslicer/   r%   rR   Zmasked_fillr{   rW   )r`   r5   r�   r6   r   r‚   rƒ   r7   r9   r8   r„   r…   r†   r:   ÚwsÚssr)   r*   Zimg_maskZcntÚhÚwZmask_windowsr‡   ra   r-   r.   rG   Å   s`     

ù	

ü

ýý&zSwinTransformerV2Block.__init__)Útarget_window_sizeÚtarget_shift_sizer   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 r-   r-   )Ú.0Úrr•   r-   r-   r.   Ú
<listcomp>!  s     z=SwinTransformerV2Block._calc_window_shift.<locals>.<listcomp>c                 S   s"   g | ]\}}}||krd n|‘qS ©r   r-   )r˜   r™   r•   Úsr-   r-   r.   rš   "  s     )r   Úzipr�   Útuple)r`   r–   r—   r   r‚   r-   r-   r.   rˆ     s
    z)SwinTransformerV2Block._calc_window_shift©r   r   c           
      C   s¾   |j \}}}}t| jƒ}|rBtj|| jd  | jd  fdd�}n|}t|| jƒ}| d| j|¡}| j	|| j
d�}	|	 d| jd | jd |¡}	t|	| j| jƒ}|r¶tj|| jdd�}n|}|S )Nr   r   )r   r   )ZshiftsZdimsr"   )rc   )r$   r�   r‚   rJ   Zrollr/   r   r%   r‰   rs   r‡   r1   r�   )
r`   r   r(   r)   r*   r+   Z	has_shiftZ	shifted_xZ	x_windowsZattn_windowsr-   r-   r.   Ú_attn%  s    
&zSwinTransformerV2Block._attnc                 C   sd   |j \}}}}||  |  |  |¡¡¡ }| |d|¡}||  |  |  |¡¡¡ }| ||||¡}|S )Nr"   )r$   rŒ   rŠ   r    rk   r�   rŽ   r�   ©r`   r   r(   r)   r*   r+   r-   r-   r.   rt   A  s    zSwinTransformerV2Block.forward)ru   rv   rw   rx   rH   ZGELUÚ	LayerNormry   Ú_int_or_tuple_2_tr{   rz   ÚModulerG   r   rˆ   rJ   r|   r    rt   r}   r-   r-   ra   r.   r~   Á   sB   òñX þ	r~   c                       sN   e Zd ZdZdejfeee ejddœ‡ fdd„Z	e
je
jdœdd„Z‡  ZS )	ÚPatchMergingz Patch Merging Layer.
    N)r5   Úout_dimr†   r   c                    sF   t ƒ  ¡  || _|pd| | _tjd| | jdd�| _|| jƒ| _dS )zì
        Args:
            dim (int): Number of input channels.
            out_dim (int): Number of output channels (or 2 * dim if None)
            norm_layer (nn.Module, optional): Normalization layer.  Default: nn.LayerNorm
        r   r    Fr<   N)rF   rG   r5   r¦   rH   rN   Ú	reductionÚnorm)r`   r5   r¦   r†   ra   r-   r.   rG   N  s
    
zPatchMerging.__init__rŸ   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   rk   r&   rX   r§   r¨   r¡   r-   r-   r.   rt   [  s    2

zPatchMerging.forward)ru   rv   rw   rx   rH   r¢   ry   r   r¤   rG   rJ   r|   rt   r}   r-   r-   ra   r.   r¥   J  s   &r¥   c                       s~   e Zd ZdZddddddejddf	eeeeeeee	ee	e	e	ej
eeddœ‡ fd	d
„Zejejdœdd„Zddœdd„Z‡  ZS )ÚSwinTransformerV2Stagez" A Swin Transformer V2 Stage.
    Fr€   Tr3   r   N)r5   r¦   r�   Údepthr6   r   Ú
downsamplerƒ   r7   r9   r8   r„   r†   r:   Úoutput_nchwr   c                    sÂ   t ƒ  ¡  |ˆ	_|ˆ	_|r,tdd„ |D ƒƒn|ˆ	_|ˆ	_|ˆ	_dˆ	_t	ˆƒ‰tdd„ ˆD ƒƒ‰
|rtt
|ˆˆd�ˆ	_n|ˆks€t‚t ¡ ˆ	_t ‡ ‡‡‡‡‡‡‡‡‡	‡
‡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.
            num_heads: Number of attention heads.
            window_size: Local window size.
            downsample: Use downsample layer at start of the block.
            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.
            pretrained_window_size: Local window size in pretraining.
            output_nchw: Output tensors on NCHW format instead of NHWC.
        c                 s   s   | ]}|d  V  qdS )r   Nr-   ©r˜   Úir-   r-   r.   Ú	<genexpr>�  s     z2SwinTransformerV2Stage.__init__.<locals>.<genexpr>Fc                 S   s   g | ]}|d  ‘qS ©r   r-   )r˜   r•   r-   r-   r.   rš   •  s     z3SwinTransformerV2Stage.__init__.<locals>.<listcomp>)r5   r¦   r†   c                    sP   g | ]H}t ˆˆ	jˆˆ|d  dkr$dnˆ
ˆˆˆˆ tˆtƒr@ˆ| nˆˆˆd�‘qS )r   r   )r5   r�   r6   r   r‚   rƒ   r7   r9   r8   r„   r†   r:   )r~   Úoutput_resolutionÚ
isinstanceÚlistr­   ©r8   r„   rƒ   r†   r6   r¦   r:   r9   r7   r`   r‚   r   r-   r.   rš   Ÿ  s   òôN)rF   rG   r5   r�   rž   r±   rª   r¬   Úgrad_checkpointingr   r¥   r«   ÚAssertionErrorrH   r‹   Z
ModuleListÚrangeÚblocks)r`   r5   r¦   r�   rª   r6   r   r«   rƒ   r7   r9   r8   r„   r†   r:   r¬   ra   r´   r.   rG   i  s     $

$ñzSwinTransformerV2Stage.__init__rŸ   c                 C   s@   |   |¡}| jD ]*}| jr2tj ¡ s2t ||¡}q||ƒ}q|S ©N)r«   r¸   rµ   rJ   ÚjitZis_scriptingÚ
checkpoint)r`   r   Úblkr-   r-   r.   rt   °  s    


zSwinTransformerV2Stage.forward©r   c                 C   sX   | j D ]L}tj |jjd¡ tj |jjd¡ tj |jjd¡ tj |jjd¡ qd S )Nr   )r¸   rH   ÚinitÚ	constant_rŠ   r=   re   rŽ   )r`   r¼   r-   r-   r.   Ú_init_respostnormº  s
    
z(SwinTransformerV2Stage._init_respostnorm)ru   rv   rw   rx   rH   r¢   ry   r£   rz   r{   r¤   rG   rJ   r|   rt   rÀ   r}   r-   r-   ra   r.   r©   e  s<   ðïG
r©   c                       sú   e Zd ZdZdddddddd	d
dddddd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df dœ‡ 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d$œd%d&„Zd'd(„ Z‡  ZS )-r   z— Swin Transformer V2

    A PyTorch impl of : `Swin Transformer V2: Scaling Up Capacity and Resolution`
        - https://arxiv.org/abs/2111.09883
    éà   r    r   éè  Úavgé`   ©r   r   é   r   ©r   rÆ   é   é   r   r€   Tr3   gš™™™™™¹?)r   r   r   r   .)r0   Ú
patch_sizeÚin_chansÚnum_classesÚglobal_poolÚ	embed_dimÚdepthsr6   r   rƒ   r7   Ú	drop_rateÚproj_drop_rateÚattn_drop_rateÚdrop_path_rater†   Úpretrained_window_sizesc                    sÊ  t ƒ  ¡  || _|dkst‚|| _d| _t|ƒ| _ˆ | _t	ˆ d| jd   ƒ| _
g | _tˆ ttfƒs|‡ fdd„t| jƒD ƒ‰ t|||ˆ d |dd�| _d	d„ t d|t|ƒ¡ |¡D ƒ}g }ˆ d }d}t| jƒD ] }ˆ | }|t||| jjd | | jjd | f|| |dk|| |	|
||||| ||| d
�g7 }|}|dk�rN|d9 }|  jt|d| d|› �d�g7  _qÒtj|Ž | _|| j
ƒ| _t| j
|||| jd�| _|  | j ¡ | jD ]}| !¡  �q¶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 stage (layer).
            num_heads: Number of attention heads in different layers.
            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: Head dropout rate.
            proj_drop_rate: Projection dropout rate.
            attn_drop_rate: Attention dropout rate.
            drop_path_rate: Stochastic depth rate.
            norm_layer: Normalization layer.
            patch_norm: If True, add normalization after patch embedding.
            pretrained_window_sizes: Pretrained window sizes of each layer.
            output_fmt: Output tensor format if not None, otherwise output 'NHWC' by default.
        )Ú rÃ   ZNHWCr   r   c                    s   g | ]}t ˆ d |  ƒ‘qS r°   )ry   r­   ©rÎ   r-   r.   rš   ÿ  s     z.SwinTransformerV2.__init__.<locals>.<listcomp>r   )r0   rÊ   rË   rÎ   r†   Ú
output_fmtc                 S   s   g | ]}|  ¡ ‘qS r-   )Útolist)r˜   r   r-   r-   r.   rš     s     )r5   r¦   r�   rª   r«   r6   r   rƒ   r7   r9   r8   r„   r†   r:   r    úlayers.)Znum_chsr§   Úmodule)Z	pool_typerÐ   Z	input_fmtN)"rF   rG   rÌ   r¶   rÍ   r×   ÚlenZ
num_layersrÎ   ry   Znum_featuresZfeature_infor²   rž   r³   r·   r   Úpatch_embedrJ   ZlinspacerY   Úsplitr©   Z	grid_sizeÚdictrH   rM   Úlayersr¨   r   ÚheadÚapplyÚ_init_weightsrÀ   )r`   r0   rÊ   rË   rÌ   rÍ   rÎ   rÏ   r6   r   rƒ   r7   rÐ   rÑ   rÒ   rÓ   r†   rÔ   ÚkwargsZdprrß   Zin_dimÚscaler®   r¦   Zblyra   rÖ   r.   rG   É  sv    *

ú	"þð

&û
zSwinTransformerV2.__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 )Ng{®Gáz”?)Ústdr   )r²   rH   rN   r   re   r=   r¾   r¿   )r`   Úmr-   r-   r.   râ   6  s    zSwinTransformerV2._init_weightsc                    s<   t ƒ }|  ¡ D ](\‰ }t‡ fdd„dD ƒƒr| ˆ ¡ q|S )Nc                    s   g | ]}|ˆ k‘qS r-   r-   )r˜   Úkw©Únr-   r.   rš   @  s     z5SwinTransformerV2.no_weight_decay.<locals>.<listcomp>)rO   rL   )ÚsetZnamed_modulesr�   Úadd)r`   Znodræ   r-   rè   r.   Úno_weight_decay<  s
    z!SwinTransformerV2.no_weight_decayFc                 C   s   t d|rdndddgd�S )Nz^absolute_pos_embed|patch_embedz^layers\.(\d+))z^layers\.(\d+).downsampler›   )z^layers\.(\d+)\.\w+\.(\d+)N)z^norm)iŸ† )Ústemr¸   )rÞ   )r`   Zcoarser-   r-   r.   Úgroup_matcherD  s    ýþzSwinTransformerV2.group_matcherc                 C   s   | j D ]
}||_qd S r¹   )rß   rµ   )r`   ÚenableÚlr-   r-   r.   Úset_grad_checkpointingO  s    
z(SwinTransformerV2.set_grad_checkpointingc                 C   s   | j jS r¹   )rà   Úfc)r`   r-   r-   r.   Úget_classifierT  s    z SwinTransformerV2.get_classifierNc                 C   s   || _ | j ||¡ d S r¹   )rÌ   rà   Úreset)r`   rÌ   rÍ   r-   r-   r.   Úreset_classifierX  s    z"SwinTransformerV2.reset_classifierc                 C   s"   |   |¡}|  |¡}|  |¡}|S r¹   )rÜ   rß   r¨   ©r`   r   r-   r-   r.   Úforward_features\  s    


z"SwinTransformerV2.forward_features©Ú
pre_logitsc                 C   s   |r| j |dd�S |   |¡S )NTrø   )rà   )r`   r   rù   r-   r-   r.   Úforward_headb  s    zSwinTransformerV2.forward_headc                 C   s   |   |¡}|  |¡}|S r¹   )r÷   rú   rö   r-   r-   r.   rt   e  s    

zSwinTransformerV2.forward)F)T)N)F)ru   rv   rw   rx   rH   r¢   r£   ry   Ústrr   r{   rz   r   rG   râ   rJ   rº   Úignorerì   rî   rñ   ró   rõ   r÷   rú   rt   r}   r-   r-   ra   r.   r   Â  sd   î


îm



c           	         sÒ   |   d| ¡} |   d| ¡} d| k}i }dd l}|  ¡ D ]˜\‰ }t‡ fdd„dD ƒƒrTq4dˆ kr¢|jjjj\}}}}|jd	 |ksŒ|jd
 |kr¢t|||fdddd�}|sÄ| 	ddd„ ˆ ¡‰ ˆ  
dd¡‰ ||ˆ < q4|S )NÚmodelÚ
state_dictzhead.fc.weightr   c                    s   g | ]}|ˆ k‘qS r-   r-   )r˜   ré   ©rq   r-   r.   rš   r  s     z(checkpoint_filter_fn.<locals>.<listcomp>)rC   r@   r‡   zpatch_embed.proj.weightrf   r"   ÚbicubicT)ÚinterpolationZ	antialiasÚverbosezlayers.(\d+).downsamplec                 S   s   dt |  d¡ƒd › d�S )NrÙ   r   z.downsample)ry   Úgroup)r   r-   r-   r.   Ú<lambda>‚  ó    z&checkpoint_filter_fn.<locals>.<lambda>zhead.zhead.fc.)ÚgetÚreÚitemsr�   rÜ   r^   re   r$   r   ÚsubÚreplace)	rþ   rý   Znative_checkpointZout_dictr  rr   Ú_r)   r*   r-   rÿ   r.   Úcheckpoint_filter_fnk  s.    û
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¹   r-   )r˜   r®   r  r-   r-   r.   r¯   Š  s     z._create_swin_transformer_v2.<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ý   r-   r-   r.   Ú_create_swin_transformer_v2‰  s      ÿ
ýür  rÕ   c                 K   s"   | ddddddt tddd	d
œ|–S )NrÂ   )r   é   r  )r>   r>   gÍÌÌÌÌÌì?r   Tzpatch_embed.projzhead.fcZmit)ÚurlrÌ   Ú
input_sizeÚ	pool_sizeÚcrop_pctr  Zfixed_input_sizeZmeanrå   Z
first_convÚ
classifierÚlicenser   )r  rã   r-   r-   r.   Ú_cfg•  s          úúr  ztimm/z{https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window12to16_192to256_22kto1k_ft.pth)Ú	hf_hub_idr  z{https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window12to24_192to384_22kto1k_ft.pth)r   é€  r  )rÈ   rÈ   r?   )r  r  r  r  r  z|https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_large_patch4_window12to16_192to256_22kto1k_ft.pthz|https://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_large_patch4_window12to24_192to384_22kto1k_ft.pthzfhttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_tiny_patch4_window8_256.pthzghttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_tiny_patch4_window16_256.pthzghttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_small_patch4_window8_256.pthzhhttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_small_patch4_window16_256.pthzfhttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window8_256.pthzghttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window16_256.pthzkhttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_base_patch4_window12_192_22k.pthiQU  )r   éÀ   r  )rÆ   rÆ   )r  r  rÌ   r  r  zlhttps://github.com/SwinTransformer/storage/releases/download/v2.0.0/swinv2_large_patch4_window12_192_22k.pth)ú2swinv2_base_window12to16_192to256.ms_in22k_ft_in1kú2swinv2_base_window12to24_192to384.ms_in22k_ft_in1kú3swinv2_large_window12to16_192to256.ms_in22k_ft_in1kú3swinv2_large_window12to24_192to384.ms_in22k_ft_in1kzswinv2_tiny_window8_256.ms_in1kz swinv2_tiny_window16_256.ms_in1kz swinv2_small_window8_256.ms_in1kz!swinv2_small_window16_256.ms_in1kzswinv2_base_window8_256.ms_in1kz swinv2_base_window16_256.ms_in1kú!swinv2_base_window12_192.ms_in22kú"swinv2_large_window12_192.ms_in22kr½   c                 K   s*   t ddddd�}tdd| it |f|Ž—ŽS )	ú
    rh   rÄ   rÅ   rÇ   ©r   rÎ   rÏ   r6   Úswinv2_tiny_window16_256r  )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 )	r$  r>   rÄ   rÅ   rÇ   r%  Úswinv2_tiny_window8_256r  )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 )	r$  rh   rÄ   ©r   r   é   r   rÇ   r%  Úswinv2_small_window16_256r  )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 )	r$  r>   rÄ   r*  rÇ   r%  Úswinv2_small_window8_256r  )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 )	r$  rh   é€   r*  ©r    r>   rh   é    r%  Úswinv2_base_window16_256r  )r1  r'  r(  r-   r-   r.   r1  þ  s     ÿÿ
ÿr1  c                 K   s*   t ddddd�}tdd| it |f|Ž—ŽS )	r$  r>   r.  r*  r/  r%  Úswinv2_base_window8_256r  )r2  r'  r(  r-   r-   r.   r2    s     ÿÿ
ÿr2  c                 K   s*   t ddddd�}tdd| it |f|Ž—ŽS )	r$  rÈ   r.  r*  r/  r%  Úswinv2_base_window12_192r  )r3  r'  r(  r-   r-   r.   r3    s     ÿÿ
ÿr3  c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
r$  rh   r.  r*  r/  ©rÈ   rÈ   rÈ   rÆ   ©r   rÎ   rÏ   r6   rÔ   Ú!swinv2_base_window12to16_192to256r  )r6  r'  r(  r-   r-   r.   r6    s       þ ÿÿ
ÿr6  c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
r$  rÉ   r.  r*  r/  r4  r5  Ú!swinv2_base_window12to24_192to384r  )r7  r'  r(  r-   r-   r.   r7  $  s       þ ÿÿ
ÿr7  c                 K   s*   t ddddd�}tdd| it |f|Ž—ŽS )	r$  rÈ   r  r*  ©rÆ   rÈ   rÉ   é0   r%  Úswinv2_large_window12_192r  )r:  r'  r(  r-   r-   r.   r:  /  s     ÿÿ
ÿr:  c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
r$  rh   r  r*  r8  r4  r5  Ú"swinv2_large_window12to16_192to256r  )r;  r'  r(  r-   r-   r.   r;  8  s       þ ÿÿ
ÿr;  c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
r$  rÉ   r  r*  r8  r4  r5  Ú"swinv2_large_window12to24_192to384r  )r<  r'  r(  r-   r-   r.   r<  C  s       þ ÿÿ
ÿr<  r"  r  r  r#  r   r!  )Zswinv2_base_window12_192_22kZ)swinv2_base_window12to16_192to256_22kft1kZ)swinv2_base_window12to24_192to384_22kft1kZswinv2_large_window12_192_22kZ*swinv2_large_window12to16_192to256_22kft1kZ*swinv2_large_window12to24_192to384_22kft1k)F)rÕ   )F)F)F)F)F)F)F)F)F)F)F)F)Drx   rV   Útypingr   r   r   r   r   r   rJ   Ztorch.nnrH   Ztorch.nn.functionalZ
functionalrj   Ztorch.utils.checkpointÚutilsr»   Z	timm.datar	   r
   Ztimm.layersr   r   r   r   r   r   r   r   r   Z_builderr   Z_features_fxr   Ú	_registryr   r   r   Ú__all__ry   r£   r|   r/   r1   r¤   r2   r~   r¥   r©   r   r  r  r  Zdefault_cfgsr&  r)  r,  r-  r1  r2  r3  r6  r7  r:  r;  r<  ru   r-   r-   r-   r.   Ú<module>   sð    ,*} 
] *

þ  ýþ  ýþþþþþþ  ý  ýÎ:



ú