U
    ¯Ê¹j†d  ã                   @   sÌ  d Z ddlZddlmZmZmZ ddlZddlm  m	Z
 ddl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 dd	lmZmZmZ dd
lmZmZmZmZmZm Z  ddl!m"Z# g Z$dqdd„Z%drdd„Z&dsdd„Z'dtdd„Z(e)ee%ddddd�e%ddddd�e&dddddddd �e&dddd!dddd �e&dd!dd"dddd �fdd#d$d$d%d&d'�ee%dd(dd)�e%dddd)�e&dddd"ddd*�e&dd!dd+ddd*�e&dd"dd,ddd*�fdd#d$d$d%d-d'�ee%dd(dd)�e%dddd)�e&dd"dd,ddd*�e&dd.dd/ddd*�e&dd0dd1ddd*�fdd#d$d$d%d2d'�ee%dd(dd)�e%dddd)�e&dd"dd,ddd*�e&dd.dd/ddd*�e&dd0dd1ddd*�fdd#d$d$d3e)d4d5�d2d6�e(dƒe(d7ƒe(d8ƒe(dƒe(d9ƒe(d:ƒe(dƒd;�Z*eG d<d=„ d=ej+ƒƒZ,G d>d?„ d?ej+ƒZ-G d@dA„ dAej+ƒZ.eG dBdC„ dCej+ƒƒZ/edDe,ƒ edEe/ƒ dudGdH„Z0dvdIdJ„Z1dwdKdL„Z2ee2dMdN�e2dMdN�e2dMdN�e2dMdOdP�e2dMdOdP�e2dMdOdP�e2dMdOdP�e2dMdOdP�e2dMdOdP�e2dMdOdP�e2dMdOdP�e2dMdOdP�e2dMdOdP�e2dMdQdRddS�e2dMdQdRddS�e2dMdQdRddS�dTœƒZ3edxedUœdVdW„ƒZ4edyedUœdXdY„ƒZ5edzedUœdZd[„ƒZ6ed{edUœd\d]„ƒZ7ed|edUœd^d_„ƒZ8ed}edUœd`da„ƒZ9ed~edUœdbdc„ƒZ:ededUœddde„ƒZ;ed€edUœdfdg„ƒZ<ed�edUœdhdi„ƒZ=ee>djdkdldmdndodpœƒ dS )‚a   MobileViT

Paper:
V1: `MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer` - https://arxiv.org/abs/2110.02178
V2: `Separable Self-attention for Mobile Vision Transformers` - https://arxiv.org/abs/2206.02680

MobileVitBlock and checkpoints adapted from https://github.com/apple/ml-cvnets (original copyright below)
License: https://github.com/apple/ml-cvnets/blob/main/LICENSE (Apple open source)

