+
    UV-jij  ã                   ó  € R t ^ RIHtHt ^ RIHtHtHtHtH	t	 ^ RI
Ht ^ RIt^ RIHt ^RIHtHt ] ! R R4      4       tR R	 ltRR
 R lltRR R lltR R ltR R lt ! R R4      tR R ltRR R lltR t]R8X  d
   ]! 4        R# R# )zRF-DETR inference pipeline.)Ú	dataclassÚfield)ÚDictÚListÚOptionalÚTupleÚUnionN)ÚImage)ÚCOCO_CLASSESÚRFDETRProcessorc                   óF   a € ] tR t^t o Rt]! ]R7      tRtV 3R lt	Rt
V tR# )ÚDetectionResultzDetection output container.)Údefault_factoryNc                óÆ   <€ V ^8„  d   Qh/ S[ P                  ;R&   S[ P                  ;R&   S[ P                  ;R&   S[S[,          ;R&   S[S[ P                  ,          ;R&   # )é   ÚboxesÚscoresÚlabelsÚclass_namesÚmasks)ÚnpÚndarrayr   Ústrr   )ÚformatÚ__classdict__s   "€Úo/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_vlm/models/rfdetr/generate.pyÚ__annotate__ÚDetectionResult.__annotate__   s_   ø‡ ‚ ñ �:‰:Ññ	 ñ
 �J‰JÑñ ñ �J‰JÑñ ñ ‘c•Ñ8ñ ñ ‘B—J‘JÕÑ&ò ó    © )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Úlistr   r   Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__©r   s   @r   r   r      s    ø‡ € á%ñ
 #°4Ô8€KØ"&€E÷ ƒ r   r   c                óX   € V ^8„  d   QhR\         P                  R\         P                  /# )r   r   Úreturn©r   r   )r   s   "r   r   r      s"   € ÷ /ñ /œbŸj™jð /¬R¯Z©Zñ /r   c                óø   € V R,          V R,          V R,          V R,          3w  rr4W^,          ,
          pW$^,          ,
          pW^,          ,           pW$^,          ,           p\         P                  ! WVWx.RR7      # )z“Convert center-format boxes to corner-format.

Args:
    boxes: (..., 4) in [cx, cy, w, h] format
Returns:
    (..., 4) in [x1, y1, x2, y2] format
©Úaxis).é    ).é   ).r   ).é   éÿÿÿÿ)r   Ústack)	r   ÚcxÚcyÚwÚhÚx1Úy1Úx2Úy2s	   &        r   Úbox_cxcywh_to_xyxyr=      sh   € ð ˜•= %¨¥-°°vµÀÀfÅÐM�L€BˆAØ	�!�e�€BØ	�!�e�€BØ	�!�e�€BØ	�!�e�€BÜ�8Š8�R˜RÐ$¨2Ô.Ð.r   c                ó$  € V ^8„  d   QhR\         P                  R\         P                  R\        \        \        3,          R\        R\        R\
        \        \        ,          ,          R\
        \         P                  ,          R\        R	\        /	# )
r   Úpred_logitsÚ
pred_boxesÚoriginal_sizeÚscore_thresholdÚ
num_selectr   Ú
pred_masksÚnms_thresholdr+   )	r   r   r   ÚintÚfloatr   r   r   r   )r   s   "r   r   r   (   s�   € ÷ Wñ WÜ—‘ðWä—
‘
ðWô œœc˜•?ðWô ð	Wô
 ðWô œ$œs�)Õ$ðWô œŸ™Õ$ðWô ðWô ñWr   c                óx  € Vf   \         p^^\        P                  ! V ^ ,          ) 4      ,           ,          pVP                  RR7      p	VP	                  RR7      p
V\        V	4      8  d   \        P                  ! V	) V4      RV pM\        P                  ! \        V	4      4      pW›,          p	W«,          p
V^ ,          V,          pW“8„  pW�,          p	W­,          p
WÍ,          pW½,          p\        V4      pVw  ppVR^ ^.3;;,          V,          uu&   VR^^.3;;,          V,          uu&   \        P                  ! VR^ ^.3,          ^ V4      VR^ ^.3&   \        P                  ! VR^^.3,          ^ V4      VR^^.3&   VR8  dA   \        V4      ^ 8”  d1   \        WÉW§4      pVV,          pV	V,          p	V
V,          p
VV,          pV
 Uu. uF!  pV\        V4      8  d
   VV,          MRV 2NK#  	  ppRpVe.   \        V4      ^ 8”  d   V^ ,          V,          p\        VVV4      p\        VV	V
VVR7      # u upi )a’  Post-process model outputs to detections.

Args:
    pred_logits: (B, Q, num_classes) raw class logits
    pred_boxes: (B, Q, 4) boxes in cxcywh normalized [0, 1]
    original_size: (H, W) original image dimensions
    score_threshold: minimum confidence threshold
    num_select: max detections to return
    class_names: optional class name list
Returns:
    DetectionResult for first image in batch
Nr.   ºNNNç      ð?Úclass_©r   r   r   r   r   r3   )r
   r   ÚexpÚmaxÚargmaxÚlenÚargpartitionÚaranger=   ÚclipÚ_nms_per_classÚ_resize_masksr   )r?   r@   rA   rB   rC   r   rD   rE   r   Ú
