+
    UV-jë  ã                   óz  € R t ^ RIt^ RIHt ^ RIHt ^ RIHtHtH	t	H
t
Ht ^ RIHt ^ RIHt ^ RIt^ RIHt ] ! R R4      4       t] ! R R	4      4       t ! R
 R4      t ! R R4      tRUR R lltR R ltR R ltRVR R llt ! R R4      tR R ltR R ltRWR R llt R R lt!RXR  R! llt"R" R# lt#RWR$ R% llt$. RYOt%RZR& lt&R[R' R( llt'R\R) R* llt(R]R+ lt)R, t*/ R-R.bR/R0bR1R2bR3R4bR5R6bR7R8bR9R:bR;R<bR=R>bR?R@bRARBbRCRDbRERFbRGRHbRIRJbRKRLbt+R^RM RN llt,RO RP lt-R_RQ RR llt.RS t/]0RT8X  d
   ]/! 4        R# R# )`a‚  SAM3 Inference Pipeline: detection, segmentation, and video tracking.

Usage:
    # Python API
    from mlx_vlm.models.sam3.generate import Sam3Predictor, Sam3VideoPredictor

    predictor = Sam3Predictor(model, processor)
    result = predictor.predict(image, text_prompt="a dog")

    # Video tracking CLI
    python -m mlx_vlm.models.sam3.generate --video input.mp4 --prompt "a car"
N)Ú	dataclass)ÚPath)ÚDictÚListÚOptionalÚTupleÚUnion©ÚImagec                   ó8   a € ] tR t^t o RtRtRtV 3R ltRtV t	R# )ÚDetectionResultzSingle detection result.Nc                óÖ   <€ V ^8„  d   Qh/ S[ P                  ;R&   S[ P                  ;R&   S[ P                  ;R&   S[S[S[,          ,          ;R&   S[S[ P                  ,          ;R&   # )é   ÚboxesÚmasksÚscoresÚlabelsÚ	track_ids)ÚnpÚndarrayr   r   Ústr)ÚformatÚ__classdict__s   "€Úm/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_vlm/models/sam3/generate.pyÚ__annotate__ÚDetectionResult.__annotate__   sd   ø‡ ‚ ñ �:‰:Ññ	 ñ
 �:‰:Ññ ñ �J‰JÑñ ñ ‘T™#•YÕÑ&ñ ñ ™Ÿ
™
Õ#Ñ*ò ó    © )
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__©r   s   @r   r   r      s   ø‡ € á"ð
 #'€FØ&*€I÷ ƒ r   r   c                   ó4   a € ] tR t^$t o RtRtV 3R ltRtV tR# )ÚTrackingResultzPer-frame tracking result.Nc                ó‚   <€ V ^8„  d   Qh/ S[ ;R&   S[P                  ;R&   S[P                  ;R&   S[S[ ,          ;R&   # )r   Ú	frame_idxr   r   Ú
object_ids)Úintr   r   r   )r   r   s   "€r   r   ÚTrackingResult.__annotate__$   sD   ø‡ ‚ ñ �Nñ	 ñ
 �:‰:Ññ ñ �J‰JÑñ ñ ‘S•	Ñ ò r   r   )	r   r   r    r!   r"   r+   r#   r$   r%   r&   s   @r   r(   r(   $   s   ø‡ € á$ð
 !€J÷ ƒ r   r(   c                   óh   a € ] tR t^.t o RtR
V 3R lR lltV 3R lR lt]V 3R lR l4       tRt	V t
R	# )ÚSimpleTrackerzBAssigns stable IDs to detections across frames using IoU matching.c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Úiou_thresholdÚmax_lost)Úfloatr,   )r   r   s   "€r   r   ÚSimpleTracker.__annotate__1   s   ø€ ÷ ñ ¡eð ¹Sñ r   c                ó:   € Wn         W n        ^ V n        / V n        R# ©é    N)r1   r2   Ú_next_idÚ_tracks)Úselfr1   r2   s   &&&r   Ú__init__ÚSimpleTracker.__init__1   s   € Ø*ÔØ ŒØˆŒØˆŽr   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r   ÚresultÚreturn)r   )r   r   s   "€r   r   r4   7   s   ø€ ÷ ,ñ ,™_ð ,±ñ ,r   c                ó>  € \        VP                  4      ^ 8X  d}   \        V P                  4       Fa  pV P                  V,          R;;,          ^,          uu&   V P                  V,          R,          V P                  8”  g   KT  V P                  V Kc  	  V# VP
                  p\        V P                  P                  4       4      p\        P                  ! \        V4      R\        R7      pV'       dæ   \        P                  ! V Uu. uF  q`P                  V,          R,          NK  	  up4      pV P                  W74      p\        \        \        V4      \        V4      4      4       Fl  p	\        P                  ! \        P                  ! V4      VP                   4      w  r«WŠV3,          V P"                  8  d    MWK,          WZ&   RWŠR3&   RVRV3&   Kn  	  \%        WU^ 8¬  ,          4      pV F  pW,9   d   ^ V P                  V,          R&   K!  V P                  V,          R;;,          ^,          uu&   V P                  V,          R,          V P                  8”  g   Kr  V P                  V K�  	  . p\        \        V4      4       Fq  p
WZ,          ^ 8¼  d   \        WZ,          4      pM%V P&                  pV ;P&                  ^,          un        RW:,          R^ /V P                  V&   VP)                  V4       Ks  	  \        P*                  ! V4      Vn        V# u upi )r7   Úlost©ÚdtypeÚboxºNNNéÿÿÿÿ)Úlenr   Úlistr9   r2   r   Úkeysr   Úfullr,   ÚstackÚ_box_iouÚrangeÚminÚunravel_indexÚargmaxÚshaper1   Úsetr8   ÚappendÚarrayr   )r:   r>   ÚtidÚ	new_boxesr   ÚassignedÚtÚ	old_boxesÚiousÚ_ÚiÚjÚmatched_track_idsÚidss   &&            r   ÚupdateÚSimpleTracker.update7   sS  € Üˆv�}‰}Ó Ô"Ü˜DŸL™LÖ)�Ø—‘˜SÕ! &×)¨QÕ.Ó)Ø—<‘< Õ$ VÕ,¨t¯}©}Ö<ØŸ™ SÒ)ñ *ð ˆMà—L‘Lˆ	Ü˜Ÿ™×*Ñ*Ó,Ó-ˆ	Ü—7’7œ3˜y›>¨2´SÔ9ˆçÜŸšÁ)Ó!LÁ)¸Q§,¡,¨q¥/°%×"8Ð"8Á)Ñ!LÓMˆIØ—=‘= Ó6ˆDäœ3œs 9›~¬s°9«~Ó>Ö?�Ü×'Ò'¬¯	ª	°$«¸¿¹ÓD‘�Ø˜1˜•: × 2Ñ 2Ô2ÙØ'�l�‘Ø�˜�T‘
Ø��Q˜�T“
ñ @ô   °Q©Õ 7Ó8ÐÛˆCØÔ'Ø,-�—‘˜SÕ! &Ó)à—‘˜SÕ! &×)¨QÕ.Ó)Ø—<‘< Õ$ VÕ,¨t¯}©}Ö<ØŸ™ SÒ)ñ ð ˆÜ”s˜9“~Ö&ˆAØ�{˜aÔÜ˜(�+Ó&‘à—m‘m�Ø—’ Õ"•Ø!&¨	­°f¸aÐ @ˆD�L‰L˜ÑØ�J‰J�sŽOñ 'ô Ÿ8š8 C›=ˆÔØˆùò? "Ms   Ä"Lc                óh   <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[ P                  /# )r   ÚaÚbr?   ©r   r   )r   r   s   "€r   r   r4   f   s.   ø€ ÷ 	&ñ 	&‘B—J‘Jð 	&¡2§:¡:ð 	&±"·*±*ñ 	&r   c                óÎ  € \         P                  ! V R,          VR,          4      p\         P                  ! V R,          VR,          4      p\         P                  ! V R,          VR,          4      p\         P                  ! V R,          VR	,          4      p\         P                  ! ^ WB,
          4      \         P                  ! ^ WS,
          4      ,          pV R
,          V R,          ,
          V R,          V R,          ,
          ,          pVR
,          VR,          ,
          VR,          VR,          ,
          ,          pVR,          VR,          ,           V,
          p	WiR,           ,          # )rE   ç�íµ ÷Æ°>)rE   Nr7   )NrE   r7   )rE   Né   )NrE   rh   )rE   Nr   )NrE   r   )rE   Né   )NrE   ri   ©rE   r   ©rE   r7   ©rE   ri   ©rE   rh   )rE   N)NrE   )r   ÚmaximumÚminimum)
rc   rd   Úx1Úy1Úx2Úy2ÚinterÚa_areaÚb_areaÚunions
   &&        r   rL   ÚSimpleTracker._box_ioue   sò   € ä�ZŠZ˜˜*� q¨¥}Ó5ˆÜ�ZŠZ˜˜*� q¨¥}Ó5ˆÜ�ZŠZ˜˜*� q¨¥}Ó5ˆÜ�ZŠZ˜˜*� q¨¥}Ó5ˆÜ—
’
˜1˜b�gÓ&¬¯ª°A°rµwÓ)?Õ?ˆØ�D•'˜A˜d�GÕ#¨¨$­°!°Dµ'Õ(9Õ:ˆØ�D•'˜A˜d�GÕ#¨¨$­°!°Dµ'Õ(9Õ:ˆØ�w• &¨¥/Õ1°EÕ9ˆØ �Õ%Ð%r   )r8   r9   r1   r2   N)ç333333Ó?é
   )r   r   r    r!   r"   r;   r`   ÚstaticmethodrL   r$   r%   r&   s   @r   r/   r/   .   s1   ø‡ € ÙL÷ò ÷,ð ,ð\ ÷	&ó ö	&r   r/   c                   óx   a € ] tR t^rt o RtRV 3R lR lltV 3R lR ltRV 3R lR lltRV 3R	 lR
 lltRt	V t