Rest of code, ByobNet, and Transformer block hacked together by / Copyright 2022, Ross Wightman
é    N)ÚCallableÚTupleÚOptional)Únn)Ú	to_2tupleÚmake_divisibleÚ
GroupNorm1ÚConvMlpÚDropPathÚis_exportableé   )Úbuild_model_with_cfg)Úregister_notrace_module)Úregister_modelÚgenerate_default_cfgsÚregister_model_deprecations)Úregister_blockÚByoBlockCfgÚByoModelCfgÚByobNetÚLayerFnÚ
num_groups)ÚBlockç      @c                 C   s   t d| ||d|tddd�d�S )NZbottler   T)Z	bottle_inZ
linear_out)ÚtypeÚdÚcÚsÚgsÚbrÚblock_kwargs)r   Údict©r   r   r   r   © r#   úT/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/mobilevit.pyÚ_inverted_residual_block!   s         
þr%   é   c                 C   s,   t | |||d�tdd|dt|||d�d�fS )Nr"   Ú	mobilevitr   )Útransformer_dimÚtransformer_depthÚ
patch_size)r   r   r   r   r    ©r%   r   r!   ©r   r   r   r(   r)   r*   r   r#   r#   r$   Ú_mobilevit_block(   s       ýþþr-   é   ç       @ç      à?c                 C   s.   t | |||d�tdd|d|dt||d�d�fS )Nr"   Ú
mobilevit2r   )r)   r*   )r   r   r   r   r   r   r    r+   )r   r   r   r)   r*   r   Ztransformer_brr#   r#   r$   Ú_mobilevitv2_block6   s         þþþr2   ç      ð?c                    sœ   d}ˆ dkr"t ‡ fdd„|D ƒƒ}ttd|d ddd�td	|d d	dd�td|d	 d	d	d
�td|d d	dd
�td|d d	dd
�ftdˆ  ƒddddd�}|S )N)é@   é€   é   é€  i   r3   c                    s   g | ]}t |ˆ  ƒ‘qS r#   )Úint)Ú.0r   ©Ú
multiplierr#   r$   Ú
<listcomp>F   s     z$_mobilevitv2_cfg.<locals>.<listcomp>r   r   r/   r"   r.   )r   r   r   r)   é   r&   é    Ú3x3Ú Úsilu)ÚblocksÚstem_chsÚ	stem_typeÚ	stem_poolÚ
downsampleÚ	act_layer)Útupler   r%   r2   r8   )r;   ZchsÚcfgr#   r:   r$   Ú_mobilevitv2_cfgC   s"    û
ôrJ   é   r"   r=   é   é0   r4   r,   éP   é`   r?   r@   rA   i@  )rB   rC   rD   rE   rF   rG   Únum_featuresr>   )r   r   r   )r   r   r   r(   r)   r*   éx   é�   r7   r5   éÀ   é    éð   i€  Úseg      À?)Zrd_ratio)rB   rC   rD   rE   rF   Z
attn_layerZattn_kwargsrP   g      è?g      ô?g      ø?g      ü?)Úmobilevit_xxsÚmobilevit_xsÚmobilevit_sZsemobilevit_sÚmobilevitv2_050Úmobilevitv2_075Úmobilevitv2_125Úmobilevitv2_100Úmobilevitv2_150Úmobilevitv2_175Úmobilevitv2_200c                       s–   e Zd ZdZdddddddddd	d
dddddejfeee eeeee e	eef eee eeeeee
eeedœ‡ fdd„Zejejdœdd„Z‡  ZS )ÚMobileVitBlockzS MobileViT block
        Paper: https://arxiv.org/abs/2110.02178?context=cs.LG
    Nr=   r   r3   ©r   r   r/   r.   é   r&   ç        F)Úin_chsÚout_chsÚkernel_sizeÚstrideÚbottle_ratioÚ
group_sizeÚdilationÚ	mlp_ratior(   r)   r*   Ú	num_headsÚ	attn_dropÚdropÚ	no_fusionÚdrop_path_rateÚlayersÚtransformer_norm_layerc              	      sü   t t| ƒ ¡  ˆptƒ ‰t||ƒ}|p(|}ˆp8t|| ƒ‰ˆj||||||d d�| _tj	|ˆddd�| _
tj‡ ‡‡‡‡‡‡‡fdd„t|
ƒD ƒŽ | _ˆˆƒ| _ˆjˆ|ddd�| _|rÀd | _nˆj|| ||dd�| _t|ƒ| _| jd | jd  | _d S )	Nr   ©rg   rh   Úgroupsrk   r   F©rg   Úbiasc                    s(   g | ] }t ˆˆˆd ˆ ˆˆˆjˆd�	‘qS )T)rl   rm   Zqkv_biasrn   Ú	proj_dropÚ	drop_pathrG   Ú
norm_layer)ÚTransformerBlockÚact©r9   Ú_©rn   ro   rq   rr   rl   rm   r(   rs   r#   r$   r<   Ë   s   õ÷z+MobileVitBlock.__init__.<locals>.<listcomp>©rg   rh   )Úsuperra   Ú__init__r   r   r   Úconv_norm_actÚconv_kxkr   ÚConv2dÚconv_1x1Ú
SequentialÚrangeÚtransformerÚnormÚ	conv_projÚconv_fusionr   r*   Ú
patch_area)Úselfre   rf   rg   rh   ri   rj   rk   rl   r(   r)   r*   rm   rn   ro   rp   rq   rr   rs   Úkwargsru   ©Ú	__class__r   r$   r‚   ©   s0    

    þô