max_scoresÚmax_classesÚtopk_idxr   ÚkeepÚfinal_query_idxÚorig_hÚorig_wÚnms_keepÚcÚnamesÚresult_masksr   s   &&&&&&&&              r   Úpostprocessra   (   sI  € ð, ÒÜ"ˆð �!”b—f’f˜k¨!�n˜_Ó-Õ-Õ.€Fð —‘ �Ó$€JØ—-‘- R�-Ó(€Kð ”C˜
“OÔ#Ü—?’? J ;°
Ó;¸K¸ZÐH‰ä—9’9œS ›_Ó-ˆàÕ%€JØÕ'€KØ�q�M˜(Õ#€Eð Ñ'€DØÕ!€JØÕ#€KØ�K€Eà•n€Oô ˜uÓ%€Eð #�N€FˆFØ	ˆ!ˆa�ˆVˆ)×˜ÕÓØ	ˆ!ˆa�ˆVˆ)×˜ÕÓô —w’w˜u Q¨¨A¨ YÕ/°°FÓ;€Eˆ!ˆa�ˆVˆ)ÑÜ—w’w˜u Q¨¨A¨ YÕ/°°FÓ;€Eˆ!ˆa�ˆVˆ)Ñð �sÔœs 5›z¨Aœ~Ü! %°[ÓPˆØ�h•ˆØ Õ)ˆ
Ø! (Õ+ˆØ)¨(Õ3ˆñ KVóÙJUÀQ˜!œc +Ó.Ô.ˆ�AŽ°f¸Q¸C°LÒ@É+ð 
ð ð
 €LØÒ¤# oÓ"6¸Ô":Ø˜1•˜oÕ.ˆÜ$ U¨F°FÓ;ˆäØØØØØôð ùòs   Ç'H7c          
      ó¤   € V ^8„  d   QhR\         P                  R\         P                  R\         P                  R\        R\         P                  /# )r   r   r   ÚclassesÚiou_thresholdr+   )r   r   rG   )r   s   "r   r   r   ‚   sJ   € ÷ .ñ .Ü�:‰:ð.ä�J‰Jð.ô �Z‰Zð.ô ð	.ô
 ‡Z�Zñ.r   c                óÖ  € . p\         P                  ! V4       FÜ  pW%8H  p\         P                  ! V4      ^ ,          pW,          pW,          p	\         P                  ! V	) 4      p
Wz,          pWŠ,          p\	        V4      ^ 8”  g   Km  VP                  V^ ,          4       \	        V4      ^8X  d   K—  \        VR,          VR,          4      ^ ,          pW³8  pVR,          V,          pVR,          V,          pKƒ  	  \	        V4      ^ 8X  d'   \         P                  ! . \         P                  R7      # \         P                  ! V4      pV\         P                  ! W,          ) 4      ,          pV# )zÇPer-class Non-Maximum Suppression.

Args:
    boxes: (N, 4) xyxy format
    scores: (N,)
    classes: (N,) class indices
    iou_threshold: IoU threshold for suppression
Returns:
    indices to keep
:r0   r1   N:r1   NN©Údtype)	r   ÚuniqueÚwhereÚargsortrP   ÚappendÚ_box_iouÚarrayÚint64)r   r   rc   rd   rY   ÚclsÚcls_maskÚcls_indicesÚ	cls_boxesÚ
cls_scoresÚorderÚiousÚ	remainings   &&&&         r   rT   rT   ‚   s   € ð  €DÜ�yŠy˜Ö!ˆØ‘>ˆÜ—h’h˜xÓ(¨Õ+ˆØ•Oˆ	ØÕ%ˆ
ô —
’
˜J˜;Ó'ˆØ!Õ(ˆØÕ$ˆ	ä�+Ó Ö"Ø�K‰K˜ A�Ô'Ü�;Ó 1Ô$Ùô ˜I c�N¨I°b­MÓ:¸1Õ=ˆDàÑ,ˆIØ% b�/¨)Õ4ˆKØ! "� iÕ0ŠIñ+ "ô. ˆ4ƒy�A„~Ü�xŠx˜¤"§(¡(Ô+Ð+ô �8Š8�D‹>€DØ”—
’
˜F�L˜=Ó)Õ*€DØ€Kr   c                óx   € V ^8„  d   QhR\         P                  R\         P                  R\         P                  /# )r   Úboxes1Úboxes2r+   r,   )r   s   "r   r   r   ³   s-   € ÷ "ñ "”R—Z‘Zð "¬¯©ð "¼¿
¹
ñ "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,           ,          # )zuCompute IoU between two sets of xyxy boxes.

Args:
    boxes1: (M, 4), boxes2: (N, 4)
Returns:
    (M, N) IoU matrix
ç�íµ ÷Æ°>)rI   Nr0   )NrI   r0   )rI   Nr1   )NrI   r1   )rI   Nr   )NrI   r   )rI   Nr2   )NrI   r2   )rI   r   )rI   r0   )rI   r2   )rI   r1   )rI   N)NrI   )r   ÚmaximumÚminimum)
rx   ry   r9   r:   r;   r<   ÚinterÚarea1Úarea2Úunions
   &&        r   rl   rl   ³   sü   € ô 