R# )ÚSam3Predictorz#Image-level segmentation predictor.c                ó    <€ V ^8„  d   QhRS[ /# ©r   Úscore_threshold©r3   )r   r   s   "€r   r   ÚSam3Predictor.__annotate__u   s   ø€ ÷ ñ ¹%ñ r   c                ó8   € Wn         W n        W0n        / V n        R # ©N)ÚmodelÚ	processorr€   Ú_text_cache©r:   r…   r†   r€   s   &&&&r   r;   ÚSam3Predictor.__init__u   s   € ØŒ
Ø"ŒØ.ÔØˆÖr   c                ó    <€ V ^8„  d   QhRS[ /# )r   Útext_prompt)r   )r   r   s   "€r   r   r‚   {   s   ø€ ÷ 
-ñ 
-±ñ 
-r   c                óL  € WP                   9  dƒ   V P                  P                  V4      p\        P                  ! VR,          4      p\        P                  ! VR,          4      pV P
                  P                  W44      w  rTWT3V P                   V&   V P                   V,          # )z>Get text features, using cache if same prompt was seen before.Ú	input_idsÚattention_mask)r‡   r†   Úpreprocess_textÚmxrT   r…   Úget_input_embeddings)r:   r‹   Útext_inputsr�   rŽ   Úinputs_embedss   &&    r   Ú_get_input_embeddingsÚ#Sam3Predictor._get_input_embeddings{   s‰   € à×.Ñ.Ô.ØŸ.™.×8Ñ8¸ÓEˆKÜŸš ¨[Õ!9Ó:ˆIÜŸXšX kÐ2BÕ&CÓDˆNØ,0¯J©J×,KÑ,KØó-Ñ)ˆMð .;Ð,KˆD×Ñ˜[Ñ)Ø×Ñ Õ,Ð,r   Nc          
      óª   <€ V ^8„  d   QhRS[ S[P                  S[P                  3,          RS[RS[S[P                  ,          RS[S[,          RS[/# )r   Úimager‹   r   r€   r?   )r   r
   r   r   r   r   r3   r   )r   r   s   "€r   r   r‚   ‡   s\   ø€ ÷ 1
ñ 1
á‘U—[‘[¡"§*¡*Ð,Õ-ð1
ñ ð1
ñ ™Ÿ
™
Õ#ð	1
ñ
 "¡%�ð1
ñ 
ñ1
r   c                ó"  € T;'       g    V P                   pV P                  P                  V4      p\        P                  ! VR,          4      pV P                  V4      w  r‰Rp
Ve   \        P                  ! V4      R,          p
V P                  P                  VV	V
VR7      p\        P                  ! V4       T P                  T\        V\        P                  4      '       d   VP                  VR7      # VP                  R,          VR7      # )uÏ  Run detection + segmentation on a single image.

Text encoding is cached â€” repeated calls with the same prompt
skip the text encoder entirely (~10ms saved per call).

Args:
    image: PIL Image or numpy array (H, W, 3)
    text_prompt: text description of objects to detect
    boxes: optional (N, 4) box prompts in xyxy format
    score_threshold: confidence threshold (default: self.score_threshold)
Returns:
    DetectionResult with boxes, masks, and scores
Úpixel_valuesN)rŽ   r   r“   ºNr   N)Ú
image_sizeÚ	threshold)r€   r†   Úpreprocess_imager�   rT   r”   r…   ÚdetectÚevalÚ_postprocessÚ
isinstancer
   ÚsizerQ   )r:   r—   r‹   r   r€   rœ   Úinputsr™   r“   rŽ   Ú	box_inputÚoutputss   &&&&&       r   ÚpredictÚSam3Predictor.predict‡   sÿ   € ð( $×;Ð; t×';Ñ';ˆ	ð —‘×0Ñ0°Ó7ˆÜ—x’x  ~Õ 6Ó7ˆð )-×(BÑ(BÀ;Ó(OÑ%ˆàˆ	ØÒÜŸš ›¨Õ-ˆIð —*‘*×#Ñ#ØØ)ØØ'ð	 $ó 
ˆô 	�Š�Ôð × Ñ Øä(¨´·±×<Ò<�—
‘
àð !ó 
ð 	
ð CHÇ+Á+ÈbÅ/àð !ó 
ð 	
r   c                ór   <€ V ^8„  d   QhRS[ S[S[P                  3,          RS[S[S[3,          RS[RS[/# )r   r¥   r›   rœ   r?   )r   r   r�   rT   r   r,   r3   r   )r   r   s   "€r   r   r‚   º   sH   ø€ ÷ 1
ñ 1
á‘c™2Ÿ8™8�mÕ$ð1
ñ ™#™s˜(•Oð1
ñ ð	1
ñ
 
ñ1
r   c           
     ó$  € \         P                  ! VR,          ^ ,          4      p\         P                  ! VR,          ^ ,          4      p\         P                  ! VR,          ^ ,          4      p\        V4      P                  4       pRV9   dA   VR,          e6   \        \         P                  ! VR,          ^ ,          4      4      pWx,          pWs8„  p	Wy,          pWY,          p
Wi,          p\	        V4      ^ 8X  dY   \        \         P                  ! R4      \         P                  ! ^ .VRRR	1,          O54      \         P                  ! R
4      R7      # \        V\        4      '       d   \	        V4      ^8X  d   Vw  rÍMVw  rÜV
R^ ^.3;;,          V,          uu&   V
R^^.3;;,          V,          uu&   \         P                  ! V
^ \        WÜ4      4      p
T
p\        W½V34      pV^ 8„  P                  \         P                  4      p\        VVVR7      # )z1Post-process model outputs into final detections.Úpred_logitsÚ
pred_boxesÚ
pred_masksÚpresence_logitsN©r   r   r   rE   ©r7   é   rF   ©r7   )r   rT   Ú_sigmoidÚsqueezerG   r   Úzerosr¡   ÚtupleÚclipÚmaxÚ_resize_masksÚastypeÚuint8)r:   r¥   r›   rœ   rª   r«   r¬   r   ÚpresÚkeepr   r   ÚWÚHÚ
boxes_xyxyÚmasks_resizedÚmasks_binarys   &&&&             r   r    ÚSam3Predictor._postprocessº   s»  € ô —h’h˜w }Õ5°aÕ8Ó9ˆÜ—X’X˜g lÕ3°AÕ6Ó7ˆ
Ü—X’X˜g lÕ3°AÕ6Ó7ˆ
ä˜+Ó&×.Ñ.Ó0ˆØ Ô'¨GÐ4EÕ,FÒ,RÜœBŸHšH WÐ->Õ%?ÀÕ%BÓCÓDˆDØ•]ˆFð Ñ!ˆØ•ˆØÕ ˆØÕ ˆäˆv‹;˜!ÔÜ"Ü—h’h˜vÓ&Ü—h’h Ð5 J©t°¨tÕ$4Ñ5Ó6Ü—x’x “~ôð ô �j¤%×(Ò(¬S°«_ÀÔ-AØ‰DˆAˆqà‰DˆAð 	ˆa�!�Q�ˆi×˜AÕÓØˆa�!�Q�ˆi×˜AÕÓÜ—’˜˜q¤# a£)Ó,ˆØˆ
ô & e°¨VÓ4ˆØ%¨Ñ)×1Ñ1´"·(±(Ó;ˆäØØØô
ð 	
r   )r‡   r…   r†   r€   ©ç      à?©NN)r   r   r    r!   r"   r;   r”   r¦   r    r$   r%   r&   s   @r   r}   r}   r   s6   ø‡ € Ù-÷ò ÷
-ð 
-÷1
ò 1
÷f1
÷ 1
ð 1
r   r}   c          
      óª   € V ^8„  d   QhR\         R\        \        ,          R\        \        P
                  ,          R\        \        ,          R\        /# )r   Ú	predictorÚpromptsr   r€   r?   )r}   r   r   r   r   r   r3   r   )r   s   "r   r   r   î   sT   € ÷ rñ rÜðrô ”#�Yðrô ”B—J‘JÕð	rô
 œe•_ðrô ñrr   c           
     óâ	  € \        V4      ^8X  dv   V P                  VV^ ,          VVR7      p\        VP                  4      ^ 8”  d7   \        V4      pV^ ,          .\        VP                  4      ,          Vn        V# . Vn        V# V P
                  P                  V4      p\        P                  ! VR,          4      pV P                  P                  pVP                  V4      p	V	 U
u. uF  q¨P                  V
4      NK  	  pp
V	RR pVRR pVR,          pVP                  w  ppppVP                  VVV,          V4      pVR,          P                  VVV,          V4      p\        P                  ! VV4       T;'       g    V P                   p\#        VR4      '       d   VP$                  MVP                  R,          p. . . . 3w  ppppV EFk  pV P'                  V4      w  ppVP)                  VVVV4      p\        P                  ! V4       VP+                  VVVVVV3R7      w  pp p!V R,          p"V"R,          p#V"R,          p$V"R,          p%V"R,          p&\        P,                  ! V#V%^,          ,
          V$V&^,          ,
          V#V%^,          ,           V$V&^,          ,           .RR7      p'VP/                  VVV4      p(V(R,          P1                  R4      p)V!R,          p*VR,          p+VP3                  V+\5        V4      VVVR7      p,\        P                  ! V)V'V,V*4       R	V)P6                  ^8X  d   T)MV)R,          R
V'P6                  ^8X  d   T'MV'R,          RV,R,          RV*P6                  ^8X  d   T*MV*R,          /p-V P9                  V-VV4      p\        VP                  4      ^ 8”  g   EKã  \        V4      pVP;                  VP<                  4       VP;                  VP>                  4       VP;                  VP                  4       VPA                  V.\        VP                  4      ,          4       EKn  	  V'       g\   \C        \D        PF                  ! R4      \D        PF                  ! R\D        PH                  R7      \D        PF                  ! R4      . R7      # \C        \D        PJ                  ! V4      \D        PJ                  ! V4      \D        PJ                  ! V4      VR7      # u up
i )z–Run vision backbone ONCE, then text+DETR per prompt. Merge with labels.

For N prompts, cost = 1x ViT + Nx (text + DETR) instead of Nx full pipeline.
)r‹   r   r€   r™   Nr¢   rš   ©Úvision_featuresr“   Úvision_pos_encodingÚ	text_maskÚspatial_shape©Úaxis©Úencoder_hidden_statesÚprompt_featuresÚprompt_maskrª   r«   r¬   r­   rB   ©r   r   r   r   rF   ©.r7   ©.rh   ©.r   ©.ri   r¯   )r7   rh   rh   r±   )&rG   r¦   r   Únmsr   r†   r�   r�   rT   r…   Údetector_modelÚvision_encoderÚ_pos_encrQ   ÚreshaperŸ   r€   Úhasattrr¢   r”   Údetr_encoderÚdetr_decoderrK   Údot_product_scoringr³   Úmask_decoderrH   Úndimr    rS   r   r   Úextendr   r   r´   rº   Úconcatenate).rÇ   r—   rÈ   r   r€   r>   r£   r™   ÚdetÚfpn_featuresÚfeatÚfpn_posÚfpn_trimmedÚfpn_pos_trimmedÚencoder_featÚBÚH_fÚW_fÚDÚsrcÚpos_flatrœ   r›   Ú	all_boxesÚ	all_masksÚ
all_scoresÚ
all_labelsÚpromptr“   rŽ   ÚencodedÚhsÚ	ref_boxesr­   Úpred_boxes_cxcywhÚcxÚcyÚwÚhÚpred_boxes_xyxyÚ
all_logitsrª   ÚpresenceÚlast_hsÚseg_outr¥   s.   &&&&&                                         r   Úpredict_multir  î   s^  € ô ˆ7ƒ|�qÔØ×"Ñ"ØØ �
ØØ+ð	 #ó 
ˆô ˆv�}‰}Ó Ô!Ü˜“[ˆFØ$ Q�Z˜L¬3¨v¯}©}Ó+=Õ=ˆFŒMð ˆð ˆFŒMØˆð × Ñ ×1Ñ1°%Ó8€FÜ—8’8˜F >Õ2Ó3€Là
�/‰/×
(Ñ
(€CØ×%Ñ% lÓ3€LÙ.:Ó;©l d�|‰|˜DÖ!©l€GÐ;Ø˜s Ð#€KØ˜c˜r�l€Oà˜r•?€LØ!×'Ñ'�N€A€sˆC�Ø
×
Ñ
˜q #¨¥)¨QÓ
/€CØ˜rÕ"×*Ñ*¨1¨c°C­i¸Ó;€HÜ‡G‚GˆC�Ôà×<Ð< 9×#<Ñ#<€IÜ& u¨f×5Ò5�—’¸5¿;¹;Àr½?€Jà35°r¸2¸r°>Ñ0€Iˆy˜* jô ˆØ(1×(GÑ(GÈÓ(OÑ%ˆ�~à×"Ñ" 3¨°-ÀÓPˆÜ
�Š�Ôà),×)9Ñ)9Ø#Ø'Ø (Ø$Ø ˜*ð *:ó *
Ñ&ˆˆI�ð & b�MÐØ˜vÕ&ˆØ˜vÕ&ˆØ˜fÕ%ˆØ˜fÕ%ˆÜŸ(š(Ø�!�a•%�Z˜˜a !�e� R¨!¨a­%¥Z°°a¸!µeµÐ<À2ô
ˆð ×,Ñ,¨R°ÀÓOˆ
Ø  •n×,Ñ,¨RÓ0ˆØ" 2Õ&ˆà�R•&ˆØ×"Ñ"ØÜ�ÓØ")Ø)Ø&ð #ó 
ˆô 	�Š�˜_¨g°xÔ@ð ¨+×*:Ñ*:¸aÔ*?™;À[ÐQUÕEVØØ#2×#7Ñ#7¸1Ô#<‘À/ÐRVÕBWà˜' ,Õ/Ø¨8¯=©=¸AÔ+=™xÀ8ÈDÅ>ð
ˆð ×'Ñ'¨°¸YÓGˆÜˆv�}‰}Ó ×!Ü˜“[ˆFØ×Ñ˜VŸ\™\Ô*Ø×Ñ˜VŸ\™\Ô*Ø×Ñ˜fŸm™mÔ,Ø×Ñ˜v˜h¬¨V¯]©]Ó);Õ;×<ñi ÷l ÜÜ—(’(˜6Ó"Ü—(’(˜9¬B¯H©HÔ5Ü—8’8˜D“>Øô	
ð 	
ô Ü�nŠn˜YÓ'Ü�nŠn˜YÓ'Ü�~Š~˜jÓ)Øô	ð ùò] <s   Ã)S,c                óX   € V ^8„  d   QhR\         P                  R\         P                  /# )r   r™   r?   ©r�   rT   )r   s   "r   r   r   c  s"   € ÷ ñ ´·±ð ¼R¿X¹Xñ r   c                ó|   € V P                   P                  P                  V4      p\        P                  ! V4       V# )z$Run ViT backbone only (no FPN neck).)rÛ   rÜ   Úbackboner�   rŸ   )r…   r™   Úfeaturess   && r   Ú_get_backbone_featuresr  c  s/   € à×#Ñ#×2Ñ2×;Ñ;¸LÓI€HÜ‡G‚GˆHÔØ€Or   c                ó8   € V ^8„  d   QhR\         P                  /# )r   Úbackbone_featuresr  )r   s   "r   r   r   j  s   € ÷ 2ñ 2´·±ñ 2r   c                ó‚  € V P                   pVP                  P                  V4      pV Uu. uF  qBP                  V4      NK  	  ppVRR pVR,          pVP                  w  r‰r«VP                  W‰V
,          V4      pVRR R,          P                  W‰V
,          V4      p\        P                  ! WÍ4       WÍWiV
33# u upi )zORun FPN neck + flatten for DETR. Returns (src, pos_flat, fpn_trimmed, spatial).NrF   )rÛ   rÜ   ÚneckrÝ   rQ   rÞ   r�   rŸ   )r…   r  rç   rè   ré   rê   rë   rí   rî   rï   rð   rñ   rò   ró   s   &&            r   Ú_get_det_featuresr  j  sº   € à
×
Ñ
€CØ×%Ñ%×*Ñ*Ð+<Ó=€LÙ.:Ó;©l d�|‰|˜DÖ!©l€GÐ;Ø˜s Ð#€Kà˜r•?€LØ!×'Ñ'�N€AˆCØ
×
Ñ
˜q¨¥)¨QÓ
/€CØ�s˜ˆ|˜BÕ×'Ñ'¨°­9°aÓ8€HÜ‡G‚GˆCÔØ˜+¨S zÐ1Ð1ùò <s   ¬B<c                ó    € V ^8„  d   QhR\         R\        P                  R\        \        ,          R\
        R\        \        ,          R\        /# )r   rÇ   r  rÈ   rœ   Úencoder_cacher?   )	r}   r�   rT   r   r   r3   r   r   r   )r   s   "r   r   r   y  sX   € ÷ pñ pÜðpä—x‘xðpô ”#�Yðpô
 ðpô œD•>ðpô ñpr   c           	     ób	  € V P                   P                  p\        V P                   V4      w  rxršV
w  r¼\        V\        4      '       d   TMV^,          V^ ,          3w  rÞ. . . . 3w  ppppV EF�  pV P                  V4      w  ppVe   VP                  V4      MRpVe   VR,          pM4VP                  WxVV4      p\        P                  ! V4       Ve   RV/VV&   VP                  VVVVW¼3R7      w  pppVR
,          pVR,          VR,          VR,          VR,          3w  pppp\        P                  ! VV^,          ,
          VV^,          ,
          VV^,          ,           VV^,          ,           .R
