a
    d-]                     @   s  d Z ddlZddlZddlmZ ddlmZmZ ddlZddl	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mZmZmZ d	d
lmZ d	dlmZmZ dgZee 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'dGddZ(dHddZ)ee)dddde)dd d!e)d"dd#e)d$dd#e)d%dd#e)d&dd#e)d'dd#e)d(dd#e) e)d)dd#e) e)d*dd#e) d+Z*edIe'd,d-d.Z+edJe'd,d/d0Z,edKe'd,d1d2Z-edLe'd,d3d4Z.edMe'd,d5d6Z/edNe'd,d7d8Z0edOe'd,d9d:Z1edPe'd,d;d<Z2edQe'd,d=d>Z3edRe'd,d?d@Z4edSe'd,dAdBZ5edTe'd,dCdDZ6edUe'd,dEdFZ7dS )Vz Relative Position Vision Transformer (ViT) in PyTorch

NOTE: these models are experimental / WIP, expect changes

Hacked together by / Copyright 2022, Ross Wightman
    N)partial)OptionalTuple)Final)
checkpointIMAGENET_INCEPTION_MEANIMAGENET_INCEPTION_STD)
PatchEmbedMlpDropPath	RelPosMlp
RelPosBiasuse_fused_attn   )build_model_with_cfg)generate_default_cfgsregister_modelVisionTransformerRelPosc                       sR   e Zd ZU ee ed< ddddddejf fdd	Zde	e
j dd	d
Z  ZS )RelPosAttention
fused_attn   FN        c	           	         s   t    || dksJ d|| _|| | _| jd | _t | _tj||d |d| _	|rf|| jnt
 | _|r~|| jnt
 | _|r||dnd | _t|| _t||| _t|| _d S )Nr   z$dim should be divisible by num_headsg         )Zbias	num_heads)super__init__r   head_dimscaler   r   nnLinearqkvIdentityq_normk_normrel_posDropout	attn_dropproj	proj_drop)	selfdimr   qkv_biasqk_normrel_pos_clsr(   r*   
norm_layer	__class__ n/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/vision_transformer_relpos.pyr      s    

zRelPosAttention.__init__shared_rel_posc                 C   s6  |j \}}}| |||d| j| jddddd}|d\}}}	| |}| |}| j	r| j
d urv| j
 }
n|d ur|}
nd }
tjjj|||	|
| jjd}nb|| j }||dd }| j
d ur| j
||d	}n|d ur|| }|jdd
}| |}||	 }|dd|||}| |}| |}|S )Nr      r   r      )Z	attn_maskZ	dropout_pr5   r,   )shaper"   Zreshaper   r   ZpermuteZunbindr$   r%   r   r&   get_biastorchr    Z
functionalZscaled_dot_product_attentionr(   pr   Z	transposeZsoftmaxr)   r*   )r+   xr6   BNCr"   qkvZ	attn_biasattnr3   r3   r4   forward8   s:    *







zRelPosAttention.forward)N)__name__
__module____qualname__r   bool__annotations__r    	LayerNormr   r   r>   TensorrH   __classcell__r3   r3   r1   r4   r      s   
r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )
LayerScaleh㈵>Fc                    s*   t    || _t|t| | _d S N)r   r   inplacer    	Parameterr>   Zonesgamma)r+   r,   init_valuesrT   r1   r3   r4   r   ^   s    
zLayerScale.__init__c                 C   s   | j r|| jS || j S rS   )rT   Zmul_rV   r+   r@   r3   r3   r4   rH   c   s    zLayerScale.forward)rR   F)rI   rJ   rK   r   rH   rP   r3   r3   r1   r4   rQ   ]   s   rQ   c                
       sL   e Zd Zddddddddejejf
 fdd	Zd
eej	 ddd	Z
  ZS )RelPosBlock      @FNr   c              	      s   t    ||| _t||||||	|d| _|r<t||dnt | _|
dkrVt	|
nt | _
||| _t|t|| ||d| _|rt||dnt | _|
dkrt	|
nt | _d S )Nr-   r.   r/   r(   r*   )rW   r   Zin_featuresZhidden_features	act_layerZdrop)r   r   norm1r   rG   rQ   r    r#   ls1r   
drop_path1norm2r   intmlpls2
drop_path2r+   r,   r   	mlp_ratior-   r.   r/   rW   r*   r(   	drop_pathr]   r0   r1   r3   r4   r   i   s,    

	