�Š�F˜:Õ&¨¨zÕ(:Ó	;€BÜ	�Š�F˜:Õ&¨¨zÕ(:Ó	;€BÜ	�Š�F˜:Õ&¨¨zÕ(:Ó	;€BÜ	�Š�F˜:Õ&¨¨zÕ(:Ó	;€Bä�JŠJ�q˜"�'Ó"¤R§Z¢Z°°2µ7Ó%;Õ;€EØ�D�\˜F 4�LÕ(¨V°D­\¸FÀ4½LÕ-HÕI€EØ�D�\˜F 4�LÕ(¨V°D­\¸FÀ4½LÕ-HÕI€EØ�'�N˜U 7�^Õ+¨eÕ3€Eà˜D•LÕ!Ð!r   c                óp   € V ^8„  d   QhR\         P                  R\        R\        R\         P                  /# )r   r   Útarget_hÚtarget_wr+   )r   r   rF   )r   s   "r   r   r   È   s0   € ÷ ñ œŸ™ð ¬sð ¼cð ÄbÇjÁjñ r   c                ó:  € ^ RI pV P                  ^ ,          p\        P                  ! WAV3\        P                  R7      p\        V4       FL  pVP                  W,          W!3VP                  R7      pV^ 8„  P                  \        P                  4      WV&   KN  	  V# )zÎResize mask logits to target size and binarize with smooth edges.

Args:
    masks: (N, mH, mW) mask logits
    target_h, target_w: output dimensions
Returns:
    (N, target_h, target_w) binary uint8 masks
Nrf   )Úinterpolation)	Úcv2Úshaper   ÚemptyÚuint8ÚrangeÚresizeÚINTER_CUBICÚastype)r   rƒ   r„   r‡   ÚNÚoutÚiÚresizeds   &&&     r   rU   rU   È   s�   € ó à�‰�A�€AÜ
�(Š(�A Ð*´"·(±(Ô
;€CÜ�1ŽXˆà—*‘*Ø�H�xÐ*¸#¿/¹/ð ó 
ˆð ˜A‘+×%Ñ%¤b§h¡hÓ/ˆ‹ñ ð €Jr   c                   ó’   a € ] tR t^Þt o R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RV 3R lR llt	Rt
V tR# )ÚRFDETRPredictorz)High-level inference wrapper for RF-DETR.Nc                óx   <€ V ^8„  d   QhRS[ RS[RS[RS[S[S[,          ,          RS[S[S[,          ,          /# )r   Ú	processorrB   rE   r   Úexclude_classes)r   rG   r   r   r   )r   r   s   "€r   r   ÚRFDETRPredictor.__annotate__á   sX   ø€ ÷ Rñ Rñ #ðRñ ð	Rñ
 ðRñ ™d¡3�iÕ(ðRñ "¡$¡s¥)Õ,ñRr   c                ó²   € Wn         W n        W0n        W@n        T;'       g    \        V n        V'       d   \        V4      V n        R # \        4       V n        R # ©N)Úmodelr–   rB   rE   r
   r   Úsetr—   )Úselfr›   r–   rB   rE   r   r—   s   &&&&&&&r   Ú__init__ÚRFDETRPredictor.__init__á   sB   € ð Œ
Ø"ŒØ.ÔØ*ÔØ&×6Ð6¬,ˆÔß7Fœs ?Ó3ˆÖÌCËEˆÖr   c                ó~   <€ V ^8„  d   QhRS[ S[P                  S[P                  S[3,          RS[S[,          RS[/# )r   ÚimagerB   r+   )r   r	   r   r   r   r   rG   r   )r   r   s   "€r   r   r˜   ñ   sA   ø€ ÷ >ñ >á‘U—[‘[¡"§*¡*©cÐ1Õ2ð>ñ "¡%�ð>ñ 
ñ	>r   c                ó€  € \        V\        4      '       d'   \        P                  ! V4      P	                  R4      pM6\        V\
        P                  4      '       d   \        P                  ! V4      pVe   TMV P                  pV P                  P                  V4      p\        P                  ! VR,          4      pV P                  V4      pVR,          VR,          .pRV9   d   VP                  VR,          4       \        P                  ! V!   \
        P                  ! VR,          4      p\
        P                  ! VR,          4      p	RV9   d   \
        P                  ! VR,          4      MRp
\!        VV	VR,          VV P                  P"                  V P$                  V
V P&                  R7      pV P(                  '       dí   \+        VP,                  4      ^ 8”  dÓ   \
        P                  ! VP$                   Uu. uF  qÌV P(                  9  NK  	  up4      p\/        VP0                  V,          VP,                  V,          VP2                  V,          \5        VP$                  V4       UUu. uF  w  rÎV'       g   K  VNK  	  uppVP6                  e   VP6                  V,          MRR	7      pV# u upi u uppi )
zÀRun detection on a single image.

Args:
    image: PIL Image, numpy array, or file path
    score_threshold: override default threshold
Returns:
    DetectionResult with boxes, scores, labels
ÚRGBNÚpixel_valuesr?   r@   rD   rA   ©rA   rB   rC   r   rD   rE   rL   )Ú
isinstancer   r	   ÚopenÚconvertr   r   Ú	fromarrayrB   r–   Úpreprocess_imageÚmxrm   r›   rk   Úevalra   rC   r   rE   r—   rP   r   r   r   r   Úzipr   )r�   r¡   rB   Ú	thresholdÚinputsr¤   ÚoutputsÚto_evalr?   r@   rD   ÚresultÚnrY   Úks   &&&            r   ÚpredictÚRFDETRPredictor.predictñ   s#  € ô �eœS×!Ò!Ü—J’J˜uÓ%×-Ñ-¨eÓ4‰EÜ˜œrŸz™z×*Ò*Ü—O’O EÓ*ˆEð  /Ò:‰OÀ×@TÑ@Tð 	ð
 —‘×0Ñ0°Ó7ˆÜ—x’x  ~Õ 6Ó7ˆð —*‘*˜\Ó*ˆØ˜=Õ)¨7°<Õ+@ÐAˆØ˜7Ô"Ø�N‰N˜7 <Õ0Ô1Ü
�Š�Òô —h’h˜w }Õ5Ó6ˆÜ—X’X˜g lÕ3Ó4ˆ
à/;¸wÔ/FŒB�HŠH�W˜\Õ*Ô+ÈDð 	ô ØØØ  Õ1Ø%Ø—~‘~×0Ñ0Ø×(Ñ(Ø!Ø×,Ñ,ô	
ˆð ××Ð¤C¨¯©Ó$6¸Ô$:Ü—8’8ÀF×DVÒDVÓWÑDV¸q d×&:Ñ&:Ô:ÑDVÑWÓXˆDÜ$Ø—l‘l 4Õ(Ø—}‘} TÕ*Ø—}‘} TÕ*Ü+.¨v×/AÑ/AÀ4Ô+HÔNÑ+H¡4 1ÌAŸQ˜QÑ+HÒNØ,2¯L©LÒ,D�f—l‘l 4Ö(È$ôˆFð ˆùò Xùó
 Os   Ç?J5É1J:ÊJ:c                óP   <€ V ^8„  d   QhRS[ P                  RS[S[,          RS[/# )r   ÚbgrrB   r+   )r   r   r   rG   r   )r   r   s   "€r   r   r˜   1  s1   ø€ ÷ 5ñ 5á�Z‰Zð5ñ "¡%�ð5ñ 
ñ	5r   c                óœ  € Ve   TMV P                   pV P                  P                  V4      p\        P                  ! VR,          4      pV P                  V4      pVR,          VR,          .pRV9   d   VP                  VR,          4       \        P                  ! V!   \        P                  ! VR,          4      p\        P                  ! VR,          4      p	RV9   d   \        P                  ! VR,          4      MRp
\        VV	VR,          VV P                  P                  V P                  V
V P                  R7      pV P                  '       dí   \        VP                  4      ^ 8”  dÓ   \        P                  ! VP                   Uu. uF  qÌV P                  9  NK  	  up4      p\!        VP"                  V,          VP                  V,          VP$                  V,          \'        VP                  V4       UUu. uF  w  rÎV'       g   K  VNK  	  uppVP(                  e   VP(                  V,          MRR7      pV# u upi u uppi )	zÄFast prediction from BGR numpy array (skips PIL, for video/camera).

Args:
    bgr: (H, W, 3) BGR uint8 array from cv2
    score_threshold: override default threshold
Returns:
    DetectionResult
Nr¤   r?   r@   rD   rA   r¥   rL   )rB   r–   Úpreprocess_bgrr«   rm   r›   rk   r¬   r   ra   rC   r   rE   r—   rP   r   r   r   r   r­   r   )r�   r¸   rB   r®   r¯   r¤   r°   r±   r?   r@   rD   r²   r³   rY   r´   s   &&&            r   Úpredict_bgrÚRFDETRPredictor.predict_bgr1  sØ  € ð  /Ò:‰OÀ×@TÑ@Tð 	ð —‘×.Ñ.¨sÓ3ˆÜ—x’x  ~Õ 6Ó7ˆà—*‘*˜\Ó*ˆØ˜=Õ)¨7°<Õ+@ÐAˆØ˜7Ô"Ø�N‰N˜7 <Õ0Ô1Ü
�Š�Òä—h’h˜w }Õ5Ó6ˆÜ—X’X˜g lÕ3Ó4ˆ
à/;¸wÔ/FŒB�HŠH�W˜\Õ*Ô+ÈDð 	ô ØØØ  Õ1Ø%Ø—~‘~×0Ñ0Ø×(Ñ(Ø!Ø×,Ñ,ô	
ˆð ××Ð¤C¨¯©Ó$6¸Ô$:Ü—8’8ÀF×DVÒDVÓWÑDV¸q d×&:Ñ&:Ô:ÑDVÑWÓXˆDÜ$Ø—l‘l 4Õ(Ø—}‘} TÕ*Ø—}‘} TÕ*Ü+.¨v×/AÑ/AÀ4Ô+HÔNÑ+H¡4 1ÌAŸQ˜QÑ+HÒNØ,2¯L©LÒ,D�f—l‘l 4Ö(È$ôˆFð ˆùò Xùó
 Os   ÆIÇ?IÈIc                ód   <€ V ^8„  d   QhRS[ RS[ RS[S[,          RS[S[,          RS[RS[ RS[/# )r   Ú
video_pathÚoutput_pathrB   Ú
max_framesÚshow_fpsÚtaskr+   )r   r   rG   rF   Úboolr   )r   r   s   "€r   r   r˜   h  sb   ø€ ÷ gñ gáðgñ ðgñ "¡%�ð	gñ
 ™S•Mðgñ ðgñ ðgñ 
ñgr   c           
     óÐ  € ^ RI p^ RIp	Ve   Tp
M\        RVR8w  d   TMR4      p
V	P                  V4      pVP	                  V	P
                  4      p\        VP	                  V	P                  4      4      p\        VP	                  V	P                  4      4      p\        VP	                  V	P                  4      4      pV'       d   \        Wô4      pT	P                  W)P                  ! R!  WÍV34      p^ RIHp . pVP                  4       pV! VRRR7      p^ pVV8  EdN   VP                  4       w  ppV'       g   EM0V P!                  VVR	7      pVP#                  \%        VP&                  4      4       VR8X  d8   \)        VP*                  VP&                  VP,                  VP.                  R
7      pV
e6   \%        VP&                  4      ^ 8”  d   V
P1                  V\3        V4      4      pV'       dM   V^ 8”  dF   VP                  4       V,
          pVV,          pV	P5                  VVR R2RV	P6                  RR^4       VP9                  V4       V^,          pVP;                  ^4       EKU  VP=                  4        VP?                  4        VP?                  4        VP                  4       V,
          pVV,          pRTRTRTRV'       d   \@        PB                  ! V4      M^ RV/pV# )ap  Run detection/segmentation on a video and save annotated output.

Args:
    video_path: path to input video
    output_path: path to save annotated video
    score_threshold: override default threshold
    max_frames: limit number of frames (None = full video)
    show_fps: overlay FPS counter on video
Returns:
    dict with stats: fps, total_frames, avg_detections
NÚautoÚdetectÚmp4v)ÚtqdmÚ
ProcessingÚframe)ÚtotalÚdescÚunit©rB   ©r   r   r   r   ú.1fz FPSgš™™™™™é?Útotal_framesÚelapsed_secondsÚfpsÚavg_detectionsr¿   )é
   é   ©r0   éÿ   r0   )"Útimer‡   Ú_get_annotatorÚVideoCaptureÚgetÚCAP_PROP_FPSrF   ÚCAP_PROP_FRAME_WIDTHÚCAP_PROP_FRAME_HEIGHTÚCAP_PROP_FRAME_COUNTÚminÚVideoWriterÚVideoWriter_fourccrÈ   Úperf_counterÚreadr»   rk   rP   r   r   r   r   r   ÚannotateÚ_to_annotator_resultÚputTextÚFONT_HERSHEY_SIMPLEXÚwriteÚupdateÚcloseÚreleaser   Úmean)r�   r¾   r¿   rB   rÀ   rÁ   Ú	annotatorrÂ   rÙ   r‡   ÚannÚcaprÓ   r7   r8   rË   ÚwriterrÈ   Ú
det_countsÚt_startÚpbarÚ	frame_idxÚretrÊ   r²   ÚelapsedÚcur_fpsÚavg_fpsÚstatss   &&&&&&&&                     r   Úpredict_videoÚRFDETRPredictor.predict_videoh  sƒ  € ó* 	ãð Ò Ø‰Cä  ¨t°v¬~¡tÀ8ÓLˆCà×Ñ˜zÓ*ˆØ�g‰g�c×&Ñ&Ó'ˆÜ�—‘˜×0Ñ0Ó1Ó2ˆÜ�—‘˜×1Ñ1Ó2Ó3ˆÜ�C—G‘G˜C×4Ñ4Ó5Ó6ˆßÜ˜Ó*ˆEà—‘Ø×/Ò/°Ñ8¸#À1¸vó
ˆõ 	àˆ
Ø×#Ñ#Ó%ˆÙ˜% l¸ÔAˆàˆ	Ø˜%ÕØŸ™›‰JˆC�ßÙà×%Ñ% e¸_Ð%ÓMˆFØ×Ñœc &§-¡-Ó0Ô1ð �xÔÜ(Ø Ÿ,™,Ø!Ÿ=™=Ø!Ÿ=™=Ø &× 2Ñ 2ô	�ð Š¤3 v§}¡}Ó#5¸Ô#9ØŸ™ UÔ,@ÀÓ,HÓI�÷ ˜I¨œMØ×+Ñ+Ó-°Õ7�Ø# gÕ-�Ø—‘ØØ˜s�m 4Ð(ØØ×,Ñ,ØØØôð �L‰L˜ÔØ˜�NˆIØ�K‰K˜�Nà�
‰
Œà�‰ŒØ�‰Ôà×#Ñ#Ó%¨Õ/ˆØ˜gÕ%ˆà˜IØ˜wØ�7Ø·ZœbŸgšg jÔ1ÀQØ˜;ð
ˆð ˆr   c                ó<   <€ V ^8„  d   QhRS[ RS[S[,          RS[ /# )r   ÚsourcerB   rÂ   )r   r   rG   )r   r   s   "€r   r   r˜   Ñ  s2   ø€ ÷ Eñ EáðEñ "¡%�ðEñ
 ñEr   c                óÀ  aaaa € ^ RI p^ RIp^ RIpVf   \        RVR8w  d   TMR4      pVP	                  4       pTP                  V'       d   \        V4      MT4      oSP                  4       '       g   \        RV 24       R# V'       d9   SP                  VP                  R4       SP                  VP                  R4       SP                  VP                  4      ;'       g    Rp	\        SP                  VP                  4      4      p
\        SP                  VP                  4      4      p\        RT
 R	T R
V	R RV'       d   RMR 24       \        R4       T;'       g    V P                  p^ pVP                  4       pRpRpRV	,          pV'       dC   R.oVP!                  4       oR.o VVVV 3R lpVP#                  VRR7      pVP%                  4         V'       d5   S;_uu_ 4        S^ ,          pRRR4       Xf   VP'                  R4       K<  M9SP)                  4       w  ppV'       g   SP                  VP*                  ^ 4       Kv  VP                  4       pV P-                  VVR7      pVP                  4       pR\/        VV,
          R4      ,          pVR8X  d8   \1        VP2                  VP4                  VP6                  VP8                  R7      p\;        VP4                  4      ^ 8”  d   VP=                  V\?        V4      4      pMTpV^,          pVP                  4       pVV,
          R8¼  d   VVV,
          ,          p^ pTpVPA                  VRVR RVR R\;        VP4                  4       R2R$VPB                  RR%^4       VPE                  RV4       V'       g<   VP                  4       V,
          p\/        ^\        VV,
          R ,          4      4      pM^pVPG                  V4      ^ÿ,          \I        R!4      8X  g   EK4   T'       d   R"S ^ &   SPK                  4        TPM                  4        \        R#4       R#   + '       g   i     EL[; i)&a“  Run realtime detection/segmentation from camera or video with display.

Camera: threaded reader so cap.read() doesn't block inference.
Video file: single-threaded with frame pacing.
Press 'q' to quit.

Args:
    source: camera index ("0") or video path
    score_threshold: override default threshold
    annotator: annotator chain (default: auto based on task)
    task: "detect", "segment", or "auto"
NrÅ   rÆ   zError: cannot open i   iÐ  g      >@zSource: Úxz @ ú.0fzfps z(camera)Ú zPress 'q' to quitg        rJ   Tc                  óº   <€ S^ ,          '       d7   SP                  4       w  rV '       g   K+  S;_uu_ 4        VS^ &   RRR4       KE  R#   + '       g   i     KX  ; i)r0   N)rå   )r÷   ÚfÚcam_lockrñ   Úlatest_frameÚrunnings     €€€€r   Ú_cam_readerÚ5RFDETRPredictor.predict_realtime.<locals>._cam_reader
  sB   ø€ Ø˜a—j”jØ ŸX™X›Z‘F�Cß‘sß%šXØ./˜L¨™O÷ &™Xñ !÷ &ŸX˜Xús   ·A	Á	A	)ÚtargetÚdaemongü©ñÒMbP?rÎ   r{   rÏ   ç      à?zInfer: z FPS | Loop: z FPS | z objgffffffæ?zRF-DETR Realtimeéè  ÚqFÚDone)rÕ   é   r×   )'Ú	threadingrÙ   r‡   rÚ   ÚisdigitrÛ   rF   ÚisOpenedÚprintrœ   rÞ   rß   rÜ   rÝ   rB   rä   ÚLockÚThreadÚstartÚsleeprå   ÚCAP_PROP_POS_FRAMESr»   rN   r   r   r   r   r   rP   ræ   rç   rè   ré   ÚimshowÚwaitKeyÚordrí   ÚdestroyAllWindows)!r�   rÿ   rB   rï   rÂ   r  rÙ   r‡   Ú	is_camerarÓ   ÚWÚHr®   Úfps_counterÚfps_t0Údisplay_fpsÚ	infer_fpsÚframe_intervalr	  ÚreaderrÊ   r÷   Út0r²   Út1r�   Únowrø   Úwait_msr  rñ   r  r  s!   &&&&&                        @@@@r   Úpredict_realtimeÚ RFDETRPredictor.predict_realtimeÑ  sÃ  û€ ó& 	ÛãàÒÜ& t°T¸V´^©TÈÓRˆIà—N‘NÓ$ˆ	Ø×Ñ¯iœs 6œ{¸VÓDˆØ�|‰|�~Š~ÜÐ'¨ xÐ0Ô1Ù÷ Ø�G‰G�C×,Ñ,¨dÔ3Ø�G‰G�C×-Ñ-¨sÔ3à�g‰g�c×&Ñ&Ó'×/Ð/¨4ˆÜ�—‘˜×0Ñ0Ó1Ó2ˆÜ�—‘˜×1Ñ1Ó2Ó3ˆÜ�˜˜˜1˜Q˜C˜s 3 s )¨4¿i±
ÈRÐ/PÐQÔRÜÐ!Ô"à#×;Ð; t×';Ñ';ˆ	ØˆØ×"Ñ"Ó$ˆØˆØˆ	Ø˜s�ˆ÷ Ø ˜6ˆLØ —~‘~Ó'ˆHØ�fˆG÷0ð 0ð ×%Ñ%¨[ÀÐ%ÓFˆFØ�L‰LŒNàßß’XØ(¨�O�E÷ à’=Ø—J‘J˜uÔ%Ùð !ð !ŸX™X›Z‘
��UßØ—G‘G˜C×3Ñ3°QÔ7Ùð ×"Ñ"Ó$ˆBØ×%Ñ% e¸YÐ%ÓGˆFØ×"Ñ"Ó$ˆBØœc " r¥'¨4Ó0Õ0ˆIà�xÔÜ(Ø Ÿ,™,Ø!Ÿ=™=Ø!Ÿ=™=Ø &× 2Ñ 2ô	�ô �6—=‘=Ó! AÔ%Ø×(Ñ(¨Ô0DÀVÓ0LÓM‘à�ð ˜1ÕˆKØ×#Ñ#Ó%ˆCØ�V�|˜sÔ"Ø)¨S°6­\Õ:�Ø�Ø�à�K‰KØØ˜) C˜¨°kÀ#Ð5FÀgÌcÐRX×R_ÑR_ÓN`ÐMaÐaeÐfØØ×(Ñ(ØØØôð �J‰JÐ)¨3Ô/÷ Ø×+Ñ+Ó-°Õ2�Ü˜a¤ n°wÕ&>À$Õ%FÓ!GÓH‘à�Ø�{‰{˜7Ó# dÕ*¬c°#«h×6ØçØˆG�A‰JØ�‰ŒØ×ÑÔÜˆfŽ÷A —X�Xús   Ç0
QÑQ	)r   r—   r›   rE   r–   rB   )r  r  NNrš   )NNFNrÅ   )Ú0NNrÅ   )r    r!   r"   r#   r$   rž   rµ   r»   rü   r,  r'   r(   r)   s   @r   r”   r”   Þ   sI   ø‡ € Ù3÷Rò R÷ >ò >÷@5ò 5÷ngò g÷RE÷ Eð Er   r”   c                ó$   € V ^8„  d   QhR\         /# )r   r²   )r   )r   s   "r   r   r   Y  s   € ÷ ñ ¤ñ r   c                óä   €  ! R R4      pV! 4       pV P                   Vn         V P                  Vn        V P                  Vn        \        V P                  4      Vn        V P                  Vn        V# )zKAdapt DetectionResult for SAM3 annotators (expects list labels, not numpy).c                   ó   € ] tR tRtRtRtR# )Ú(_to_annotator_result.<locals>._AnnResulti\  r   N)r   r   r   r   r   )r    r!   r"   r#   Ú	__slots__r'   r   r   r   Ú
_AnnResultr2  \  s   † ØIŒ	r   r4  )r   r   r   r%   r   r   )r²   r4  Úrs   &  r   rç   rç   Y  s\   € ÷Jñ Jñ 	‹€AØ�l‰l€A„GØ�}‰}€A„HØ�l‰l€A„Gä�F×&Ñ&Ó'€A„HØ×&Ñ&€A„MØ€Hr   c                ó^   € V ^8„  d   QhR\         \        ,          R\        R\        R\        /# )r   ÚnamerÂ   ÚopacityÚcontour_thickness)r   r   rG   rF   )r   s   "r   r   r   i  s4   € ÷ 1ñ 1Ü
”3�-ð1ä
ð1ô ð1ô ñ	1r   c                ó¼   € ^RI Hp V '       d   V! WVR7      # ^RIHpHpHp VR8X  d"   V! W#R7      V! 4       ,           V! 4       ,           # V! 4       V! 4       ,           # )z9Build an annotator chain. Reuses SAM3's annotator system.)Úbuild_annotator©r8  r9  )ÚBoxAnnotatorÚLabelAnnotatorÚMaskAnnotatorÚsegment)Úsam3.generater;  Úsam3.annotatorsr=  r>  r?  )r7  rÂ   r8  r9  r;  r=  r>  r?  s   &&&&    r   rÚ   rÚ   i  sb   € õ 0çÙØÐ5Fô
ð 	
÷ NÑMàˆyÔá 'ÔOÙ‹nõáÓõð	
ñ ‹~¡Ó 0Õ0Ð0r   c                 ó@  € ^ RI p ^ RIHp ^ RIHpHp ^RIHp V P                  RR7      pVP                  RR. RgORR7       VP                  R\        RR7       VP                  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$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/R0P                  VP                  4       4      ,           R1,           R27       VP                  R3\        RR4R7       VP                  R5\        ^R6R7       VP                  4       pVP                   R8X  d$   VP"                  '       g   VP%                  R74       VP                   Rh9  d6   VP&                  '       g$   VP"                  '       g   VP%                  R84       V! VP(                  4      p\+        R9V R:24       V! V4      p\,        P.                  ! \        V4      4      p	VP0                  RJp
VP                   pVR8X  d   V
'       d   R
MR	pVRi9   d&   V
'       g   VR
8X  d   \+        R;4       VR
8X  d   R	MTp\3        TT	VP4                  VP6                  VP8                  ;'       g    RR<7      pV
'       d
   VR	8w  d   R
