a
    dH                     @   sF  d 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	m
Z
 ddlmZ ddlmZmZmZ d	d
lmZ d	dlmZ d	dlmZmZmZ dgZG dd deZdaddZdbddZeedddedddedddedddddedddd edd!dd edd"dd edd#dddd$edd%dedd&dddedd'dedd(dedd)dddedd*dedd+dddedd,dedd-dd.edd/dddedd0dd.edd1dd.edd2dddedd3dd.edd4dddedd5dd.d6Zedced7d8d9Zedded7d:d;Zedeed7d<d=Z edfed7d>d?Z!edged7d@dAZ"edhed7dBdCZ#edied7dDdEZ$edjed7dFdGZ%edked7dHdIZ&edled7dJdKZ'edmed7dLdMZ(edned7dNdOZ)edoed7dPdQZ*edped7dRdSZ+edqed7dTdUZ,edred7dVdWZ-ee.dXdYdZd[d\d]d^d_d` dS )sa[   DeiT - Data-efficient Image Transformers

DeiT model defs and weights from https://github.com/facebookresearch/deit, original copyright below

paper: `DeiT: Data-efficient Image Transformers` - https://arxiv.org/abs/2012.12877

paper: `DeiT III: Revenge of the ViT` - https://arxiv.org/abs/2204.07118

Modifications copyright 2021, Ross Wightman
    )partial)SequenceUnionN)nnIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)resample_abs_pos_embed)VisionTransformertrunc_normal_checkpoint_filter_fn   )build_model_with_cfg)checkpoint_seq)generate_default_cfgsregister_modelregister_model_deprecationsVisionTransformerDistilledc                       s   e Zd ZdZ fddZd fdd	Zejjddd	Z	ejjd
d Z
dddZejjdddZd ejeeef dddZejdddZd!eejdddZ  ZS )"r   z Vision Transformer w/ Distillation Token and Head

    Distillation token & head support for `DeiT: Data-efficient Image Transformers`
        - https://arxiv.org/abs/2012.12877
    c                    s   | dd}t j|i |ddi | jdv s4J d| _ttdd| j	| _
ttd| jj| j | j	| _| jdkrt| j	| jnt | _d| _| | d S )	Nweight_init skip)token   r   r   F)popsuper__init__global_poolZnum_prefix_tokensr   	Parametertorchzeros	embed_dim
dist_tokenpatch_embedZnum_patches	pos_embednum_classesLinearIdentity	head_distdistilled_traininginit_weights)selfargskwargsr   	__class__ Y/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/deit.pyr   $   s    $z#VisionTransformerDistilled.__init__r   c                    s    t | jdd t j|d d S )Ng{Gz?)std)mode)r   r!   r   r)   )r*   r2   r-   r/   r0   r)   2   s    z'VisionTransformerDistilled.init_weightsFc                 C   s   t dddgdS )Nz+^cls_token|pos_embed|patch_embed|dist_token)z^blocks\.(\d+)N)z^norm)i )stemblocks)dict)r*   Zcoarser/   r/   r0   group_matcher6   s    z(VisionTransformerDistilled.group_matcherc                 C   s   | j | jfS Nheadr'   )r*   r/   r/   r0   get_classifier?   s    z)VisionTransformerDistilled.get_classifierNc                 C   sL   || _ |dkrt| j|nt | _|dkr>t| j| j nt | _d S )Nr   )r$   r   r%   r    r&   r9   r'   )r*   r$   r   r/   r/   r0   reset_classifierC   s     z+VisionTransformerDistilled.reset_classifierTc                 C   s
   || _ d S r7   )r(   )r*   enabler/   r/   r0   set_distilled_trainingH   s    z1VisionTransformerDistilled.set_distilled_trainingr   )xnc                 C   s   g t | j }}tt|tr*t|| |n|}| |}tj| j	