zRelPosBlock.__init__r5   c              
   C   sH   ||  | | j| ||d }|| | | | | }|S Nr5   )r`   r_   rG   r^   re   rd   rc   ra   r+   r@   r6   r3   r3   r4   rH      s    $ zRelPosBlock.forward)N)rI   rJ   rK   r    GELUrN   r   r   r>   rO   rH   rP   r3   r3   r1   r4   rY   g   s   (rY   c                
       sT   e Zd Zddddddddejejf
 fdd	Zdd Zdee	j
 d	d
dZ  ZS )ResPostRelPosBlockrZ   FNr   c              	      s   t    || _t||||||	|d| _||| _|
dkrBt|
nt | _	t
|t|| ||d| _||| _|
dkrt|
nt | _|   d S )Nr[   r   r\   )r   r   rW   r   rG   r^   r   r    r#   r`   r   rb   rc   ra   re   init_weightsrf   r1   r3   r4   r      s,    
	


zResPostRelPosBlock.__init__c                 C   s6   | j d ur2tj| jj| j  tj| jj| j  d S rS   )rW   r    initZ	constant_r^   Zweightra   r+   r3   r3   r4   rm      s    
zResPostRelPosBlock.init_weightsr5   c              	   C   s<   ||  | | j||d }|| | | | }|S ri   )r`   r^   rG   re   ra   rc   rj   r3   r3   r4   rH      s    zResPostRelPosBlock.forward)N)rI   rJ   rK   r    rk   rN   r   rm   r   r>   rO   rH   rP   r3   r3   r1   r4   rl      s   )rl   c                       s   e Zd ZdZddddddddd	d
ddddddddddddeddef fdd	Z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+eddd Zd!d" Zd,ed#d$d%Zd&d' Z  ZS )-r   ah   Vision Transformer w/ Relative Position Bias

    Differing from classic vit, this impl
      * uses relative position index (swin v1 / beit) or relative log coord + mlp (swin v2) pos embed
      * defaults to no class token (can be enabled)
      * defaults to global avg pool for head (can be changed)
      * layer-scale (residual branch gain) enabled
          r     avg      rZ   TFư>rc   Nr   skipc                    s  t    |dv sJ |s&|dks&J p6ttjdd p@tj || _|| _ | _| _	|rbdnd| _
d| _||||d| _| jj}t|| j
d	}|d
r|r||d< d|v rd|d< ttfi |nttfi |d| _|rd| _d|rttd| j
nd| _dd td||D t 	
fddt|D | _|svnt | _|rnt | _t|| _|dkrt | j	|nt | _!|dkr| "| dS )a  
        Args:
            img_size (int, tuple): input image size
            patch_size (int, tuple): patch size
            in_chans (int): number of input channels
            num_classes (int): number of classes for classification head
            global_pool (str): type of global pooling for final sequence (default: 'avg')
            embed_dim (int): embedding dimension
            depth (int): depth of transformer
            num_heads (int): number of attention heads
            mlp_ratio (int): ratio of mlp hidden dim to embedding dim
            qkv_bias (bool): enable bias for qkv if True
            qk_norm (bool): Enable normalization of query and key in attention
            init_values: (float): layer-scale init values
            class_token (bool): use class token (default: False)
            fc_norm (bool): use pre classifier norm instead of pre-pool
            rel_pos_ty pe (str): type of relative position
            shared_rel_pos (bool): share relative pos across all blocks
            drop_rate (float): dropout rate
            proj_drop_rate (float): projection dropout rate
            attn_drop_rate (float): attention dropout rate
            drop_path_rate (float): stochastic depth rate
            weight_init (str): weight init scheme
            embed_layer (nn.Module): patch embedding layer
            norm_layer: (nn.Module): normalization layer
            act_layer: (nn.Module): MLP activation layer
         rs   tokenrz   rv   )Zepsr   r   F)img_size
patch_sizein_chans	embed_dim)Zwindow_sizeZprefix_tokensrc   Z
hidden_dimZswinmodeNr   c                 S   s   g | ]}|  qS r3   )item).0r@   r3   r3   r4   
<listcomp>5      z4VisionTransformerRelPos.__init__.<locals>.<listcomp>c                    s0   g | ](}
	|  d qS ))r,   r   rg   r-   r.   r/   rW   r*   r(   rh   r0   r]   r3   )r   ir]   attn_drop_rateblock_fnZdprr~   rW   rg   r0   r   proj_drop_rater.   r-   r/   r3   r4   r   6  s   rw   )#r   r   r   r    rN   rk   num_classesglobal_poolZnum_featuresr~   num_prefix_tokensgrad_checkpointingpatch_embedZ	grid_sizedict
startswithr   r   r6   rU   r>   zeros	cls_tokenZlinspaceZ
ModuleListrangeblocksr#   normfc_normr'   	head_dropr!   headrm   )r+   r{   r|   r}   r   r   r~   depthr   rg   r-   r.   rW   class_tokenr   Zrel_pos_typerel_pos_dimr6   Z	drop_rater   r   Zdrop_path_rateZweight_initZembed_layerr0   r]   r   Z	feat_sizeZrel_pos_argsr1   r   r4   r      sP    8


"&
"
z VisionTransformerRelPos.__init__ry   c                 C   s,   |dv sJ | j d ur(tjj| j dd d S )N)ZjaxZmocory   rv   )std)r   r    rn   Znormal_)r+   r   r3   r3   r4   rm   P  s    
z$VisionTransformerRelPos.init_weightsc                 C   s   dhS )Nr   r3   ro   r3   r3   r4   no_weight_decayW  s    z'VisionTransformerRelPos.no_weight_decayc                 C   s   t dddgdS )Nz^cls_token|patch_embed)z^blocks\.(\d+)N)z^norm)i )stemr   )r   )r+   Zcoarser3   r3   r4   group_matcher[  s    z%VisionTransformerRelPos.group_matcherc                 C   s
   || _ d S rS   )r   )r+   enabler3   r3   r4   set_grad_checkpointingb  s    z.VisionTransformerRelPos.set_grad_checkpointingc                 C   s   | j S rS   )r   ro   r3   r3   r4   get_classifierf  s    z&VisionTransformerRelPos.get_classifier)r   c                 C   sD   || _ |d ur |dv sJ || _|dkr6t| j|nt | _d S )Nrx   r   )r   r   r    r!   r~   r#   r   )r+   r   r   r3   r3   r4   reset_classifierj  s
    z(VisionTransformerRelPos.reset_classifierc                 C   s   |  |}| jd ur8tj| j|jd dd|fdd}| jd urL| j nd }| jD ]0}| j	rztj
 szt|||d}qV|||d}qV| |}|S )Nr   r:   r   r;   r5   )r   r   r>   catexpandr<   r6   r=   r   r   jitZis_scriptingr   r   )r+   r@   r6   Zblkr3   r3   r4   forward_featuresq  s    

$

z(VisionTransformerRelPos.forward_features)
pre_logitsc                 C   sd   | j r>| j dkr.|d d | jd f jddn|d d df }| |}| |}|rZ|S | |S )Nrs   r   r;   r   )r   r   meanr   r   r   )r+   r@   r   r3   r3   r4   forward_head  s
    8

z$VisionTransformerRelPos.forward_headc                 C   s   |  |}| |}|S rS   )r   r   rX   r3   r3   r4   rH     s    

zVisionTransformerRelPos.forward)ry   )F)T)N)F)rI   rJ   rK   __doc__r
   rY   r   rm   r>   r   ignorer   r   r   r   rb   r   r   rL   r   rH   rP   r3   r3   r1   r4   r      sR   x


Fc                 K   s,   | dd rtdtt| |fi |}|S )NZfeatures_onlyz<features_only not implemented for Vision Transformer models.)getRuntimeErrorr   r   )variant
pretrainedkwargsmodelr3   r3   r4   !_create_vision_transformer_relpos  s    r   ry   c                 K   s    | ddd dddt tddd|S )	Nrr   )r   rp   rp   g?ZbicubicTzpatch_embed.projr   )urlr   
input_sizeZ	pool_sizeZcrop_pctinterpolationZfixed_input_sizer   r   Z
first_conv
classifierr   )r   r   r3   r3   r4   _cfg  s    r   zhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/vit_replos_base_patch32_plus_rpn_256-sw-dd486f51.pthztimm/)r      r   )r   	hf_hub_idr   )r      r   )r   r   zhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/vit_relpos_small_patch16_224-sw-ec2778b4.pth)r   r   zhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/vit_relpos_medium_patch16_224-sw-11c174af.pthzhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/vit_relpos_base_patch16_224-sw-49049aed.pthzhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/vit_srelpos_small_patch16_224-sw-6cdb8849.pthzhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/vit_srelpos_medium_patch16_224-sw-ad702b8c.pthzhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/vit_relpos_medium_patch16_cls_224-sw-cfe8e259.pthzhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/vit_relpos_base_patch16_gapcls_224-sw-1a341d6c.pthzhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/vit_relpos_medium_patch16_rpn_224-sw-5d2befd8.pth)z,vit_relpos_base_patch32_plus_rpn_256.sw_in1kz*vit_relpos_base_patch16_plus_240.untrainedz$vit_relpos_small_patch16_224.sw_in1kz%vit_relpos_medium_patch16_224.sw_in1kz#vit_relpos_base_patch16_224.sw_in1kz%vit_srelpos_small_patch16_224.sw_in1kz&vit_srelpos_medium_patch16_224.sw_in1kz)vit_relpos_medium_patch16_cls_224.sw_in1kz)vit_relpos_base_patch16_cls_224.untrainedz*vit_relpos_base_patch16_clsgap_224.sw_in1kz*vit_relpos_small_patch16_rpn_224.untrainedz)vit_relpos_medium_patch16_rpn_224.sw_in1kz)vit_relpos_base_patch16_rpn_224.untrained)returnc                 K   s4   t ddddtd}tdd| it |fi |}|S )	z` ViT-Base (ViT-B/32+) w/ relative log-coord position and residual post-norm, no class token
          ru      )r|   r~   r   r   r   $vit_relpos_base_patch32_plus_rpn_256r   )r   r   rl   r   r   r   Z