zMobileVitBlock.__init__©ÚxÚreturnc                 C   s   |}|   |¡}|  |¡}| j\}}|j\}}}}t || ¡| t || ¡|  }	}
|	| |
|  }}|| }d}|	|ks„|
|kržtj||	|
fddd�}d}| || | |||¡ 	dd¡}| |||| j
¡ 	dd¡ || j
 |d¡}|  |¡}|  |¡}| ¡  || j
|d¡}| 	dd¡ || | |||¡}| 	dd¡ |||| || ¡}|�rntj|||fddd�}|  |¡}| jd k	�rœ|  tj||fdd	�¡}|S )
NFÚbilinear©ÚsizeÚmodeZalign_cornersTr   r.   r=   éÿÿÿÿ©Údim)r„   r†   r*   ÚshapeÚmathÚceilÚFÚinterpolateÚreshapeZ	transposer�   r‰   rŠ   Ú
contiguousÚviewr‹   rŒ   ÚtorchÚcat)rŽ   r“   ZshortcutÚpatch_hÚpatch_wÚBÚCÚHÚWÚnew_hÚnew_wÚnum_patch_hÚnum_patch_wÚnum_patchesr    r#   r#   r$   Úforwardå   s2    


& *

  
zMobileVitBlock.forward)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Z	LayerNormr8   r   Úfloatr   Úboolr   r   r‚   r¤   ÚTensorr±   Ú__classcell__r#   r#   r�   r$   ra   ¤   sN   í
í<ra   c                       sŠ   e Zd ZdZdeeeeddœ‡ fdd„Zej	ej	dœd	d
„Z
ej ¡ dej	eej	 ej	dœdd„ƒZdej	eej	 ej	dœdd„Z‡  ZS )ÚLinearSelfAttentiona·  
    This layer applies a self-attention with linear complexity, as described in `https://arxiv.org/abs/2206.02680`
    This layer can be used for self- as well as cross-attention.
    Args:
        embed_dim (int): :math:`C` from an expected input of size :math:`(N, C, H, W)`
        attn_drop (float): Dropout value for context scores. Default: 0.0
        bias (bool): Use bias in learnable layers. Default: True
    Shape:
        - Input: :math:`(N, C, P, N)` where :math:`N` is the batch size, :math:`C` is the input channels,
        :math:`P` is the number of pixels in the patch, and :math:`N` is the number of patches
        - Output: same as the input
    .. note::
        For MobileViTv2, we unfold the feature map [B, C, H, W] into [B, C, P, N] where P is the number of pixels
        in a patch and N is the number of patches. Because channel is the first dimension in this unfolded tensor,
        we use point-wise convolution (instead of a linear layer). This avoids a transpose operation (which may be
        expensive on resource-constrained devices) that may be required to convert the unfolded tensor from
        channel-first to channel-last format in case of a linear layer.
    rd   TN)Ú	embed_dimrn   rx   rw   r”   c                    s\   t ƒ  ¡  || _tj|dd|  |dd�| _t |¡| _tj|||dd�| _t |¡| _	d S )Nr   r.   )Zin_channelsZout_channelsrw   rg   )
r�   r‚   r»   r   r…   Úqkv_projZDropoutrn   Úout_projÚout_drop)rŽ   r»   rn   rx   rw   r�   r#   r$   r‚   $  s     

