o
    Wh                     @   s   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dZddededdfddZdededdfddZdS )    )partial)PathN)IterableSimpleNamespace	yaml_load)
check_yaml   )BOTSORT)BYTETracker)	bytetrackbotsortF	predictorpersistreturnc                    sL   j jdkr
tdt dr|rdS t j j}tdi t|}|jdvr0t	d|j d|jdkrx|j
rx|jd	krxd
dlm} t jjtjjr^t jjjd |r^ jjjd jrbd|_nd _d _ fdd} jjjd | g }t jjD ]}t|j |dd}||  jjdkr nq| _dg jj  _dS )aE  
    Initialize trackers for object tracking during prediction.

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

    Raises:
        AssertionError: If the tracker_type is not 'bytetrack' or 'botsort'.
        ValueError: If the task is 'classify' as classification doesn't support tracking.

    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 ''r   autor   )Detectzyolo11n-cls.ptTc                    s   |d  _ d S )Nr   )_feats)moduleinputoutputr    N/var/www/vscode/kcb/lib/python3.10/site-packages/ultralytics/trackers/track.py
capture_io=   s   z$on_predict_start.<locals>.capture_io   )args
frame_ratestreamr   )r   task
ValueErrorhasattrr   trackerr   r   tracker_typeAssertionError	with_reidmodelultralytics.nn.modules.headr   
isinstancetorchnnModuleend2end
save_featsr   register_forward_hookrangedatasetbsTRACKER_MAPappendmoder   vid_path)r   r   r$   cfgr   r   r   _r   r   r   on_predict_start   s<   

r:   c              	   C   s4  | j jdk}| jjdk}t| jD ]\}}| j|r|nd }| jt|j	j
 }|sA| j|r/|nd |krA|  || j|r?|nd< |rF|jn|j  }t|dkrTq|||jt|dd}	t|	dkrgq|	dddf t}
||
 | j|< |r}dndt|	ddddf i}| j| jdi | qdS )	a  
    Postprocess detected boxes and update with object tracking.

    Args:
        predictor (object): The predictor object containing the predictions.
        persist (bool): 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!   r2   r6   	enumerateresultsr   save_dirr   pathnamer7   resetr;   r=   cpunumpylenupdateorig_imggetattrastypeintr+   	as_tensor)r   r   is_obb	is_streamiresultr$   r7   dettracksidxupdate_argsr   r   r   on_predict_postprocess_endL   s&   &rU   r(   c                 C   s,   |  dtt|d |  dtt|d 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   rU   N)add_callbackr   r:   rU   )r(   r   r   r   r   register_trackero   s   rW   )F)	functoolsr   pathlibr   r+   ultralytics.utilsr   r   ultralytics.utils.checksr   bot_sortr   byte_trackerr	   r4   objectboolr:   rU   rW   r   r   r   r   <module>   s   
:#