|jd dd| j
|jd dd|fdd}| || j }| |}| |}t| jD ]"\}}||}||v r|| q|S Nr   r   )Zdim)lenr4   set
isinstanceintranger"   r   cat	cls_tokenexpandshaper!   pos_dropr#   Z
patch_dropZnorm_pre	enumerateappend)r*   r>   r?   outputsZ
num_blocksZtake_indicesiZblkr/   r/   r0   _intermediate_layersL   s$     


z/VisionTransformerDistilled._intermediate_layersreturnc                 C   s   |  |}tj| j|jd dd| j|jd dd|fdd}| || j }| j	rptj
 spt| j|}n
| |}| |}|S r@   )r"   r   rG   rH   rI   rJ   r!   rK   r#   Zgrad_checkpointingjitis_scriptingr   r4   Znorm)r*   r>   r/   r/   r0   forward_featurese   s    


z+VisionTransformerDistilled.forward_features)
pre_logitsrR   c                 C   st   |d d df |d d df  }}|r2|| d S |  |}| |}| jrd| jrdtj sd||fS || d S d S )Nr   r   r   )r9   r'   r(   Ztrainingr   rS   rT   )r*   r>   rV   Zx_distr/   r/   r0   forward_headt   s    "

z'VisionTransformerDistilled.forward_head)r   )F)N)T)r   )F)__name__
__module____qualname____doc__r   r)   r   rS   ignorer6   r:   r;   r=   ZTensorr   rE   r   rP   rU   boolrW   __classcell__r/   r/   r-   r0   r      s"   

 
Fc                 K   sD   | dd rtd|rtnt}t|| |fdttddi|}|S )NZfeatures_onlyz<features_only not implemented for Vision Transformer models.Zpretrained_filter_fnT)Zadapt_layer_scale)getRuntimeErrorr   r
   r   r   r   )variant