MR	p\;        VP<                  VVP>                  VP@                  R=7      pV! V4      ;_uu_ 4        VR8X  g   VP                   R8X  d7   VP"                  ;'       g    R>pTPC                  TTV
'       d   R
MR	R?7       EMcVP&                  '       Ed$   ^ RI"p\F        PH                  ! VP&                  4      PK                  R@4      pVPM                  V4      p\N        PP                  ! \N        PR                  ! ^4      4       \N        PT                  ! 4       RA,          pVPW                  4       pVPM                  V4      pVPW                  4       p\N        PT                  ! 4       RA,          pVR	8X  d8   \Y        VPZ                  VP\                  VP^                  VP`                  RB7      p\+        \c        VP\                  4       RC24       \e        \c        VP\                  4      4       F®  pVPZ                  V,          pVPf                  e%   RDVPf                  V,          Pi                  4        2MREp\+        RFVP`                  V,          RG RHVP\                  V,          RI RJV^ ,          RK RLV^,          RK RLV^,          RK RLV^,          RK RMV 24       K°  	  \+        RN4       \+        ROVV,
          RP,          RQ RR^VV,
          ,          RQ RS24       \+        RTVRQ RU24       VPj                  ;'       g+    VP&                  Pm                  RV^4      ^ ,          RW,           p\n        Pp                  ! \n        Pr                  ! V4      RXRRRj13,          4      pVPu                  V\w        V4      4      p\F        Px                  ! VRXRRRj13,          4      P{                  V^_RY7       \+        RZV 24       EM-VP"                  '       g	   VR8X  Ed   ^ RI"p\N        P|                  ! 4        VPW                  4       pVPj                  ;'       g+    VP"                  Pm                  RV^4      ^ ,          R[,           pVP                  VP"                  VVP€                  VP‚                  VVR\7      p\N        PT                  ! 4       RA,          p\+        VR],           R^VR_,          RQ R`VRa,          RQ RbVRc,          RQ Rd24       \+        ReVRQ RU24       \+        RZVRf,           24       RRR4       R#   + '       g   i     R# ; i)kaæ  RF-DETR CLI for detection and segmentation on images and videos.

Usage:
    python -m mlx_vlm.models.rfdetr.generate --task detect --image photo.jpg --model ./rfdetr-base-mlx
    python -m mlx_vlm.models.rfdetr.generate --task segment --video traffic.mp4 --model ./rfdetr-seg-small-mlx
    python -m mlx_vlm.models.rfdetr.generate --task realtime --model ./rfdetr-base-mlx
    python -m mlx_vlm.models.rfdetr.generate --task realtime --video traffic.mp4 --model ./rfdetr-seg-small-mlx
N)Úwired_limit)Úget_model_pathÚ
load_model)ÚANNOTATOR_PRESETSzRF-DETR detection/segmentation)Údescriptionz--taskrÅ   rÆ   r@  ÚtrackÚrealtimez[Task: detect (image), segment (image+masks), track (video to file), realtime (live display))ÚdefaultÚchoicesÚhelpz--imagezInput image path)ÚtyperM  z--videoz$Input video path or camera index (0)z--modelTzModel directory)rN  ÚrequiredrM  z--outputz!Output path (default: auto-named)z--thresholdg333333Ó?zScore threshold)rN  rK  rM  z--nms-thresholdr  zNMS IoU thresholdz	--excludeÚ+zClasses to exclude)ÚnargsrK  rM  z--show-boxesÚ
store_truez,Show bounding boxes and labels (default: on))ÚactionrK  rM  z
--show-fpszShow FPS overlay on video)rS  rM  z--max-frameszMax video framesz--annotatorzAnnotation style. Presets: z, z5. Or chain: MaskAnnotator+BoxAnnotator+LabelAnnotator)rK  rM  z	--opacityzMask opacityz--contour-thicknesszMask contour thicknessz--task track requires --videoz9Provide --image or --video (or use --task realtime/track)zLoading model from z...z?Warning: model has no segmentation head, falling back to detect)rB   rE   r—   r<  r.  )rÿ   rï   rÂ   r£   g    €„.ArÏ   z detections:z
  mask_px=r  z  Ú20sÚ z.3fz  [r  Ú,Ú]z
