Ë
    éÓ^j§q  ã                   ó6  — d Z ddlZddlm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c mZ ddlmZmZ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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+ ddl,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2m3Z3 dgZ4 ejj                  e6«      Z7de8de8dejr                  dejr                  fd„Z: e-e:«       dejr                  dejr                  dejr                  dee8e8f   dee8e8f   dejr                  fd„Z; G d„ dejx                  «      Z= G d„ dejx                  «      Z>dejr                  de8deejr                  ee8e8f   f   fd„Z?	 d8dejr                  de8d ee8e8f   d!eee8e8f      dejr                  f
d"„Z@ G d#„ dejx                  «      ZAd$„ ZBd9d%„ZC e2 eCd&d'd(eedd)d*¬+«       eCd,d'd(eedd)d*¬+«       eCd-d'd(eedd)d*¬+«       eCeed.d/d0¬1«      d2œ«      ZDd:d3„ZEe3d:deAfd4„«       ZFe3d:deAfd5„«       ZGe3d:deAfd6„«       ZHe3d:deAfd7„«       ZIy);a+   Vision Transformer (ViT) in PyTorch

A PyTorch implement of Vision Transformers as described in:

'Exploring Plain Vision Transformer Backbones for Object Detection'
    - https://arxiv.org/abs/2203.16527

'Segment Anything Model (SAM)'
    - https://github.com/facebookresearch/segment-anything/

é    N)Úpartial)ÚCallableÚListÚOptionalÚTupleÚTypeÚUnion)ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STDÚIMAGENET_INCEPTION_MEANÚIMAGENET_INCEPTION_STD)Ú
PatchEmbedÚMlpÚDropPathÚcalculate_drop_path_ratesÚPatchDropoutÚLayerNorm2dÚ
LayerScaleÚClassifierHeadÚNormMlpClassifierHeadÚFormatÚresample_abs_pos_embed_nhwcÚRotaryEmbeddingCatÚapply_rot_embed_catÚ	to_2tupleÚuse_fused_attn)ÚFinalé   )Úbuild_model_with_cfg)Úfeature_take_indices)Úregister_notrace_function)Ú
checkpointÚcheckpoint_seq)Úgenerate_default_cfgsÚregister_modelÚVisionTransformerSAMÚq_sizeÚk_sizeÚrel_posÚreturnc                 ó€  — t        dt        | |«      z  dz
  «      }|j                  d   |k7  rjt        j                  |j                  d|j                  d   d«      j                  ddd«      |d¬«      }|j                  d|«      j                  dd«      }n|}t        j                  | t        j                  ¬«      dd…df   t        || z  d	«      z  }t        j                  |t        j                  ¬«      ddd…f   t        | |z  d	«      z  }||z
  |dz
  t        | |z  d	«      z  z   }||j                  «          S )
a\  
    Get relative positional embeddings according to the relative positions of
        query and key sizes.
    Args:
        q_size (int): size of query q.
        k_size (int): size of key k.
        rel_pos (Tensor): relative position embeddings (L, C).

    Returns:
        Extracted positional embeddings according to relative positions.
    é   r   r   éÿÿÿÿÚlinear)ÚsizeÚmode)ÚdtypeNç      ð?)ÚintÚmaxÚshapeÚFÚinterpolateÚreshapeÚpermuteÚtorchÚarangeÚfloat32Úlong)r'   r(   r)   Úmax_rel_distÚrel_pos_resizedÚq_coordsÚk_coordsÚrelative_coordss           úm/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/vision_transformer_sam.pyÚget_rel_posrD   4   s*  € ô �qœ3˜v vÓ.Ñ.°Ñ2Ó3€Là‡}�}�QÑ˜<Ò'äŸ-™-Ø�O‰O˜A˜wŸ}™}¨QÑ/°Ó4×<Ñ<¸QÀÀ1ÓEØØô
ˆð
 *×1Ñ1°"°lÓC×KÑKÈAÈqÓQ‰à!ˆô �|‰|˜F¬%¯-©-Ô8º¸D¸ÑAÄCÈÐQWÉÐY\ÓD]Ñ]€HÜ�|‰|˜F¬%¯-©-Ô8¸ºq¸ÑAÄCÈÐQWÉÐY\ÓD]Ñ]€HØ (Ñ*¨v¸©z¼SÀÈ&ÁÐRUÓ=VÑ.VÑV€Oà˜?×/Ñ/Ó1Ñ2Ð2ó    ÚqÚ	rel_pos_hÚ	rel_pos_wc                 ój  — |\  }}|\  }}t        |||«      }	t        |||«      }
| j                  \  }}}| j                  ||||«      }t        j                  d||	«      }t        j                  d||
«      }|dd…dd…dd…dd…df   |dd…dd…dd…ddd…f   z   }|j                  d||z  ||z  «      S )a£  
    Calculate decomposed Relative Positional Embeddings from :paper:`mvitv2`.
    https://github.com/facebookresearch/mvit/blob/19786631e330df9f3622e5402b4a419a263a2c80/mvit/models/attention.py
    Args:
        q (Tensor): query q in the attention layer with shape (B, q_h * q_w, C).
        rel_pos_h (Tensor): relative position embeddings (Lh, C) for height axis.
        rel_pos_w (Tensor): relative position embeddings (Lw, C) for width axis.
        q_size (Tuple): spatial sequence size of query q with (q_h, q_w).
        k_size (Tuple): spatial sequence size of key k with (k_h, k_w).

    Returns:
        bias (Tensor): attention bias to add to attention map
    zbhwc,hkc->bhwkzbhwc,wkc->bhwkNr-   )rD   r5   r8   r:   Úeinsum)rF   rG   rH   r'   r(   Úq_hÚq_wÚk_hÚk_wÚRhÚRwÚBÚ_ÚdimÚr_qÚrel_hÚrel_wÚ	attn_biass                     rC   Úget_decomposed_rel_pos_biasrX   W   sÂ   € ð( �H€CˆØ�H€CˆÜ	�S˜#˜yÓ	)€BÜ	�S˜#˜yÓ	)€Bà—‘�I€A€qˆ#Ø