pretrained	distilledr,   Z	model_clsmodelr/   r/   r0   _create_deit   s    
re   r   c                 K   s    | ddd dddt tddd|S )	Ni  )      rg   g?ZbicubicTzpatch_embed.projr9   )urlr$   
input_sizeZ	pool_sizecrop_pctinterpolationZfixed_input_sizemeanr1   Z
first_conv
classifierr   )rh   r,   r/   r/   r0   _cfg   s    rn   ztimm/zFhttps://dl.fbaipublicfiles.com/deit/deit_tiny_patch16_224-a1311bcf.pth)	hf_hub_idrh   zGhttps://dl.fbaipublicfiles.com/deit/deit_small_patch16_224-cd65a155.pthzFhttps://dl.fbaipublicfiles.com/deit/deit_base_patch16_224-b5f2ef4d.pthzFhttps://dl.fbaipublicfiles.com/deit/deit_base_patch16_384-8de9b5d1.pth)rf     rp   g      ?)ro   rh   ri   rj   zPhttps://dl.fbaipublicfiles.com/deit/deit_tiny_distilled_patch16_224-b40b3cf7.pthr8   )ro   rh   rm   zQhttps://dl.fbaipublicfiles.com/deit/deit_small_distilled_patch16_224-649709d9.pthzPhttps://dl.fbaipublicfiles.com/deit/deit_base_distilled_patch16_224-df68dfff.pthzPhttps://dl.fbaipublicfiles.com/deit/deit_base_distilled_patch16_384-d0272ac0.pth)ro   rh   ri   rj   rm   z;https://dl.fbaipublicfiles.com/deit/deit_3_small_224_1k.pthz;https://dl.fbaipublicfiles.com/deit/deit_3_small_384_1k.pthz<https://dl.fbaipublicfiles.com/deit/deit_3_medium_224_1k.pthz:https://dl.fbaipublicfiles.com/deit/deit_3_base_224_1k.pthz:https://dl.fbaipublicfiles.com/deit/deit_3_base_384_1k.pthz;https://dl.fbaipublicfiles.com/deit/deit_3_large_224_1k.pthz;https://dl.fbaipublicfiles.com/deit/deit_3_large_384_1k.pthz:https://dl.fbaipublicfiles.com/deit/deit_3_huge_224_1k.pthz<https://dl.fbaipublicfiles.com/deit/deit_3_small_224_21k.pth)ro   rh   rj   z<https://dl.fbaipublicfiles.com/deit/deit_3_small_384_21k.pthz=https://dl.fbaipublicfiles.com/deit/deit_3_medium_224_21k.pthz;https://dl.fbaipublicfiles.com/deit/deit_3_base_224_21k.pthz;https://dl.fbaipublicfiles.com/deit/deit_3_base_384_21k.pthz<https://dl.fbaipublicfiles.com/deit/deit_3_large_224_21k.pthz<https://dl.fbaipublicfiles.com/deit/deit_3_large_384_21k.pthz>https://dl.fbaipublicfiles.com/deit/deit_3_huge_224_21k_v1.pth)zdeit_tiny_patch16_224.fb_in1kzdeit_small_patch16_224.fb_in1kzdeit_base_patch16_224.fb_in1kzdeit_base_patch16_384.fb_in1kz'deit_tiny_distilled_patch16_224.fb_in1kz(deit_small_distilled_patch16_224.fb_in1kz'deit_base_distilled_patch16_224.fb_in1kz'deit_base_distilled_patch16_384.fb_in1kzdeit3_small_patch16_224.fb_in1kzdeit3_small_patch16_384.fb_in1kz deit3_medium_patch16_224.fb_in1kzdeit3_base_patch16_224.fb_in1kzdeit3_base_patch16_384.fb_in1kzdeit3_large_patch16_224.fb_in1kzdeit3_large_patch16_384.fb_in1kzdeit3_huge_patch14_224.fb_in1k(deit3_small_patch16_224.fb_in22k_ft_in1k(deit3_small_patch16_384.fb_in22k_ft_in1k)deit3_medium_patch16_224.fb_in22k_ft_in1k'deit3_base_patch16_224.fb_in22k_ft_in1k'deit3_base_patch16_384.fb_in22k_ft_in1k(deit3_large_patch16_224.fb_in22k_ft_in1k(deit3_large_patch16_384.fb_in22k_ft_in1k'deit3_huge_patch14_224.fb_in22k_ft_in1krQ   c                 K   s2   t ddddd}tdd| it |fi |}|S )	z DeiT-tiny model @ 224x224 from paper (https://arxiv.org/abs/2012.12877).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
             rf   
patch_sizer    depth	num_headsdeit_tiny_patch16_224rb   )r   r5   re   rb   r,   Z
model_argsrd   r/   r/   r0   r      s    r   c                 K   s2   t ddddd}tdd| it |fi |}|S )	z DeiT-small model @ 224x224 from paper (https://arxiv.org/abs/2012.12877).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
    ry   rp   r{      r|   deit_small_patch16_224rb   )r   r   r   r/   r/   r0   r     s    r   c                 K   s2   t ddddd}tdd| it |fi |}|S )z DeiT base model @ 224x224 from paper (https://arxiv.org/abs/2012.12877).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
    ry      r{   r|   deit_base_patch16_224rb   )r   r   r   r/   r/   r0   r     s    r   c                 K   s2   t ddddd}tdd| it |fi |}|S )z DeiT base model @ 384x384 from paper (https://arxiv.org/abs/2012.12877).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
    ry   r   r{   r|   deit_base_patch16_384rb   )r   r   r   r/   r/   r0   r     s    r   c                 K   s4   t ddddd}td	| ddt |fi |}|S )
z DeiT-tiny distilled model @ 224x224 from paper (https://arxiv.org/abs/2012.12877).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
    ry   rz   r{   rf   r|   deit_tiny_distilled_patch16_224Trb   rc   )r   r   r   r/   r/   r0   r   $  s     r   c                 K   s4   t ddddd}td	| ddt |fi |}|S )