R7      p VP                  VVV4      p!V!R
,          P                  R
4      p"VR
,          p#VR
,          p$VP                  V$\        V	4      VVVR7      p%\        P                   ! V"^ ,          P                  4       4      p&V#e%   V&\        P                   ! V#^ ,          4      ,          p&V ^ ,          \        P"                  ! WÞWÞ.V P$                  R7      ,          p'\        P&                  ! V'^ \)        Wí4      4      p'\        P                  ! V&V'V%4       \*        P"                  ! V&4      p(V(V8„  p)V)P-                  4       '       g   EK^  \*        P"                  ! V'4      V),          p*\*        P"                  ! V%R,          ^ ,          4      V),          p+\/        V+Wí34      p,V,^ 8„  P1                  \*        P2                  4      p-\5        V*V-V(V),          R7      p.\7        V.P8                  4      ^ 8”  g   EK  \;        V.4      p.VP=                  V.P>                  4       VP=                  V.P@                  4       VP=                  V.P8                  4       VPC                  V.\7        V.P8                  4      ,          4       EK’  	  V'       g^   \5        \*        PD                  ! R4      \*        PD                  ! ^ Wí3\*        P2                  R7      \*        PD                  ! R4      . R	7      # \5        \*        PF                  ! V4      \*        PF                  ! V4      \*        PF                  ! V4      VR	7      # )z®Run detection on pre-computed backbone features.