�)‰)�A�s˜C Ó
%€CÜ�L‰LÐ)¨3°Ó3€EÜ�L‰LÐ)¨3°Ó3€Eà’aššAšq $Ð&Ñ'¨%²²1²a¸ºqÐ0@Ñ*AÑA€IØ×Ñ˜R  s¡¨C°#©IÓ6Ð6rE   c                   óÐ   ‡ — e Zd ZU ee   ed<   dddddej                  dddddfdeded	ed
ede	de	de
ej                     dedeeeef      deej                     fˆ fd„Zd„ Zˆ xZS )Ú	AttentionÚ
fused_attné   TFç        NrS   Ú	num_headsÚqkv_biasÚqk_normÚ	attn_dropÚ	proj_dropÚ
norm_layerÚuse_rel_posÚ
input_sizeÚropec                 ó¢  •— ||dœ}t         ‰| �  «        ||z  dk(  sJ d«       ‚|| _        ||z  | _        | j                  dz  | _        t        «       | _        t        j                  ||dz  fd|i|¤Ž| _	        |r || j                  fi |¤Žnt        j                  «       | _        |r || j                  fi |¤Žnt        j                  «       | _        t        j                  |«      | _        t        j                  ||fi |¤Ž| _        t        j                  |«      | _        || _        | j"                  r‘|
�J ‚|	€J d«       ‚t        j$                  t'        j(                  d|	d   z  d	z
  | j                  fi |¤Ž«      | _        t        j$                  t'        j(                  d|	d	   z  d	z
  | j                  fi |¤Ž«      | _        |
| _        y )
N©Údevicer1   r   z$dim should be divisible by num_headsg      à¿é   ÚbiaszBInput size must be provided if using relative positional encoding.r,   r   )ÚsuperÚ__init__r^   Úhead_dimÚscaler   r[   ÚnnÚLinearÚqkvÚIdentityÚq_normÚk_normÚDropoutra   Úprojrb   rd   Ú	Parameterr:   ÚzerosrG   rH   rf   )ÚselfrS   r^   r_   r`   ra   rb   rc   rd   re   rf   ri   r1   ÚddÚ	__class__s                 €rC   rm   zAttention.__init__|   s–  ø€ ð ¨Ñ/ˆÜ‰ÑÔØ�Y‰ !Ò#ÐKÐ%KÓKÐ#Ø"ˆŒØ˜yÑ(ˆŒØ—]‘] dÑ*ˆŒ
Ü(Ó*ˆŒä—9‘9˜S #¨¡'Ñ?°Ð?¸BÑ?ˆŒÙ9@‘j §¡Ñ5°"Ò5ÄbÇkÁkÃmˆŒÙ9@‘j §¡Ñ5°"Ò5ÄbÇkÁkÃmˆŒÜŸ™ IÓ.ˆŒÜ—I‘I˜c 3Ñ-¨"Ñ-ˆŒ	ÜŸ™ IÓ.ˆŒØ&ˆÔØ×ÒØ�<Ð�<àÐ&ðTàSóTØ&ô  Ÿ\™\¬%¯+©+°a¸*ÀQ¹-Ñ6GÈ!Ñ6KÈTÏ]É]Ñ*aÐ^`Ñ*aÓbˆDŒNÜŸ\™\¬%¯+©+°a¸*ÀQ¹-Ñ6GÈ!Ñ6KÈTÏ]É]Ñ*aÐ^`Ñ*aÓbˆDŒNØˆ�	rE   c                 óô  — |j                   \  }}}}||z  }|j                  ||d«      }| j                  |«      j                  ||d| j                  d«      j                  ddddd«      }|j                  d|| j                  z  |d«      j                  d«      \  }}	}
| j                  |«      | j                  |	«      }	}| j                  r(t        || j                  | j                  ||f||f«      }n^d }| j                  �P| j                  j                  «       }t        ||«      j!                  |
«      }t        |	|«      j!                  |
«      }	| j"                  rQt$        j&                  j(                  j+                  ||	|
|| j,                  r| j.                  j0                  nd¬«      }nS|| j2                  z  }||	j5                  d	d«      z  }|�||z   }|j7                  d¬
«      }| j/                  |«      }||
z  }|j                  || j                  |d«      j5                  dd«      j                  ||d«      }| j9                  |«      }| j;                  |«      }|j                  |||d«      }|S )Nr-   rj   r,   r   r   é   r]   )Ú	attn_maskÚ	dropout_péþÿÿÿ)rS   )r5   r8   rr   Úviewr^   r9   Úunbindrt   ru   rd   rX   rG   rH   rf   Ú	get_embedr   Útype_asr[   r:   rp   Ú
functionalÚscaled_dot_product_attentionÚtrainingra   Úpro   Ú	transposeÚsoftmaxrw   rb   )rz   ÚxrQ   ÚHÚWrR   ÚNrr   rF   ÚkÚvrW   rf   Úattns                 rC   ÚforwardzAttention.forward¤   s6  € Ø—W‘W‰
ˆˆ1ˆa�Ø�‰EˆØ�I‰I�a˜˜BÓˆØ�h‰h�q‹k×Ñ˜q ! Q¨¯©¸Ó;×CÑCÀAÀqÈ!ÈQÐPQÓRˆà—+‘+˜a  T§^¡^Ñ!3°Q¸Ó;×BÑBÀ1ÓE‰ˆˆ1ˆaà�{‰{˜1‹~˜tŸ{™{¨1›~ˆ1ˆà×ÒÜ3°A°t·~±~ÀtÇ~Á~ÐXYÐ[\ÐW]Ð`aÐcdÐ_eÓf‰IàˆIØ�y‰yÐ$Ø—y‘y×*Ñ*Ó,�Ü'¨¨4Ó0×8Ñ8¸Ó;�Ü'¨¨4Ó0×8Ñ8¸Ó;�à�?Š?Ü—‘×#Ñ#×@Ñ@Ø�1�aØ#Ø.2¯mªm˜$Ÿ.™.×*Ò*Àð Aó ‰Að �D—J‘J‘ˆAØ�q—{‘{ 2 rÓ*Ñ*ˆDØÐ$Ø˜iÑ'�Ø—<‘< B�<Ó'ˆDØ—>‘> $Ó'ˆDØ�q‘ˆAà�F‰F�1�d—n‘n a¨Ó,×6Ñ6°q¸!Ó<×DÑDÀQÈÈ2ÓNˆØ�I‰I�a‹LˆØ�N‰N˜1ÓˆØ�F‰F�1�a˜˜BÓˆØˆrE   )Ú__name__Ú
__module__Ú__qualname__r   ÚboolÚ__annotations__rp   Ú	LayerNormr3   Úfloatr   ÚModuler   r   rm   r“   Ú__classcell__©r|   s   @rC   rZ   rZ   y   s¿   ø… Ø�d‘Óð
 Ø!Ø!Ø!Ø!Ø*,¯,©,Ø %Ø48Ø(,ØØñ&àð&ð ð&ð ð	&ð
 ð&ð ð&ð ð&ð ˜RŸY™Y™ð&ð ð&ð !  s¨C x¡Ñ1ð&ð ˜2Ÿ9™9Ñ%õ&öP&rE   rZ   c                   óü   ‡ — e Zd Zdddddddej                  ej
                  eddddddfdeded	ed
e	de	dedede
e   dedeej                     deej                     deej                     de	defˆ fd„Zd„ Zˆ xZS )ÚBlockç      @TFr]   Nr   rS   r^   Ú	mlp_ratior_   r`   rb   ra   Úinit_valuesÚ	drop_pathÚ	act_layerrc   Ú	mlp_layerrd   Úwindow_sizec                 óJ  •— ||dœ}t         ‰| �  «        || _         ||fi |¤Ž| _        t	        |f||||||||dk(  r|n||f|dœ	|¤Ž| _        |rt        |fd|i|¤Žnt        j                  «       | _	        |	dkD  rt        |	«      nt        j                  «       | _         ||fi |¤Ž| _         |d|t        ||z  «      |
|dœ|¤Ž| _        |rt        |fd|i|¤Žnt        j                  «       | _        |	dkD  rt        |	«      | _        y t        j                  «       | _        y )Nrh   r   )	r^   r_   r`   ra   rb   rc   rd   re   rf   r¢   r]   )Úin_featuresÚhidden_featuresr¤   Údrop© )rl   rm   r¦   Únorm1rZ   r’   r   rp   rs   Úls1r   Ú
drop_path1Únorm2r3   ÚmlpÚls2Ú
drop_path2)rz   rS   r^   r¡   r_   r`   rb   ra   r¢   r£   r¤   rc   r¥   rd   r¦   re   rf   ri   r1   r{   r|   s                       €rC   rm   zBlock.__init__Ï   sC  ø€ ð* ¨Ñ/ˆÜ‰ÑÔØ&ˆÔÙ Ñ* rÑ*ˆŒ
ÜØð
àØØØØØ!Ø#Ø%0°AÒ%5‘z¸KÈÐ;UØñ
ð ñ
ˆŒ	ñ FQ”:˜cÑA¨{ÐA¸bÒAÔVX×VaÑVaÓVcˆŒØ1:¸R²œ( 9Ô-ÄRÇ[Á[Ã]ˆŒá Ñ* rÑ*ˆŒ
Ùð 
ØÜ  i¡Ó0ØØñ	
ð
 ñ
ˆŒñ FQ”:˜cÑA¨{ÐA¸bÒAÔVX×VaÑVaÓVcˆŒØ1:¸R²œ( 9Ó-ˆ�ÄRÇ[Á[Ã]ˆ�rE   c           
      ó2  — |j                   \  }}}}|}| j                  |«      }d }| j                  dkD  rt        || j                  «      \  }}| j	                  | j                  | j                  |«      «      «      }| j                  dkD  rt        || j                  ||f|«      }||z   }|j                  |||z  d«      }|| j                  | j                  | j                  | j                  |«      «      «      «      z   }|j                  |||d«      }|S )Nr   r-   )r5   r¬   r¦   Úwindow_partitionr®   r­   r’   Úwindow_unpartitionr8   r²   r±   r°   r¯   )rz   rŒ   rQ   r�   rŽ   rR   ÚshortcutÚpad_hws           rC   r“   zBlock.forward  sü   € Ø—W‘W‰
ˆˆ1ˆa�àˆØ�J‰J�q‹Mˆà,0ˆØ×Ñ˜aÒÜ(¨¨D×,<Ñ,<Ó=‰IˆAˆvà�O‰O˜DŸH™H T§Y¡Y¨q£\Ó2Ó3ˆð ×Ñ˜aÒÜ" 1 d×&6Ñ&6¸¸A¸ÀÓGˆAà�q‰Lˆà�I‰I�a˜˜Q™ Ó#ˆØ�—‘ §¡¨¯©°$·*±*¸Q³-Ó)@Ó AÓBÑBˆØ�I‰I�a˜˜A˜rÓ"ˆàˆrE   )r”   r•   r–   rp   ÚGELUr™   r   r3   rš   r—   r   r   r›   rm   r“   rœ   r�   s   @rC   rŸ   rŸ   Í   sý   ø„ ð  "Ø!Ø!Ø!Ø!Ø+/Ø!Ø)+¯©Ø*,¯,©,Ø),Ø %Ø ØØØØñ'2Sàð2Sð ð2Sð ð	2Sð
 ð2Sð ð2Sð ð2Sð ð2Sð " %™ð2Sð ð2Sð ˜BŸI™I‘ð2Sð ˜RŸY™Y™ð2Sð ˜BŸI™I‘ð2Sð ð2Sð õ2SöhrE   rŸ   rŒ   r¦   c           	      óL  — | j                   \  }}}}|||z  z
  |z  }|||z  z
  |z  }t        j                  | ddd|d|f«      } ||z   ||z   }	}| j                  |||z  ||	|z  ||«      } | j	                  dddddd«      j                  «       j                  d|||«      }
|
||	ffS )aU  
    Partition into non-overlapping windows with padding if needed.
    Args:
        x (tensor): input tokens with [B, H, W, C].
        window_size (int): window size.

    Returns:
        windows: windows after partition with [B * num_windows, window_size, window_size, C].
        (Hp, Wp): padded height and width before partition
    r   r   rj   r,   r~   é   r-   )r5   r6   Úpadr‚   r9   Ú
contiguous)rŒ   r¦   rQ   r�   rŽ   ÚCÚpad_hÚpad_wÚHpÚWpÚwindowss              rC   r´   r´     sÎ   € ð —‘�J€A€qˆ!ˆQà˜1˜{™?Ñ*¨kÑ9€EØ˜1˜{™?Ñ*¨kÑ9€EÜ	�‰ˆa�!�Q˜˜5 ! UÐ+Ó,€AØ�‰Y˜˜E™	ˆ€Bà	�‰ˆq�"˜Ñ# [°"¸Ñ2CÀ[ÐRSÓT€AØ�i‰i˜˜1˜a  A qÓ)×4Ñ4Ó6×;Ñ;¸BÀÈ[ÐZ[Ó\€GØ�R˜�HÐÐrE   rÂ   Úhwr·   c                 ó:  — |�|n|\  }}|\  }}| j                   d   ||z  |z  |z  z  }| j                  |||z  ||z  ||d«      }	|	j                  dddddd«      j                  «       j                  |||d«      }	|	dd…d|…d|…dd…f   j                  «       }	|	S )	a›  
    Window unpartition into original sequences and removing padding.
    Args:
        windows (tensor): input tokens with [B * num_windows, window_size, window_size, C].
        window_size (int): window size.
        pad_hw (Tuple): padded height and width (Hp, Wp).
        hw (Tuple): original height and width (H, W) before padding.

    Returns:
        x: unpartitioned sequences with [B, H, W, C].
    Nr   r-   r   rj   r,   r~   rº   )r5   r‚   r9   r¼   )
rÂ   r¦   rÃ   r·   rÀ   rÁ   r�   rŽ   rQ   rŒ   s
             rC   rµ   rµ   3  sº   € ð Ð)‰V¨r�F€BˆØ�D€A€qØ�‰�aÑ˜R "™W¨Ñ3°{ÑBÑC€AØ�‰�Q˜˜kÑ)¨2°Ñ+<¸kÈ;ÐXZÓ[€AØ	�	‰	�!�Q˜˜1˜a Ó#×.Ñ.Ó0×5Ñ5°a¸¸RÀÓD€AØ	Š!ˆRˆaˆR��!�’Qˆ,‰×"Ñ"Ó$€AØ€HrE   c            H       ó  ‡ — 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 eeej                  d	¬«      ej                  ej                  eedd	d	ddddd
d
d
d
f#dededededededededededee   dededed ed!ed"ed#ed$ed%eej&                     d&eeej&                        d'eeej&                        d(eej&                     d)eej&                     d*ed+ed,ed-ed.eed/f   d0ed1ed2ee   d3eeeeef   eeef   f      fBˆ fd4„Zej.                  j0                  d5„ «       Zej.                  j0                  dId6„«       Zej.                  j0                  dJd7„«       Zej.                  j0                  d8ej&                  fd9„«       ZdKded1ee   fd:„Z	 	 	 	 	 dLd;ej<                  d<eeee e   f      d=ed>ed?ed@ed8ee ej<                     eej<                  e ej<                     f   f   fdA„Z!	 	 	 dMd<eeee e   f      dBedCefdD„Z"dE„ Z#dIdFefdG„Z$dH„ Z%ˆ xZ&S )Nr&   zâ Vision Transformer for Segment-Anything Model(SAM)

    A PyTorch impl of : `Exploring Plain Vision Transformer Backbones for Object Detection` or `Segment Anything Model (SAM)`
        - https://arxiv.org/abs/2010.11929
    é   é   rj   é   é   r    TFNr]   Ú )Ú
output_fmtÚstrict_img_sizeé   r«   é   ÚavgÚimg_sizeÚ
patch_sizeÚin_chansÚnum_classesÚ	embed_dimÚdepthr^   r¡   r_   r`   r¢   Úpre_normÚ	drop_rateÚpos_drop_rateÚpatch_drop_rateÚproj_drop_rateÚattn_drop_rateÚdrop_path_rateÚweight_initÚembed_layerrc   r¤   Úblock_fnr¥   Úuse_abs_posrd   Úuse_roper¦   Úglobal_attn_indexes.Ú
neck_chansÚglobal_poolÚhead_hidden_sizeÚref_feat_shapec$                 ó<  •— t         ‰+| �  «        |"|#dœ}$|xs t        t        j                  d¬«      }|xs t        j
                  }|| _        || _        || _        |x| _	        x| _
        | _        d| _         |d&||||| dœ|$¤Ž| _        | j                  j                  }%t        | j                  d«      r| j                  j!                  «       n|}&|r8t        j"                  t%        j&                  d|%d   |%d   |fi |$¤Ž«      | _        nd	| _        t        j*                  |¬