model_argsr   r3   r3   r4   r     s     r   c                 K   s2   t ddddd}tdd| it |fi |}|S )	zI ViT-Base (ViT-B/16+) w/ relative log-coord position, no class token
    rq   r   ru   r   )r|   r~   r   r    vit_relpos_base_patch16_plus_240r   )r   r   r   r   r3   r3   r4   r     s     r   c                 K   s6   t ddddddd}td
d	| it |fi |}|S )H ViT-Base (ViT-B/16) w/ relative log-coord position, no class token
    rq     ru      FTr|   r~   r   r   r-   r   vit_relpos_small_patch16_224r   )r   r   r   r3   r3   r4   r     s     r   c                 K   s6   t ddddddd}td
d	| it |fi |}|S )r   rq      ru   r   FTr   vit_relpos_medium_patch16_224r   )r   r   r   r3   r3   r4   r     s     r   c                 K   s6   t ddddddd}td	d| it |fi |}|S )
r   rq   rt   ru   FTr   vit_relpos_base_patch16_224r   )r   r   r   r3   r3   r4   r     s     r   c              
   K   s:   t ddddddddd}td
d	| it |fi |}|S )O ViT-Base (ViT-B/16) w/ shared relative log-coord position, no class token
    rq   r   ru   r   FTr|   r~   r   r   r-   r   r   r6   vit_srelpos_small_patch16_224r   )r   r   r   r3   r3   r4   r     s     r   c              
   K   s:   t ddddddddd}td