With encoder_cache: skips DETR encoder when backbone + text are unchanged.
All scoring stays in MLX until final conversion.
Nrù   rÊ   rÏ   rÑ   rB   r¬   r®   rÕ   rF   rÖ   r×   rØ   rÙ   r¯   r±   )$r…   rÛ   r  r¡   rµ   r”   Úgetrà   r�   rŸ   rá   rK   râ   r³   rã   rH   ÚsigmoidrT   rC   r¶   r·   r   Úanyr¸   r¹   rº   r   rG   r   rÚ   rS   r   r   rå   r´   ræ   )/rÇ   r  rÈ   r›   rœ   r  rç   rò   ró   rë   Úspatialrï   rð   r½   r¾   rô   rõ   rö   r÷   rø   r“   rŽ   Úcachedrù   rú   rû   r­   rü   rý   rþ   rÿ   r   r  r  rª   r  r  r  r   r   Ú	scores_npr¼   Úboxes_npÚmasks_nprÀ   rÁ   r>   s/   &&&&&&                                         r   Ú_detect_with_backboner  y  sÿ  € ð �/‰/×
(Ñ
(€CÜ*;Ø�‰Ð*ó+Ñ'€C�;ð �H€Cô ! ¬U×3Ò3‰
¸*ÀQ½-ÈÐTUÍÐ9Wñ 	€Að 46°r¸2¸r°>Ñ0€Iˆy˜* jÜˆØ(1×(GÑ(GÈÓ(OÑ%ˆ�~ð /<Ò.G�×"Ñ" 6Ô*ÈTˆØÒØ˜YÕ'‰Gà×&Ñ& s°mÀ^ÓTˆGÜ�GŠG�GÔØÒ(Ø)2°GÐ(<�˜fÑ%à),×)9Ñ)9Ø#Ø'Ø (Ø$Ø˜*ð *:ó *
Ñ&ˆˆI�ð & b�MÐà˜fÕ%Ø˜fÕ%Ø˜fÕ%Ø˜fÕ%ð	
‰ˆˆB��1ô Ÿ(š(Ø�!�a•%�Z˜˜a !�e� R¨!¨a­%¥Z°°a¸!µeµÐ<À2ô
ˆð ×,Ñ,¨R°ÀÓOˆ
Ø  •n×,Ñ,¨RÓ0ˆØ" 2Õ&ˆà�R•&ˆØ×"Ñ"ØÜ�ÓØ")Ø)Ø&ð #ó 
ˆô —’˜K¨�N×2Ñ2Ó4Ó5ˆØÒØœbŸjšj¨°!­Ó5Õ5ˆFØ Õ"¤R§X¢X¨q°Q¨lÀ/×BWÑBWÔ%XÕXˆÜ—’˜˜q¤# a£)Ó,ˆä
�Š�˜˜wÔ'ô —H’H˜VÓ$ˆ	Ø˜9Ñ$ˆØ�x‰x�zŠzÚä—8’8˜E“? 4Õ(ˆÜ—8’8˜G LÕ1°!Õ4Ó5°dÕ;ˆÜ% h°°Ó7ˆØ%¨Ñ)×1Ñ1´"·(±(Ó;ˆä Ø ,°yÀµô
ˆô ˆv�}‰}Ó ×!Ü˜“[ˆFØ×Ñ˜VŸ\™\Ô*Ø×Ñ˜VŸ\™\Ô*Ø×Ñ˜fŸm™mÔ,Ø×Ñ˜v˜h¬¨V¯]©]Ó);Õ;×<ñU ÷X ÜÜ—(’(˜6Ó"Ü—(’(˜A˜q˜9¬B¯H©HÔ5Ü—8’8˜D“>Øô	
ð 	
ô Ü�nŠn˜YÓ'Ü�nŠn˜YÓ'Ü�~Š~˜jÓ)Øô	ð r   c                   óì   a € ] tR tRt o RtRV 3R lR lltV 3R lR ltRV 3R lR	 lltRV 3R
 lR lltRV 3R lR llt	RV 3R lR llt
V 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltRtV tR# )ÚSam3VideoPredictoriì  z2Video-level tracking predictor using SAM3 tracker.c                ó    <€ V ^8„  d   QhRS[ /# r   r�   )r   r   s   "€r   r   ÚSam3VideoPredictor.__annotate__ï  s   ø€ ÷ 
!ñ 
!¹%ñ 
!r   c                óp   € Wn         W n        W0n        . V n        . V n        / V n        / V n        ^V n        R# )rh   N)r…   r†   r€   Ú_framesÚ_frame_featuresÚ_memory_bankÚ_object_promptsÚ_next_object_idrˆ   s   &&&&r   r;   ÚSam3VideoPredictor.__init__ï  s;   € ØŒ
Ø"ŒØ.Ôð ˆŒØ!ˆÔØˆÔØ!ˆÔØ ˆÖr   c                ón   <€ V ^8„  d   QhRS[ S[S[P                  S[P                  3,          ,          /# )r   Úframes)r   r   r
   r   r   )r   r   s   "€r   r   r!  û  s+   ø€ ÷ "ñ "¡¡U©5¯;©;¹¿
¹
Ð+BÕ%CÕ Dñ "r   c                ó^   € Wn         R.\        V4      ,          V n        / V n        / V n        R# )zSet video frames.N)r#  rG   r$  r%  r&  )r:   r*  s   &&r   Ú	set_videoÚSam3VideoPredictor.set_videoû  s*   € àŒØ $˜v¬¨F«Õ3ˆÔØˆÔØ!ˆÖr   Nc                óB   <€ V ^8„  d   QhRS[ RS[RS[S[,          RS[/# )r   Útextr*   Ú	object_idr?   )r   r,   r   )r   r   s   "€r   r   r!    s7   ø€ ÷ ñ áðñ ðñ ™C•=ð	ñ
 
ñr   c                ó‚   € Vf&   V P                   pV ;P                   ^,          un         RRRVRV/V P                  V&   V# )z`Add a text prompt to detect and track an object.

Returns:
    object_id for the tracked object
Útyper/  r*   ©r'  r&  )r:   r/  r*   r0  s   &&&&r   Úadd_text_promptÚ"Sam3VideoPredictor.add_text_prompt  sQ   € ð ÒØ×,Ñ,ˆIØ× Ò  AÕ%Õ ð �FØ�DØ˜ð+
ˆ×Ñ˜YÑ'ð
 Ðr   c          
      óp   <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[RS[S[,          RS[/# )r   Úpointsr   r*   r0  r?   ©r   r   r,   r   )r   r   s   "€r   r   r!    sI   ø€ ÷ ñ á—
‘
ðñ —
‘
ðñ ð	ñ
 ™C•=ðñ 
ñr   c                ó†   € Vf&   V P                   pV ;P                   ^,          un         RRRVRVRV/V P                  V&   V# )z Add point prompts for an object.r2  r7  r   r*   r3  )r:   r7  r   r*   r0  s   &&&&&r   Úadd_point_promptÚ#Sam3VideoPredictor.add_point_prompt  sV   € ð ÒØ×,Ñ,ˆIØ× Ò  AÕ%Õ ð �HØ�fØ�fØ˜ð	+
ˆ×Ñ˜YÑ'ð Ðr   c                óV   <€ V ^8„  d   QhRS[ P                  RS[RS[S[,          RS[/# )r   rD   r*   r0  r?   r8  )r   r   s   "€r   r   r!  ,  s;   ø€ ÷ ñ á�Z‰Zðñ ðñ ™C•=ð	ñ
 
ñr   c                ó‚   € Vf&   V P                   pV ;P                   ^,          un         RRRVRV/V P                  V&   V# )zAdd a box prompt for an object.r2  rD   r*   r3  )r:   rD   r*   r0  s   &&&&r   Úadd_box_promptÚ!Sam3VideoPredictor.add_box_prompt,  sQ   € ð ÒØ×,Ñ,ˆIØ× Ò  AÕ%Õ ð �EØ�3Ø˜ð+
ˆ×Ñ˜YÑ'ð
 Ðr   c                óL   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[,          /# )r   Ústart_frameÚ	end_framer?   )r,   r   r   r(   )r   r   s   "€r   r   r!  >  s7   ø€ ÷ Iñ IáðIñ ™C•=ðIñ 
‰nÕ	ñ	Ir   c           
     óž  € Vf   \        V P                  4      p. p\        W4       EF—  pV P                  V,          pV P                  V4      p/ p/ pV P                  P                  4        F‘  w  ršV
R,          V8X  d1   V P                  W–V
4      w  r¼W·V	&   WÈV	&   V P                  W–V4       KC  WJR,          8”  g   KR  W�P                  9   g   Kd  V P                  W–4      w  r¼W·V	&   WÈV	&   V P                  W–V4       K“  	  V'       dt   \        VP                  4       4      p\        P                  ! V Uu. uF  qçV,          NK  	  up4      p\        P                  ! V Uu. uF  qèV,          NK  	  up4      pEM#. p\        V P                  ^ ,          \         P                   4      '       d%   V P                  ^ ,          P"                  ^,          M#V P                  ^ ,          P$                  ^ ,          p\        V P                  ^ ,          \         P                   4      '       d%   V P                  ^ ,          P"                  ^ ,          M#V P                  ^ ,          P$                  ^,          p\        P&                  ! ^ VV34      p\        P&                  ! R4      pVP)                  \+        VVVVR7      4       EKš  	  V# u upi u upi )z]Propagate tracking through video frames.

Returns:
    List of TrackingResult, one per frame
r*   )r*   r   r   r+   r±   )rG   r#  rM   Ú_get_frame_featuresr&  ÚitemsÚ_init_objectÚ_update_memoryr%  Ú_track_objectÚsortedrI   r   rK   rT   r¡   r
   r¢   rQ   r´   rS   r(   )r:   rA  rB  Úresultsr*   Úframer  Úframe_masksÚframe_scoresÚobj_idrø   ÚmaskÚscoreÚobj_idsr\   rõ   rö   r¾   r½   s   &&&                r   Ú	propagateÚSam3VideoPredictor.propagate>  sP  € ð ÒÜ˜DŸL™LÓ)ˆIàˆä˜{×6ˆIØ—L‘L Õ+ˆEð ×/Ñ/°	Ó:ˆHð ˆKØˆLà"&×"6Ñ"6×"<Ñ"<Ö">‘�Ø˜+Õ&¨)Ô3à"&×"3Ñ"3°FÀfÓ"M‘K�DØ*. Ñ'Ø+0 Ñ(ð ×'Ñ'¨¸$Ö?à¨Õ!4Ö4¸×CTÑCTÖ9Tà"&×"4Ñ"4°VÓ"F‘K�DØ*. Ñ'Ø+0 Ñ(ð ×'Ñ'¨¸$Ö?ñ# #?÷( Ü  ×!1Ñ!1Ó!3Ó4�ÜŸHšH¹gÓ%F¹g¸°!§n n¹gÑ%FÓG�	ÜŸXšXÁÓ&HÁ¸1°A§ ÁÑ&HÓI’
à�ô " $§,¡,¨q¥/´5·;±;×?Ò?ð —L‘L •O×(Ñ(¨Ö+àŸ™ a�×.Ñ.¨qÕ1ð ô " $§,¡,¨q¥/´5·;±;×?Ò?ð —L‘L •O×(Ñ(¨Ö+àŸ™ a�×.Ñ.¨qÕ1ð ô
 ŸHšH a¨¨A YÓ/�	ÜŸXšX d›^�
à�N‰NÜØ'Ø#Ø%Ø&ô	÷ñc 7ðt ˆùò5 &GùÚ&Hs   Ä7K
Å#K

c                ó:   <€ V ^8„  d   QhRS[ RS[P                  /# )r   r*   r?   )r,   r�   rT   )r   r   s   "€r   r   r!  ‰  s   ø€ ÷ ñ ©Sð ±R·X±Xñ r   c                ó’  € V P                   V,          e   V P                   V,          # V P                  V,          pV P                  P                  V4      p\        P
                  ! VR,          4      pV P                  P                  P                  P                  V4      p\        P                  ! V4       WPP                   V&   V# )z-Get or compute backbone features for a frame.r™   )r$  r#  r†   r�   r�   rT   r…   rÛ   rÜ   r
  rŸ   )r:   r*   rK  r£   r™   r  s   &&    r   rD  Ú&Sam3VideoPredictor._get_frame_features‰  s˜   € à×Ñ 	Õ*Ò6Ø×'Ñ'¨	Õ2Ð2à—‘˜YÕ'ˆØ—‘×0Ñ0°Ó7ˆÜ—x’x  ~Õ 6Ó7ˆà—:‘:×,Ñ,×;Ñ;×DÑDÀ\ÓRˆÜ
�Š�ÔØ*2×Ñ˜YÑ'Øˆr   c          
      óp   <€ V ^8„  d   QhRS[ RS[P                  RS[RS[S[P                  S[3,          /# )r   rN  r  rø   r?   )r,   r�   rT   Údictr   r   r   r3   )r   r   s   "€r   r   r!  —  sK   ø€ ÷ O%ñ O%áðO%ñ —(‘(ðO%ñ ð	O%ñ
 
‰r�z‰z™5Ð Õ	!ñO%r   c                ó`	  € VR,          R8X  EdN   V P                   VR,          ,          pV P                  P                  V4      p\        P                  ! VR,          4      pVR,          p\        V R4      '       g   / V n        WpP                  9  dƒ   V P                  P                  V4      p\        P                  ! VR,          4      p	\        P                  ! VR,          4      p
V P                  P                  Wš4      w  r¼W¼3V P                  V&   V P                  V,          w  rÚV P                  P                  VV
VR7      p\        P                  ! V4       \        P                  ! VR	,          ^ ,          4      P                  4       p\        P                  ! VR
,          ^ ,          4      p\        V4      pRV9   dB   VR,          e7   \        \        P                  ! VR,          ^ ,          4      4      pVV,          p\        P                  ! V4      pVV,          ^ 8„  P!                  \        P"                  4      pVV,          pV\%        V4      3# VR,          R8X  Ed#   \        P                  ! VR,          4      R,          p\        P                  ! VR,          4      R,          pV P                  P'                  V4      pV^,          pV P                  P(                  P+                  VVV3R7      p\        P                  ! V4       \        P                  ! VR
,          R,          4      pV^ 8„  P!                  \        P"                  4      p\%        \        P                  ! VR,          R,          4      4      pVV3# VR,          R8X  dý   \        P                  ! VR,          4      R,          pV P                  P'                  V4      pV^,          pV P                  P(                  P+                  VVR7      p\        P                  ! V4       \        P                  ! VR
,          R,          4      pV^ 8„  P!                  \        P"                  4      p\%        \        P                  ! VR,          R,          4      4      pVV3# \        P,                  ! R4      R3# )z#Initialize an object from a prompt.r2  r/  r*   r™   r‡   r�   rŽ   )rŽ   r“   rª   r¬   r­   Nr7  r   )Úcurrent_featuresÚprompt_pointsÚ
iou_scoresrD   )rZ  Úprompt_boxesç        ©r7   r7   rÅ   )rh   rh   )r#  r†   r�   r�   rT   rß   r‡   r�   r…   r‘   rž   rŸ   r   r³   r²   rP   r¹   rº   r3   Útracker_neckÚtracker_modelÚ
track_stepr´   )r:   rN  r  rø   rK  r£   r™   r/  r’   r�   rŽ   ÚtfÚamr“   r¥   Úlogitsr   r   r»   Úbest_idxrO  rP  r7  r   Útracker_fpnÚtrack_featuresr>   rD   s   &&&&                        r   rF  ÚSam3VideoPredictor._init_object—  s£  € ð �&�>˜VÕ#à—L‘L ¨Õ!4Õ5ˆEØ—^‘^×4Ñ4°UÓ;ˆFÜŸ8š8 F¨>Õ$:Ó;ˆLð ˜&•>ˆDÜ˜4 ×/Ò/Ø#%�Ô Ø×+Ñ+Ô+Ø"Ÿn™n×<Ñ<¸TÓB�ÜŸHšH [°Õ%=Ó>�	Ü!#§¢¨+Ð6FÕ*GÓ!H�ØŸ™×8Ñ8¸ÓS‘�Ø*,¨�× Ñ  Ñ&Ø,0×,<Ñ,<¸TÕ,BÑ)ˆMà—j‘j×'Ñ'ØØ-Ø+ð (ó ˆGô
 �GŠG�GÔô —X’X˜g mÕ4°QÕ7Ó8×@Ñ@ÓBˆFÜ—H’H˜W \Õ2°1Õ5Ó6ˆEÜ˜fÓ%ˆFØ  GÔ+°Ð8IÕ0JÒ0VÜ¤§¢¨Ð1BÕ)CÀAÕ)FÓ GÓH�Ø $��Ü—y’y Ó(ˆHØ˜(•O aÑ'×/Ñ/´·±Ó9ˆDØ˜8Õ$ˆEØœ˜u›Ð%Ð%à�F�^˜xÕ'Ü—X’X˜f XÕ.Ó/°Õ5ˆFÜ—X’X˜f XÕ.Ó/°Õ5ˆFàŸ*™*×1Ñ1°(Ó;ˆKØ(¨�^ˆNà—Z‘Z×-Ñ-×8Ñ8Ø!/Ø% vÐ.ð 9ó ˆFô �GŠG�FŒOä—8’8˜F <Õ0°Õ6Ó7ˆDØ˜1‘H×$Ñ$¤R§X¡XÓ.ˆDÜœ"Ÿ(š( 6¨,Õ#7¸Õ#=Ó>Ó?ˆEØ˜�;Ðà�F�^˜uÔ$Ü—(’(˜6 %�=Ó)¨*Õ5ˆCàŸ*™*×1Ñ1°(Ó;ˆKØ(¨�^ˆNà—Z‘Z×-Ñ-×8Ñ8Ø!/Ø ð 9ó ˆFô �GŠG�FŒOä—8’8˜F <Õ0°Õ6Ó7ˆDØ˜1‘H×$Ñ$¤R§X¡XÓ.ˆDÜœ"Ÿ(š( 6¨,Õ#7¸Õ#=Ó>Ó?ˆEØ˜�;Ðä�xŠx˜Ó Ð$Ð$r   c                ój   <€ V ^8„  d   QhRS[ RS[P                  RS[S[P
                  S[3,          /# )r   rN  r  r?   )r,   r�   rT   r   r   r   r3   )r   r   s   "€r   r   r!  è  s;   ø€ ÷ ñ áðñ —(‘(ðñ 
‰r�z‰z™5Ð Õ	!ñ	r   c                ó4  € V P                   P                  V4      pV^,          p\        V4      ^8”  d   V^ ,          V^,          .MRpV P                  P	                  V. 4      pV P                   P
                  P                  VVRVR7      p\        P                  ! V4       \        P                  ! VR,          R,          4      pV^ 8„  P                  \        P                  4      p\        \        P                  ! VR,          R,          4      4      p	W‰3# )z"Track an object using memory bank.NF)rZ  Úmemory_bankÚmultimask_outputÚhigh_res_featuresr¬   r\  r_  )r…   r`  rG   r%  r  ra  rb  r�   rŸ   r   rT   r¹   rº   r3   )
r:   rN  r  rg  rh  Úhigh_resÚmemory_listr>   rO  rP  s
   &&&       r   rH  Ú Sam3VideoPredictor._track_objectè  sç   € ð —j‘j×-Ñ-¨hÓ7ˆØ$ Q�ˆÜ7:¸;Ó7GÈ!Ô7K�K •N K°¥NÑ3ÐQUˆà×'Ñ'×+Ñ+¨F°BÓ7ˆà—‘×)Ñ)×4Ñ4Ø+Ø#Ø"Ø&ð	 5ó 
ˆô 	�Š�Œä�xŠx˜˜|Õ,¨TÕ2Ó3ˆØ�q‘× Ñ ¤§¡Ó*ˆÜ”b—h’h˜v lÕ3°DÕ9Ó:Ó;ˆØˆ{Ðr   c                óT   <€ V ^8„  d   QhRS[ RS[P                  RS[P                  /# )r   rN  r  rO  )r,   r�   rT   r   r   )r   r   s   "€r   r   r!    s6   ø€ ÷ #Mñ #Máð#Mñ —(‘(ð#Mñ �j‰jñ	#Mr   c                óð  € WP                   9  d   . V P                   V&   V P                  P                  V4      pV^,          p\        P                  ! VP                  \        P                  4      4      R,          pRpVP                  ^,          V8w  g   VP                  ^,          V8w  dQ   \        P                  ! WvP                  ^,          ,          WvP                  ^,          ,          3RR7      pV! V4      pV P                  P                  P                  WV4      p	\        P                  ! V	4       V	P                  w  r«rÍV	P                  ^W¼,          V4      pV P                   V,          P                  V4       V P                  P                   P"                  P$                  p\'        V P                   V,          4      V8”  d'   V P                   V,          V) R V P                   V&   R# R# )z!Update memory bank for an object.Ni€  Únearest)Úscale_factorÚmode)NrE   rE   N)r%  r…   r`  r�   rT   r¹   r   Úfloat32rQ   ÚnnÚUpsamplera  Úmemory_encoderrŸ   rÞ   rS   ÚconfigÚtracker_configÚnum_maskmemrG   )r:   rN  r  rO  rg  rh  Úmask_mxÚtargetÚupÚmemoryÚB_mÚH_mÚW_mÚC_mÚmemory_flatÚmax_mems   &&&&            r   rG  Ú!Sam3VideoPredictor._update_memory  s�  € ð ×*Ñ*Ô*Ø(*ˆD×Ñ˜fÑ%à—j‘j×-Ñ-¨hÓ7ˆØ$ Q�ˆä—(’(˜4Ÿ;™;¤r§z¡zÓ2Ó3Ð4DÕEˆð ˆØ�=‰=˜Õ˜vÔ%¨¯©°qÕ)9¸VÔ)CÜ—’Ø$§}¡}°QÕ'7Õ7¸Ç-Á-ÐPQÕBRÕ9RÐSØôˆBñ ˜“kˆGà—‘×)Ñ)×8Ñ8¸ÓQˆÜ
�Š�ŒØ#Ÿ\™\Ñˆ�#Ø—n‘n Q¨­	°3Ó7ˆà×Ñ˜&Õ!×(Ñ(¨Ô5ð —*‘*×#Ñ#×2Ñ2×>Ñ>ˆÜˆt× Ñ  Õ(Ó)¨GÔ3Ø(,×(9Ñ(9¸&Õ(AÀ7À(À)Ð(LˆD×Ñ˜fÓ%ñ 4r   )	r$  r#  r%  r'  r&  r‡   r…   r†   r€   rÃ   r6   r„   )r   r   r    r!   r"   r;   r,  r4  r:  r>  rR  rD  rF  rH  rG  r$   r%   r&   s   @r   r  r  ì  st   ø‡ € Ù<÷
!ò 
!÷"ð "÷ò ÷,ò ÷(ò ÷$Iò I÷Vð ÷O%ð O%÷bð ÷2#Mö #Mr   r  c                óX   € V ^8„  d   QhR\         P                  R\         P                  /# )r   Úxr?   re   )r   s   "r   r   r   '  s"   € ÷  ñ  ”—
‘
ð  œrŸz™zñ  r   c                 óL   € ^^\         P                  ! V ) 4      ,           ,          # )rh   )r   Úexp)rŠ  s   &r   r²   r²   '  s   € Ø�”B—F’F˜A˜2“J•ÕÐr   c                óX   € V ^8„  d   QhR\         P                  R\         P                  /# )r   r   r?   re   )r   s   "r   r   r   +  s"   € ÷ .ñ .œ2Ÿ:™:ð .¬"¯*©*ñ .r   c                óø   € V R,          V R,          V R,          V R,          3w  rr4W^,          ,
          pW$^,          ,
          pW^,          ,           pW$^,          ,           p\         P                  ! WVWx.^R7      # )z+Convert (cx, cy, w, h) to (x1, y1, x2, y2).rÏ   rk   rm   rj   rl   )r   rK   )	r   rý   rþ   rÿ   r   rp   rq   rr   rs   s	   &        r   Ú_cxcywh_to_xyxyr�  +  sf   € à˜•;  d¥¨U°4­[¸%À½+ÐE�L€BˆAØ	�!�e�€BØ	�!�e�€BØ	�!�e�€BØ	�!�e�€BÜ�8Š8�R˜RÐ$¨1Ô-Ð-r   c                ó„   € V ^8„  d   QhR\         P                  R\         P                  R\        R\         P                  /# )r   r   r   r1   r?   ©r   r   r3   )r   s   "r   r   r   5  s8   € ÷ '*ñ '*Ü�:‰:ð'*Ü!Ÿz™zð'*Ü:?ð'*ä‡Z�Zñ'*r   c                ó†  € \        V 4      ^ 8X  d'   \        P                  ! . \        P                  R7      # \	        V 4      pVR,          VR,          VR,          VR,          3w  rErgWd,
          Wu,
          ,          pVP                  4       RRR1,          p	. p
\        V	4      ^ 8”  Edu   V	^ ,          pV
P                  V4       \        V	4      ^8X  d   EMH\        P                  ! WK,          WIR,          ,          4      p\        P                  ! W[,          WYR,          ,          4      p\        P                  ! Wk,          WiR,          ,          4      p\        P                  ! W{,          WyR,          ,          4      p\        P                  ! ^ Wì,
          4      p\        P                  ! ^ Wý,
          4      pVV,          pVW‹,          W‰R,          ,          ,           V,
          ,          p\        P                  ! VV8*  4      ^ ,          pV	V^,           ,          p	EK…  \        P                  ! V
\        P                  R7      # )	zNon-maximum suppression.rB   N:rh   NNrk   rm   rj   rl   rF   )
rG   r   rT   Úint64r�  ÚargsortrS   rn   ro   Úwhere)r   r   r1   r¿   rp   rq   rr   rs   ÚareasÚorderr¼   r\   Úxx1Úyy1Úxx2Úyy2rÿ   r   rt   ÚiouÚ	remainings   &&&                  r   Ú_nmsrž  5  s•  € ô ˆ5ƒz�Q„Ü�xŠx˜¤"§(¡(Ô+Ð+ä  Ó'€Jà�4ÕØ�4ÕØ�4ÕØ�4Õð	�N€BˆBð �W˜�Õ!€Eà�N‰NÓ™T˜r˜TÕ"€EØ€Dä
ˆe‹*�q�.Ø�!�HˆØ�‰�AŒäˆu‹:˜Œ?Ùä�jŠj˜� ¨¥9¥Ó.ˆÜ�jŠj˜� ¨¥9¥Ó.ˆÜ�jŠj˜� ¨¥9¥Ó.ˆÜ�jŠj˜� ¨¥9¥Ó.ˆä�JŠJ�q˜#�)Ó$ˆÜ�JŠJ�q˜#�)Ó$ˆØ�A•ˆà�u•x %¨b­	Õ"2Õ2°UÕ:Õ;ˆÜ—H’H˜S MÑ1Ó2°1Õ5ˆ	Ø�i !•mÕ$‹ä�8Š8�D¤§¡Ô)Ð)r   c                ód   € V ^8„  d   QhR\         P                  R\         P                  R\        /# )r   Úbox1Úbox2r?   r‘  )r   s   "r   r   r   _  s)   € ÷ 	.ñ 	.”2—:‘:ð 	.¤R§Z¡Zð 	.´Eñ 	.r   c                ó0  € \        V ^ ,          V^ ,          4      p\        V ^,          V^,          4      p\        V ^,          V^,          4      p\        V ^,          V^,          4      p\        ^ WB,
          4      \        ^ WS,
          4      ,          pV ^,          V ^ ,          ,
          V ^,          V ^,          ,
          ,          pV^,          V^ ,          ,
          V^,          V^,          ,
          ,          pV\        Wx,           V,
          R4      ,          # )zIoU between two xyxy boxes.rg   )r·   rN   )	r   r¡  rp   rq   rr   rs   rt   Úa1Úa2s	   &&       r   rL   rL   _  sÌ   € ä	ˆT�!�W�d˜1•gÓ	€BÜ	ˆT�!�W�d˜1•gÓ	€BÜ	ˆT�!�W�d˜1•gÓ	€BÜ	ˆT�!�W�d˜1•gÓ	€BÜ��2•7‹Oœc ! R¥W›oÕ-€EØ
ˆq�'�D˜•GÕ
  Q¥¨$¨q­'Õ 1Õ	2€BØ
ˆq�'�D˜•GÕ
  Q¥¨$¨q­'Õ 1Õ	2€BØ”3�r•w •¨Ó-Õ-Ð-r   c                ó\   € V ^8„  d   QhR\         R\        P                  R\        R\         /# )r   r>   ÚregionsÚ
iou_threshr?   )r   r   r   r3   )r   s   "r   r   r   k  s0   € ÷ ñ ÜðÜ&(§j¡jðÜ>Cðäñr   c                ó¦  € \        V P                  4      ^ 8X  d   V # . p\        \        V P                  4      4       FB  pV F9  p\        V P                  V,          V4      V8”  g   K'  VP                  V4        K@  	  KD  	  V'       gL   \        \        P                  ! R4      \        P                  ! R4      \        P                  ! R4      . R7      # V P                  '       d#   V Uu. uF  q@P                  V,          NK  	  upMRp\        V P                  V,          V P                  V,          V P                  V,          VR7      # u upi )zïKeep only detections that overlap with any of the input box regions.

Args:
    result: Detection result to filter
    regions: (N, 4) xyxy boxes defining regions of interest
    iou_thresh: Minimum IoU with any region to keep a detection
rÕ   Nr¯   )r7   r7   r7   r±   )rG   r   rM   rL   r   rS   r   r   r´   r   r   )r>   r¦  r§  r¼   r\   Úregionr   s   &&&    r   Ú_filter_by_regionsrª  k  s  € ô ˆ6�=‰=Ó˜QÔØˆØ€DÜ”3�v—}‘}Ó%Ö&ˆÛˆFÜ˜Ÿ™ Q�¨Ó0°:Ö=Ø—‘˜A”Úó ñ '÷
 ÜÜ—(’(˜6Ó"Ü—(’(˜9Ó%Ü—8’8˜D“>Øô	
ð 	
ð 28··°©Ó-© 1�m‰m˜A×Ð©Ò-ÀD€FÜØ�l‰l˜4Õ Ø�l‰l˜4Õ Ø�}‰}˜TÕ"Øô	ð ùò .s   Ã,Ec                ó†   € V ^8„  d   QhR\         P                  R\        \        \        3,          R\         P                  /# )r   r   Útarget_sizer?   )r   r   r   r,   )r   s   "r   r   r   �  s6   € ÷ 
Añ 
AœŸ™ð 
A´%¼¼S¸µ/ð 
AÄbÇjÁjñ 
Ar   c                óx  € ^ RI Hp Vw  r4. pV  Fs  pVP                  VP                  \        P
                  4      4      pVP                  WC3VP                  4      pVP                  \        P                  ! V4      4       Ku  	  V'       d   \        P                  ! V4      # \        P                  ! ^ W434      # )z9Resize masks to target size using bilinear interpolation.r	   )ÚPILr
   Ú	fromarrayr¹   r   rw  ÚresizeÚBILINEARrS   rT   rK   r´   )r   r¬  ÚPILImager¾   r½   ÚresizedrO  Úpil_masks   &&      r   r¸   r¸   �  sŠ   € å%à�D€AØ€GÛˆØ×%Ñ% d§k¡k´"·*±*Ó&=Ó>ˆØ—?‘? A 6¨8×+<Ñ+<Ó=ˆØ�‰”r—x’x Ó)Ö*ñ ÷ !(Œ2�8Š8�GÓÐ@¬R¯XªX°q¸!°iÓ-@Ð@r   c                ó<   € V ^8„  d   QhR\         R\        R\         /# )r   r>   r§  r?   )r   r3   )r   s   "r   r   r   š  s!   € ÷ ñ ”ð ¬Uð ¼_ñ r   c                óÔ  € \        V P                  4      ^ 8X  d   V # V P                  V P                  V P                  rCp\        P
                  ! V) 4      p. pV EF®  pRpV EF…  p	\        W',          ^ ,          W),          ^ ,          4      p
\        W',          ^,          W),          ^,          4      p\        W',          ^,          W),          ^,          4      p\        W',          ^,          W),          ^,          4      p\        ^ WÊ,
          4      \        ^ WÛ,
          4      ,          pW',          ^,          W',          ^ ,          ,
          W',          ^,          W',          ^,          ,
          ,          pW),          ^,          W),          ^ ,          ,
          W),          ^,          W),          ^,          ,
          ,          pV\        VV,           V,
          R4      ,          V8”  g   EK„  Rp M	  V'       d   EK�  VP                  V4       EK±  	  V P                  '       d#   V Uu. uF  qpP                  V,          NK  	  upMRp\        W&,          WF,          W6,          VR7      # u upi )z8Remove duplicate detections via Non-Maximum Suppression.Frg   TNrÕ   )rG   r   r   r   r   r”  r·   rN   rS   r   r   )r>   r§  r   r   r   r—  r¼   r\   Údiscardr]   rp   rq   rr   rs   rt   Úa_iÚa_jr   s   &&                r   rÚ   rÚ   š  s´  € ä
ˆ6�=‰=Ó˜QÔØˆØ!Ÿ<™<¨¯©¸¿¹�5€EÜ�JŠJ˜�wÓ€EØ€DÜˆØˆÜˆAÜ�U•X˜a•[ %¥(¨1¥+Ó.ˆBÜ�U•X˜a•[ %¥(¨1¥+Ó.ˆBÜ�U•X˜a•[ %¥(¨1¥+Ó.ˆBÜ�U•X˜a•[ %¥(¨1¥+Ó.ˆBÜ˜˜2�7“O¤c¨!¨R­W£oÕ5ˆEØ•8˜A•; ¥¨!¥Õ,°µ¸!µ¸u½xÈ½{Õ1JÕKˆCØ•8˜A•; ¥¨!¥Õ,°µ¸!µ¸u½xÈ½{Õ1JÕKˆCØ”s˜3 �9 uÕ,¨dÓ3Õ3°j×@Ø�Ùñ ÷ ŠwØ�K‰K˜�Nñ ð 28··°©Ó-© 1�m‰m˜A×Ð©Ò-ÀD€FÜØ�kØ�kØ�|Øô	ð ùò .s   È$I%c	           
     óž  € ^ RI p	V P                  4       p
\        \        V4      4       EF  p\        V\        \        4      ,          ,          pW,          pVP
                  ^ ,          V8w  g   VP
                  ^,          V8w  d=   V	P                  VP                  \        P                  4      We3V	P                  R7      pV^ 8„  p\        ^4       FŠ  p\        P                  ! VV
RRV3,          P                  \        P                  4      R,          WÏ,          R,          ,           P                  \        P                  4      V
RRV3,          4      V
RRV3&   KŒ  	  V	P                  VP                  \        P                  4      V	P                  V	P                  4      w  ppV	P!                  V
VR	V^4       V'       d   V\        V4      8  d	   W‹,          MTpV RW+,          R 2pV'       dP   W;,          P                  \"        4      w  ppppV	P%                  V
VV3VV3V^4       T\'        V^,
          ^4      ppMq\        P                  ! V4      w  pp\        V4      ^ 8”  dE   \#        VP)                  4       4      \'        \#        VP)                  4       4      ^,
          ^4      ppM^
^ppV	P+                  VV	P,                  R^4      w  w  pppV	P%                  V
V\'        VV,
          ^,
          ^ 4      3VV,           ^,           V^,           3VR	4       V	P/                  V
VV^,           V3V	P,                  RR
^4       EK"  	  V
# )z�Draw masks, contours, boxes, and labels on a BGR frame.

Args:
    show_boxes: If False, draw only mask overlays + contours (no boxes/labels).
N)ÚinterpolationrE   gš™™™™™á?gÍÌÌÌÌÌÜ?Ú ú.2fç333333ã?rF   ©éÿ   rÀ  rÀ  )Úcv2ÚcopyrM   rG   Ú
COLORS_BGRrQ   r°  r¹   r   rw  ÚINTER_LINEARr•  rº   ÚfindContoursÚRETR_EXTERNALÚCHAIN_APPROX_SIMPLEÚdrawContoursr,   Ú	rectangler·   rN   ÚgetTextSizeÚFONT_HERSHEY_SIMPLEXÚputText)Ú	frame_bgrr   r   r   rø   r¾   r½   Ú
show_boxesr   rÁ  Úoutr\   ÚcolorrO  ÚbinaryÚcÚcontoursr[   ÚlblÚlabelrp   rq   rr   rs   ÚlxÚlyÚysÚxsÚtwÚths   &&&&&&&&&                     r   Ú
draw_framerÜ  Ã  sÃ  € ó à
�.‰.Ó
€CÜ”3�v“;×ˆÜ˜1œs¤:›Õ.Õ/ˆØ�xˆØ�:‰:�a�=˜AÔ §¡¨A¥°!Ô!3Ø—:‘:Ø—‘œBŸJ™JÓ'¨!¨¸s×?OÑ?Oð ó ˆDð ˜‘ˆä�q–ˆAÜŸ8š8ØØ�Q˜˜1�W•×$Ñ$¤R§Z¡ZÓ0°4Õ7¸%½(ÀT½/ÕI×QÑQÜ—H‘Hóð �A�q˜!�G•óˆC��1�a�‹Lñ ð ×&Ñ&Ø�M‰Mœ"Ÿ(™(Ó# S×%6Ñ%6¸×8OÑ8Oó
‰ˆ�!ð 	×Ñ˜˜h¨¨E°1Ô5÷ " a¬#¨f«+¤oˆfŽi¸6ˆØ�%�q˜� 3˜Ð(ˆçØ"�XŸ_™_¬SÓ1‰NˆB��B˜Ø�M‰M˜#  B˜x¨"¨b¨°5¸!Ô<Øœ˜R !�V R›�ˆB�ô —X’X˜fÓ%‰FˆB�Ü�2‹w˜Œ{Ü˜RŸV™V›X›¬¬C°·±³«M¸AÕ,=¸rÓ(B�B��Bà˜R�B�à—o‘o e¨S×-EÑ-EÀsÈAÓN‰‰ˆˆR�!Ø�‰ØØ”�R˜"•W˜q•[ !Ó$Ð%Ø�"�W�q�[˜"˜q�&Ð!ØØô	
ð 	�‰ØØØ�!�V�RˆLØ×$Ñ$ØØØ÷	
ñ_  ðp €Jr   c                ó  € V ^8„  d   QhR\         R\        \         ,          R\        \         ,          R\         R\        R\        R\        R\        \         ,          R	\
        R
\        R\        \         ,          R\        R\        R\        /# )r   Ú
video_pathrÈ   ÚoutputÚ
model_pathrœ   Ú
nms_threshÚeveryr   rÎ  Ú
resolutionÚannotator_nameÚbackbone_everyÚopacityÚcontour_thickness)r   r   r   r3   r,   Úbool)r   s   "r   r   r   	  s´   € ÷ I ñ I ÜðI ä”#�YðI ô ”S�MðI ô ð	I ô
 ðI ô ðI ô ðI ô ”C�=ðI ô ðI ô ðI ô œS•MðI ô ðI ô ðI ô ñI r   c                óô
  € ^ RI p^ RIHp ^ RIHp ^ RIHpHp VfA   \        V 4      p\        VP                  VP                   RVP                   2,          4      pRpVe¡   . pVP                  R4       FO  pVP                  R4       Uu. uF  p\        V4      NK  	  pp\        V4      ^8X  g   K>  VP!                  V4       KQ  	  V'       d3   \"        P$                  ! V4      p\'        RVP)                  4        24       \'        R	V 24       V! V4      pV! V4      pVP+                  \        V4      4      pV	R
8w  d   V	Vn        \/        VVVR7      pVP1                  V 4      pVP3                  4       '       g   \'        RV  24       R# \5        VP7                  VP8                  4      4      pVP7                  VP:                  4      p\5        VP7                  VP<                  4      4      p \5        VP7                  VP>                  4      4      p!\'        RV RVR RV  RV! 24       RPA                  V4      p"\'        RV RV RV RV	 24       VPB                  ! R!  p#VPE                  VV#VV V!34      p$\G        \"        P$                  ! . 4      \"        P$                  ! . 4      \"        P$                  ! . 4      . R7      p%\I        4       p&Rp'/ p(^ p)^ RI%p*V*PM                  4       p+V! V4      ;_uu_ 4        \O        V4       EF  p,VPQ                  4       w  p-p.V-'       g    EMV,V,          ^ 8X  Ed`   \R        PT                  ! VPW                  V.VPX                  4      4      p/VPZ                  P]                  V/4      p0\^        P$                  ! V0R,          4      p1V)V,          ^ 8X  g   V'f   \a        VV14      p'V(Pc                  4        \e        VV'VV/Pf                  VV(R7      p2Ve'   \        V2Ph                  4      ^ 8”  d   \k        V2V4      p2V&Pm                  V24      p%V)^,          p)V,^(,          ^ 8X  d]   V*PM                  4       V+,
          p3V3^ 8”  d   V,^,           V3,          M^ p4\'        RV, RV R\        V%Ph                  4       RV4R R2	4       V
'       d;   \        V%Ph                  4      ^ 8”  d!   \o        W¬VR 7      p5V5Pq                  V.V%4      p6M<\s        V.V%Pt                  V%Ph                  V%Pv                  V"V!V VV%Px                  R!7	      p6V$P{                  V64       EK"  	  RRR4       V$P}                  4        VP}                  4        \'        R"V 24       R# u upi   + '       g   i     LE; i)#zTrack objects in a video file.N©Úwired_limit©ÚSam3Processor©Úget_model_pathÚ
load_modelÚ_trackedÚ;Ú,zBox prompts: úLoading model: éð  ©r€   úError: cannot open úVideo: z	 frames, ú.1fú fps, rŠ  ú + ú	Prompts: z, detect every z frames, threshold ú, resolution Úmp4vrÕ   r™   ©r  z  Frame Ú/z: z det, z fps©ræ  rç  ©rÎ  r   z
Saved: )?rÁ  Úmlx_vlm.generaterë  Ú#mlx_vlm.models.sam3.processing_sam3rí  Úmlx_vlm.utilsrï  rð  r   r   ÚparentÚstemÚsuffixÚsplitr3   rG   rS   r   rT   ÚprintÚtolistÚfrom_pretrainedr›   r}   ÚVideoCaptureÚisOpenedr,   r  ÚCAP_PROP_FRAME_COUNTÚCAP_PROP_FPSÚCAP_PROP_FRAME_WIDTHÚCAP_PROP_FRAME_HEIGHTÚjoinÚVideoWriter_fourccÚVideoWriterr   r/   ÚtimeÚperf_counterrM   Úreadr
   r¯  ÚcvtColorÚCOLOR_BGR2RGBr†   r�   r�   r  Úclearr  r¢   r   rª  r`   Úbuild_annotatorÚannotaterÜ  r   r   r   ÚwriteÚrelease)7rÞ  rÈ   rß  rà  rœ   rá  râ  r   rÎ  rã  rä  rå  ræ  rç  rÁ  rë  rí  rï  rð  ÚpÚ	box_arrayÚbox_listrd   rŠ  ÚcoordsÚmpr…   r†   rÇ   ÚcapÚtotal_framesÚfpsr½   r¾   Ú
prompt_strÚfourccÚwriterÚlatest_resultÚ
id_trackerÚbackbone_cacher  Údetect_countÚ_timeÚt_startÚfiÚretrÍ  Ú	frame_pilr£   r™   r>   ÚelapsedÚ
fps_actualÚannrÏ  s7   &&&&&&&&&&&&&&                                         r   Útrack_videor7  	  s¿  € ó" å,ÝAß8à‚~Ü�ÓˆÜ�Q—X‘X 1§6¡6 (¨(°1·8±8°*Ð =Õ=Ó>ˆð €IØÒØˆØ—‘˜SÖ!ˆAØ()¯©°¬Ó5© 1”e˜A–h©ˆFÐ5Ü�6‹{˜aÖØ—‘ Ö'ñ "÷ ÜŸš Ó*ˆIÜ�M )×"2Ñ"2Ó"4Ð!5Ð6Ô7ä	ˆO˜J˜<Ð
(Ô)Ù	˜
Ó	#€BÙ�r‹N€EØ×-Ñ-¬c°"«gÓ6€IØ�TÔØ)ˆ	ÔÜ˜e YÀ	ÔJ€Ià
×
Ñ
˜:Ó
&€CØ�<‰<�>Š>ÜÐ# J <Ð0Ô1Ùä�s—w‘w˜s×7Ñ7Ó8Ó9€LØ
�'‰'�#×"Ñ"Ó
#€CÜˆC�G‰G�C×,Ñ,Ó-Ó.€AÜˆC�G‰G�C×-Ñ-Ó.Ó/€AÜ	ˆG�L�> ¨3¨s¨)°6¸!¸¸A¸a¸SÐ
AÔBØ—‘˜GÓ$€JÜ	Ø
�G�9˜O¨E¨7Ð2EÀiÀ[ÐP]Ð^hÐ]iÐjôð ×#Ò# VÑ,€FØ�_‰_˜V V¨S°1°a°&Ó9€Fä#Ü�hŠh�r‹lÜ�hŠh�r‹lÜ�xŠx˜‹|Øô	€Mô “€JØ€NØ€MØ€LÛà× Ñ Ó"€Gá	�U×	Õ	Ü˜×%ˆBØ ŸX™X›Z‰NˆC�ßÚà�E�z˜Q�Ü!ŸOšO¨C¯L©L¸ÀC×DUÑDUÓ,VÓW�	Ø"×,Ñ,×=Ñ=¸iÓH�Ü!Ÿxšx¨¨~Õ(>Ó?�à .Õ0°AÔ5¸Ò9OÜ%;¸EÀ<Ó%P�NØ!×'Ñ'Ô)ä.ØØ"ØØ—N‘NØØ"/ô�ð Ò(¬S°·±Ó-?À!Ô-CÜ/°¸	ÓB�FØ *× 1Ñ 1°&Ó 9�Ø Õ!�à˜•7˜a”<Ø#×0Ñ0Ó2°WÕ<�GØ7>À´{ " q¥&¨GÖ!3È�JÜØ" 2 $ a¨ ~°R¼¸M×<PÑ<PÓ8QÐ7RÐRXØ% cÐ*¨$ð0ô÷
 ¤# m×&:Ñ&:Ó";¸aÔ"?Ü%Ø"ÐGXô�ð —l‘l 9¨mÓ<‘ä ØØ!×'Ñ'Ø!×(Ñ(Ø!×'Ñ'ØØØØ)Ø(×/Ñ/ô
�ð �L‰L˜×ñi &÷ 
ðn ‡N�NÔØ‡K�K„MÜ	ˆI�f�XÐ
ÖùòS 6÷` 
×	ús   ÂU"Ë:F#U'ÒBU'Õ'U7	c                ó  € V ^8„  d   QhR\         R\        \         ,          R\         R\        R\        R\        \         ,          R\        R\
        R	\        \         ,          R
\
        R\        \         ,          R\        R\
        /# )r   rÞ  rÈ   rà  rœ   rá  r   rÎ  rã  Úbg_imageÚrecompute_backbone_everyrä  ræ  rç  )r   r   r3   r   rè  r,   )r   s   "r   r   r   •  s©   € ÷ ñ Üðä”#�Yðô ðô ð	ô
 ðô ”C�=ðô ðô ðô ”s�mðô "ðô œS•Mðô ðô ñr   c                óÊ  aaaa	a2a3a4a5a6a7a8a9a:a;a<a=a>a?€ ^ RI p^ RIo?^ RIo4^ RIHp ^ RIHp ^ RIHpH	p Ro2Ve…   . pVP                  R4       FO  pVP                  R4       Uu. uF  p\        V4      NK  	  pp\        V4      ^8X  g   K>  VP                  V4       KQ  	  V'       d   \        P                  ! V4      o2\!        RV 24       V! V4      pV! V4      o;VP#                  \%        V4      4      pVR8w  d   VVn        \)        S;VSR	7      o<V P+                  4       '       d   \-        V 4      MT pS4P/                  V4      o3S3P1                  4       '       g   \!        R
V  24       R# S3P3                  S4P4                  4      ;'       g    Rp\-        S3P3                  S4P6                  4      4      p\-        S3P3                  S4P8                  4      4      p\!        RVR RV RV 24       RP;                  S4      p\!        RS RS RV RV 24       RpVe|   \<        P>                  ! V4      PA                  R4      PC                  VV34      pS4PE                  \        P                  ! V4      S4PF                  4      p\!        RV RV RV R24       \!        R4       ^ RI$o=S=PK                  ^
R7      o5VPM                  4       o:\O        \        PP                  ! R64      \        PP                  ! ^ VV3\        PR                  R7      \        PP                  ! R74      . R7      pRVR^ RR/o8R R/o9R!R"/o>\%        V 4      P+                  4       o7S7'       g
   R#V,          M^ o6V3V4V5V6V7V9V:V=V>V?3
R$ lp V2V4V8V9V:V;VV<VV	V>VV?3R% lp!V! S;4      ;_uu_ 4        VPU                  V R"R&7      p"VPU                  V!R"R&7      p#V"PW                  4        V#PW                  4        ^ p$S?PY                  4       p%Rp&V
'       d   \[        W«VR'7      p'M)^ R(I.H/p(H0p)H1p* V*! 4       V(! 4       ,           V)! 4       ,           p'  S5P3                  R)R*7      p+S:;_uu_ 4        S8R,          p,S8R,          p-S8R,          p.RRR4       \        X,Pf                  4      ^ 8”  d"   T'Pi                  T+Pk                  4       T,4      p/MT+p/T$^,          p$S?PY                  4       p0T0T%,
          R+8¼  d   T$T0T%,
          ,          p&^ p$T0p%S4Pm                  T/R,X-R R-T&R. R/X. R02R8S4Pn                  R1R9^4       S4Pq                  R2T 2T/4       S4Ps                  ^4      ^ÿ,          p1T1\u        R34      8X  g   EK'   R4S>R!&   T#P;                  ^R*7       RRR4       S3Pw                  4        S4Py                  4        \!        R54       R# u upi   S=Pd                   d     EKŽ  i ; i  + '       g   i     ELa; i  + '       g   i     Lo; i):z—Track objects in a video with a real-time preview window.

Optimized with backbone caching, DETR encoder caching, and fast overlay.
Press 'q' to quit.
Nrê  rì  rî  rò  ró  rô  rõ  rö  r÷  g      >@rø  rù  rú  rŠ  rû  rü  ú, threshold rý  ÚRGBzBackground swap: z (Ú)zPress 'q' to quit)ÚmaxsizerB   rÕ   r>   Ún_objr'  r^  ÚbgrÚactiveTç      ð?c                  óž  <
€ SP                  4       p SR ,          '       Ed   S'       gA   SP                  4       pW8  d+   SP                  \        ^ W,
          R,
          4      4       KX  SP                  4       w  r#V'       g9   S'       d   K|  SP	                  SP
                  ^ 4       SP                  4       p Kª  S
;_uu_ 4        VS	R&   RRR4       SP                  4       '       d    SP                  4        SP                  V4       S'       d   EK  V S,          p EK  R#   + '       g   i     La; i  SP                   d     LPi ; i)rB  gü©ñÒMbP?rA  N)
r  Úsleepr·   r  rR   ÚCAP_PROP_POS_FRAMESrJ   Ú
get_nowaitÚEmptyÚput)Únext_frame_timeÚnowr2  rK  r%  rÁ  Úframe_bufferÚframe_intervalÚ	is_cameraÚlatest_frameÚlockÚqueueÚrunningr  s       €€€€€€€€€€r   Úreader_loopÚ)track_video_realtime.<locals>.reader_loopõ  s  ø€ Ø×+Ñ+Ó-ˆØ�h×ÕçØ×'Ñ'Ó)�ØÔ(Ø—J‘Jœs 1 oÕ&;¸eÕ&CÓDÔEÙàŸ™›‰JˆCßßÙØ—‘˜×/Ñ/°Ô3Ø"&×"3Ñ"3Ó"5�Ùç’Ø&+�˜UÑ#÷ ð × Ñ ×"Ò"ðØ ×+Ñ+Ô-ð ×Ñ˜UÔ#ç’9Ø >Õ1“ñ7  ÷  —ûð —{‘{ô Ùðús   ÃD%Ã+D8 Ä%D5	Ä8EÅEc            	      ó:  <€ R RRR/p / p^ p\        4       pSR,          '       EdÏ   S;_uu_ 4        SR,          pRSR&   RRR4       Xf   SP                  R4       KH  SP                  4       p\        P                  ! SP                  VSP                  4      4      pVP                  pSP                  P                  V4      p\        P                  ! VR,          4      p	VS,          ^ 8H  ;'       g    V R ,          RJ p
V
'       d"   \        SV	4      pW°R &   VP                  4        M	V R ,          p\        SVSVSVR7      p\        VP                   4      ^ 8”  d   \#        VS4      pSe   \%        VS4      pSP                  4       V,
          pVP'                  V4      pS;_uu_ 4        VSR&   \        VP                   4      SR	&   R
\)        VR4      ,          SR&   RRR4       V^,          pEKÞ  R#   + '       g   i     ELÀ; i  + '       g   i     L2; i)r  Nr*   rB  rA  g{®Gázt?r™   rÿ  r>   r@  rC  rg   r'  rF   )r/   rE  r  r
   r¯  r  r  r¢   r†   r�   r�   rT   r  r  r  rG   r   rÚ   rª  r`   r·   )r-  r  Úinference_countr,  Ú
latest_bgrÚt0r3  r›   r£   r™   Úneed_backboner  r>   Údtr!  rÁ  ÚlatestrO  rP  r…   rá  rÇ   rÈ   r:  rR  rœ   r  s                 €€€€€€€€€€€€€r   Úinference_loopÚ,track_video_realtime.<locals>.inference_loop  sí  ø€ Ø$ d¨K¸Ð<ˆØˆØˆÜ"“_ˆ
à�h×Õß’Ø)¨%Õ0�
Ø&*�˜UÑ#÷ ð Ò!Ø—
‘
˜5Ô!Ùà×"Ñ"Ó$ˆBÜŸš¨¯©°ZÀ×ARÑARÓ(SÓTˆIØ"Ÿ™ˆJà×(Ñ(×9Ñ9¸)ÓDˆFÜŸ8š8 F¨>Õ$:Ó;ˆLð  Ð":Õ:¸aÑ?÷ 6ð 6Ø! *Õ-°Ð5ð ÷ Ü$:¸5À,Ó$OÐ!Ø->˜zÑ*Ø×#Ñ#Õ%à$2°:Õ$>Ð!ô +ØØ!ØØØØ+ôˆFô �6—=‘=Ó! AÔ%Ü˜V ZÓ0�ØÒ(Ü/°¸	ÓB�Fà×"Ñ"Ó$ rÕ)ˆBà×&Ñ& vÓ.ˆFß’Ø#)��xÑ Ü"% f§m¡mÓ"4��w‘Ø #¤c¨"¨d£mÕ 3��u‘÷ ð
 ˜qÕ ‹Oñe  ß—�ú÷X —ús   °G6Æ,4H
Ç6H	È
H	)r  Údaemonr  )ÚBoxAnnotatorÚLabelAnnotatorÚMaskAnnotatorgš™™™™™©?)ÚtimeoutrÄ   zDetect: z FPS | Display: ú.0fz FPS | z objgš™™™™™é?zSAM3 Tracking - ÚqFÚDoner¯   r±   )rz   é   )r7   rÀ  r7   )=Ú	threadingr  rÁ  r  rë  r  rí  r  rï  rð  r	  r3   rG   rS   r   rT   r
  r  r   r›   r}   Úisdigitr,   r  r  r  r  r  r  r  r
   ÚopenÚconvertr°  r  ÚCOLOR_RGB2BGRrQ  ÚQueueÚLockr   r´   rº   ÚThreadÚstartr  r  Úmlx_vlm.models.sam3.annotatorsr_  r`  ra  rH  r   r  rÂ  rÌ  rË  ÚimshowÚwaitKeyÚordr  ÚdestroyAllWindows)@rÞ  rÈ   rà  rœ   rá  r   rÎ  rã  r9  r:  rä  ræ  rç  rg  rë  rí  rï  rð  r"  rd   rŠ  r#  r$  r†   Úsourcer'  r½   r¾   r(  Úbg_frameÚbg_pilÚempty_resultrS  r\  Úreader_threadÚinference_threadÚdisplay_fps_counterÚdisplay_fps_t0Údisplay_fps_valÚdisplay_annr_  r`  ra  rÍ  r>   Údet_fpsr@  rÏ  rK  Úkeyr!  r%  rÁ  rL  rM  rN  r[  rO  rP  r…   rÇ   rQ  rR  r  s@   &f&ff&&&&f&&&                                     @@@@@@@@@@@@@@r   Útrack_video_realtimer�  •  sE  ÿÿù€ ó( Ûãå,ÝAß8ð €IØÒØˆØ—‘˜SÖ!ˆAØ()¯©°¬Ó5© 1”e˜A–h©ˆFÐ5Ü�6‹{˜aÖØ—‘ Ö'ñ "÷ ÜŸš Ó*ˆIä	ˆO˜J˜<Ð
(Ô)Ù	˜
Ó	#€BÙ�r‹N€EØ×-Ñ-¬c°"«gÓ6€IØ�TÔØ)ˆ	ÔÜ˜e YÀ	ÔJ€Ià *× 2Ñ 2× 4Ò 4ŒS�Œ_¸*€FØ
×
Ñ
˜6Ó
"€CØ�<‰<�>Š>ÜÐ# J <Ð0Ô1Ùà
�'‰'�#×"Ñ"Ó
#×
+Ð
+ t€CÜˆC�G‰G�C×,Ñ,Ó-Ó.€AÜˆC�G‰G�C×-Ñ-Ó.Ó/€AÜ	ˆG�C˜�9˜F 1 # Q q cÐ
*Ô+Ø—‘˜GÓ$€JÜ	Ø
�G�9˜L¨¨°=ÀÀÈAÈjÈ\ÐZôð
 €HØÒÜ—’˜HÓ%×-Ñ-¨eÓ4×;Ñ;¸QÀ¸FÓCˆØ—<‘<¤§¢¨Ó 0°#×2CÑ2CÓDˆÜÐ! ( ¨2¨a¨S°°!°°AÐ6Ô7ä	Ð
Ôãà—;‘; r�;Ó*€Lð �>‰>Ó€DÜ"Ü�hŠh�vÓÜ�hŠh˜˜1˜a�y¬¯©Ô1Ü�xŠx˜‹~Øô	€Lð 	�,Ø�Øˆsð€Fð
 ˜4�=€LØ˜Ð€Gô �J“×'Ñ'Ó)€Iß&/�S˜3–Y°Q€N÷2ö 2÷@8!÷ 8!ñ 8!ñv 
