Ë
    Fêñi6V  ã                  ó:  — d Z ddlmZ ddlZddlmZ ddlmZ ddlZddl	m
Z
 ddlm
c mZ ddlmc mZ ddl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  G d„ de
j>                  «      Z  G d„ de
j>                  «      Z! G d„ de
j>                  «      Z"y)a@  
ViTDet backbone adapted from Detectron2.
This module implements Vision Transformer (ViT) backbone for object detection.

Rope embedding code adopted from:
1. https://github.com/meta-llama/codellama/blob/main/llama/model.py
2. https://github.com/naver-ai/rope-vit
3. https://github.com/lucidrains/rotary-embedding-torch
é    )ÚannotationsN)Úpartial)ÚCallable)ÚTensor)Ú
PatchEmbed)Úapply_rotary_encÚcompute_axial_cisÚconcat_rel_posÚget_abs_posÚwindow_partitionÚwindow_unpartition)Úcheck_requirementsé   )Ú
LayerScalec                  óˆ   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zd	d
d„Zddd„Zdd„Zdd„Zˆ xZ	S )Ú	AttentionzIMulti-head Attention block with relative position embeddings and 2d-rope.c                óŠ  •— t         ‰| �  «        || _        ||z  | _        | j                  dz  | _        || _        t        j                  ||dz  |¬«      | _        t        j                  ||«      | _	        || _
        || _        || _        |	| _        |
| _        || _        | j!                  ||«       | j#                  |«       y)a	  
        Args:
            dim (int): Number of input channels.
            num_heads (int): Number of attention heads.
            qkv_bias (bool): If True, add a learnable bias to query, key, value.
            use_rel_pos (bool): If True, add relative positional embeddings to the attention map.
            rel_pos_zero_init (bool): If True, zero initialize relative positional parameters.
            input_size (tuple[int, int] or None): Input resolution for calculating the relative positional parameter
                size or rope size.
            cls_token (bool): Whether a cls_token is present.
            use_rope (bool): Whether to use rope 2d (independent of use_rel_pos, as it can be used together).
            rope_theta (float): Control frequencies of rope.
            rope_pt_size (tuple[int, int] or None): Size of rope in previous stage of training, needed for interpolation
                or tiling.
            rope_interp (bool): Whether to interpolate (or extrapolate) rope to match input size.
        ç      à¿é   )ÚbiasN)ÚsuperÚ__init__Ú	num_headsÚhead_dimÚscaleÚ	cls_tokenÚnnÚLinearÚqkvÚprojÚuse_rel_posÚ
input_sizeÚuse_ropeÚ
rope_thetaÚrope_pt_sizeÚrope_interpÚ_setup_rel_posÚ_setup_rope_freqs)ÚselfÚdimr   Úqkv_biasr!   Úrel_pos_zero_initr"   r   r#   r$   r%   r&   Ú	__class__s               €úd/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/ultralytics/models/sam/sam3/vitdet.pyr   zAttention.__init__,   s´   ø€ ô< 	‰ÑÔØ"ˆŒØ˜yÑ(ˆŒØ—]‘] DÑ(ˆŒ
Ø"ˆŒä—9‘9˜S #¨¡'°Ô9ˆŒÜ—I‘I˜c 3Ó'ˆŒ	ð 'ˆÔØ$ˆŒà ˆŒØ$ˆŒØ(ˆÔØ&ˆÔð 	×ÑÐ-¨zÔ:Ø×Ñ˜zÕ*ó    c                óÚ  — | j                   sd| _        d| _        y|€J ‚| j                  du sJ d«       ‚t	        j
                  t        j                  d|d   z  dz
  | j                  «      «      | _        t	        j
                  t        j                  d|d   z  dz
  | j                  «      «      | _        |sVt        j                  j                  | j                  d¬«       t        j                  j                  | j                  d¬«       |\  }}t        j                  |«      dd…df   }t        j                  |«      ddd…f   }||z
  |dz
  z   }|j                  «       | _        y)	z%Setup relative positional embeddings.NFznot supportedé   r   r   ç{®Gáz”?©Ústd)r!   Ú	rel_pos_hÚ	rel_pos_wr   r   Ú	ParameterÚtorchÚzerosr   ÚinitÚtrunc_normal_ÚarangeÚlongÚrelative_coords)r)   r,   r"   ÚHÚWÚq_coordsÚk_coordsr>   s           r.   r'   zAttention._setup_rel_pos`   s-  € à×ÒØ!ˆDŒNØ!ˆDŒNØàÐ%Ð%Ð%Ø�~‰~ Ñ&Ð7¨Ó7Ð&äŸ™¤e§k¡k°!°jÀ±mÑ2CÀaÑ2GÈÏÉÓ&WÓXˆŒÜŸ™¤e§k¡k°!°jÀ±mÑ2CÀaÑ2GÈÏÉÓ&WÓXˆŒá Ü�G‰G×!Ñ! $§.¡.°dÐ!Ô;Ü�G‰G×!Ñ! $§.¡.°dÐ!Ô;ð ‰ˆˆ1Ü—<‘< “?¢1 d 7Ñ+ˆÜ—<‘< “? 4ª 7Ñ+ˆØ# hÑ.°1°q±5Ñ9ˆØ.×3Ñ3Ó5ˆÕr/   c                ó\  — | j                   sd| _        y|€J ‚| j                  €|| _        t        t        | j
                  | j                  ¬«      | _        d}| j                  r| j                  d   |d   z  }| j                  |d   |d   |¬«      }| j                  r†t        j                  | j
                  dz  t        j                  |j                  ¬«      }t        j                  t        j                  |«      |«      ddd…f   }t        j                   ||gd¬	«      }|| _        y)