d	| it |fi |}|S )r   rq   r   ru   r   FTr   vit_srelpos_medium_patch16_224r   )r   r   r   r3   r3   r4   r     s     r   c                 K   s<   t dddddddddd		}tdd| it |fi |}|S )zM ViT-Base (ViT-M/16) w/ relative log-coord position, class token present
    rq   r   ru   r   Fr   Trz   )	r|   r~   r   r   r-   r   r   r   r   !vit_relpos_medium_patch16_cls_224r   )r   r   r   r3   r3   r4   r     s     r   c              	   K   s8   t dddddddd}td
d	| it |fi |}|S )zM ViT-Base (ViT-B/16) w/ relative log-coord position, class token present
    rq   rt   ru   FTrz   )r|   r~   r   r   r-   r   r   vit_relpos_base_patch16_cls_224r   )r   r   r   r3   r3   r4   r     s     r   c              	   K   s8   t dddddddd}td	d| it |fi |}|S )
a   ViT-Base (ViT-B/16) w/ relative log-coord position, class token present
    NOTE this config is a bit of a mistake, class token was enabled but global avg-pool w/ fc-norm was not disabled
    Leaving here for comparisons w/ a future re-train as it performs quite well.
    rq   rt   ru   FT)r|   r~   r   r   r-   r   r   "vit_relpos_base_patch16_clsgap_224r   )r   r   r   r3   r3   r4   r   *  s     r   c                 K   s6   t dddddtd}td	d| it |fi |}|S )
_ ViT-Base (ViT-B/16) w/ relative log-coord position and residual post-norm, no class token
    rq   r   ru   r   Fr|   r~   r   r   r-   r    vit_relpos_small_patch16_rpn_224r   )r   r   r   r3   r3   r4   r   7  s     r   c                 K   s6   t dddddtd}td	d| it |fi |}|S )
r   rq   r   ru   r   Fr   !vit_relpos_medium_patch16_rpn_224r   )r   r   r   r3   r3   r4   r   B  s     r   c                 K   s6   t dddddtd}tdd| it |fi |}|S )	r   rq   rt   ru   Fr   vit_relpos_base_patch16_rpn_224r   )r   r   r   r3   r3   r4   r   M  s     r   )F)ry   )F)F)F)F)F)F)F)F)F)F)F)F)F)8r   loggingmath	functoolsr   typingr   r   r>   Ztorch.nnr    Z	torch.jitr   Ztorch.utils.checkpointr   Z	timm.datar   r	   Ztimm.layersr
   r   r   r   r   r   Z_builderr   	_registryr   r   __all__	getLoggerrI   Z_loggerModuler   rQ   rY   rl   r   r   r   Zdefault_cfgsr   r   r   r   r   r   r   r   r   r   r   r   r   r3   r3   r3   r4   <module>   s    
B
07 ?


(			