«      | _        |dkD  rt/        |d¬«      | _        nt        j2                  «       | _        |r	 ||fi |$¤Žnt        j2                  «       | _        |rt|rJ d«       ‚|!�-t7        |!«      dk(  sJ ‚t9        |!d   «      }'t9        |!d   «      }(nd	x}'}(t;        ||z  d|%|'¬«      | _        t;        ||z  dt9        |«      |(¬«      | _        nd	| _        d	| _        tA        ||«      })t        jB                  tE        |«      D �*cg c]]  }* |d&i d|“d|“d|“d|	“d|
“d|“d|“d|“d|)|*   “d|“d|“d|“d|“d|*|vr|nd“d|%“d|*|vr| j>                  n| j<                  “|$¤Ž‘Œ_ c}*Ž | _#        tE        |«      D �*cg c]  }*tI        d|*› �||&¬ «      ‘Œ c}*| _%        |rjt        jB                  t        jL                  ||fddd!œ|$¤ŽtO        |fi |$¤Žt        jL                  ||fd"ddd#œ|$¤ŽtO        |fi |$¤Ž«      | _(        || _	        n/| rt        j2                  «       | _(        ntO        |fi |$¤Ž| _(        |}| rtS        ||f| ||d$œ|$¤Ž| _*        y	tW        ||f||d%œ|$¤Ž| _*        y	c c}*w c c}*w )'a×  
        Args:
            img_size: Input image size.
            patch_size: Patch size.
            in_chans: Number of image input channels.
            num_classes: Number of classes for classification head.
            global_pool: Type of global pooling for final sequence (default: 'token').
            embed_dim: Transformer embedding dimension.
            depth: Depth of transformer.
            num_heads: Number of attention heads.
            mlp_ratio: Ratio of mlp hidden dim to embedding dim.
            qkv_bias: Enable bias for qkv projections if True.
            init_values: Layer-scale init values (layer-scale enabled if not None).
            drop_rate: Head dropout rate.
            pos_drop_rate: Position embedding dropout rate.
            attn_drop_rate: Attention dropout rate.
            drop_path_rate: Stochastic depth rate.
            weight_init: Weight initialization scheme.
            embed_layer: Patch embedding layer.
            norm_layer: Normalization layer.
            act_layer: MLP activation layer.
            block_fn: Transformer block layer.
            use_abs_pos: If True, use absolute positional embeddings.
            use_rel_pos: If True, add relative positional embeddings to the attention map.
            use_rope: If True, add rotary position embeddings to q/k in attention block.
            window_size: Window size for window attention blocks. If 0, not use window attention.
            global_attn_indexes: Indexes for blocks using global attention. Used when window_size > 0.
            global_pool: Global pooling type.
            head_hidden_size: If set, use NormMlpHead
            ref_feat_shape: Tuple of reference feature shapes for ROPE, (global, local)
        rh   g�íµ ÷Æ°>)ÚepsF)rÐ   rÑ   rÒ   rÔ   rk   Ú
