]e'DddlZejdejdddlmZmZddlmZddlZ ddl m Z ddl m Z ddlmZmZddlZdd lmZGd d Zed krdd lmZmZmZeeeeZejdZejeejZdZdZ dZ!e"eee e!\Z#Z$ee$e#Z%ejeej&Zej'de%ej'de$dSdS)Nz..z./sam)sam_model_registrySamAutomaticMaskGenerator)get_aot) Segmentor)Detector) draw_outline draw_points) draw_maskceZdZddZdZdZdZddZdd Zd Z d Z d Z dZ de jde jfdZdde jde jde jfdZde jfdZdde jfdZdS) SegTrackerreturnNczt||_t||_t |jj|_|d|_|d|_|d|_ |d|_ g|_ d|_ d|_ d|_d|_g|_g|_t%ddS)z* Initialize SAM and AOT. sam_gapmin_area max_obj_nummin_new_obj_iouNzSegTracker has been initialized)rsamrtrackerrdevicedetectorrrrrreference_objs_list object_idxcurr_idxorigin_merged_maskfirst_frame_maskeverything_pointseverything_labelsprint)selfsegtracker_argssam_argsaot_argss cC:\Users\User\OneDrive\Рабочий стол\records\SAM\Segment-and-Track-Anything\SegTracker.py__init__zSegTracker.__init__sX&&x((  11 &y1 ' 3 *=9./@A#%  "& $"$!# /00000cL|dddddddf}|jj|}t|dkrdSt j|ddjtj|_d}|D]n}|d|j kr[|d}||j|dk<|dz }|j |dd|j dot j |j}||dk}d|_|D]t}t j|j|k|j ks|j|jkrd|j|j|k<L|j|j|j|k<|xjdz c_u|j|_|jS) z Arguments: frame: numpy array (h,w,3) Return: origin_merged_mask: numpy array (h,w) Nr segmentationdtyperarea point_coords)reverything_generatorgeneratelennpzerosshapeuint8rrrappendruniquersumrr)r frameannsidxannmobj_idsids r$segzSegTracker.seg%saaaDDbDj!x,55e<< t99>> F#%(47>+B+Hrx"X"X"X 1 1C6{T]**'03'1-q&--c..A!.DEEE&--a000)D344'1*% % %Bvd-r122T]BBdoX\XhFhFhGH'(?(CDDGK'(?(CD1$ $ 7&&r&c||_dSN)r)r updated_merged_masks r$update_origin_merged_maskz$SegTracker.update_origin_merged_maskLs"5r&c"||_||_dSrA)rr)r maskr>s r$reset_origin_merged_maskz#SegTracker.reset_origin_merged_maskRs"& r&rc|jtj||dz|_|j|||jdz |dS)z Add objects in a mask for tracking. Arguments: frame: numpy array (h,w,3) mask: numpy array (h,w) rN)rr5r1r6 get_obj_numrradd_reference_frame)r r8rE frame_steps r$ add_referencezSegTracker.add_referenceVsd  '' $888((**Q.  ((tT]Q5F SSSSSr&Fcd|j|}|r|j||ddtj S)z Track all known objects. Arguments: frame: numpy array (h,w,3) Return: origin_merged_mask: numpy array (h,w) r) rtrack update_memorysqueezedetachcpunumpyastyper1r4)r r8rN pred_masks r$rMzSegTracker.trackasL&&u--  2 L & &y 1 1 1  ##++A..5577;;==CCEELLRXVVVr&ct}|jD]$}|t|%tt t|}d|D}|S)Ncg|] }|dk| Sr).0is r$ z0SegTracker.get_tracking_objs..ss(((a1a44444r&)setrupdatelistsorted)r objsrefs r$get_tracking_objszSegTracker.get_tracking_objsnskuu+ " "C KKC ! ! ! !F4::&&''((4((( r&c|}t|dkrdStt|S)Nr)rbr0intmax)r r`s r$rHzSegTracker.get_obj_numvs8%%'' t99>>!!3t99~~r&cH|dk|z}tj|}||dk}|j}|D]n}tj||k}tj||k}||z |jks||jks ||jkr d|||k<`||||k<|dz }o|S)a, Compare tracked results from AOT with segmented results from SAM. Select objects from background if they are not tracked. Arguments: track_mask: numpy array (h,w) seg_mask: numpy array (h,w) Return: new_obj_mask: numpy array (h,w) rr)r1r6rr7rrr) r track_maskseg_mask new_obj_mask new_obj_idsobj_numr: new_obj_areaobj_areas r$ find_new_objszSegTracker.find_new_objs{s#A 1 i -- !+q.1 -  C6,"344Lvhm,,HH$t';;;|dm?[?[T---23 \3.//29 \3./1 r&c8|jdSrA)rrestart)r s r$restart_trackerzSegTracker.restart_trackers r& origin_framebboxc|j||d}||}t||}t j||d|dd}||fS)z' Use bbox-prompt to get mask Parameters: origin_frame: H, W, C bbox: [[x0, y0], [x1, y1]] Return: refined_merged_mask: numpy array (h, w) masked_frame: numpy array (h, w, c) rr)rr)rsegment_with_boxadd_maskr copycv2 rectangle)r rrrsinteractive_maskrefined_merged_mask masked_frames r$ seg_acc_bboxzSegTracker.seg_acc_bboxs| 844\4HHK"mm,<==!!2!2!4!46IJJ }\47DG[QQ "L00r&Tcoordsmodesc|j||||}||}t||}t |||}t ||}||fS)a  Use point-prompt to get mask Parameters: origin_frame: H, W, C coords: nd.array [[x, y]] modes: nd.array [[1]] Return: refined_merged_mask: numpy array (h, w) masked_frame: numpy array (h, w, c) )rsegment_with_clickrwr rxr r)r rrrr multimaskr{r|r}s r$ seg_acc_clickzSegTracker.seg_acc_clicks 866|VUT]^^"mm,<==!!2!2!4!46IJJ #65,?? $$4lCC "L00r&r{c|j*tj|jtj|_|j}|j||dk<|S)z Merge interactive mask with self.origin_merged_mask Parameters: interactive_mask: numpy array (h, w) Return: refined_merged_mask: numpy array (h, w) Nr*r)rr1r2r3r4rxr)r r{r|s r$rwzSegTracker.add_masksX  " *&(h/?/EBH&U&U&UD #"5::<<48M,q01""r&rcP|j}|j}|j||||\} } t t | D]} | | } | dd| ddz | dd| ddz z| jd| jdz|zkrf|j|| |d} | | }| ||xjdz c_| |||| fS)z Using Grounding-DINO to detect object acc Text-prompts Retrun: refined_merged_mask: numpy array (h, w) annotated_frame: numpy array (h, w, 3) rr) rrr run_groundingranger0r3rrvrwrCrF)r rrgrounding_caption box_thresholdtext_thresholdbox_size_threshold reset_imagebc_idbc_maskannotated_frameboxesrZrsr{r|s r$detect_and_segzSegTracker.detect_and_segsD )"&! ? ? ? MMQ MMM %%gu555"O33r&)r NrW)F)T)rF)__name__ __module__ __qualname__r%r?rCrFrKrMrbrHrnrqr1ndarrayr~rrwrrXr&r$r r s]1111,%'%'%'N666  T T T T W W W W 2112:1111,11"*1bj1QSQ[1111<##### 442:444444r&r __main__)r!r"r#zA/data2/cym/Seg_Tra_any/Segment-and-Track-Anything/debug/point.pngz swan.waterg?z./debug/masked_frame.pngz ./debug/x.png)(syspathr5sam.segment_anythingrr aot_trackerrrRr1tool.segmentorr tool.detectorrtool.transfer_toolsrr ryseg_track_anythingr r r model_argsr!r"r# Seg_TrackerimreadrrcvtColor COLOR_BGR2RGBrrrrpredicted_maskrr} COLOR_RGB2BGRimwriterXr&r$rs NNNNNNNN$$$$$$""""""99999999 ((((((f4f4f4f4f4f4f4f4P z<<<<<<<<<<*_hAAK3:abbL3< c.?@@L$MN&1&@&@O`boq'A'A#NO9_n==L3< c.?@@LCK*L999CK11111%r&