�U×	Õ	Ø!×(Ñ(°ÀDÐ(ÓIˆØ$×+Ñ+°>È$Ð+ÓOÐØ×ÑÔØ×ÑÔ àÐØ×*Ñ*Ó,ˆØˆçÜ)ØÐCTô‰K÷ñ ñ (›/©L«NÕ:¹^Ó=MÕMˆKàðØ(×,Ñ,°TÐ,Ó:�	÷ ’Ø Õ)�Ø  �-�Ø˜w��÷ ô
 �6—=‘=Ó! AÔ%Ø!×*Ñ*¨9¯>©>Ó+;¸VÓD‘à�ð   1Õ$ÐØ×#Ñ#Ó%ˆCØ�^Õ# sÔ*Ø"5¸¸~Õ9MÕ"N�Ø&'Ð#Ø!$�à�K‰KØØ˜7 3˜-Ð'7¸ÈÐ7LÈGÐTYÐSZÐZ^Ð_ØØ×(Ñ(ØØØôð �J‰JÐ)¨*¨Ð6¸Ô<à—+‘+˜a“. 4Õ'ˆCØ”c˜#“h�Øà!ˆ�ÑØ×Ñ aÐÔ(÷A 
ðD ‡K�K„MØ×ÑÔÜ	ˆ&†Mùò{ 6øðf —;‘;ô Ûðú÷ —�ú÷; 
×	úsV   Á"V ÎBWÐ.V%Ñ 
WÑ
V>	Ñ&C'WÕWÖ%V;Ö6WÖ:V;Ö;WÖ>W×		W×W"	c                óä   € ^ RI Hp ^ RIHpHp \        RV  24       V! V 4      pV! V4      pVP                  \        V4      4      pVR8w  d   W(n        \        RV RV 24       \        WxVR7      # )z#Shared model loading for CLI tasks.rì  rî  rô  rõ  zResolution: rŠ  rö  )
r  rí  r  rï  rð  r
  r  r   r›   r}   )	rà  rœ   rã  rí  rï  rð  r$  r…   r†   s	   &&&      r   Ú_load_predictorrƒ  —  sn   € åAß8ä	ˆO˜J˜<Ð
(Ô)Ù	˜
Ó	#€BÙ�r‹N€EØ×-Ñ-¬c°"«gÓ6€IØ�TÔØ)ÔÜ�˜Z˜L¨¨*¨Ð6Ô7Ü˜¸9ÔEÐEr   c                ó˜  € ^ RI pV P                  4       p\        \        V4      4       EF  p\        V\        \        4      ,          ,          p	W(,          P                  \        4      w  r«rÍVP                  WzV3WÍ3V	^4       V RW,          R 2pVP                  WæP                  R^4      w  w  pppVP                  VV
\        VV,
          ^
,
          ^ 4      3W¯,           ^,           \        VV^
,           4      3V	R4       VP                  VVV
^,           \        V^,
          V^,           4      3VP                  RR^4       EK  	  V# )z&Draw boxes and labels only (no masks).Nr¼  r½  gffffffæ?rF   r¿  )rÁ  rÂ  rM   rG   rÃ  r¹   r,   rÉ  rÊ  rË  r·   rÌ  )rÍ  r   r   rø   r¾   r½   rÁ  rÏ  r\   rÐ  rp   rq   rr   rs   rÕ  rÚ  rÛ  r[   s   &&&&&&            r   Ú_draw_boxes_onlyr…  ¦  s$  € ãà
�.‰.Ó
€CÜ”3�v“;×ˆÜ˜1œs¤:›Õ.Õ/ˆØ�Ÿ™¬Ó-‰ˆ�Ø�‰�c ˜8 b X¨u°aÔ8Ø�(˜!˜F�I c˜?Ð+ˆØ—o‘o e×-EÑ-EÀsÈAÓN‰‰ˆˆR�!Ø�‰ØØ”�R˜"•W˜r•\ 1Ó%Ð&Ø�W�q�[œ#˜b " r¥'Ó*Ð+ØØô	
ð 	�‰ØØØ�!�V”S˜˜a�  a¥Ó(Ð)Ø×$Ñ$ØØØ÷	
ñ  ð, €Jr   rD   zBoxAnnotator+LabelAnnotatorÚcornerz!BoxCornerAnnotator+LabelAnnotatorÚroundz RoundBoxAnnotator+LabelAnnotatorrO  zMaskAnnotator+LabelAnnotatorzmask+boxz)MaskAnnotator+BoxAnnotator+LabelAnnotatorÚhalozHaloAnnotator+LabelAnnotatorzhalo+boxz)HaloAnnotator+BoxAnnotator+LabelAnnotatorrÐ  zColorAnnotator+LabelAnnotatorÚellipsezEllipseAnnotator+LabelAnnotatorÚtrianglez TriangleAnnotator+LabelAnnotatorÚdotzDotAnnotator+LabelAnnotatorÚcirclezCircleAnnotator+LabelAnnotatorÚbarz#PercentageBarAnnotator+BoxAnnotatorÚblurÚBlurAnnotatorÚpixelateÚPixelateAnnotatorÚ
backgroundz)BackgroundOverlayAnnotator+LabelAnnotatorc                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   Únameræ  rç  )r   r3   r,   )r   s   "r   r   r   Ø  s!   € ÷ /ñ /œ#ð /¬ð /Ìñ /r   c           
     óˆ  € ^ RI Hp RpT pRV 9   d$   V P                  RR4      P                  R4      pRp\        P                  WU4      pV'       d
   VR,          pVP                  R4       Uu. uF  qwP                  4       NK  	  ppRp	Rp