feat_ratior   r   N)r‰   )Únum_prefix_tokenszCROPE and relative pos embeddings should not be enabled at same timer,   )Ú	in_pixelsÚ
feat_shaperæ   rS   r^   r¡   r_   r`   r¢   rb   ra   r£   rc   r¤   r¥   rd   r¦   re   rf   zblocks.)ÚmoduleÚnum_chsÚ	reduction)Úkernel_sizerk   rj   )rð   Úpaddingrk   )Úhidden_sizeÚ	pool_typer×   )ró   r×   r«   ),rl   rm   r   rp   r™   r¸   rÓ   rÒ   rä   Únum_featuresrå   rÔ   Úgrad_checkpointingÚpatch_embedÚ	grid_sizeÚhasattrré   rx   r:   ry   Ú	pos_embedrv   Úpos_dropr   Ú
patch_droprs   Únorm_preÚlenr   r   Úrope_globalÚrope_windowr   Ú
SequentialÚrangeÚblocksÚdictÚfeature_infoÚConv2dr   Úneckr   Úheadr   ),rz   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   r^   r¡   r_   r`   r¢   rÖ   r×   rØ   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rc   r¤   rß   r¥   rà   rd   rá   r¦   râ   rã   rä   rå   ræ   ri   r1   r{   r÷   ÚrÚref_feat_shape_globalÚref_feat_shape_windowÚdprÚir|   s,                                              €rC   rm   zVisionTransformerSAM.__init__Q  sm  ø€ ôJ 	‰ÑÔØ¨Ñ/ˆØÒB¤7¬2¯<©<¸TÔ#Bˆ
ØÒ(¤§¡ˆ	à&ˆÔØ ˆŒØ&ˆÔØENÐNˆÔÐN˜DÔ1°D´NØ"'ˆÔá&ð 
ØØ!ØØØ�ñ
ð ñ
ˆÔð ×$Ñ$×.Ñ.ˆ	Ü-4°T×5EÑ5EÀ|Ô-TˆD×Ñ×'Ñ'Ô)ÐZdˆáäŸ\™\¬%¯+©+°a¸À1¹ÀyÐQRÁ|ÐU^Ñ*eÐbdÑ*eÓfˆD�Nà!ˆDŒNÜŸ
™
 ]Ô3ˆŒØ˜QÒÜ*ØØ"#ôˆD�Oô
 !Ÿk™k›mˆDŒOÙ7?™
 9Ñ3°Ò3ÄRÇ[Á[Ã]ˆŒáÙ"ÐiÐ$iÓi�?ØÐ)Ü˜>Ó*¨aÒ/Ð/Ð/Ü(1°.ÀÑ2CÓ(DÐ%Ü(1°.ÀÑ2CÓ(DÑ%à@DÐDÐ%Ð(=Ü1Ø˜YÑ&ØØ$Ø4ô	 ˆDÔô  2Ø˜YÑ&ØÜ$ [Ó1Ø4ô	 ˆDÕð  $ˆDÔØ#ˆDÔô (¨¸Ó>ˆÜ—m‘mô( ˜5“\ö)&#ð( ñ' ò Ùðá#ðñ $ðñ "ð	ñ
  ðñ (ðñ )ðñ )ðð ˜aš&ðñ &ðñ $ðñ $ðñ (ðð ,-Ð4GÑ+G™KÈQøðñ %ðð  *+Ð2EÑ)E�T×%Ò%È4×K[ÑK[øØó#ò&#ð $ˆŒô, QVÐV[ÓP\ö^ØKLŒD˜' ! ˜¨yÀAÖFò^ˆÔñ ÜŸ™Ü—	‘	ØØðð !"Øñ	ð
 ñô ˜JÑ-¨"Ñ-Ü—	‘	ØØðð !"ØØñð ñô ˜JÑ-¨"Ñ-ó#ˆDŒIð& !+ˆDÕáÜŸK™K›M�•	ô (¨	Ñ8°RÑ8�”	Ø"ˆJñ Ü-ØØðð -Ø%Ø#ñð ñˆD�Iô 'ØØðð &Ø#ñ	ð
 ñˆD�IùòA&#ùò*^s   È2A"NÊ*Nc                 ó
   — ddhS )Nrù   Ú
dist_tokenr«   ©rz   s    rC   Úno_weight_decayz$VisionTransformerSAM.no_weight_decay  s   € à˜\Ð*Ð*rE   c                 ó    — t        dddg¬«      S )Nz^pos_embed|patch_embed)z^blocks\.(\d+)N)z^norm)iŸ† )Ústemr  )r  )rz   Úcoarses     rC   Úgroup_matcherz"VisionTransformerSAM.group_matcher!  s   € äØ*Ø-Ð/CÐDô
ð 	
rE   c                 ó   — || _         y ©N)rõ   )rz   Úenables     rC   Úset_grad_checkpointingz+VisionTransformerSAM.set_grad_checkpointing(  s
   € à"(ˆÕrE   r*   c                 ó   — | j                   S r  ©r  r  s    rC   Úget_classifierz#VisionTransformerSAM.get_classifier,  s   € à�y‰yÐrE   c                 óJ   — || _         | j                  j                  ||«       y r  )rÓ   r  Úreset)rz   rÓ   rä   s      rC   Úreset_classifierz%VisionTransformerSAM.reset_classifier0  s   € Ø&ˆÔØ�	‰	�‰˜ [Õ1rE   rŒ   ÚindicesÚnormÚ
stop_earlyrË   Úintermediates_onlyc                 ó€  — |dk(  sJ d«       ‚g }t        t        | j                  «      |«      \  }}	| j                  |«      }| j                  �&|t        | j                  |j                  dd «      z   }| j                  |«      }| j                  |«      }| j                  |«      }t        j                  j                  «       s|s| j                  }
n| j                  d|	dz    }
t        |
«      D ]¡  \  }}| j                  r+t        j                  j                  «       st        ||«      }n ||«      }||v sŒJ|r3|j!                  | j#                  |j%                  dddd«      «      «       Œ|j!                  |j%                  dddd«      «       Œ£ |r|S | j#                  |j%                  dddd«      «      }||fS )aè   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to all intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
        Returns:

        ÚNCHWz&Output shape for ViT-SAM must be NCHW.Nr   rj   r   r,   )r    rý   r  rö   rù   r   r5   rú   rû   rü   r:   ÚjitÚis_scriptingÚ	enumeraterõ   r"   Úappendr  r9   )rz   rŒ   r  r   r!  rË   r"  ÚintermediatesÚtake_indicesÚ	max_indexr  r  Úblks                rC   Úforward_intermediatesz*VisionTransformerSAM.forward_intermediates4  s–  € ð* ˜VÒ#ÐMÐ%MÓMÐ#ØˆÜ"6´s¸4¿;¹;Ó7GÈÓ"QÑˆ�ið ×Ñ˜QÓˆØ�>‰>Ð%àÔ/°·±ÀÇÁÈÈ!ÀÓMÑMˆAØ�M‰M˜!ÓˆØ�O‰O˜AÓˆØ�M‰M˜!Óˆä�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFÜ Ó'ò 	@‰FˆAˆsØ×&Ò&¬u¯y©y×/EÑ/EÔ/GÜ˜s AÓ&‘á˜“F�Ø�LÒ áð "×(Ñ(¨¯©°1·9±9¸QÀÀ1ÀaÓ3HÓ)IÕJà!×(Ñ(¨¯©°1°a¸¸AÓ)>Õ?ð	@ñ Ø Ð à�I‰I�a—i‘i  1 a¨Ó+Ó,ˆà�-ÐÐrE   Ú
