
    h                         S SK Jr  S SKJr  S SKrS SKJrJr  S SKJ	r	  SSK
Jr  SSKJr  \\S	.rSS
\S\SS4S jjrSS
\S\SS4S jjrS\S\SS4S jrg)    )partial)PathN)YAMLIterableSimpleNamespace)
check_yaml   )BOTSORT)BYTETracker)	bytetrackbotsort	predictorpersistreturnc                   ^  T R                   R                  S:X  a  [        S5      e[        T S5      (       a  U(       a  g[	        T R                   R
                  5      n[        S0 [        R                  " U5      D6nUR                  S;  a  [        SUR                   S35      eST l        [        T S5      (       a  T R                  R                  5         UR                  S	:X  Ga  UR                  (       a  UR                  S
:X  a  SSKJn  [%        T R                  R                  [&        R(                  R*                  5      (       ad  [%        T R                  R                  R                  S   U5      (       a2  T R                  R                  R                  S   R,                  (       a  SUl        O=U 4S jnT R                  R                  R                  S   R/                  U5      T l        / n[1        T R2                  R4                  5       HH  n[6        UR                     " USS9nUR9                  U5        T R2                  R:                  S:w  d  MH    O   UT l        S/T R2                  R4                  -  T l        g)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yolo11n-cls.ptc                 ,   > [        US   5      Tl        g )Nr   )list_feats)moduleinputr   s     T/home/james-whalen/.local/lib/python3.13/site-packages/ultralytics/trackers/track.pypre_hook"on_predict_start.<locals>.pre_hook9   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y*%%'//0G
!
7DIIg$6
7C
77^_b_o_o^ppqrssIy'"" 
9$399;N6 y,,ehhoo>>9??0066r:FCCOO))//3;;(CI2 (oo3399"=WWX`aIOH9$$''(c../SRH !!X-	 )
 "I)"3"3"6"66Ir    c           
         U R                   R                  S:H  nU R                  R                  S:H  n[	        U R
                  5       GH~  u  pEU R                  U(       a  UOS   nU R                  [        UR                  5      R                  -  nU(       dC  U R                  U(       a  UOS   U:w  a'  UR                  5         XpR                  U(       a  UOS'   U(       a  UR                  OUR                  R                  5       R!                  5       nUR#                  XR$                  ['        USS5      5      n	[)        U	5      S:X  a  GM  U	SS2S4   R+                  [,        5      n
XZ   U R
                  U'   U(       a  SOS[.        R0                  " U	SS2SS24   5      0nU R
                  U   R"                  " S0 UD6  GM     g)	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&   r8   r<   	enumerateresultsr   save_dirr   pathnamer=   resetrB   rD   cpunumpyupdateorig_imggetattrlenastypeintr2   	as_tensor)r   r   is_obb	is_streamiresultr)   r=   dettracksidxupdate_argss               r   on_predict_postprocess_endr\   H   se    ^^  E)F!!&&(2Iy001	$$)Q;%%V[[(9(>(>>9--9a!DPMMO8@Iq15#vzz::<BBD__gfgt6TUv;!QUm""3'%{	! &uGU__VAsPRsF^5TU!##2k2 2r    r/   c                 |    U R                  S[        [        US95        U R                  S[        [        US95        g)aq  
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_   i   s7     
)73CW+UV	3W=Wah5ijr    )F)	functoolsr   pathlibr   r2   ultralytics.utilsr   r   ultralytics.utils.checksr   bot_sortr	   byte_trackerr
   r:   objectboolr@   r\   r_   r%   r    r   <module>rh      s|       ; /  % (G<37 37 37$ 37l3& 34 3D 3BkF kT kd kr    