zSetup 2d-rope frequencies.N)r*   Úthetaç      ð?r   r   )Úend_xÚend_yÚ	scale_posr1   )ÚdtypeÚdevice©r*   )r#   Ú	freqs_cisr%   r   r	   r   r$   Úcompute_cisr&   r   r8   r9   Úfloat32rJ   ÚpolarÚ	ones_likeÚcat)r)   r"   rH   rL   ÚtÚcls_freqs_ciss         r.   r(   zAttention._setup_rope_freqsx   s  € à�}Š}Ø!ˆDŒNØàÐ%Ð%Ð%à×ÑÐ$Ø *ˆDÔô #ÜØ—‘Ø—/‘/ô
ˆÔð ˆ	Ø×ÒØ×)Ñ)¨!Ñ,¨z¸!©}Ñ<ˆIà×$Ñ$Ø˜Q‘-Ø˜Q‘-Øð %ó 
ˆ	ð
 �>Š>Ü—‘Ø—‘ Ñ"Ü—m‘mØ ×'Ñ'ôˆAô
 "ŸK™K¬¯©¸Ó(:¸AÓ>¸tÂQ¸wÑGˆMÜŸ	™	 =°)Ð"<À!ÔDˆIà"ˆ�r/   c                ó    — | j                   s||fS | j                  €J ‚t        ||| j                  j                  |j                  «      ¬«      S )zApply 2d-rope to q and k.)rL   )r#   rL   r   ÚtorJ   )r)   ÚqÚks      r.   Ú_apply_ropezAttention._apply_ropeŸ   sD   € à�}Š}Ø�a�4ˆKà�~‰~Ð)Ð)Ð)Ü  1°·±×0AÑ0AÀ!Ç(Á(Ó0KÔLÐLr/   c           
     óœ  — | j                   rdnd}|j                  dk(  r |j                  \  }}}}|dk(  sJ ‚||z  }d}n=|j                  dk(  sJ ‚|j                  \  }}}d}t        j                  ||z
  «      x}}| j                  |«      j                  ||d| j                  d«      }	|	j                  ddddd«      j                  d«      \  }
}}| j                  |
|«      \  }
}| j                  r¥t        |
j                  dd«      |j                  dd«      ||f|j                  dd | j                  | j                  d| j                   ¬«      \  }
}|
j                  || j                  ||z  d«      }
|j                  || j                  ||z  d«      }t#        j$                  |
||«      }|dk(  rE|j'                  || j                  ||d«      j                  ddddd«      j                  |||d«      }nA|j'                  || j                  |d«      j                  dddd«      j                  ||d«      }| j)                  |«      }|S )	z Forward pass of attention block.r   r   é   r   éÿÿÿÿr1   T)Úrescaler>   )r   ÚndimÚshapeÚmathÚsqrtr   Úreshaper   ÚpermuteÚunbindrX   r!   r
   Úflattenr5   r6   r>   ÚFÚscaled_dot_product_attentionÚviewr    )r)   ÚxÚsÚBr?   r@   Ú_ÚLr]   r   rV   rW   Úvs                r.   ÚforwardzAttention.forward§   s&  € à—’‰A QˆØ�6‰6�QŠ;ØŸ™‰JˆAˆq�!�QØ˜’6ˆM�6Ø�A‘ˆAØ‰Dà—6‘6˜Q’;Ð�;Ø—g‘g‰GˆAˆq�!ØˆDÜ—I‘I˜a !™eÓ$Ð$ˆA�ð �h‰h�q‹k×!Ñ! ! Q¨¨4¯>©>¸2Ó>ˆà—+‘+˜a  A q¨!Ó,×3Ñ3°AÓ6‰ˆˆ1ˆað ×Ñ  1Ó%‰ˆˆ1Ø×ÒÜ!Ø—	‘	˜!˜Q“Ø—	‘	˜!˜Q“Ø�A�Ø—‘˜˜!�Ø—‘Ø—‘ØØ $× 4Ñ 4ô	‰DˆAˆqð —	‘	˜!˜TŸ^™^¨Q°©U°BÓ7ˆAØ—	‘	˜!˜TŸ^™^¨Q°©U°BÓ7ˆAä×*Ñ*¨1¨a°Ó3ˆà�1Š9Ø—‘�q˜$Ÿ.™.¨!¨Q°Ó3×;Ñ;¸A¸qÀ!ÀQÈÓJ×RÑRÐSTÐVWÐYZÐ\^Ó_‰Aà—‘�q˜$Ÿ.™.¨!¨RÓ0×8Ñ8¸¸A¸qÀ!ÓD×LÑLÈQÐPQÐSUÓVˆAà�I‰I�a‹Lˆàˆr/   )