prune_normÚ
prune_headc                 óÖ   — t        t        | j                  «      |«      \  }}| j                  d|dz    | _        |rt        j                  «       | _        |r| j                  dd«       |S )z@ Prune layers not required for specified intermediates.
        Nr   r   rÊ   )r    rý   r  rp   rs   r  r  )rz   r  r.  r/  r*  r+  s         rC   Úprune_intermediate_layersz.VisionTransformerSAM.prune_intermediate_layerso  s]   € ô #7´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iØ—k‘k . 9¨q¡=Ð1ˆŒÙäŸ™›ˆDŒIÙØ×!Ñ! ! RÔ(ØÐrE   c                 óÜ  — | j                  |«      }| j                  �&|t        | j                  |j                  dd «      z   }| j	                  |«      }| j                  |«      }| j                  |«      }| j                  r5t        j                  j                  «       st        | j                  |«      }n| j                  |«      }| j                  |j                  dddd«      «      }|S )Nr   rj   r   r,   )rö   rù   r   r5   rú   rû   rü   rõ   r:   r%  r&  r#   r  r  r9   ©rz   rŒ   s     rC   Úforward_featuresz%VisionTransformerSAM.forward_features€  s½   € Ø×Ñ˜QÓˆØ�>‰>Ð%àÔ/°·±ÀÇÁÈÈ!ÀÓMÑMˆAØ�M‰M˜!ÓˆØ�O‰O˜AÓˆØ�M‰M˜!ÓˆØ×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨AÓ.‰Aà—‘˜A“ˆAØ�I‰I�a—i‘i  1 a¨Ó+Ó,ˆØˆrE   Ú
