a
    yf?D                     @   s   d Z ddlZddlZddlZddlmZ ddlZddlZddl	Z	ddl
mZmZ ddlmZ ddlmZmZ ddlmZ ddlmZmZmZmZmZmZmZ dd	lmZmZ dd
lm Z  ddl!m"Z"m#Z# dZ$G dd dZ%dS )a  
Run prediction on images, videos, directories, globs, YouTube, webcam, streams, etc.

Usage - sources:
    $ yolo mode=predict model=yolov8n.pt source=0                               # webcam
                                                img.jpg                         # image
                                                vid.mp4                         # video
                                                screen                          # screenshot
                                                path/                           # directory
                                                list.txt                        # list of images
                                                list.streams                    # list of streams
                                                'path/*.jpg'                    # glob
                                                'https://youtu.be/LNwODJXcvt4'  # YouTube
                                                'rtsp://example.com/media.mp4'  # RTSP, RTMP, HTTP, TCP stream

Usage - formats:
    $ yolo mode=predict model=yolov8n.pt                 # PyTorch
                              yolov8n.torchscript        # TorchScript
                              yolov8n.onnx               # ONNX Runtime or OpenCV DNN with dnn=True
                              yolov8n_openvino_model     # OpenVINO
                              yolov8n.engine             # TensorRT
                              yolov8n.mlpackage          # CoreML (macOS-only)
                              yolov8n_saved_model        # TensorFlow SavedModel
                              yolov8n.pb                 # TensorFlow GraphDef
                              yolov8n.tflite             # TensorFlow Lite
                              yolov8n_edgetpu.tflite     # TensorFlow Edge TPU
                              yolov8n_paddle_model       # PaddlePaddle
                              yolov8n_ncnn_model         # NCNN
    N)Path)get_cfgget_save_dir)load_inference_source)	LetterBoxclassify_transforms)AutoBackend)DEFAULT_CFGLOGGERMACOSWINDOWS	callbackscolorstrops)check_imgszcheck_imshow)increment_path)select_devicesmart_inference_modeu"  
WARNING ⚠️ inference results will accumulate in RAM unless `stream=True` is passed, causing potential out-of-memory
errors for large sources or long-running streams and videos. See https://docs.ultralytics.com/modes/predict/ for help.

Example:
    results = model(source=..., stream=True)  # generator of Results objects
    for r in results:
        boxes = r.boxes  # Boxes object for bbox outputs
        masks = r.masks  # Masks object for segment masks outputs
        probs = r.probs  # Class probabilities for classification outputs
c                   @   s   e Zd ZdZeddfddZdd Zdd Zd	d
 Zdd Z	d&ddZ
d'ddZdd Ze d(ddZd)ddZdd Zd*ddZd+dd Zed!d"d#Zed!d$d%ZdS ),BasePredictoraI  
    BasePredictor.

    A base class for creating predictors.

    Attributes:
        args (SimpleNamespace): Configuration for the predictor.
        save_dir (Path): Directory to save results.
        done_warmup (bool): Whether the predictor has finished setup.
        model (nn.Module): Model used for prediction.
        data (dict): Data configuration.
        device (torch.device): Device used for prediction.
        dataset (Dataset): Dataset used for prediction.
        vid_writer (dict): Dictionary of {save_path: video_writer, ...} writer for saving video output.
    Nc                 C   s   t ||| _t| j| _| jjdu r,d| j_d| _| jjrHtdd| j_d| _| jj	| _	d| _
d| _d| _i | _d| _d| _d| _g | _d| _d| _d| _|pt | _d| _t | _t|  dS )z
        Initializes the BasePredictor class.

        Args:
            cfg (str, optional): Path to a configuration file. Defaults to DEFAULT_CFG.
            overrides (dict, optional): Configuration overrides. Defaults to None.
        Ng      ?FT)warnr   )r   argsr   save_dirconfdone_warmupshowr   modeldataimgszdevicedataset
vid_writerplotted_imgsource_typeseenwindowsbatchresults
transformsr   Zget_default_callbackstxt_path	threadingLock_lockZadd_integration_callbacks)selfcfgZ	overrides
_callbacks r0   X/var/www/html/django/DPS/env/lib/python3.9/site-packages/ultralytics/engine/predictor.py__init__P   s0    

zBasePredictor.__init__c                 C   s   t |tj }|rNt| |}|ddddf d}t|}t|}|	| j
}| jjrj| n| }|r~|d }|S )z
        Prepares input image before inference.

        Args:
            im (torch.Tensor | List(np.ndarray)): BCHW for tensor, [(HWC) x B] for list.
        .N)r               )
isinstancetorchTensornpstackpre_transformZ	transposeZascontiguousarrayZ
from_numpytor   r   fp16halffloat)r-   imZ
not_tensorr0   r0   r1   
preprocesss   s    