é   TFTNFFg     ˆÃ@NF)r*   Úintr   rp   r+   Úboolr!   rq   r,   rq   r"   útuple[int, int] | Noner   rq   r#   rq   r$   Úfloatr%   rr   r&   rq   )TN)r,   rq   r"   rr   ÚreturnÚNone)N)r"   rr   rt   ru   )rt   ztuple[Tensor, Tensor]©rh   r   rt   r   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r'   r(   rX   rn   Ú__classcell__©r-   s   @r.   r   r   )   s®   ø„ ÙSð
 ØØ!Ø"&Ø-1ØØØ#Ø/3Ø!ð2+àð2+ð ð2+ð ð	2+ð
 ð2+ð  ð2+ð +ð2+ð ð2+ð ð2+ð ð2+ð -ð2+ð õ2+ôh6ô0%#óNM÷.r/   r   c                  ó¶   ‡ — e Zd ZdZdddej
                  ej                  ddddddddddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d
ˆ fd„Zdd	„Zˆ xZ	S )ÚBlockz4Transformer blocks with support of window attention.ç      @Tç        Fr   Nc                ó.  •— t         ‰| �  «        t        d«       ddlm}m}  ||«      | _        t        |||||	|
dk(  r|n|
|
f||||¬«
      | _        |rt        ||¬«      nt        j                  «       | _        |dkD  r ||«      nt        j                  «       | _         ||«      | _         ||t        ||z  «      ||df¬«      | _        |rt        ||¬«      nt        j                  «       | _        t        j$                  |«      | _        |
| _        y)	a  
        Args:
            dim (int): Number of input channels.
            num_heads (int): Number of attention heads in each ViT block.
            mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
            qkv_bias (bool): If True, add a learnable bias to query, key, value.
            drop_path (float): Stochastic depth rate.
            norm_layer (Callable): Normalization layer constructor.
            act_layer (Callable): Activation layer constructor.
            use_rel_pos (bool): If True, add relative positional embeddings to the attention map.
            rel_pos_zero_init (bool): If True, zero initialize relative positional parameters.
            window_size (int): Window size for window attention blocks. If it equals 0, then not use window attention.
            input_size (tuple[int, int] | None): Input resolution for calculating the relative positional parameter
                size.
            use_rope (bool): Whether to use rope 2d (independent of use_rel_pos, as it can be used together).
            rope_pt_size (tuple[int, int] | None): Size of rope in previous stage of training, needed for interpolation
                or tiling.
            rope_interp (bool): Whether to interpolate (or extrapolate) rope to match target input size, expected to
                specify source size as rope_pt_size.
            cls_token (bool): Whether a cls_token is present.
            dropout (float): Dropout rate.
            init_values (float | None): Layer scale init, None for no layer scale.
        Útimmr   )ÚDropPathÚMlp)	r   r+   r!   r,   r"   r#   r%   r&   r   )Úinit_valuesr€   )Úin_featuresÚhidden_featuresÚ	act_layerÚdropN)r   r   r   Útimm.layersrƒ   r„   Únorm1r   Úattnr   r   ÚIdentityÚls1Ú	drop_pathÚnorm2rp   ÚmlpÚls2ÚDropoutÚdropoutÚwindow_size)r)   r*   r   Ú	mlp_ratior+   r�   Ú