pre_logitsc                 óN   — |r| j                  |d¬«      S | j                  |«      S )NT)r5  r  )rz   rŒ   r5  s      rC   Úforward_headz!VisionTransformerSAM.forward_head�  s$   € Ù0:ˆt�y‰y˜ tˆyÓ,ÐLÀÇ	Á	È!ÃÐLrE   c                 óJ   — | j                  |«      }| j                  |«      }|S r  )r4  r7  r3  s     rC   r“   zVisionTransformerSAM.forward’  s'   € Ø×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆrE   ©F)Tr  )NFFr$  F)NFT)'r”   r•   r–   Ú__doc__r   r   r   ÚNHWCrp   r™   r¸   rŸ   r   r3   rš   r—   r   Ústrr   r›   r   rm   r:   r%  Úignorer  r  r  r  r  ÚTensorr	   r   r-  r1  r4  r7  r“   rœ   r�   s   @rC   r&   r&   J  sì  ø„ ñð !Ø ØØ"Ø ØØØ!Ø!Ø!Ø+/Ø"Ø!Ø#%Ø%'Ø$&Ø$&Ø$&Ø!Ù+2°:È&Ï+É+ÐglÔ+mØ46·L±LØ35·7±7Ø(-Ø),Ø $Ø %Ø"Ø!Ø35Ø!Ø$Ø.2ØPTØØñIJàðJð ðJð ð	Jð
 ðJð ðJð ðJð ðJð ðJð ðJð ðJð " %™ðJð ðJð ðJð !ðJð  #ð!Jð" "ð#Jð$ "ð%Jð& "ð'Jð( ð)Jð* ˜bŸi™i™ð+Jð, !  b§i¡i¡Ñ1ð-Jð.    R§Y¡Y¡Ñ0ð/Jð0 ˜2Ÿ9™9‘oð1Jð2 ˜BŸI™I‘ð3Jð4 ð5Jð6 ð7Jð8 ð9Jð: ð;Jð< "' s¨C x¡ð=Jð> ð?Jð@ ðAJðB ' s™mðCJðD % U¨5°°c°©?¸EÀ#ÀsÀ(¹OÐ+KÑ%LÑMõEJðX ‡Y�Y×Ññ+ó ð+ð ‡Y�Y×Ñò