zBasePredictor.preprocessc                 O   s^   | j jr2| jjs2t| jt| jd d j ddnd}| j	|g|R | j j
|| j jd|S )zHRuns inference on a given image using the specified model and arguments.r   T)mkdirF)augment	visualizeembed)r   rF   r#   tensorr   r   r   r&   stemr   rE   rG   )r-   rB   r   kwargsrF   r0   r0   r1   	inference   s    $zBasePredictor.inferencec                    sD   t dd |D dk}t| j|o&| jj| jjd  fdd|D S )z
        Pre-transform input image before inference.

        Args:
            im (List(np.ndarray)): (N, 3, h, w) for tensor, [(h, w, 3) x N] for list.

        Returns:
            (list): A list of transformed images.
        c                 S   s   h | ]
}|j qS r0   )shape.0xr0   r0   r1   	<setcomp>       z.BasePredictor.pre_transform.<locals>.<setcomp>r5   )autostridec                    s   g | ]} |d qS ))imager0   rM   Z	letterboxr0   r1   
<listcomp>   rQ   z/BasePredictor.pre_transform.<locals>.<listcomp>)lenr   r   r   ptrS   )r-   rB   Zsame_shapesr0   rU   r1   r=      s    
zBasePredictor.pre_transformc                 C   s   |S )z9Post-processes predictions for an image and returns them.r0   )r-   predsZimgZ	orig_imgsr0   r0   r1   postprocess   s    zBasePredictor.postprocessFc                 O   sF   || _ |r$| j||g|R i |S t| j||g|R i |S dS )z)Performs inference on an image or stream.N)streamstream_inferencelist)r-   sourcer   r[   r   rJ   r0   r0   r1   __call__   s    zBasePredictor.__call__c                 C   s   |  ||}|D ]}qdS )aK  
        Method used for Command Line Interface (CLI) prediction.

        This function is designed to run predictions using the CLI. It sets up the source and model, then processes
        the inputs in a streaming manner. This method ensures that no outputs accumulate in memory by consuming the
        generator without storing results.

        Note:
            Do not modify this function or remove the generator. The generator ensures that no outputs are
            accumulated in memory, which is critical for preventing memory issues during long-running predictions.
        N)r\   )r-   r^   r   gen_r0   r0   r1   predict_cli   s    zBasePredictor.predict_clic                 C   s   t | jj| jjdd| _| jjdkrFt| jjdt| jd | jjdnd| _	t
|| jj| jj| jjd| _| jj| _t| d	d
s| jjs| jjst| jdkstt| jddgrtt i | _dS )z"Sets up source and inference mode.r6   )rS   Zmin_dimZclassifyr(   r   )crop_fractionN)r^   r&   
vid_stridebufferr[   Ti  Z
video_flagF)r   r   r   r   rS   taskgetattrr   rc   r(   r   r&   rd   Zstream_bufferr    r#   r[   Z
screenshotrW   anyr
   warningSTREAM_WARNINGr!   )r-   r^   r0   r0   r1   setup_source   s6    
	