Performance:z  Inference: r  rÐ   z ms (z FPS)z  Peak memory: z MBÚ.z_rfdetr.jpg.)Úqualityz	Saved to z_rfdetr.mp4)rÁ   rÀ   rï   rÂ   rÑ   z frames in rÒ   zs (rÓ   z FPS, rÔ   z
 avg dets)zPeak memory: r¿   )rÅ   rÆ   r@  rI  rJ  )rJ  rI  )r@  rJ  r3   )BÚargparseÚmlx_vlm.generaterD  Úmlx_vlm.utilsrE  rF  rA  rG  ÚArgumentParserÚadd_argumentr   rG   rF   ÚjoinÚkeysÚ
parse_argsrÂ   ÚvideoÚerrorr¡   r›   r  r   Úfrom_pretrainedÚsegmentation_headr”   r®   rE   ÚexcluderÚ   rï   r8  r9  r,  rÙ   r	   r§   r¨   rµ   r«   r¬   ÚzerosÚget_peak_memoryrä   r   r   r   r   r   rP   r‹   r   ÚsumÚoutputÚrsplitr   Úascontiguousarrayrm   ræ   rç   r©   ÚsaveÚreset_peak_memoryrü   rÁ   rÀ   )rZ  rD  rE  rF  rG  ÚparserÚargsÚ
model_pathr›   r–   Úhas_segrÂ   Ú	predictorÚeffective_taskrï   rÿ   rÙ   r¡   Ú_Ú
mem_beforer(  r²   r)  Úpeak_memr‘   ÚboxÚ	mask_infoÚout_pathÚscenerô   rû   s                                  r   Úmainr|  ƒ  s-  € ó å,ß8å1à×$Ñ$Ð1QÐ$ÓR€FØ
×ÑØØÚBØjð	 ô ð ×Ñ˜	¬Ð2DÐÔEØ
×ÑØœÐ"Hð ô ð ×Ñ˜	¬°dÐARÐÔSØ
×Ñ˜
¬Ð3VÐÔWØ
×Ñ˜¬E¸3ÐEVÐÔWØ
×ÑØ¤¨sÐ9Lð ô ð ×Ñ˜¨3¸ÐAUÐÔVØ
×ÑØØØØ;ð	 ô ð ×ÑØ˜\Ð0Kð ô ð ×Ñ˜¬S¸$ÐEWÐÔXØ
×ÑØØØ*Ø
�)‰)Ð%×*Ñ*Ó,Ó
-õ.à
AõBð ô ð ×Ñ˜¬%¸À>ÐÔRØ
×ÑØ¤C°Ð9Qð ô ð ×ÑÓ€Dà‡y�y�GÔ D§J§J JØ�‰Ð4Ô5Ø‡y�yÐ-Ô-°d·j·j°jÈÏÏÈØ�‰ÐPÔQñ   §
¡
Ó+€JÜ	Ð 
˜|¨3Ð
/Ô0Ù�zÓ"€EÜ×/Ò/´°J³Ó@€Ið ×%Ñ%¨TÐ1€GØ�9‰9€DØˆv„~ß#‰y¨ˆØÐ&Ô&¯wØ�9ÔÜÐSÔTØ 9Ô,‰x°$ˆäØØØŸ™Ø×(Ñ(ØŸ™×,Ð,¨ô€I÷ #*¨d°hÔ.>‘YÀH€NÜØ�‰ØØ—‘Ø×0Ñ0ô	€Iñ 
�U×	Õ	Ø�:Ô $§)¡)¨zÔ"9Ø—Z‘Z×&Ð& 3ˆFØ×&Ñ&ØØ#ß")‘Y¨xð 'ö ð �Z�Z‰ZÛä—J’J˜tŸz™zÓ*×2Ñ2°5Ó9ˆEð ×!Ñ! %Ó(ˆAÜ�GŠG”B—H’H˜Q“KÔ ä×+Ò+Ó-°Õ3ˆJØ×"Ñ"Ó$ˆBØ×&Ñ& uÓ-ˆFØ×"Ñ"Ó$ˆBÜ×)Ò)Ó+¨cÕ1ˆHà�xÔÜ(Ø Ÿ,™,Ø!Ÿ=™=Ø!Ÿ=™=Ø &× 2Ñ 2ô	�ô ”S˜Ÿ™Ó'Ð(¨Ð5Ô6Üœ3˜vŸ}™}Ó-Ö.�Ø—l‘l 1•o�ð —|‘|Ò/ð ! §¡¨a¥×!4Ñ!4Ó!6Ð 7Ñ8àð ô
 Ø˜×+Ñ+¨AÕ.¨sÐ3°1°V·]±]À1Õ5EÀcÐ4Jð KØ˜A�˜s�| 1 S¨¥V¨C L°°#°aµ&¸°¸Q¸sÀ1½vÀc¸lÈ!ÈIÈ;ðXöñ /ô �NÔ$Ü�M 2 b¥5¨$¥,¨sÐ!3°5¸¸B¸r½E½À3¸ÀuÐMÔNÜ�O H¨S >°Ð5Ô6à—{‘{×RÐR d§j¡j×&7Ñ&7¸¸QÓ&?ÀÕ&BÀ]Õ&RˆHÜ×(Ò(¬¯ª°%«¸¹dÀ¸d¸Õ)CÓDˆEØ×&Ñ& uÔ.BÀ6Ó.JÓKˆEÜ�OŠO˜E #¡t¨ t )Õ,Ó-×2Ñ2°8ÀRÐ2ÔHÜ�I˜h˜ZÐ(Ö)à�Z�ZˆZ˜4 7�?Ûä× Ò Ô"Ø×'Ñ'Ó)ˆGØ—{‘{×RÐR d§j¡j×&7Ñ&7¸¸QÓ&?ÀÕ&BÀ]Õ&RˆHØ×+Ñ+Ø—
‘
ØØŸ™ØŸ?™?Ø#Øð ,ó ˆEô ×)Ò)Ó+¨cÕ1ˆHäØ˜Õ(Ð)¨°UÐ;LÕ5MÈcÐ4Rð SØ˜%•L Ð% V¨EÐ2BÕ,CÀCÐ+HÈ
ðTôô �M (¨3 ¨sÐ3Ô4Ü�I˜e MÕ2Ð3Ð4Ô5÷Y 
×	×	Ò	ús-   Í+`Í<`Î`Î2L4`Û'A`Ü+C`à`	Ú__main__)r  i,  NNr  )r  )r  r1   )r$   Údataclassesr   r   Útypingr   r   r   r   r   Úmlx.coreÚcorer«   Únumpyr   ÚPILr	   Úprocessing_rfdetrr
   r   r   r=   ra   rT   rl   rU   r”   rç   rÚ   r|  r    r   r   r   Ú<module>r…     s„   ðÙ !ç (ß 5Õ 5å Û Ý ç <ð ÷'ð 'ó ð'õ/÷ W÷t.õb"õ*÷,xñ xõv÷ 1ò4k6ð\ ˆzÔÙ†Fñ r   