ó ð
ð ‡Y�Y×Ñò)ó ð)ð ‡Y�Y×Ñð §	¡	ò ó ðñ2¨Cð 2¸hÀs¹mó 2ð 8<ØØ$Ø$Ø',ñ9 à�|‰|ð9 ð ˜e C¨¨c© NÑ3Ñ4ð9 ð ð	9 ð
 ð9 ð ð9 ð !%ð9 ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó9 ðz 8<Ø$Ø#ñ	à˜e C¨¨c© NÑ3Ñ4ðð ðð ó	ò"ñM¨$ó MörE   c                 ó¤   — d| v }i }| j                  «       D ]6  \  }}|j                  d«      r|dd }|j                  dd«      }n|rŒ2|||<   Œ8 |S )z Remap SAM checkpoints -> timm z%image_encoder.patch_embed.proj.weightzimage_encoder.rÍ   Nzmlp.linzmlp.fc)ÚitemsÚ
startswithÚreplace)Ú
state_dictÚmodelÚsam_checkpointÚout_dictr�   r‘   s         rC   Úcheckpoint_filter_fnrG  ˜  sm   € ð
 =À
ÐJ€NØ€HØ× Ñ Ó"ò ‰ˆˆ1Ø�<‰<Ð(Ô)Ø�"�#�ˆAØ—	‘	˜) XÓ.‰AáØØˆ�Šðð €OrE   c                 ó2   — | ddd dddt         t        dddœ|¥S )	Néè  ©rj   rÆ   rÆ   çÍÌÌÌÌÌì?ÚbicubicTzpatch_embed.projzhead.fc)ÚurlrÓ   re   Ú	pool_sizeÚcrop_pctÚinterpolationÚfixed_input_sizeÚmeanÚstdÚ
first_convÚ
classifier)r   r   )rM  Úkwargss     rC   Ú_cfgrW  ª  s2   € àØ¨?ÈØ¨ÈÜ'Ô0FØ(¸	ñð ðð rE   zDhttps://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pthztimm/z
apache-2.0rJ  r2   )rM  Ú	hf_hub_idÚlicenserR  rS  rÓ   re   rO  zDhttps://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pthzDhttps://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pthrI  )rj   éà   rZ  rK  )rR  rS  rÓ   re   rO  )zsamvit_base_patch16.sa1bzsamvit_large_patch16.sa1bzsamvit_huge_patch16.sa1bÚsamvit_base_patch16_224c                 ón   — |j                  dd«      }t        t        | |ft        t	        |d¬«      dœ|¤ŽS )NÚout_indicesrj   Úgetter)r]  Úfeature_cls)Úpretrained_filter_fnÚfeature_cfg)Úpopr   r&   rG  r  )ÚvariantÚ
pretrainedrV  r]  s       rC   Ú_create_vision_transformerre  Ñ  sF   € Ø—*‘*˜]¨AÓ.€KÜÜØØðô 2Ü [¸hÔGñð ñð rE   c           
      ó`   — t        ddddg d¢ddd¬«      }t        	 d
d	| it        |fi |¤Ž¤Ž}|S )z# ViT-B/16 for Segment-Anything
    rÇ   rÈ   rÉ   ©r,   rº   r\   é   rÍ   TrÆ   ©rÑ   rÔ   rÕ   r^   râ   r¦   rd   rÐ   rd  )Úsamvit_base_patch16©r  re  ©rd  rV  Ú
model_argsrD  s       rC   rj  rj  Ý  sR   € ô Ø ¨B¸"ÒR_Ø D°4ô€Jô 'ØñTØ*4ðTÜ8<¸ZÑ8RÈ6Ñ8RñT€Eà€LrE   c           
      ó`   — t        ddddg d¢ddd¬«      }t        	 d	d| it        |fi |¤Ž¤Ž}|S )