V F«  pVR8X  d    V
e   \        V
R	4      '       d   RV
n        K)  \        W;R4      pVf-   \        R
V R\        \        P                  4       4       24      h/ p\        VR4      '       d   WR&   \        VR4      '       d   W-R&   V! R/ VB pTp
V	f   TMWž,           p	K­  	  V	# u upi )ah  Build an annotator from a preset name or explicit chain.

Append ``+bg`` to blur/pixelate to target the background instead of objects.

Examples:
    build_annotator("mask+box")
    build_annotator("blur+bg")          # blur background
    build_annotator("pixelate+bg")      # pixelate background
    build_annotator("halo", opacity=0.8, contour_thickness=3)
)Ú
annotatorsFz+bgÚ Ú+TNÚbgr’  zUnknown annotator: z. Presets: ræ  rç  r   )Úmlx_vlm.models.sam3r–  ÚreplaceÚstripÚANNOTATOR_PRESETSr  r	  rß   r’  ÚgetattrÚ
ValueErrorrH   rI   )r”  ræ  rç  Ú
ann_moduleÚbg_modifierÚ	base_nameÚspecr   ÚpartsÚchainÚlastÚpartÚclsÚkwargsrc   s   &&&            r   r  r  Ø  sM  € õ =ð €KØ€IØ�„}Ø—L‘L ¨Ó+×1Ñ1°#Ó6ˆ	Øˆä× Ñ  Ó6€DßØ��ˆà $§
¡
¨3¤Ó0¡˜1�W‰WŽY¡€EÐ0Ø€EØ€DÛˆØ�4Œ<àÒ¤G¨D°,×$?Ò$?Ø"&�”ÙÜ�j¨Ó-ˆØŠ;ÜØ% d Vð ,Ü Ô!2×!7Ñ!7Ó!9Ó:Ð;ð=óð ð ˆÜ�3˜	×"Ò"Ø '�9ÑÜ�3Ð+×,Ò,Ø*;Ð&Ñ'Ù‰M�&‰MˆØˆØ’]‘¨­	Šñ' ð( €Lùò/ 1s   Á.D?c                óp   € V ^8„  d   QhR\         \        ,          R\         \        P                  ,          /# )r   Ú	boxes_strr?   )r   r   r   r   )r   s   "r   r   r   
  s'   € ÷ 	4ñ 	4œH¤S�Mð 	4¬h´r·z±zÕ.Bñ 	4r   c                ó$  € V f   R# . pV P                  R4       FO  pVP                  R4       Uu. uF  p\        V4      NK  	  pp\        V4      ^8X  g   K>  VP                  V4       KQ  	  V'       d   \        P
                  ! V4      # R# u upi )z4Parse box string 'x1,y1,x2,y2;...' into numpy array.Nrò  ró  )r	  r3   rG   rS   r   rT   )r«  r"  rd   rŠ  r#  s   &    r   Ú_parse_boxesr­  
  sx   € àÒÙØ€HØ�_‰_˜SÖ!ˆØ$%§G¡G¨C¤LÓ1¡L˜q”%˜–(¡LˆÐ1Üˆv‹;˜!ÖØ�O‰O˜FÖ#ñ "÷ "*Œ2�8Š8�HÓÐ3¨tÐ3ùò 2s   °Bc                ó  € V ^8„  d   QhR\         R\        \         ,          R\         R\        \         ,          R\         R\        R\        R\        \         ,          R	\        R
\
        R\        \         ,          R\        R\
        /# )r   Ú
image_pathrÈ   Útaskrß  rà  rœ   rá  r   rÎ  rã  rä  ræ  rç  )r   r   r   r3   rè  r,   )r   s   "r   r   r     s©   € ÷ Eñ EÜðEä”#�YðEô ðEô ”S�Mð	Eô
 ðEô ðEô ðEô ”C�=ðEô ðEô ðEô œS•MðEô ðEô ñEr   c                óX  € ^ RI p^ RIHp VR8X  d   RMRpVfB   \        V 4      p\	        VP
                  VP                   V VP                   2,          4      p\        WEV	4      p\        V4      p\        P                  ! V 4      P                  R4      pVP                  w  pp\        RV RV 24       \        R	V R