zBasePredictor.setup_sourcec                 /   s*   j jrtd  js" |  j  |dur<|n j j  j j	sV j j
rx j j
rh jd n jjddd  js jj jjs jjrdn jjdg jR d d _d	g d   _ _ _tj jd
tj jd
tj jd
f} d  jD ] _ d  j\}}}|d	   |}	W d   n1 sL0    Y  |d `  j|	g|R i |}
 j jrt|
tj r|
gn|
E dH  W d   qW d   n1 s0    Y  |d    !|
|	| _"W d   n1 s 0    Y   d t#|}t$|D ]}  jd7  _|d	 j%d | |d j%d | |d j%d | d j"| _& j js j j	s j j
s j j'r$||   (|t)|| |	|7  < q$ j jrtd*|  d  j"E dH  qW d   n1 s0    Y   j+, D ]}t|t-j.r"|/  q" j jr jrt0 fdd|D }tdt1 j j jdg|	j2dd R  |   j j	s j j
s j j3rt#t4 j5d} j j
rd| dd|dk  d jd  nd}tdt6d j |   d dS )zEStreams real-time inference on camera feed and saves results to file. NlabelsTparentsexist_okr5   r4   )r   r   )r   Zon_predict_startZon_predict_batch_startr6   Zon_predict_postprocess_end     @@)rC   rK   rZ   
Zon_predict_batch_endc                 3   s   | ]}|j  j d  V  qdS )rq   N)tr$   rM   r-   r0   r1   	<genexpr>"  rQ   z1BasePredictor.stream_inference.<locals>.<genexpr>zRSpeed: %.1fms preprocess, %.1fms inference, %.1fms postprocess per image at shape zlabels/*.txtz labelsz
 saved to zResults saved to boldZon_predict_end)7r   verboser
   infor   setup_modelr,   rk   r^   savesave_txtr   rD   r   ZwarmuprX   Ztritonr    bsr   r$   r%   r&   r   ZProfiler   run_callbacksrC   rK   rG   r8   r9   r:   rZ   r'   rW   rangedtspeedr   write_resultsr   joinr!   valuescv2VideoWriterreleasetupleminrL   	save_cropr]   globr   )r-   r^   r   r   rJ   Z	profilerspathsZim0srv   rB   rY   nivrs   nlr0   rt   r1   r\      sx    


"2


*

0
0
((

0"2zBasePredictor.stream_inferenceTc              
   C   sb   t |p| jjt| jj|d| jj| jj| jj| jjd|d| _| jj| _| jj	| j_| j
  dS )zJInitialize YOLO model with given parameters and set it to evaluation mode.)rx   T)weightsr   dnnr   r?   r&   Zfuserx   N)r   r   r   r   r   r   r   r@   r&   r?   eval)r-   r   rx   r0   r0   r1   rz   -  s    

zBasePredictor.setup_modelc           	      C   s  d}t |jdkr|d }| jjs2| jjs2| jjrJ|| d7 }| jj}n$t	d|| }|rjt
|d nd}| jd |j| jjdkrdnd	|   | _|d
j|jdd  7 }| j| }| j |_||  |jd dd7 }| jjs| jjr0|j| jj| jj| jj| jj| jjr"dn|| d| _| jjrT|j| j d| jjd | jj rv|j | jd | jjd | jjr| t!| | jjr| "t!| j|j# | |S )z/Write inference results to a file or directory.rl   r4   Nz: zframe (\d+)/r5   rm   rT   ra   z
{:g}x{:g} r6   rK   z.1fms)
line_widthZboxesr   rm   Zim_gpuz.txt)	save_confZcrops)r   	file_name)$rW   rL   r#   r[   Zfrom_imgrH   r    countresearchintr   rI   moder)   formatr'   __str__rx   r   r   r{   r   Zplotr   Z
show_boxesZ	show_confZshow_labelsZretina_masksr"   r|   r   r   strsave_predicted_imagesname)	r-   r   prB   rv   stringframematchresultr0   r0   r1   r   >  s<    
,
	



zBasePredictor.write_resultsrl   r   c                 C   s   | j }| jjdv r| jjdkr&| jjnd}|ddd  d}|| jvr| jjrdt|j	ddd	 t
rld
n
trtdnd\}}tjtt||tj| ||jd |jd fd| j|< | j| | | jjrt| | d| nt|| dS )z0Save video predictions as mp4 at specified path.>   r[   videor      .r5   r   z_frames/Trn   )z.mp4Zavc1).aviZWMV2)r   ZMJPG)filenamefourccfpsZ	frameSizez.jpgN)r"   r    r   r   splitr!   r   Zsave_framesr   rD   r   r   r   r   r   with_suffixZVideoWriter_fourccrL   writeZimwrite)r-   Z	save_pathr   rB   r   Zframes_pathsuffixr   r0   r0   r1   r   f  s$    
z#BasePredictor.save_predicted_imagesc                 C   s   | j }t dkrV|| jvrV| j| t|tjtjB  t	||j
d |j
d  t|| t| jjdkrvdnd dS )z>Display an image in a window using the OpenCV imshow function.Linuxr5   r   rT   i,  N)r"   platformsystemr%   appendr   ZnamedWindowZWINDOW_NORMALZWINDOW_KEEPRATIOZresizeWindowrL   ZimshowZwaitKeyr    r   )r-   r   rB   r0   r0   r1   r     s    zBasePredictor.show)eventc                 C   s    | j |g D ]}||  qdS )z3Runs all registered callbacks for a specific event.N)r   get)r-   r   callbackr0   r0   r1   r~     s    zBasePredictor.run_callbacksc                 C   s   | j | | dS )zAdd callback.N)r   r   )r-   r   funcr0   r0   r1   add_callback  s    zBasePredictor.add_callback)NNF)NN)NN)T)rl   r   )rl   )__name__
__module____qualname____doc__r	   r2   rC   rK   r=   rZ   r_   rb   rk   r   r\   rz   r   r   r   r   r~   r   r0   r0   r0   r1   r   ?   s"   #	

V
(


r   )&r   r   r   r*   pathlibr   r   numpyr;   r9   Zultralytics.cfgr   r   Zultralytics.datar   Zultralytics.data.augmentr   r   Zultralytics.nn.autobackendr   Zultralytics.utilsr	   r
   r   r   r   r   r   Zultralytics.utils.checksr   r   Zultralytics.utils.filesr   Zultralytics.utils.torch_utilsr   r   rj   r   r0   r0   r0   r1   <module>   s"   $