z# ViT-L/16 for Segment-Anything
    rÇ   rÆ   é   )rº   rh  é   é   rÍ   Tri  rd  )Úsamvit_large_patch16rk  rl  s       rC   rr  rr  ê  sR   € ô Ø ¨R¸2ÒSbØ D°4ô€Jô 'ØñUØ+5ðUÜ9=¸jÑ9SÈFÑ9SñU€Eà€LrE   c           
      ó`   — t        ddddg d¢ddd¬«      }t        	 d
d	| it        |fi |¤Ž¤Ž}|S )z# ViT-H/16 for Segment-Anything
    rÇ   i   é    )é   é   rq  é   rÍ   TrÆ   ri  rd  )Úsamvit_huge_patch16rk  rl  s       rC   rx  rx  ÷  sR   € ô Ø ¨R¸2ÒSbØ D°4ô€Jô 'ØñTØ*4ðTÜ8<¸ZÑ8RÈ6Ñ8RñT€Eà€LrE   c                 ód   — t        ddddg d¢ddddd	¬
«
      }t        	 dd| it        |fi |¤Ž¤Ž}|S )z# ViT-B/16 based on samvit arch
    rÇ   rÈ   rÉ   rg  rÍ   TFrZ  N)
rÑ   rÔ   rÕ   r^   râ   r¦   rd   rà   rÐ   rã   rd  )r[  rk  rl  s       rC   r[  r[    sW   € ô Ø ¨B¸"ÒR_Ø D°eÀcÐVZô€Jô 'Ø!ñXØ.8ðXÜ<@ÀÑ<VÈvÑ<VñX€Eà€LrE   r  )rÊ   r9  )Jr:  ÚloggingÚ	functoolsr   Útypingr   r   r   r   r   r	   r:   Útorch.nnrp   Útorch.nn.functionalr†   r6   Ú	timm.datar
   r   r   r   Útimm.layersr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú	torch.jitr   Ú_builderr   Ú	_featuresr    Ú_features_fxr!   Ú_manipulater"   r#   Ú	_registryr$   r%   Ú__all__Ú	getLoggerr”   Ú_loggerr3   r>  rD   rX   r›   rZ   rŸ   r´   rµ   r&   rG  rW  Údefault_cfgsre  rj  rr  rx  r[  r«   rE   rC   ú<module>r‹     sÔ  ðñ
ó Ý ß ?× ?ã Ý ß Ð ß rÓ r÷÷ ÷ ÷ ñ õ" å *Ý +Ý 3ß 3ß <ð "Ð
"€ð ˆ'×
Ñ
˜HÓ
%€ð3˜ð 3 Sð 3°5·<±<ð 3ÀEÇLÁLó 3ñ@ ˜+Ô &ð7Ø�<‰<ð7à—<‘<ð7ð —<‘<ð7ð �c˜3�h‘ð	7ð
 �c˜3�h‘ð7ð ‡\�\ó7ôDQ�—	‘	ô QôhLˆB�I‰Iô Lð^˜Ÿ™ð °3ð ¸5ÀÇÁÈuÐUXÐZ]ÐU]ÉÐA^Ñ;_ó ð0 gkñØ�\‰\ðØ(+ðØ16°s¸C°x±ðØJRÐSXÐY\Ð^aÐYaÑSbÑJcðà
‡\�\óô.K˜2Ÿ9™9ô Kò\
ó$ñ %ñ !%ØRØØØ"Ð(<È!Ø"¨Sô!2ñ "&ØRØØØ"Ð(<È!Ø"¨Sô"2ñ !%ØRØØØ"Ð(<È!Ø"¨Sô!2ñ  $Ø"Ð(<È$Ø ¨3ô 0ñ-&ó €ó8	ð ñ	Ð7Kò 	ó ð	ð ñ	Ð8Lò 	ó ð	ð ñ	Ð7Kò 	ó ð	ð ñ	Ð;Oò 	ó ñ	rE   