V RV 24       V! VP                  4      ;_uu_ 4        \!        VVVVR7      pRRR4       Ve'   \#        XP$                  4      ^ 8”  d   \'        VV4      p\        R\#        XP$                  4       24       \)        \#        VP$                  4      4       F»  pVP*                  V,          w  ppppVP,                  '       d   VP,                  V,          MV^ ,          pRVP$                  V,          R RV RVR RVR RVR RVR R2pVR8X  d6   VR\/        VP0                  V,          P3                  4       4       R2,          p\        V4       K½  	  VP5                  \6        P8                  ! V4      VP:                  4      pRP=                  V4      pV
'       d!   \?        W«VR7      p V PA                  VV4      p!MhVR8X  d&   \C        VVP$                  VP*                  VVV4      p!M<\E        VVP0                  VP$                  VP*                  VVVVVP,                  R7	      p!VPG                  VV!4       \        RV 24       R#   + '       g   i     EL,; i)z*Run detection or segmentation on an image.Nrê  rž   Ú	_detectedÚ
_segmentedr=  zImage: rŠ  zTask: z, prompts: r<  )r   zDetections: z  [r½  z] z box=(rc  ú, r>  Úsegmentz  mask=Úpxrû  r  r  zSaved: )$rÁ  r  rë  r   r   r  r  r  rƒ  r­  r
   ri  rj  r¢   r
  r…   r  rG   r   rª  rM   r   r   r,   r   Úsumr  r   rT   rk  r  r  r  r…  rÜ  Úimwrite)"r¯  rÈ   r°  rß  rà  rœ   rá  r   rÎ  rã  rä  ræ  rç  rÁ  rë  r  r   rÇ   r!  r—   r½   r¾   r>   r\   rp   rq   rr   rs   rÔ  ÚlinerÍ  r(  r6  rÏ  s"   &&&&&&&&&&&&&                     r   Ú	run_imagerº    s»  € ó  å,à  HÔ,‰[°,€FØ‚~Ü�ÓˆÜ�Q—X‘X 1§6¡6 (¨6¨(°1·8±8°*Ð =Õ=Ó>ˆä 
°zÓB€IÜ˜UÓ#€Iä�JŠJ�zÓ"×*Ñ*¨5Ó1€EØ�:‰:�D€A€qÜ	ˆG�A�3�a˜�sÐ
ÔÜ	ˆF�4�&˜ G 9¨L¸¸Ð
DÔEá	�Y—_‘_×	%Õ	%Ü˜y¨%°À	ÔJˆ÷ 
&àÒ¤ V§]¡]Ó!3°aÔ!7Ü# F¨IÓ6ˆä	ˆLœ˜VŸ]™]Ó+Ð,Ð
-Ô.Ü”3�v—}‘}Ó%Ö&ˆØŸ™ a�‰ˆˆB��BØ"(§-§- -ˆf�m‰m˜AÖ°W¸QµZˆØ�V—]‘] 1Õ% cÐ*¨"¨S¨E°¸¸3°x¸rÀ"ÀSÀÈÈBÈsÈ8ÐSUÐVXÐY\ÐU]Ð]^Ð_ˆØ�9ÔØ�gœc &§,¡,¨q¥/×"5Ñ"5Ó"7Ó8Ð9¸Ð<Õ<ˆDÜˆdŽñ 'ð —‘œRŸXšX e›_¨c×.?Ñ.?Ó@€IØ—‘˜GÓ$€JßÜØÐ?Pô
ˆð �l‰l˜9 fÓ-‰Ø	�Ô	Ü˜y¨&¯-©-¸¿¹ÀzÐSTÐVWÓX‰äØØ�L‰LØ�M‰MØ�L‰LØØØØ!Ø—=‘=ô