norm_layerrˆ   r!   r,   r•   r"   r#   r%   r&   r   r”   r…   rƒ   r„   r-   s                       €r.   r   zBlock.__init__Û   s  ø€ ôV 	‰ÑÔä˜6Ô"ß-á “_ˆŒ
ÜØØØØ#Ø/Ø%0°AÒ%5‘z¸KÈÐ;UØØ%Ø#Øô
ˆŒ	ñ @K”:˜c¨{Õ;ÔPR×P[ÑP[ÓP]ˆŒØ09¸C²™ )Ô,ÄRÇ[Á[Ã]ˆŒá “_ˆŒ
ÙØÜ  i¡Ó0ØØ˜3�ô	
ˆŒñ @K”:˜c¨{Õ;ÔPR×P[ÑP[ÓP]ˆŒÜ—z‘z 'Ó*ˆŒØ&ˆÕr/   c                ó0  — |}| j                  |«      }| j                  dkD  r7|j                  d   |j                  d   }}t        || j                  «      \  }}| j	                  | j                  |«      «      }| j                  dkD  rt        || j                  f«      }|| j                  | j                  |«      «      z   }|| j                  | j                  | j                  | j                  | j                  |«      «      «      «      «      z   }|S )z&Forward pass of the transformer block.r   r   r1   )r‹   r•   r^   r   rŽ   rŒ   r   r”   r�   r’   r‘   r�   )r)   rh   Úshortcutr?   r@   Úpad_hws         r.   rn   zBlock.forward&  sæ   € àˆØ�J‰J�q‹Mˆà×Ñ˜aÒØ—7‘7˜1‘:˜qŸw™w q™zˆqˆAÜ(¨¨D×,<Ñ,<Ó=‰IˆAˆvà�H‰H�T—Y‘Y˜q“\Ó"ˆà×Ñ˜aÒÜ" 1 d×&6Ñ&6¸ÀÀAÀÓGˆAà�t—|‘| D§N¡N°1Ó$5Ó6Ñ6ˆØ�—‘˜TŸ^™^¨D¯H©H°T·X±X¸d¿j¹jÈ»mÓ5LÓ,MÓNÓOÑOˆàˆr/   )"r*   rp   r   rp   r–   rs   r+   rq   r�   rs   r—   úCallable[..., nn.Module]rˆ   r›   r!   rq   r,   rq   r•   rp   r"   rr   r#   rq   r%   rr   r&   rq   r   rq   r”   rs   r…   úfloat | Nonerv   )
rw   rx   ry   rz   r   Ú	LayerNormÚGELUr   rn   r{   r|   s   @r.   r~   r~   Ø   s  ø„ Ù>ð ØØØ/1¯|©|Ø.0¯g©gØ!Ø"&ØØ-1ØØ/3Ø!ØØØ$(ð%I'àðI'ð ðI'ð ð	I'ð
 ðI'ð ðI'ð -ðI'ð ,ðI'ð ðI'ð  ðI'ð ðI'ð +ðI'ð ðI'ð -ðI'ð ðI'ð  ð!I'ð" ð#I'ð$ "õ%I'÷Vr/   r~   c                  ó  ‡ — e Zd ZdZddddddddd	d
ej
                  ddddddddddddd	dddddddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zedd„«       Zdd„Z	ddgfdd„Z
ˆ xZS )ÚViTz¼This module implements Vision Transformer (ViT) backbone in :paper:`vitdet`. "Exploring Plain Vision Transformer
    Backbones for Object Detection", https://arxiv.org/abs/2203.16527.
    i   é   r   i   é   r   Tr€   r�   )r1   é   ro   é   é   FNéà   c            	     óô  •— t         ‰)| �  «        || _        t        |«      D � cg c]	  } | |vsŒ| ‘Œ }!} t	        |«      | _        dg|z  | _        t        |t        «      r|rdg|z  | _        n|D ]  } d| j                  | <   Œ || _	        | j                  ro|sJ ‚t        |!«      dk(  sJ d«       ‚t        | j                  «      dk(  sJ d«       ‚|dz  }"t        j                  |"t        j                  dd|«      z  «      | _        t        |
t"        «      rt%        t'        t        |
«      d¬	«      }
t)        ||f||f|||¬
«      | _        || _        || _        | j,                  r| j.                  sJ ‚| j.                  rD||z  ||z  z  }#|r|#dz   n|#}$t        j                  t        j0                  d|$|«      «      | _        nd| _        t        j4                  d|	|«      D �%cg c]  }%|%j7                  «       ‘Œ }&}%|| _        || _        t        j<                  «       | _        d}'t        |«      D ]™  } tA        d i d|“d|“d|“d|“d|&|    “d|
“d|“d| j                  |    “d|“d| |!v r|nd“d||z  ||z  f“d|“d|€||fn||f“d|“d| j                  “d|“d|“Ž}(| |!vr|'dz  }'|| _!        | j>                  jE                  |(«       Œ› || _#        |r|gt        | j
                  «      z  n|g| _$        | j2                  �+t        jJ                  jM                  | j2                  d¬«       |r |
|«      nt        jN                  «       | _(        |r |
|«      nt        jN                  «       | _)        | jU                  | jV                  «       |�at        jX                  | jZ                  |d¬«      | _-        | jB                  r-| j\                  r dt        j^                  j`                  _1        yyyyc c} w c c}%w )!ak
  
        Args:
            img_size (int): Input image size. Only relevant for rel pos or rope.
            patch_size (int): Patch size.
            in_chans (int): Number of input image channels.
            embed_dim (int): Patch embedding dimension.
            depth (int): Depth of ViT.
            num_heads (int): Number of attention heads in each ViT block.
            mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
            qkv_bias (bool): If True, add a learnable bias to query, key, value.
            drop_path_rate (float): Stochastic depth rate.
            norm_layer (Callable or str): Normalization layer constructor or name.
            act_layer (Callable): Activation layer constructor.
            use_abs_pos (bool): If True, use absolute positional embeddings.
            tile_abs_pos (bool): If True, tile absolute positional embeddings instead of interpolation.
            rel_pos_blocks (tuple[int, ...] | bool): Blocks which have rel pos embeddings.
            rel_pos_zero_init (bool): If True, zero initialize relative positional parameters.
            window_size (int): Window size for window attention blocks.
            global_att_blocks (tuple[int, ...]): Indexes for blocks using global attention (other blocks use window
                attention).
            use_rope (bool): Whether to use rope 2d (independent of rel_pos_blocks, as it can be used together).
            rope_pt_size (int | None): Size of rope in previous stage of training, needed for interpolation or tiling.
            use_interp_rope (bool): Whether to interpolate (or extrapolate) rope to match target input size, expected to
                specify source size as rope_pt_size.
            pretrain_img_size (int): Input image size for pretraining models.
            pretrain_use_cls_token (bool): If True, pretraining models use class token.
            retain_cls_token (bool): Whether cls_token should be retained.
            dropout (float): Dropout rate. Applied in residual blocks of attn, mlp and inside the mlp.
            return_interm_layers (bool): Whether to return intermediate layers (all global attention blocks).
            init_values (float | None): Layer scale init, None for no layer scale.
            ln_pre (bool): If True, apply layer norm before transformer blocks.
            ln_post (bool): If True, apply layer norm after transformer blocks.
            bias_patch_embed (bool): If True, use bias in conv for patch embed.
            compile_mode (str | None): Mode to compile the forward, or None to disable.
            use_act_checkpoint (bool): If True, use activation checkpointing.
        FTr   z&windowing not supported with cls tokenz$rel pos not supported with cls tokenr   r   gñhãˆµøä>)Úeps)Úkernel_sizeÚstrideÚin_chansÚ	embed_dimr   Nr*   r   r–   r+   r�   r—   rˆ   r!   r,   r•   r"   r#   r%   r&   r   r”   r…   r2   r3   )ÚmodeÚ	fullgraph© )2r   r   Úpretrain_use_cls_tokenÚrangeÚlistÚfull_attn_idsÚrel_pos_blocksÚ
isinstancerq   Úretain_cls_tokenÚlenÚsumr   r7   r8   ÚrandnÚclass_embeddingÚstrr   Úgetattrr   Úpatch_embedÚtile_abs_posÚuse_abs_posr9   Ú	pos_embedÚlinspaceÚitemÚ
patch_sizer•   Ú
ModuleListÚblocksr~   Úuse_act_checkpointÚappendÚreturn_interm_layersÚchannel_listr:   r;   r�   Úln_preÚln_postÚapplyÚ_init_weightsÚcompilern   ÚtrainingÚ_dynamoÚconfigÚoptimize_ddp)*r)   Úimg_sizerÃ   r«   r¬   Údepthr   r–   r+   Údrop_path_rater—   rˆ   r¿   r¾   r´   r,   r•   Úglobal_att_blocksr#   r%   Úuse_interp_ropeÚpretrain_img_sizer°   r¶   r”   rÈ   r…   rÊ   rË   Úbias_patch_embedÚcompile_moderÆ   ÚiÚwindow_block_indexesr   Únum_patchesÚnum_positionsrh   ÚdprÚ	cur_stageÚblockr-   s*                                            €r.   r   zViT.__init__?  s4  ø€ ôL 	‰ÑÔØ&<ˆÔ#ä+0°«<ÖV a¸1ÐDUÒ;U¢ÐVÐÐVÜ!Ð"3Ó4ˆÔØ$˜g¨™oˆÔÜ�n¤dÔ+±Ø#' &¨5¡.ˆDÕà#ò .�Ø)-�×#Ñ# AÒ&ð.ð !1ˆÔØ× Ò Ù)Ð)Ð)ÜÐ+Ó,°Ò1Ð[Ð3[Ó[Ð1ä�t×*Ñ*Ó+¨qÒ0ÐXÐ2XÓXÐ0à˜t‘OˆEÜ#%§<¡<°¼¿¹ÀAÀqÈ)Ó8TÑ0TÓ#UˆDÔ ä�j¤#Ô&Ü ¤¬¨ZÓ!8¸dÔCˆJä%Ø# ZÐ0Ø 
Ð+ØØØ!ô
ˆÔð )ˆÔØ&ˆÔØ×ÒØ×#Ò#Ð#Ð#à×Òà,°
Ñ:Ð?PÐT^Ñ?^Ñ_ˆKÙ1G˜[¨1š_È[ˆMÜŸ\™\¬%¯+©+°a¸È	Ó*RÓSˆD�Nà!ˆDŒNô "'§¡°°>À5Ó!IÖJ˜Aˆq�v‰v�xÐJˆÐJà$ˆŒØ&ˆÔÜ—m‘m“oˆŒØˆ	Ü�u“ò 	&ˆAÜò Ùðá#ðñ $ðñ "ð	ð
 ˜aš&ðñ &ðñ $ðð !×/Ñ/°Ò2ðñ #4ðð ,-Ð0DÑ+D™KÈ!øðð %¨
Ñ2°HÀ
Ñ4JÑKðñ "ðð =IÐ<P˜{¨KÑ8ÐWcÐeqÐVrøðñ ,ðð ×/Ò/ðñ   ð!ñ" (ð#ˆEð( Ð,Ñ,Ø˜Q‘�	à&8ˆDÔ#à�K‰K×Ñ˜uÕ%ð5	&ð8 %9ˆÔ!ÙEY˜Y˜K¬#¨d×.@Ñ.@Ó*AÒAÐ`iÐ_jˆÔà�>‰>Ð%Ü�G‰G×!Ñ! $§.¡.°dÐ!Ô;á/5‘j Ô+¼2¿;¹;»=ˆŒÙ07‘z )Ô,¼R¿[¹[»]ˆŒà�
‰
�4×%Ñ%Ô&àÐ#Ü Ÿ=™=¨¯©¸LÐTXÔYˆDŒLØ×&Ò&¨4¯=ª=Ø49”—‘×$Ñ$Õ1ð ,9Ð&ð $ùòu  WùòZ Ks   ¤	O0®O0Ç!O5c                ó  — t        | t        j                  «      r~t        j                  j	                  | j
                  d¬«       t        | t        j                  «      r8| j                  �+t        j                  j                  | j                  d«       yyyt        | t        j                  «      rUt        j                  j                  | j                  d«       t        j                  j                  | j
                  d«       yy)zInitialize the weights.r2   r3   Nr   rE   )	rµ   r   r   r:   r;   Úweightr   Ú	constant_r�   )Úms    r.   rÍ   zViT._init_weightsç  s§   € ô �aœŸ™Ô#Ü�G‰G×!Ñ! !§(¡(°Ð!Ô5Ü˜!œRŸY™YÔ'¨A¯F©FÐ,>Ü—‘×!Ñ! !§&¡&¨!Õ,ð -?Ð'ä˜œ2Ÿ<™<Ô(Ü�G‰G×Ñ˜aŸf™f aÔ(Ü�G‰G×Ñ˜aŸh™h¨Õ,ð )r/   c                ó^  — | j                  |«      }|j                  d   |j                  d   }}d}| j                  r5t        j                  | j
                  |j                  dd«      gd¬«      }d}| j                  �=|t        | j                  | j                  ||f| j                  | j                  ¬«      z   }| j                  |«      }g }t        | j                  «      D �]E  \  }}| j                  r%| j                  rt!        j                   ||d¬«      }n ||«      }|| j"                  d	   k(  s| j$                  sŒ_|| j"                  v sŒn|| j"                  d	   k(  r| j'                  |«      }|dd…|d…f   }|j(                  d