üüzLinearSelfAttention.__init__r’   c           	      C   s~   |   |¡}|jd| j| jgdd�\}}}tj|dd�}|  |¡}|| jddd�}t |¡| |¡ }|  	|¡}|  
|¡}|S )Nr   rš   r™   T©r›   Zkeepdim)r¼   Úsplitr»   rŸ   Úsoftmaxrn   ÚsumÚreluÚ	expand_asr½   r¾   )	rŽ   r“   ZqkvÚqueryÚkeyÚvalueÚcontext_scoresÚcontext_vectorÚoutr#   r#   r$   Ú_forward_self_attn=  s    



z&LinearSelfAttention._forward_self_attn©r“   Úx_prevr”   c                 C   s  |j \}}}}|j dd … \}}||ks0tdƒ‚tj|| jjd | jd … | jjd | jd … d�}	|	jd| jgdd�\}
}tj|| jj| jd  | jjd k	r°| jj| jd  nd d�}tj	|
dd�}|  
|¡}|| jddd�}t |¡| |¡ }|  |¡}|  |¡}|S )	NéþÿÿÿzJThe number of pixels in a patch for query and key_value should be the samer   )Úweightrw   rš   r™   Tr¿   )rœ   ÚAssertionErrorrŸ   Zconv2dr¼   rÏ   r»   rw   rÀ   rÁ   rn   rÂ   rÃ   rÄ   r½   r¾   )rŽ   r“   rÍ   Z
batch_sizeZin_dimZkv_patch_areaZkv_num_patchesZq_patch_areaZq_num_patchesZqkrÅ   rÆ   rÇ   rÈ   rÉ   rÊ   r#   r#   r$   Ú_forward_cross_attnU  s0    ÿþý ý


z'LinearSelfAttention._forward_cross_attnc                 C   s$   |d kr|   |¡S | j||d�S d S )N)rÍ   )rË   rÑ   )rŽ   r“   rÍ   r#   r#   r$   r±   €  s    
zLinearSelfAttention.forward)rd   rd   T)N)N)r²   r³   r´   rµ   r8   r¶   r·   r‚   r¤   r¸   rË   ZjitÚignorer   rÑ   r±   r¹   r#   r#   r�   r$   rº     s      ûú *rº   c                       sP   e Zd ZdZdeeeeeddœ‡ fdd„Zdeje	ej ejdœd	d
„Z
‡  ZS )ÚLinearTransformerBlockaF  
    This class defines the pre-norm transformer encoder with linear self-attention in `MobileViTv2 paper <>`_
    Args:
        embed_dim (int): :math:`C_{in}` from an expected input of size :math:`(B, C_{in}, P, N)`
        mlp_ratio (float): Inner dimension ratio of the FFN relative to embed_dim
        drop (float): Dropout rate. Default: 0.0
        attn_drop (float): Dropout rate for attention in multi-head attention. Default: 0.0
        drop_path (float): Stochastic depth rate Default: 0.0
        norm_layer (Callable): Normalization layer. Default: layer_norm_2d
    Shape:
        - Input: :math:`(B, C_{in}, P, N)` where :math:`B` is batch size, :math:`C_{in}` is input embedding dim,
            :math:`P` is number of pixels in a patch, and :math:`N` is number of patches,
        - Output: same shape as the input
    r/   rd   N)r»   rl   ro   rn   ry   r”   c                    sr   t ƒ  ¡  |ptj}|pt}||ƒ| _t|||d�| _t|ƒ| _	||ƒ| _
t|t|| ƒ||d�| _t|ƒ| _d S )N)r»   rn   rx   )Zin_featuresZhidden_featuresrG   ro   )r�   r‚   r   ZSiLUr   Únorm1rº   Úattnr
   Ú
drop_path1Únorm2r	   r8   ÚmlpÚ
drop_path2)rŽ   r»   rl   ro   rn   ry   rG   rz   r�   r#   r$   r‚   —  s    






