
    3jf                     z   S r SSKJr  SSKrSSKrSSKrSSKJs  Jr	  SSK
rSSKrSSKrSSKJrJrJr  SSKrSSKJr  S rS r " S S	\R.                  5      r\R2                  " S
5      r " S S\R.                  5      r " S S\R.                  5      r " S S\R.                  5      r " S S\5      rS\4S jrg)zR
SAM3 (Segment Anything 3) nodes for detection, segmentation, and video tracking.
    )overrideN)ComfyExtensionioui)Fractionc           	         U S   S   nUR                  S5      n/ nUb  U H  nUS   R                  XS9nUS   b  US   R                  U5      OSnUc?  [        R                  " UR                  S   UR                  S   [        R
                  US9nUR                  XxUR                  S	S5      45        M     U$ U S   S   R                  XS9nUR                  S5      nUb  UR                  U5      nO?[        R                  " UR                  S   UR                  S   [        R
                  US9nUR                  XxS45        U$ )
z?Extract list of (text_embeddings, text_mask) from conditioning.r      sam3_multi_condNconddevicedtypeattention_maskr   r   max_detections)gettotorchonesshapeint64append)	conditioningr   r   	cond_metamultipromptsentryembmasks	            7/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_sam3.py_extract_text_promptsr!      s?   Q"IMM+,EGE-""&">C9>?O9P9\5)*--f5bfD|zz#))A,		!EKKX^_NNCuyy1A1'EFG  N 1oa ##6#?}}-.776?D::ciilCIIaLTZ[D1~&N    c	           	        ^^^ UUU4S jn	US::  a  U	" 5       $ Sn
UR                  5       u  ppX-
  X-
  nn[        S[        XU
-  -
  5      5      n[        S[        UUU
-  -
  5      5      n[        T[        XU
-  -   5      5      n[        T[        UUU
-  -   5      5      nUU::  d  UU::  a  U	" 5       $ UUU2UU2SS24   n[        R
                  R                  UR                  S5      R                  SS5      SSS	S
S9nUR                  XgS9nUU-
  UU-
  nnTR                  SS u  nn[        UT-  U-  5      [        UT-  U-  5      nn[        UT-  U-  5      [        UT-  U-  5      nnUU::  d  UU::  a  U	" 5       $ TSUU2UU24   R                  S5      R                  S5      n [        U5       H*  n![        R                  " U SS	SS9n"U R                  UU"S9n M,     [        R                  " U UU4S	SS9n#[        R                   " SSTTXgS9n$U#U$SS2SS2UU2UU24'   [        R                  " TR                  S5      R                  S5      TT4S	SS9n%U$S   S:  U%S   S:  -  R#                  5       $ )znRefine a coarse detector mask via SAM decoder, cropping to the detection box.

Returns: [1, H, W] binary mask
c                     > [         R                  " TR                  S5      R                  S5      T T4SSS9S   S:  R                  5       $ )Nr   bilinearFsizemodealign_corners)Finterpolate	unsqueezefloat)HWcoarse_masks   r    _coarse_fallback&_refine_mask.<locals>._coarse_fallback/   sR    k33A6@@C1a&#-UDDEGIJKLQEG	Tr"   r   g?N   r	     r%   disabledcropr   .)r5   r5   Fr&   mask_inputs)tolistmaxintmincomfyutilscommon_upscaler,   movedimr   r   ranger*   r+   forward_segmentr   zerosr-   )&
sam3_modelorig_image_hwcr0   box_xyxyr.   r/   r   r   
iterationsr1   pad_fracx1y1x2y2bwbhcx1cy1cx2cy2r8   	crop_1008
crop_framecrop_hcrop_wmask_hmask_wmx1my1mx2my2
mask_logit_coarse_inputrefined_crop	full_maskcoarse_fulls&     ` ``                                r    _refine_maskrf   *   s   
T Q!!H__&NBBWbgB
aRx-'(
)C
aR"x-'(
)C
aRx-'(
)C
aR"x-'(
)C
czSCZ!!#c'3s7BQB./D**4>>!+<+D+DR+KTSWYcjt*uIV9J3Yc	FF !&&rs+NFF37V#$c#'F*:&;C37V#$c#'F*:&;C
czSCZ!!S#c'3s723==a@JJ1MJ:}}Zlchi//
/U
  ==662BchiLAq!QvCI(4IaCGSW$%-- 5 5a 8 B B1 EQPQFYcsxyKq\A+a.1"45<<>>r"   c                   X    \ rS rSrSr\S 5       r\SS\R                  4S jj5       r	Sr
g)	SAM3_DetectX   zMOpen-vocabulary detection and segmentation using text, box, or point prompts.c                    [         R                  " SSS/ SQ[         R                  R                  SSS9[         R                  R                  SSS9[         R
                  R                  SSS	S
S9[         R                  R                  SSS	S	SS9[         R                  R                  SSS	S	SS9[         R                  R                  SSS	S	SS9[         R                  R                  SSSSSSS9[         R                  R                  SSSSSSS9[         R                  R                  SSS S!S"9/	[         R                  R                  S#5      [         R                  R                  S5      /S$9$ )%Nrh   zSAM3 Detectimage/detection)sam3zsegment anythingzopen vocabularyztext detectionsegmentmodeldisplay_nameimager   Tz%Text conditioning from CLIPTextEncoderp   optionaltooltipbboxesz Bounding boxes to segment within)rp   force_inputrs   rt   positive_coordszIPositive point prompts as JSON [{"x": int, "y": int}, ...] (pixel coords)negative_coordszINegative point prompts as JSON [{"x": int, "y": int}, ...] (pixel coords)	threshold      ?              ?{Gz?rp   defaultr?   r=   steprefine_iterations   r      z8SAM decoder refinement passes (0=use raw detector masks)rp   r   r?   r=   rt   individual_masksFz(Output per-object masks instead of unionrp   r   rt   masksnode_idrp   categorysearch_aliasesinputsoutputs)r   SchemaModelInputImageConditioningBoundingBoxStringFloatIntBooleanMaskOutputclss    r    define_schemaSAM3_Detect.define_schema[   sz   yy!&&gwW=wW=%%n>\`  kR%  S$$XHRVae  pR$  S		 1@Q_cnr  }L  M		 1@Q_cnr  }L  M{cWZ`cjno0?R\]cdjk  vp  q

  !3BT^c  nX   Y
 w'%%h/!
 	
r"   Nreturnc
                   ^A^B UR                   u  n
mAmBn[        R                  R                  USS S24   R	                  SS5      SSSSS9nUAUB4S	 jnS nUb  [        U[        5      (       a  U" U/5      nU/U
-  nO[        U[        5      (       a  [        U5      S
:  aw  [        US
   [        5      (       a_  U Vs/ s H  nU(       a  U" U5      OS PM     nn[        U5      U
:  a.  UR                  U(       a  US   OS 5        [        U5      U
:  a  M.  O2[        U[        5      (       a  [        U5      S
:  a  U" U5      nU/U
-  nU(       a  [        R                  " U5      O/ nU(       a  [        R                  " U5      O/ n[        U5      S
:  =(       d    [        U5      S
:  n[        R                  R                  U5        [        R                  R                  5       nUR                  R!                  5       nUR                  R"                  nS nU(       a  U Vs/ s H  nUS   TB-  S-  US   TA-  S-  /PM     snU Vs/ s H  nUS   TB-  S-  US   TA-  S-  /PM     sn-   nS/[        U5      -  S
/[        U5      -  -   n[$        R&                  " U/UUS9[$        R&                  " U/[$        R(                  US9S.nUb  [        U5      S
:  a  [+        UUU5      O/ n[        U5      S
:  n/ n/ n[        R                  R-                  U
5      n[/        U
5       GH  n UU U S-    R1                  UUS9n!S n"Ub  UU    b  UU    R1                  UUS9n"/ n#/ n$Ub}  UR3                  U!US9n%[/        [5        S
US-
  5      5       H  n&UR3                  U!U%S9n%M     [6        R8                  " U%TATB4SSS9n'U$R                  U'S
   S
:  R;                  5       5        U"b  U(       d  U"S
    H  n(U(R=                  5       u  n)n*n+n,[$        R&                  " U)U+S-  -
  S-  U*U,S-  -
  S-  /U)U+S-  -   S-  U*U,S-  -   S-  ///UUS9n-UR3                  U!U-S9n%[/        [5        S
US-
  5      5       H  n&UR3                  U!U%S9n%M     [6        R8                  " U%TATB4SSS9n'U$R                  U'S
   S
:  R;                  5       5        M     U GH;  u  n.n/n0U" U!U.U/U"UTATB4S9n1U1S   S
   n2U1S   S
   n3U1S   S
   n4U3R?                  5       n5U5U:  n6U2U6   RA                  5       n7U5U6   RA                  5       n8U4U6   n9U8RC                  SS9S U0 n:U7U:   n7U8U:   n8U9U:   n9[E        U7U85       Hb  u  n;n<U#R                  [;        U;S
   5      [;        U;S   5      [;        U;S   U;S
   -
  5      [;        U;S   U;S   -
  5      [;        U<5      S.5        Md     [E        U9U75       H+  u  n=n;U$R                  [G        UUU    U=U;TATBUUU5	      5        M-     GM>     UR                  U#5        [        U$5      S
:  a^  [$        RH                  " U$S
S9n>U	(       a  UR                  U>5        OUR                  U>S
:  RK                  S
S9R;                  5       5        OU	(       aC  UR                  [$        RL                  " S
TATB[        R                  RO                  5       S95        OAUR                  [$        RL                  " TATB[        R                  RO                  5       S95        URQ                  S5        GM     [        R                  RO                  5       n?U V=s/ s H  n=U=R1                  U?5      PM     nn=U	(       a  [$        RH                  " US
S9O[$        RR                  " U5      n@[T        RV                  " U@U5      $ s  snf s  snf s  snf s  sn=f )N.r3   r4   r	   r5   r%   r6   r7   c                    > / nU  HE  nUS   US   S-  -   T-  nUS   US   S-  -   T-  nUR                  X4US   T-  US   T-  /5        MG     [        R                  " U/[        R                  S9$ )Nxwidthr   yheightr   )r   r   tensorfloat32)box_listcoordsdcxcyr.   r/   s        r    _boxes_to_tensor-SAM3_Detect.execute.<locals>._boxes_to_tensorz   s    FfqzA~-2fq{Q.!3rqzA~q{QGH  <<>>r"   r   r   r   r   )point_coordspoint_labelsr   )point_inputsr:   Fr&   r   )
box_inputs)text_embeddings	text_maskboxesry   	orig_sizer   scoresr   T)
descending)r   r   r   r   scoredimr   ),r   r@   rA   rB   rC   
isinstancedictlistlenr   jsonloadsmodel_managementload_model_gpuget_torch_devicern   	get_dtypediffusion_modelr   r   int32r!   ProgressBarrD   r   rE   r=   r*   r+   r-   r<   sigmoidcpuargsortziprf   catanyrF   intermediate_deviceupdatestackr   
NodeOutput)Cr   rn   rq   r   ru   rw   rx   ry   r   r   BCimage_inr   per_frame_boxessharedframe_boxespos_ptsneg_pts
has_pointsr   r   rG   r   p
all_coords
all_labels	cond_listhas_textall_bbox_dicts	all_maskspbarbframeb_boxesframe_bbox_dictsframe_masksr`   ra   r   
box_cxcywhr   r   rP   rQ   sam_boxr   r   max_detresults
pred_boxesr   r   probskeep
kept_boxeskept_scores
kept_masksorderboxr   mcombinedidevmask_outr.   r/   sC                                                                    @@r    executeSAM3_Detect.executes   s   [[
1a;;--eC!Gn.D.DR.KTSWYcjt-u	? &$'')6(3#)(Q,FD))c&kAo*VTUYX\B]B]ms"tms^iK#3K#@UY#Yms"t/*Q.#**/?2+>W[\ /*Q.FD))c&kAo)&1#)(Q, 2A$**_-b1@$**_-b\A%9W)9
--e4''88:%%'[[00
 JQR'Q1S6A:,afqj4.?@'RJQR'Q1S6A:,afqj4.?@'RSJs7|+qcCL.@@J %j\v V %j\U[ \L
 KWJbgjkwgx{|g|),F  CE	y>A% 	{{&&q)qAQqsO&&fE&BEG*q/A/M)!,//vU/K!K ''77L7Y
s1&7!&;<=A!+!;!;Ez!;!ZJ >}}Zq!f:]bc""DGaK#6#6#89 "8")!*J%/%6%6%8NBB#llrBqDyD.@219PTBT-U/1BqDyD.@219PTBT-U-W ,X28GG ",!;!;Eg!;!VJ"3q*;a*?#@A%/%?%?S]%?%^
 B==1a&zafgD&&Q!':':'<= #- 8A3G$?i!Y1a&J %W-a0
 *1-(+(y('-113
#Dkoo/"4[
#++t+<XgF'.
)%0'.
"%j+">JC$++"3q6]s1v!&s1vA!75QRUVWRXCY!&u-  #? "*j9FAs&&|"E!HaaFEK\(^ _ :5 8A< !!"23;!# 99[a8#$$X.$$hl%7%7A%7%>%D%D%FG#$$U[[AqAWAWAkAkAm%no$$U[[Ae>T>T>h>h>j%klKKNU X %%99;)23AQTT$Z	32B599YA.T]H^}}X~66k #u, SRx 4s   =^7% ^< __ )NNNNrz   r   F__name__
__module____qualname____firstlineno____doc__classmethodr   r   r   r   __static_attributes__r   r"   r    rh   rh   X   sH    W
 
. K7  oq  o|  o| K7 K7r"   rh   SAM3_TRACK_DATAc                   X    \ rS rSrSr\S 5       r\SS\R                  4S jj5       r	Sr
g)	SAM3_VideoTracki  zDTrack objects across video frames using SAM3's memory-based tracker.c                    [         R                  " SSS/ SQ[         R                  R                  SSSS9[         R                  R                  SSS	9[         R
                  R                  S
S
SSS9[         R                  R                  SSSSS9[         R                  R                  SSSSSSSS9[         R                  R                  SSSSSSS9[         R                  R                  SSSSSS 9/[        R                  S!S!S	9/S"9$ )#Nr  zRun SAM3 Video Trackrk   )rl   videotrack	propagateimageszVideo frames as batched images)rp   rt   rn   ro   initial_maskTz5Mask(s) for the first frame to track (one per object)rr   r   z;Text conditioning for detecting new objects during trackingdetection_thresholdrz   r{   r|   r}   z,Score threshold for text-prompted detection.)rp   r   r?   r=   r   rt   max_objects   r   @   zZMax tracked objects. Initial masks count toward this limit. 0 uses the internal cap of 64.r   detect_intervalr	   zIRun detection every N frames (1=every frame). Higher values save compute.)rp   r   r?   rt   
track_datar   )r   r   r   r   r   r   r   r   r   SAM3TrackDatar   r   s    r    r   SAM3_VideoTrack.define_schema  s+   yy%/&BxhHhiwW=n>TX  cZ  [%%n>\`  kh%  i4CXbekntw  C  M{  |]PQWX^`  kG  H.=NXY_`  kv  w $$\$M
 	
r"   Nr   c                    UR                   u  pp[        R                  R                  U5        [        R                  R	                  5       nUR
                  R                  5       nUR
                  R                  nUSS S24   R                  SS5      nS nUb  UR                  S5      R                  XS9n[        R                  R                  U5      nS nUb6  [        U5      S:  a'  [        XLU5       VVVs/ s H  u  nnnUU4PM     nnnnOUc  [        S5      eUR!                  UUUUXVX|US9	nX4US	'   ["        R$                  " U5      $ s  snnnf )
N.r3   r4   r	   r   r   z4Either initial_mask or conditioning must be provided)	r  initial_masksr   text_promptsnew_det_threshr  r  target_devicetarget_dtyper   )r   r@   r   r   r   rn   r   r   rC   r,   r   rA   r   r   r!   
ValueErrorforward_videor   r   )r   r  rn   r  r   r  r  r  Nr.   r/   r   r   r   rG   	frames_in
init_masksr   r  r   r   ra   results                          r    r   SAM3_VideoTrack.execute  sS   \\
a--e4''88:%%'[[00
37O++B2	
#%//255V5QJ{{&&q)#L(9A(=<QR^hm<no<nLCqS$K<nLoL!STT))JTP\.+PU * W  !f{}}V$$ ps   <Er   )NNrz   r   r	   r   r   r"   r    r  r    sE    N
 
( %  IK  IV  IV % %r"   r  c                       \ rS rSrSr\S 5       r/ SQr0 r\	SS j5       r
\	SS j5       r\SS\R                  4S	 jj5       rS
rg)SAM3_TrackPreviewi;  ul   Visualize tracked objects with distinct colors as a video preview. No tensor output — saves to temp video.c                    [         R                  " SSS[        R                  SSS9[         R                  R                  SSSS9[         R
                  R                  S	S	S
SSSS9[         R
                  R                  SSSSSSS9/SS9$ )Nr$  zSAM3 Track Previewrk   r  ro   r  T)rp   rs   opacityrz   r{   r|   皙?r~   fps      8@g      ^@)r   rp   r   r   is_output_node)r   r   r  r   r   r   r   s    r    r   SAM3_TrackPreview.define_schema>  s    yy'-&##L|#LxhNyy#SV\_fjku5$CUZade	  
 	
r"   ))gQ?Gz?gQ?)r|   rz   r'  )(\?g)\(?r-  )zG?g333333?g{Gz?)g(\?g?Gz?)g?g(\?g(\?)g{Gz?r,  RQ?)rz   rz   rz   )r/  r/  gp=
ף?)g
ףp=
?g      ?gQ?)gGz?r0  gQ?)gzG?g(\?r.  c                 $   X4nU[         R                  ;   a  [         R                  U   $ [        R                  " / SQ/ SQ/ SQ/ SQ/ SQ// SQ/ SQ/ SQ/ SQ/ SQ// SQ/ SQ/ SQ/ SQ/ SQ// SQ/ SQ/ SQ/ SQ/ SQ// SQ/ SQ/ SQ/ SQ/ SQ// SQ/ SQ/ SQ/ SQ/ SQ// SQ/ SQ/ SQ/ SQ/ SQ// SQ/ SQ/ SQ/ SQ/ SQ// SQ/ SQ/ SQ/ SQ/ SQ// SQ/ SQ/ SQ/ SQ/ SQ//
[        R                  S9n/ / pT[        S5       H  nX6   R                  US	5      R                  US
5      n[        R                  " UR                  5       R                  S	5      R                  S	5      S5      n[        R                  " USS
S
S9S   S	:  n	UR                  UR                  U 5      5        UR                  U	R                  U 5      5        M     US	   R                  u  pUS	   R                  u  pXEXX4[         R                  U'   [         R                  U   $ )N)r	   r	   r	   )r	   r   r	   )r   r	   r   )r	   r	   r   )r   r   r	   )r	   r   r   r   
   r   r	   )r	   r	   r	   r	   r3   )stridepadding)r   r   )r$  _glyph_cacher   r   boolrD   repeat_interleaver*   padr-   r,   
max_pool2dr   r   r   )r   scalekeyatlasglyphsoutlinesr   gpaddedoghgwohows                 r    _get_glyphsSAM3_TrackPreview._get_glyphsV  s   o#000$11#66WWWW5WWWW5WWWW5WWWW5WWWW5WWWW5WWWW5WWWW5WWWW5WWWW5
  rrA**5!4FFuaPAUU1779..q1;;A>	JFfa1=dCaGAMM!$$v,'OOADDL)  !""/5.P&&s+ --c22r"   c                 h   U R                   SS u  pgU R                  n[        R                  X5      u  ppp[        R
                  " XHU R                  S9n[        U5       Vs/ s H  n[        U5      PM     nn[        U5      X-   -  U-
  nUUS-  -
  nX;S-  -
  n[        U5       GH  u  nnUUX-   -  -   nUS-
  US-
  nn[        SU* 5      [        SU* 5      nn[        XU-
  5      [        XU-
  5      nnUU:  a6  UU:  a0  UU-   UU-   nnSU UUUU-
  -   2UUUU-
  -   24   U
U   UU2UU24   '   [        SU* 5      [        SU* 5      n n[        XU-
  5      [        XU-
  5      n"n!U!U:  d  M  U"U :  d  M  UU-   UU -   nnXUUU!U-
  -   2UUU"U -
  -   24   U	U   UU!2U U"24   '   GM     gs  snf )zKDraw a number on a GPU tensor [H, W, 3] float 0-1 at (cx, cy) with outline.Nr   r   r	   r   )r   r   r$  rF  r   r   r   strr>   r   	enumerater=   r?   )#r   numberr   r   colorr:  r.   r/   r   r=  r>  rB  rC  rD  rE  color_tr   digstotal_wx0y0idxoy0ox0osy1osx1osy2osx2fy1fx1sy1sx1sy2sx2s#                                      r    _draw_number_gpu"SAM3_TrackPreview._draw_number_gpus  s    {{2A+<+H+H+W("",,u5;;G #F,1A,d)rz*U2'Q,'\dODAqa2:&&BAvrAvCQs1sd|$DRS)3rs7+;$Dd{td{:sTzSefc#tDy/)3sDI+>>?DQUIW[\`W`L`@ab1rc{CB3KC22vBBCSyS3Y8R#XS[bc#s3w-'S#c'])::;F1Ic#gsSVwFV<WX $	 -s   #F/Nr   c                 ~   SSK Jn  US   nUS   u  pxUb  UR                  S   UR                  S   pUc  US   SpOUR                  S   UR                  S   pSS Kn[        R
                  R                  5       n[        R                  " 5       nSUR                  5       R                  S S	  S
3n[        R                  R                  X5      n[        R                  " USS9 nUR!                  S[#        [%        US-  5      S5      S9nUUl        UUl        SUl        [,        R.                  " XxS[,        R0                  S9nUR3                  5       nU
S:  a  [,        R4                  " [7        U
5       Vs/ s H(  nU R8                  U[;        U R8                  5      -     PM*     snU[,        R<                  S9n[,        R>                  " X|S9RA                  SUS5      n[,        R>                  " XS9RA                  SSU5      n[7        U	5       GH  nUb'  UUR                  S   :  a  UU   RC                  5       nO[,        RD                  " XxS5      nU
S:  Ga  U" UUUS-    RG                  U5      5      n[H        RJ                  " URM                  5       Xx4SS9S   nURG                  U5      nUS:  nURO                  SS9nURO                  5       (       af  URG                  [,        R0                  5      RQ                  SS9nWU   n URS                  S5      n![,        RT                  " U!USU-
  -  U U-  -   U5      nURW                  SS9RY                  SS9n"UW-  RW                  SS9U"-  n#UW-  RW                  SS9U"-  n$U"S:  n%UR[                  S/ 5      n&[]        SUS-  5      n'U"RM                  5       R_                  5       S-  RY                  SS9Ra                  5       Rc                  5       n([7        U
5       H  n)U%U)   (       d  M  [e        U$U)   5      [e        U#U)   5      n+n*U R8                  U)[;        U R8                  5      -     n,[g        U'U(U)   5      n-[]        SU-S-  S-  5      n.[h        Rk                  UU)U*U+U,U-S9  U)[;        U&5      :  d  M  U&U)   S :  d  M  [h        Rk                  U[e        U&U)   S!-  5      U*U+S"U--  -   S-   U,U.S9  M     URm                  URY                  SS5      Ro                  S#5      Rq                  5       5        O>URm                  URY                  SS5      Ro                  S#5      Rq                  5       5        [        Rr                  Ru                  US$S%9n/URw                  URy                  U/R{                  SS%95      5        GM     URw                  URy                  S 5      5        S S S 5        [|        R~                  " [        R                  " [        R                  " US&[|        R                  R                  5      /5      S'9$ s  snf ! , (       d  f       Nj= f)(Nr   unpack_maskspacked_masksr   r	   r   n_framessam3_track_preview_   z.mp4w)r(   h264i  )rateyuv420pr3   r   r   r   nearest)r'   r(   rz   r   r4   )r4   r9   )r?   r         )r:  r|   d   r      rgb24)format )r   )Ecomfy.ldm.sam3.trackerrd  r   uuidr@   r   r   folder_pathsget_temp_directoryuuid4hexospathjoinavopen
add_streamr   roundr   r   pix_fmtr   emptyuint8numpyr   rD   COLORSr   r   arangeviewclonerF   r   r*   r+   r-   r   argmaxr,   wheresumclamp_r   r=   sqrtlongr<   r>   r?   r$  r`  copy_mul_byte
VideoFramefrom_ndarraymuxencodereformatr   r   r   PreviewVideoSavedResult
FolderTypetemp)0r   r  r  r&  r(  rd  packedr.   r/   r  N_objrv  gputemp_dirfilenamefilepathoutputstream	frame_cpuframe_nprR  colors_tgrid_ygrid_xtr   frame_binaryr   	frame_gpu
bool_masksany_maskobj_idx_mapcolor_overlaymask_3darear   r   hasr   label_scale	size_capsobj_idx_cx_cyrL  	obj_scalescore_scalevframes0                                                   r    r   SAM3_TrackPreview.execute  sr    	8N++&<<?FLLOq>!*-qu||AQu$$557224()9)9"1)=(>dC77<<3WWXC(F&&vHU3:=NPT4U&VFFLFM&FNA!5;;?I (Hqy <<RWX]R^(_R^QACJJ4G)HR^(_.1Ha499!QBa499!QB1X%!fll1o*="1IOO-E!KKa0E19#/q10@0@0E#FL"#--0B0B0DA6Xa"bcd"eK %I!,s!2J)~~!~4H||~~&0mmEKK&@&G&GA&G&N(0(="*"4"4R"8$)KKa'k9RUbelUl9lnw$x	%>>h>7>>1>ED$v-22x2@DHB$v-22x2@DHB(C'^^Hb9F"%ac"2K!%!2!2!4r!9 A Aa A H M M O V V XI#(<w<<'*2g;'7R[9IC$'JJwSZZ/H$IE(+K79K(LI*-aQ!1C*DK->>y'SVX[]bjs>t&V439N 1 B B9cRXY`RadgRgNhCFaR[mH[^_H_afny !C !{ $0 OOI$4$4Q$:$?$?$D$I$I$KLOOELLA$6$;$;C$@$E$E$GH33HW3M

6==	)JKLO P JJv}}T*+k )l }}"bmmN`N`1a0b cdd[ )` )(s4   &BX.9/X)
(I'X.BX.X.)D!X.)X..
X<r   )r3   )Nrz   r)  )r   r   r   r  r  r  r   r  r5  staticmethodrF  r`  r   r   r   r  r   r"   r    r$  r$  ;  sr    v
 
F L3 38 c c4 Ge Ge Ger"   r$  c                   X    \ rS rSrSr\S 5       r\SS\R                  4S jj5       r	Sr
g)	SAM3_TrackToMaski  z3Select tracked objects by index and output as mask.c                     [         R                  " SSS[        R                  SSS9[         R                  R                  SSSSS	9/[         R
                  R                  S
S
S9/S9$ )Nr  zSAM3 Track to Maskrk   r  ro   object_indicesrt  zNComma-separated object indices to include (e.g. '0,2,3'). Empty = all objects.r   r   )r   rp   r   r   r   )r   r   r  r   r   r   r   r   s    r    r   SAM3_TrackToMask.define_schema  sq    yy&-&##L|#L		 0?OY[(x   z wW=
 	
r"   r   c           	         SSK Jn  US   nUS   u  pVUcK  US   n[        R                  " [        R
                  " XuU[        R                  R                  5       S95      $ UR                  S   UR                  S   pUR                  5       (       a  UR                  S5       V	s/ s H@  oR                  5       R                  5       (       d  M'  [        U	R                  5       5      PMB     n
n	U
 V	s/ s H  n	SU	s=::  a  U:  d  M  O  M  U	PM     n
n	O[        [        U5      5      n
U
(       dF  [        R                  " [        R
                  " XuU[        R                  R                  5       S95      $ US S 2U
S   4   R!                  5       nU
SS   H  n	XS S 2U	4   -  nM     U" U5      R#                  S5      R%                  5       n[&        R(                  " XU4S	S
S9S S 2S4   n[        R                  " U5      $ s  sn	f s  sn	f )Nr   rc  re  r   rf  r   r	   ,r%   Fr&   )ru  rd  r   r   r   rF   r@   r   r   r   stripsplitisdigitr>   r   rD   r  r,   r-   r*   r+   )r   r  r  rd  r  r.   r/   r  r  rR  indicesunion_packedunionr   s                 r    r   SAM3_TrackToMask.execute  s   7N++&>:&A==Q1U=S=S=g=g=i!jkk<<?FLLO5!!/=/C/CC/H`/H!GGIL]L]L_~s1779~/HG`")<'QQ!^e^q^q'G<G5<(G==Q1U=S=S=g=g=i!jkkam,224A1a4L(L \*44Q7==?==V*TYZ[\^_[_`}}X&& a<s   &&HH3HHHr   N)rt  r   r   r"   r    r  r    s6    =
 
 'r}} ' 'r"   r  c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)SAM3Extensioni	  r   c                 6   #    [         [        [        [        /$ 7fN)rh   r  r$  r  )selfs    r    get_node_listSAM3Extension.get_node_list
  s      	
 	
s   r   N)r   r   r   r  r   r   typer   	ComfyNoder  r  r   r"   r    r  r  	  s)    
T$r||*<%= 
 
r"   r  r   c                     #    [        5       $ 7fr  )r  r   r"   r    comfy_entrypointr    s     ?s   ) r  typing_extensionsr   r   r{  r   torch.nn.functionalnn
functionalr*   comfy.model_managementr@   comfy.utilsrw  comfy_api.latestr   r   r   r~  	fractionsr   r!   rf   r  rh   Customr  r  r$  r  r  r  r   r"   r    <module>r     s    '  	       3 3 	 .*?\g7",, g7T 		+,4%bll 4%n[e [e|-'r|| -'`
N 
 r"   