k(  r|j+                  dddd«      }nu|j(                  dk(  sJ ‚t-        j.                  |j                  d   «      x}}|j1                  |j                  d   |||j                  d	   «      j+                  dddd«      }|j3                  |«       �ŒH |S )z&Vit forward path and get feature maps.r   r1   r   rK   N)ÚtilingF)Úuse_reentrantr[   rZ   r   )r½   r^   r¶   r8   rQ   rº   rd   rÀ   r   r°   r¾   rÊ   Ú	enumeraterÅ   rÆ   rÏ   Ú
checkpointr³   rÈ   rË   r]   rb   r_   r`   ra   rÇ   )	r)   rh   ÚhÚwri   ÚoutputsrÛ   ÚblkÚfeatss	            r.   rn   zViT.forwardò  só  € à×Ñ˜QÓˆØ�w‰w�q‰z˜1Ÿ7™7 1™:ˆ1ˆàˆØ× Ò ô —	‘	˜4×/Ñ/°·±¸1¸a³ÐAÀqÔIˆAØˆAà�>‰>Ð%Ø”KØ—‘Ø×+Ñ+Ø�A�Ø×%Ñ%Ø×(Ñ(ôñ ˆAð �K‰K˜‹NˆàˆÜ §¡Ó,ó 	&‰FˆAˆsØ×&Ò&¨4¯=ª=Ü×)Ñ)¨#¨qÀÔF‘á˜“F�Ø�T×'Ñ'¨Ñ+Ò+°×1JÓ1JÈqÐTX×TfÑTfÒOfØ˜×*Ñ*¨2Ñ.Ò.ØŸ™ Q›�Aàš!˜Q™R˜%™�Ø—:‘: ’?Ø!ŸM™M¨!¨Q°°1Ó5‘Eà Ÿ:™:¨š?Ð*˜?Ü ŸI™I e§k¡k°!¡nÓ5Ð5�A˜Ø!ŸM™M¨%¯+©+°a©.¸!¸QÀÇÁÈBÁÓP×XÑXÐYZÐ\]Ð_`ÐbcÓd�Eà—‘˜uÖ%ð#	&ð& ˆr/   ið  c                ó>  — | j                   D ]Ž  }|j                  dk7  rŒ|j                  j                  |d   | j                  z  |d   | j                  z  f¬«       |j                  j                  |d   | j                  z  |d   | j                  z  f¬«       Œ� y)zCSetup rel pos embeddings and rope freqs for a new input image size.r   r   )r"   N)rÅ   r•   rŒ   r'   rÃ   r(   )r)   Úimgszrá   s      r.   Ú	set_imgszzViT.set_imgsz  sš   € à—[‘[ò 	pˆEØ× Ñ  AÒ%ØØ�J‰J×%Ñ%°%¸±(¸d¿o¹oÑ2MÈuÐUVÉxÐ[_×[jÑ[jÑOjÐ1kÐ%ÔlØ�J‰J×(Ñ(°U¸1±XÀÇÁÑ5PÐRWÐXYÑRZÐ^b×^mÑ^mÑRmÐ4nÐ(Õoñ		pr/   )>rÓ   rp   rÃ   rp   r«   rp   r¬   rp   rÔ   rp   r   rp   r–   rs   r+   rq   rÕ   rs   r—   zCallable[..., nn.Module] | strrˆ   r›   r¿   rq   r¾   rq   r´   ztuple[int, ...] | boolr,   rq   r•   rp   rÖ   ztuple[int, ...]r#   rq   r%   z
int | Noner×   rq   rØ   rp   r°   rq   r¶   rq   r”   rs   rÈ   rq   r…   rœ   rÊ   rq   rË   rq   rÙ   rq   rÚ   z
str | NonerÆ   rq   )rå   z	nn.Modulert   ru   )rh   ztorch.Tensorrt   zlist[torch.Tensor])rñ   z	list[int])rw   rx   ry   rz   r   rž   r   ÚstaticmethodrÍ   rn   rò   r{   r|   s   @r.   r    r    :  s÷  ø„ ñð ØØØØØØØØ #Ø5@Ø.0¯g©gØ Ø!Ø1>Ø"&ØØ-:ØØ#'Ø %Ø!$Ø'+Ø!%ØØ%*Ø$(ØØØ!%Ø#'Ø#'ðAf:àðf:ð ðf:ð ð	f:ð
 ðf:ð ðf:ð ðf:ð ðf:ð ðf:ð ðf:ð 3ðf:ð ,ðf:ð ðf:ð ðf:ð /ðf:ð   ð!f:ð" ð#f:ð$ +ð%f:ð& ð'f:ð( !ð)f:ð* ð+f:ð, ð-f:ð. !%ð/f:ð0 ð1f:ð2 ð3f:ð4 #ð5f:ð6 "ð7f:ð8 ð9f:ð: ð;f:ð< ð=f:ð> !ð?f:ð@ !õAf:ðP ò-ó ð-ó+ðZ -1°$¨<÷ pð pr/   r    )#rz   Ú
__future__r   r_   Ú	functoolsr   Útypingr   r8   Útorch.nnr   Útorch.nn.functionalÚ
functionalre   Útorch.utils.checkpointÚutilsrê   r   Ú%ultralytics.models.sam.modules.blocksr   Ú$ultralytics.models.sam.modules.utilsr   r	   r
   r   r   r   Úultralytics.utils.checksr   Ú
model_miscr   ÚModuler   r~   r    r¯   r/   r.   ú<module>r     s|   ðñ
õ #ã Ý Ý ã Ý ß Ð ß +Ð +Ý å <÷÷ õ 8å "ôl�—	‘	ô lô^_ˆB�I‰Iô _ôDkpˆ"�)‰)õ kpr/   