z DeiT-small distilled model @ 224x224 from paper (https://arxiv.org/abs/2012.12877).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
    ry   rp   r{   r   r|    deit_small_distilled_patch16_224Tr   )r   r   r   r/   r/   r0   r   /  s     r   c                 K   s4   t ddddd}td| ddt |fi |}|S )	z DeiT-base distilled model @ 224x224 from paper (https://arxiv.org/abs/2012.12877).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
    ry   r   r{   r|   deit_base_distilled_patch16_224Tr   )r   r   r   r/   r/   r0   r   :  s     r   c                 K   s4   t ddddd}td| ddt |fi |}|S )	z DeiT-base distilled model @ 384x384 from paper (https://arxiv.org/abs/2012.12877).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
    ry   r   r{   r|   deit_base_distilled_patch16_384Tr   )r   r   r   r/   r/   r0   r   E  s     r   c                 K   s6   t ddddddd}td
d	| it |fi |}|S )z DeiT-3 small model @ 224x224 from paper (https://arxiv.org/abs/2204.07118).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
    ry   rp   r{   r   Tư>r}   r    r~   r   Zno_embed_classZinit_valuesdeit3_small_patch16_224rb   )r   r   r   r/   r/   r0   r   P  s    r   c                 K   s6   t ddddddd}td
d	| it |fi |}|S )z DeiT-3 small model @ 384x384 from paper (https://arxiv.org/abs/2204.07118).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
    ry   rp   r{   r   Tr   r   deit3_small_patch16_384rb   )r   r   r   r/   r/   r0   r   Z  s    r   c                 K   s6   t ddddddd}td
d	| it |fi |}|S )z DeiT-3 medium model @ 224x224 (https://arxiv.org/abs/2012.12877).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
    ry   i   r{      Tr   r   deit3_medium_patch16_224rb   )r   r   r   r/   r/   r0   r   d  s    r   c                 K   s6   t ddddddd}td	d| it |fi |}|S )
z DeiT-3 base model @ 224x224 from paper (https://arxiv.org/abs/2204.07118).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
    ry   r   r{   Tr   r   deit3_base_patch16_224rb   )r   r   r   r/   r/   r0   r   n  s    r   c                 K   s6   t ddddddd}td	d| it |fi |}|S )
 DeiT-3 base model @ 384x384 from paper (https://arxiv.org/abs/2204.07118).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
    ry   r   r{   Tr   r   deit3_base_patch16_384rb   )r   r   r   r/   r/   r0   r   x  s    r   c                 K   s6   t ddddddd}td	d| it |fi |}|S )
z DeiT-3 large model @ 224x224 from paper (https://arxiv.org/abs/2204.07118).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
    ry         Tr   r   deit3_large_patch16_224rb   )r   r   r   r/   r/   r0   r     s    r   c                 K   s6   t ddddddd}td	d| it |fi |}|S )
z DeiT-3 large model @ 384x384 from paper (https://arxiv.org/abs/2204.07118).
    ImageNet-1k weights from https://github.com/facebookresearch/deit.
    ry   r   r   Tr   r   deit3_large_patch16_384rb   )r   r   r   r/   r/   r0   r     s    r   c                 K   s6   t ddddddd}td
d	| it |fi |}|S )r      i       ry   Tr   r   deit3_huge_patch14_224rb   )r   r   r   r/   r/   r0   r     s    r   rq   rr   rs   rt   ru   rv   rw   rx   )Z deit3_small_patch16_224_in21ft1kZ deit3_small_patch16_384_in21ft1kZ!deit3_medium_patch16_224_in21ft1kZdeit3_base_patch16_224_in21ft1kZdeit3_base_patch16_384_in21ft1kZ deit3_large_patch16_224_in21ft1kZ deit3_large_patch16_384_in21ft1kZdeit3_huge_patch14_224_in21ft1k)FF)r   )F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)/r[   	functoolsr   typingr   r   r   r   Z	timm.datar   r   Ztimm.layersr	   Ztimm.models.vision_transformerr
   r   r   Z_builderr   Z_manipulater   	_registryr   r   r   __all__r   re   rn   Zdefault_cfgsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rX   r/   r/   r/   r0   <module>   sV  e

a				



								