
    |h                         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y)    )partial)PathN)YAMLIterableSimpleNamespace)
check_yaml   )BOTSORT)BYTETracker)	bytetrackbotsort	predictorpersistreturnc                      j                   j                  dk(  rt        d      t         d      r|ryt	         j                   j
                        }t        di t        j                  |      }|j                  dvrt        d|j                   d      d _        t         d      r j                  j                          |j                  d	k(  r|j                  r|j                  d
k(  rddlm} t%         j                  j                  t&        j(                  j*                        rZt%         j                  j                  j                  d   |      r- j                  j                  j                  d   j,                  rd|_        n< fd} j                  j                  j                  d   j/                  |       _        g }t1         j2                  j4                        D ]H  }t7        |j                     |d      }|j9                  |        j2                  j:                  dk7  sH n | _        dg j2                  j4                  z   _        y)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                 ,    t        |d         _        y )Nr   )list_feats)moduleinputr   s     Y/var/www/html/test/engine/venv/lib/python3.12/site-packages/ultralytics/trackers/track.pypre_hookz"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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           
      V   | j                   j                  dk(  }| j                  j                  dk(  }t	        | j
                        D ]^  \  }}| j                  |r|nd   }| j                  t        |j                        j                  z  }|s9| j                  |r|nd   |k7  r#|j                          || j                  |r|nd<   |r|j                  n|j                  j                         j!                         }|j#                  ||j$                  t'        |dd            }	t)        |	      dk(  r|	dddf   j+                  t,              }
||
   | j
                  |<   |rdndt/        j0                  |	ddddf         i} | j
                  |   j"                  di | a y)	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[   H   st    ^^  E)F!!&&(2Iy001 3	6$$)Q;%%V[[(9(>(>>9--9a!DPMMO8@IIq15#vzz::<BBDV__gfgt6TUv;!QUm""3'%c{	! &uGU__VAsPRsF^5TU#	!##2k23r   r.   c                     | j                  dt        t        |             | j                  dt        t        |             y)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^   i   s7     
)73CW+UV	3W=Wah5i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<37 37 37$ 37l3& 34 3D 3BkF kT kd kr   