ˆð ‡K�K�˜ÔÜ	ˆG�F�8Ð
Ö÷I 
&×	%Ð	%ús   Ã%LÌL)	c                  óÆ  € \         P                  ! R \         P                  RR7      p V P                  R. R>ORRR7       V P                  R	R
RR7       V P                  RR
RR7       V P                  RRRRR7       V P                  RR
RR7       V P                  RRRR7       V P                  RR
RR7       V P                  RRRR7       V P                  R\        R R!R"7       V P                  R#\        R R$R"7       V P                  R%\
        ^R&R"7       V P                  R'\
        R(R)R"7       V P                  R*R
R+R7       V P                  R,R
R-R.P                  \        P                  4       4      ,           R/,           R7       V P                  R0\
        ^R1R"7       V P                  R2\        R R3R"7       V P                  R4\
        ^R5R"7       V P                  4       pVP                  pVP                  R?9   dÕ   VP                  f   V P                  R64       \        VP                  TVP                  VP                  VP                   VP"                  e   VP"                  MR7VP$                  VP&                  VP                  R8X  d   VP(                  MRVP*                  VP,                  VP.                  VP0                  R87       R
# VP                  R8X  dÍ   VP2                  f   V P                  R94       \5        VP2                  TVP                  VP                   VP"                  e   VP"                  MR:VP$                  VP6                  VP&                  VP(                  VP*                  VP,                  VP8                  VP.                  VP0                  R;7       R
# VP                  R8X  d¡   \;        R<TVP                   VP"                  e   VP"                  MR VP$                  R 8w  d   VP$                  MR7VP&                  VP(                  VP*                  VP<                  VP,                  VP.                  VP0                  R=7       R
# R
# )@z1SAM3: detection, segmentation, and video trackinga¶  examples:
  # Object detection (boxes only)
  python -m mlx_vlm.models.sam3.generate --task detect --image photo.jpg --prompt "a cat"

  # Instance segmentation (masks only)
  python -m mlx_vlm.models.sam3.generate --task segment --image photo.jpg --prompt "a cat"

  # Instance segmentation with boxes overlaid
  python -m mlx_vlm.models.sam3.generate --task segment --image photo.jpg --prompt "a cat" --show-boxes

  # Box-guided segmentation
  python -m mlx_vlm.models.sam3.generate --task segment --image photo.jpg --prompt "a cat" --boxes "10,50,300,400"

  # Video tracking
  python -m mlx_vlm.models.sam3.generate --task track --video input.mp4 --prompt "a car"

  # Real-time webcam (live preview window, press 'q' to quit)
  python -m mlx_vlm.models.sam3.generate --task realtime --prompt "a person"

  # Real-time webcam with background swap
  python -m mlx_vlm.models.sam3.generate --task realtime --prompt "a person" --bg-image beach.jpg
)ÚdescriptionÚformatter_classÚepilogz--taskrµ  ÚtrackÚrealtimez9Task: detect, segment, track, realtime (default: segment))ÚchoicesÚdefaultÚhelpz--imageNz!Input image path (detect/segment))rÂ  rÃ  z--videozInput video path (track only)z--promptTr˜  zUText prompt(s). Pass multiple to track different objects: --prompt 'a car' 'a person')ÚrequiredÚnargsrÃ  z--boxeszIBox prompts as 'x1,y1,x2,y2' or 'x1,y1,x2,y2;x1,y1,x2,y2' in pixel coordsz--show-boxesÚ
store_truez6Draw bounding boxes and labels on segment/track output)ÚactionrÃ  z--outputz!Output path (default: auto-named)z--modelúfacebook/sam3zModel path or HF repoz--thresholdrÄ   z0Score threshold (default: 0.3 image, 0.15 video))r2  rÂ  rÃ  z--nms-threshzNMS IoU thresholdz--everyz"Detect every N frames (track only)z--resolutionrõ  zLInput resolution (default: 1008). Lower = faster: 336 (~8 FPS), 504 (~3 FPS)z
--bg-imagezNBackground image for realtime bg swap (replaces area outside detected objects)z--annotatorzAnnotation style. Presets: r´  z'. Or chain: BoxAnnotator+LabelAnnotatorz--backbone-everyzMRe-run ViT backbone every N detection frames (default: 1, increase for speed)z	--opacityz#Mask/overlay opacity (default: 0.5)z--contour-thicknessz1Mask contour thickness, 0 to disable (default: 1)z---image is required for --task detect/segmentry   )r¯  rÈ   r°  rß  rà  rœ   rá  r   rÎ  rã  rä  ræ  rç  z$--video is required for --task trackç333333Ã?)rÞ  rÈ   rß  rà  rœ   rá  râ  r   rÎ  rã  rä  rå  ræ  rç  Ú0)rÞ  rÈ   rà  rœ   rá  r   rÎ  rã  r9  rä  ræ  rç  )rž   rµ  r¿  rÀ  )rž   rµ  )ÚargparseÚArgumentParserÚRawDescriptionHelpFormatterÚadd_argumentr3   r,   r  r�  rI   Ú
parse_argsrø   r°  r—   Úerrorrº  rß  r…   rœ   rá  r   rÎ  rã  Ú	annotatorræ  rç  Úvideor7  râ  rå  r�  r9  )ÚparserÚargsrÈ   s      r   ÚmainrÕ  ^  s)  € Ü×$Ò$ØGÜ ×<Ñ<ðô€Fð4 ×ÑØÚ:ØØHð	 ô ð ×ÑØ˜4Ð&Ið ô ð ×ÑØØØ,ð ô ð
 ×ÑØØØØdð	 ô ð ×ÑØØØXð ô ð
 ×ÑØØØEð ô ð
 ×ÑØ˜DÐ'Jð ô ð ×ÑØ˜?Ð1Hð ô ð ×ÑØÜØØ?ð	 ô ð ×ÑØœU¨CÐ6Ið ô ð ×ÑØœ QÐ-Qð ô ð ×ÑØÜØØ[ð	 ô ð ×ÑØØØ]ð ô ð
 ×ÑØØà)Ø�i‰iÔ)×.Ñ.Ó0Ó1õ2à7õ8ð	 ô ð ×ÑØÜØØ\ð	 ô ð ×ÑØÜØØ2ð	 ô ð ×ÑØÜØØ@ð	 ô ð ×ÑÓ€Dà�k‰k€Gà‡y�yÐ)Ô)Ø�:‰:ÒØ�L‰LÐHÔIÜØ—z‘zØØ—‘Ø—;‘;Ø—z‘zØ(,¯©Ò(B�d—n’nÈØ—‘Ø—*‘*Ø*.¯)©)°yÔ*@�t—’ÀdØ—‘ØŸ>™>Ø—L‘LØ"×4Ñ4÷	
ð 
�‰�gÔ	Ø�:‰:ÒØ�L‰LÐ?Ô@ÜØ—z‘zØØ—;‘;Ø—z‘zØ(,¯©Ò(B�d—n’nÈØ—‘Ø—*‘*Ø—*‘*Ø—‘Ø—‘ØŸ>™>Ø×.Ñ.Ø—L‘LØ"×4Ñ4÷	
ð  
�‰�jÔ	 ÜØØØ—z‘zØ(,¯©Ò(B�d—n’nÈØ*.¯/©/¸SÔ*@�t—’ÀcØ—*‘*Ø—‘Ø—‘Ø—]‘]ØŸ>™>Ø—L‘LØ"×4Ñ4÷	
ñ 
!r   Ú__main__rÅ   r„   rÃ   )gš™™™™™¹?))éµ   éx   é   )é   é€   rÀ  )é+   é¡   rÜ  )é)   é&   éÖ   )é½   éf   é”   )éJ   éW   éŒ   )TN)NrÈ  rÉ  rÄ   r   NTrõ  Nrh   r¾  r   )rÈ  rÉ  rÄ   NTrõ  Né   Nr¾  r   )rõ  )r¾  r   )rµ  NrÈ  ry   rÄ   NTrõ  Nr¾  r   )1r"   rË  Údataclassesr   Úpathlibr   Útypingr   r   r   r   r   Úmlx.coreÚcorer�   Úmlx.nnrx  Únumpyr   r®  r
   r   r(   r/   r}   r  r  r  r  r  r²   r�  rž  rL   rª  r¸   rÚ   rÃ  rÜ  r7  r�  rƒ  r…  r�  r  r­  rº  rÕ  r   r   r   r   Ú<module>rï     sç  ðñó Ý !Ý ß 5Õ 5å Ý Û Ý ð ÷+ð +ó ð+ð ÷!ð !ó ð!÷A&ñ A&÷Hy
ñ y
÷xrõjõ2÷p÷fxMñ xMõv	 õ.÷'*õT	.÷õD
A÷ò>€
ôC÷LI ÷XôDFòð<Ø	Ð(ðàÐ1ðð Ð/ðð Ð*ð	ð
 Ð;ðð Ð*ðð Ð;ðð Ð,ðð Ð0ðð Ð2ðð 
Ð(ðð Ð.ðð 
Ð0ðð ˆOðð Ð#ðð  Ð=ð!Ð ÷(/õd	4÷EòPh
ðV ˆzÔÙ†Fñ r   