üzLinearTransformerBlock.__init__rÌ   c                 C   sj   |d kr$||   |  |  |¡¡¡ }n(|}|  |¡}|  ||¡}|   |¡| }||  |  |  |¡¡¡ }|S )N)rÖ   rÕ   rÔ   rÙ   rØ   r×   )rŽ   r“   rÍ   Úresr#   r#   r$   r±   ±  s    
zLinearTransformerBlock.forward)r/   rd   rd   rd   NN)N)r²   r³   r´   rµ   r8   r¶   r‚   r¤   r¸   r   r±   r¹   r#   r#   r�   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efeee eeee eeef eee eeeeee	e
dœ‡ fdd„Zejejdœdd„Z‡  ZS )ÚMobileVitV2Blockz8
    This class defines the `MobileViTv2 block <>`_
    Nr=   r3   r   rb   r/   r.   rc   rd   )re   rf   rg   ri   rj   rk   rl   r(   r)   r*   rn   ro   rq   rr   rs   c                    sà   t t| ƒ ¡  ˆptƒ ‰t||ƒ}|p(|}ˆp8t|| ƒ‰ˆj|||d||d d�| _tj	|ˆddd�| _
tj‡ ‡‡‡‡‡‡fdd„t|	ƒD ƒŽ | _ˆˆƒ| _ˆjˆ|dddd�| _t|
ƒ| _| jd | jd  | _tƒ | _d S )	Nr   r   rt   Frv   c                    s$   g | ]}t ˆˆˆ ˆˆˆjˆd �‘qS ))rl   rn   ro   ry   rG   rz   )rÓ   r|   r}   ©rn   ro   rq   rr   rl   r(   rs   r#   r$   r<   å  s   
÷ùz-MobileVitV2Block.__init__.<locals>.<listcomp>)rg   rh   Z	apply_act)r�   rÛ   r‚   r   r   r   rƒ   r„   r   r…   r†   r‡   rˆ   r‰   rŠ   r‹   r   r*   r�   r   Úcoreml_exportable)rŽ   re   rf   rg   ri   rj   rk   rl   r(   r)   r*   rn   ro   rq   rr   rs   r�   ru   r�   rÜ   r$   r‚   Ç  s,    

    þ
ö


zMobileVitV2Block.__init__r’   c                 C   s~  |j \}}}}| j\}}t || ¡| t || ¡|  }}	|| |	|  }
}|
| }||ksh|	|kr~tj|||	fddd�}|  |¡}|  |¡}|j d }| jr¼tj	|||f||fd�}n$| 
|||
|||¡ ddddd	d
¡}| 
||d|¡}|  |¡}|  |¡}| j�r4| 
||| | |
|¡}tj||d�}n<| 
|||||
|¡ ddd
d	dd¡}| 
|||
| || ¡}|  |¡}|S )Nr•   Tr–   r   r€   r   r=   é   r.   r&   r™   )Zupscale_factor)rœ   r*   r�   rž   rŸ   r    r„   r†   rÝ   Zunfoldr¡   Zpermuter‰   rŠ   Zpixel_shuffler‹   )rŽ   r“   r¨   r©   rª   r«   r¦   r§   r¬   r­   r®   r¯   r°   r#   r#   r$   r±   ù  s.    
&


$

