
    j                         d dl mZ d dlmZ d dlZd dlmZmZ d dlm	Z	 ddl
mZ ddlmZ eed	ZddededdfdZddededdfdZdededdfdZdS )    )partial)PathN)YAMLIterableSimpleNamespace)
check_yaml   )BOTSORT)BYTETracker)	bytetrackbotsortF	predictorpersistreturnc                 
     j         j        dk    rt          d          t           d          r|rdS t	           j         j                  }t          di t          j        |          }|j	        dvrt          d|j	         d          d _        t           d          r j                                         |j	        d	k    r|j        r|j        d
k    rddlm} t%           j        j        t&          j        j                  rAt%           j        j        j        d         |          r j        j        j        d         j        rd|_        n4 fd} j        j        j        d                             |           _        g }t1           j        j                  D ]E}t7          |j	                 |d          }|                    |            j        j        dk    r nF| _        dg j        j        z   _        dS )a  Initialize trackers for object tracking during prediction.

    Args:
        predictor (ultralytics.engine.predictor.BasePredictor): The predictor object to initialize trackers for.
        persist (bool, optional): Whether to persist the trackers if they already exist.

    Examples:
        Initialize trackers for a predictor object
        >>> predictor = SomePredictorClass()
        >>> on_predict_start(predictor, persist=True)
    classifyu/   ❌ Classification doesn't support 'mode=track'trackersN>   r   r   z?Only 'bytetrack' and 'botsort' are supported for now, but got ''_hookr   autor   )Detectzyolo26n-cls.ptc                 <    t          |d                   _        d S )Nr   )list_feats)moduleinputr   s     _/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/ultralytics/trackers/track.pypre_hookz"on_predict_start.<locals>.pre_hook8   s    #'a>>	          )args
frame_ratestream ) r!   task
ValueErrorhasattrr   trackerr   r   loadtracker_typeAssertionErrorr   r   remove	with_reidmodelultralytics.nn.modules.headr   
isinstancetorchnnModuleend2endregister_forward_pre_hookrangedatasetbsTRACKER_MAPappendmoder   vid_path)r   r   r(   cfgr   r   r   _s   `       r   on_predict_startr?      s-    ~j((JKKKy*%% ' /00G
!
7
7DIg$6$6
7
7C
777r_b_orrrsssIy'"" !   
9$$$39;N;N666666 y,eho>>	b9?06r:FCC	b O)/3;	b
 )CII2 2 2 2 2 (o39"=WWX`aaIOH9$'((  c./SRHHH   !X--E .!I)"3"66Ir   c           
         | j         j        dk    }| j        j        dk    }t	          | j                  D ]V\  }}| j        |r|nd         }| j        t          |j	                  j
        z  }|s7| j        |r|nd         |k    r"|                                 || j        |r|nd<   |r|j        n|j                                                                        }|                    ||j        t'          |dd                    }	t)          |	          dk    r|	dddf                             t,                    }
||
         | j        |<   |rdndt/          j        |	ddddf                   i} | j        |         j        di | XdS )	a  Postprocess detected boxes and update with object tracking.

    Args:
        predictor (object): The predictor object containing the predictions.
        persist (bool, optional): Whether to persist the trackers if they already exist.

    Examples:
        Postprocess predictions and update with tracking
        >>> predictor = YourPredictorClass()
        >>> on_predict_postprocess_end(predictor, persist=True)
    obbr#   r   featsNr   boxesr$   )r!   r%   r7   r;   	enumerateresultsr   save_dirr   pathnamer<   resetrA   rC   cpunumpyupdateorig_imggetattrlenastypeintr1   	as_tensor)r   r   is_obb	is_streamiresultr(   r<   dettracksidxupdate_argss               r   on_predict_postprocess_endr[   G   s    ^ E)F!&(2Iy011 3 3	6$)%:QQ;%V[(9(9(>> 	A9-9.Caa!DPPMMOOO8@II4qq15#5vzz::<<BBDDV_gfgt6T6TUUv;;!QQQUm""3''%c{	! &3uuGU_VAAAsPRsF^5T5TU#	!#22k22223 3r   r.   c                     |                      dt          t          |                     |                      dt          t          |                     dS )a  Register tracking callbacks to the model for object tracking during prediction.

    Args:
        model (object): The model object to register tracking callbacks for.
        persist (bool): Whether to persist the trackers if they already exist.

    Examples:
        Register tracking callbacks to a YOLO model
        >>> model = YOLOModel()
        >>> register_tracker(model, persist=True)
    r?   )r   r[   N)add_callbackr   r?   r[   )r.   r   s     r   register_trackerr^   g   sU     
)73CW+U+U+UVVV	3W=Wah5i5i5ijjjjjr   )F)	functoolsr   pathlibr   r1   ultralytics.utilsr   r   ultralytics.utils.checksr   bot_sortr	   byte_trackerr
   r9   objectboolr?   r[   r^   r$   r   r   <module>rg      s+                ; ; ; ; ; ; ; ; / / / / / /       % % % % % % (G<<27 27 27 27$ 27 27 27 27j3 3& 34 3D 3 3 3 3@kF kT kd k k k k k kr   