$
zMobileVitV2Block.forward)r²   r³   r´   rµ   r   r8   r   r¶   r   r   r   r‚   r¤   r¸   r±   r¹   r#   r#   r�   r$   rÛ   Á  sB   ð
ð2rÛ   r'   r1   Fc                 K   s0   t t| |f|st|  nt| tdd�dœ|—ŽS ©NT)Zflatten_sequential)Z	model_cfgZfeature_cfg©r   r   Ú
model_cfgsr!   ©ÚvariantZcfg_variantÚ
pretrainedr�   r#   r#   r$   Ú_create_mobilevit#  s      ÿýürå   c                 K   s0   t t| |f|st|  nt| tdd�dœ|—ŽS rß   rà   râ   r#   r#   r$   Ú_create_mobilevit2+  s      ÿýüræ   c                 K   s    | ddddddddd	d
dœ|–S )Niè  )r=   r6   r6   )rc   rc   gÍÌÌÌÌÌì?Zbicubic)rd   rd   rd   )r3   r3   r3   z	stem.convzhead.fcF)ÚurlZnum_classesÚ
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationZmeanZstdZ
first_convÚ
classifierZfixed_input_sizer#   )rç   r�   r#   r#   r$   Ú_cfg3  s          ûúrí   ztimm/)Ú	hf_hub_idgÑ"Ûù~jì?)rî   rê   )r=   r7   r7   )é   rï   )rî   rè   ré   rê   )zmobilevit_xxs.cvnets_in1kzmobilevit_xs.cvnets_in1kzmobilevit_s.cvnets_in1kzmobilevitv2_050.cvnets_in1kzmobilevitv2_075.cvnets_in1kzmobilevitv2_100.cvnets_in1kzmobilevitv2_125.cvnets_in1kzmobilevitv2_150.cvnets_in1kzmobilevitv2_175.cvnets_in1kzmobilevitv2_200.cvnets_in1kú$mobilevitv2_150.cvnets_in22k_ft_in1kú$mobilevitv2_175.cvnets_in22k_ft_in1kú$mobilevitv2_200.cvnets_in22k_ft_in1kú(mobilevitv2_150.cvnets_in22k_ft_in1k_384ú(mobilevitv2_175.cvnets_in22k_ft_in1k_384ú(mobilevitv2_200.cvnets_in22k_ft_in1k_384)r”   c                 K   s   t dd| i|—ŽS )NrW   rä   )rW   ©rå   ©rä   r�   r#   r#   r$   rW   o  s    rW   c                 K   s   t dd| i|—ŽS )NrX   rä   )rX   rö   r÷   r#   r#   r$   rX   t  s    rX   c                 K   s   t dd| i|—ŽS )NrY   rä   )rY   rö   r÷   r#   r#   r$   rY   y  s    rY   c                 K   s   t dd| i|—ŽS )NrZ   rä   )rZ   rö   r÷   r#   r#   r$   rZ   ~  s    rZ   c                 K   s   t dd| i|—ŽS )Nr[   rä   )r[   rö   r÷   r#   r#   r$   r[   ƒ  s    r[   c                 K   s   t dd| i|—ŽS )Nr]   rä   )r]   rö   r÷   r#   r#   r$   r]   ˆ  s    r]   c                 K   s   t dd| i|—ŽS )Nr\   rä   )r\   rö   r÷   r#   r#   r$   r\   �  s    r\   c                 K   s   t dd| i|—ŽS )Nr^   rä   )r^   rö   r÷   r#   r#   r$   r^   ’  s    r^   c                 K   s   t dd| i|—ŽS )Nr_   rä   )r_   rö   r÷   r#   r#   r$   r_   —  s    r_   c                 K   s   t dd| i|—ŽS )Nr`   rä   )r`   rö   r÷   r#   r#   r$   r`   œ  s    r`   rð   rñ   rò   ró   rô   rõ   )Zmobilevitv2_150_in22ft1kZmobilevitv2_175_in22ft1kZmobilevitv2_200_in22ft1kZmobilevitv2_150_384_in22ft1kZmobilevitv2_175_384_in22ft1kZmobilevitv2_200_384_in22ft1k)r   )r&   r   )r.   r/   r0   )r3   )NF)NF)r@   )F)F)F)F)F)F)F)F)F)F)?rµ   r�   Útypingr   r   r   r¤   Ztorch.nn.functionalr   Z
functionalrŸ   Ztimm.layersr   r   r   r	   r
   r   Z_builderr   Z_features_fxr   Ú	_registryr   r   r   Zbyobnetr   r   r   r   r   r   Zvision_transformerr   r{   Ú__all__r%   r-   r2   rJ   r!   rá   ÚModulera   rº   rÓ   rÛ   rå   ræ   rí   Zdefault_cfgsrW   rX   rY   rZ   r[   r]   r\   r^   r_   r`   r²   r#   r#   r#   r$   Ú<module>   sp    



ûóûóûóûò¸Lkw:]




þþþþþþþþþþ  þ  þ  þÕ1ù