
    FPh A                         d 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      Z#y)af  
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
    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                       e Zd ZdZeddfdZd Zd Zd Zd Z	d Z
dd	Zdd
Zd Z e       dd       ZddZd Zd ZdefdZdefdZy)BasePredictora  
    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_path (str): Path to video file.
        vid_writer (cv2.VideoWriter): Video writer for saving video output.
        data_path (str): Path to data.
    Nc                 j   t        ||      | _        t        | j                        | _        | j                  j                  d| j                  _        d| _        | j                  j                  rt        d      | j                  _        d| _        | j                  j                  | _	        d| _
        d| _        d| _        d\  | _        | _        d| _        d| _        d| _        d| _        d| _        d| _        |xs t+        j,                         | _        d| _        t+        j0                  |        y)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)warnNN)r   argsr   save_dirconfdone_warmupshowr   modeldataimgszdevicedatasetvid_path
vid_writerplotted_img	data_pathsource_typebatchresults
transformsr   get_default_callbackstxt_pathadd_integration_callbacks)selfcfg	overrides
_callbackss       gC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\ultralytics/engine/predictor.py__init__zBasePredictor.__init__N   s     C+	$TYY/99>>!!DIIN 99>>)t4DIIN 
IINN	
)3&t
#Hy'F'F'H++D1    c                    t        |t        j                         }|rgt        j                  | j                  |            }|ddddf   j                  d      }t        j                  |      }t        j                  |      }|j                  | j                        }| j                  j                  r|j                         n|j                         }|r|dz  }|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_transform	transposeascontiguousarray
from_numpytor#   r    fp16halffloat)r0   im
not_tensors      r4   
preprocesszBasePredictor.preprocesso   s     $B55
$,,R01BC2I((6B%%b)B!!"%BUU4;;**//RWWYrxxz#IB	r6   c                 (   | j                   j                  rS| j                  j                  s=t	        | j
                  t        | j                  d   d         j                  z  d      nd}| j                  || j                   j                  |      S )zHRuns inference on a given image using the specified model and arguments.r   T)mkdirF)augment	visualize)r   rP   r)   tensorr   r   r   r*   stemr    rO   )r0   rJ   r   kwargsrP   s        r4   	inferencezBasePredictor.inference   sv     37))2E2EtO_O_OfOf #4==4

1a8H3I3N3N#N)-/mr 	zz"dii&7&79zMMr6   c                     t        fdD              }t        | j                  |xr | j                  j                  | j                  j
                        }D cg c]  } ||       c}S c c}w )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              3   V   K   | ]   }|j                   d    j                   k(   " yw)r   N)shape).0xrJ   s     r4   	<genexpr>z.BasePredictor.pre_transform.<locals>.<genexpr>   s#     ="Q!''RU[[0"   &))autostride)image)allr   r"   r    ptr]   )r0   rJ   same_shapes	letterboxrY   s    `   r4   rB   zBasePredictor.pre_transform   s^     ="==djj{/Ltzz}}UYU_U_UfUfg	,./Bq	"B///s   A1c                    |\  }}}d}t        |j                        dk(  r|d   }| j                  j                  s,| j                  j                  s| j                  j
                  r|| dz  }| j                  j                  }nt        | j                  dd      }|| _	        t        | j                  dz  |j                  z        | j                  j                  dk(  rdnd	| z   | _        |d
|j                  dd z  z  }||   }	||	j                         z  }| j                   j"                  s| j                   j$                  r| j                   j&                  | j                   j(                  | j                   j*                  | j                   j,                  d}
| j                   j.                  s||   |
d<    |	j0                  di |
| _        | j                   j4                  r4|	j5                  | j                   d| j                   j6                         | j                   j8                  rU|	j9                  | j                  dz  | j                  j                  | j                  j                  dk(  rdnd	| z          |S )z/Write inference results to a file or directory. r9   Nz: framer   labelsr^   _z%gx%g r;   )
line_widthboxesr   rf   im_gpuz.txt)	save_confcrops)r   	file_name )lenrW   r)   webcamfrom_imgrQ   r$   countgetattrr(   strr   rR   moder.   verboser   saver   rh   ri   	show_confshow_labelsretina_masksplotr'   save_txtrk   	save_crop)r0   idxr+   r*   prJ   rg   
log_stringre   result	plot_argss              r4   write_resultszBasePredictor.write_results   s   2q
rxx=ADB""d&6&6&?&?4CSCSCZCZSE*$JLL&&EDLL'15EDMMH4qvv=>HYHY]dHd"lmnsmtjuvh!"--
fnn&&
99>>TYY^^"ii22		++))//	1I
 99))&(g	(#*v{{7Y7D99OOt}}oT2dii>Q>QOR99dmmg&='+~~':':DLLDUDUY`D`bhijoipfq'r  t r6   c                     |S )z9Post-processes predictions for an image and returns them.rn   )r0   predsimg	orig_imgss       r4   postprocesszBasePredictor.postprocess   s    r6   c                     || _         |r | j                  ||g|i |S t         | j                  ||g|i |      S )z)Performs inference on an image or stream.)streamstream_inferencelist)r0   sourcer    r   r   rS   s         r4   __call__zBasePredictor.__call__   sP    (4((HHHH---feMdMfMNNr6   c                 6    | j                  ||      }|D ]  } y)z{
        Method used for CLI prediction.

        It uses always generator as outputs as not required by CLI mode.
        N)r   )r0   r   r    genrg   s        r4   predict_clizBasePredictor.predict_cli   s#     ##FE2A r6   c                 X   t        | j                  j                  | j                  j                  d      | _        | j                  j
                  dk(  r7t        | j                  j                  dt        | j                  d               nd| _        t        || j                  | j                  j                  | j                  j                        | _        | j                  j                  | _        t        | dd	      sk| j                  j                  dk(  s9t        | j                        d
kD  s!t!        t        | j                  ddg            rt#        j$                  t&               dg| j                  j(                  z  dg| j                  j(                  z  c| _        | _        y)z"Sets up source and inference mode.r;   )r]   min_dimclassifyr,   r   N)r   r"   
vid_stridebufferr   Ti  
video_flagF)r   r   r"   r    r]   taskrs   r   r,   r   r   stream_bufferr$   r)   ru   ro   anyr   warningSTREAM_WARNINGbsr%   r&   )r0   r   s     r4   setup_sourcezBasePredictor.setup_source   s0    9J9JTUV
#yy~~; "$**"2"2LBUJJqMC AE 	,F37::8<		8L8L48II4K4KM  <<33tXt,$,,2C2Cx2O25dll2Cd2J25gdllL[`Za6b2cNN>**.$,,//)AD6DLLOOC[&tr6   c           
   /   `   K    j                   j                  rt        j                  d        j                  s j                  |        j                  ||n j                   j                          j                   j                  s j                   j                  rB j                   j                  r j                  dz  n j                  j                  dd        j                  st j                  j                   j                  j                  s j                  j                  rdn j                   j"                  dg j$                         d _        d	g dt'        j(                         t'        j(                         t'        j(                         ff\   _         _         _        } j1                  d
        j                   D ]!  } j1                  d       | _        |\  }}}	}
|d	   5   j3                  |      }ddd       |d   5    j4                  g|i |}ddd       |d   5   j7                  |       _        ddd        j1                  d       t;        |      }t=        |      D ]  } xj*                  dz  c_        |d	   j>                  dz  |z  |d   j>                  dz  |z  |d   j>                  dz  |z  d j8                  |   _         ||    jB                  jD                  rdn||   jG                         }}tI        |      } j                   j                  sB j                   j                  s, j                   j                  s j                   jJ                  r#|
 jM                  | j8                  ||f      z  }
 j                   j                  s j                   j                  r, j                  jO                          j8                  |   _
         j                   jJ                  r jP                   jK                  |        j                   j                  sÉ jP                  щ jS                  |	|tU         j                  |jV                  z                 j1                  d        j8                  E d{     j                   j                  st        j                  |
 |d   j>                  dz  dd       $ tY         jZ                  d   t\        j^                        r jZ                  d   ja                           j                   j                  rM j*                  rAtc         fd|D              }t        j                  dddgjd                  dd  |z          j                   j                  s, j                   j                  s j                   jf                  rt;        ti         j                  jk                  d                  } j                   j                  rd| dd|dkD  z   d j                  dz   nd}
t        j                  dtm        d j                         |
         j1                  d       y# 1 sw Y   yxY w# 1 sw Y   bxY w# 1 sw Y   IxY w7 w)zEStreams real-time inference on camera feed and saves results to file.rd   Nrf   T)parentsexist_okr:   r9   )r"   r   on_predict_starton_predict_batch_startr;   on_predict_postprocess_end     @@)rL   rT   r   on_predict_batch_endz.1fmsr8   c              3   V   K   | ]   }|j                   j                  z  d z   " yw)r   N)tseen)rX   rY   r0   s     r4   rZ   z1BasePredictor.stream_inference.<locals>.<genexpr>+  s#     ?YaccDIIo+Yr[   zRSpeed: %.1fms preprocess, %.1fms inference, %.1fms postprocess per image at shape zlabels/*.txt
z labelsz
 saved to zResults saved to boldon_predict_end)7r   rv   r   infor    setup_modelr   r   rw   r|   r   rN   r   warmupr`   tritonr$   r   r"   r   Profiler   windowsr*   run_callbacksrL   rT   r   r+   ro   rangedtspeedr)   rQ   copyr   r   r   __str__r'   
save_predsrt   namer=   r&   cv2VideoWriterreleasetuplerW   r}   r   globr   )r0   r   r    r   rS   	profilersr*   pathim0svid_capr   rJ   r   nir   im0r   nls   `                  r4   r   zBasePredictor.stream_inference   s/     99KKO zzU# 	F$6&DII<L<LM 99>>TYY//)-););T]]X%UU^bmqUr JJ$**--4::;L;LQRVR^R^RaRacd$rgkgqgq$rs#D9:Bs{{}VYVaVaVcehepeperFs9s6	4<Y-.\\E78DJ%*"D$ 1__T*  1&r;D;F;  1#//r4@ ;< D	A1X		Q	"+A,//C"7!";!*13!6!:#,Q<??S#81#<)>Q% a$*:*:*A*A$tAw||~3G99$$		$)):L:LPTPYPYP^P^++At||aS\JJA99>>TYY%7%7/3}}/D/D/FDLLO,99>>d&6&6&BIIaL99>>d&6&6&BOOGQDMMAFF4J0KL! $ 56||## yy  qc)A,//C"7!<B?@W "\ doob)3??;OOB'') 99?Y??AKKlq0288AB<013567 899>>TYY//4993F3FT$--,,^<=>BW[W`W`WiWi"RDsb1f~.j9Q8RSoqAKK+HVT]],K+LQCPQ+,k   2 $so   G8Z.;ZZ.Z1Z.>ZG0Z.	Z.AZ.-Z+.Z.
F:Z.Z		Z.Z	Z.Z(	#	Z.c           	         t        |xs | j                  j                  t        | j                  j                  |      | j                  j
                  | j                  j                  | j                  j                  d|      | _        | j                  j                  | _        | j                  j                  | j                  _        | j                  j                          y)zJInitialize YOLO model with given parameters and set it to evaluation mode.)rv   T)r#   dnnr!   rG   fuserv   N)
r	   r   r    r   r#   r   r!   rH   rG   eval)r0   r    rv   s      r4   r   zBasePredictor.setup_model5  s     !9$))//(5dii6F6FPW(X%)YY]]&*iinn&*iinn&*)02
 jj''		

r6   c                 >   | j                   }t        j                         dk(  r|| j                  vr| j                  j	                  |       t        j                  t        |      t
        j                  t
        j                  z         t        j                  t        |      |j                  d   |j                  d          t        j                  t        |      |       t        j                  | j                  d   j                  d      rd       yd       y)z3Display an image in a window using OpenCV imshow().Linuxr:   r   r9   r^   i  N)r'   platformsystemr   appendr   namedWindowrt   WINDOW_NORMALWINDOW_KEEPRATIOresizeWindowrW   imshowwaitKeyr*   
startswith)r0   r   r   s      r4   r   zBasePredictor.showC  s    ??'AT\\,ALL"OOCFC$5$58L8L$LMSVSYYq\399Q<@

3q634::a=33G<CD!Dr6   c                    | j                   }| j                  j                  dk(  rt        j                  ||       y| j
                  |   |k7  r]|| j
                  |<   t        | j                  |   t        j                        r| j                  |   j                          |ryt        |j                  t        j                              }t        |j                  t        j                              }t        |j                  t        j                              }n d|j                  d   |j                  d   }}}t         rdn	t"        rdnd\  }}	t%        t'        |      j)                  |            }t        j                  |t        j*                  |	 |||f      | j                  |<   | j                  |   j-                  |       y)	z0Save video predictions as mp4 at specified path.r^      r:   r   )z.mp4avc1).aviWMV2)r   MJPGN)r'   r$   ru   r   imwriter%   r=   r&   r   r   intgetCAP_PROP_FPSCAP_PROP_FRAME_WIDTHCAP_PROP_FRAME_HEIGHTrW   r   r   rt   r   with_suffixVideoWriter_fourccwrite)
r0   r   r~   	save_pathr   fpswhsuffixfourccs
             r4   r   zBasePredictor.save_predsM  sY   <<'KK	3'}}S!Y.%.c"dooc2COODOOC(002gkk#*:*:;<CGKK(@(@ABAGKK(A(ABCA "CIIaL#))A,AC5:!1T[@PaqY ; ;F CD	'*y#BXBXZ`Bacfijlmhn'o$OOC &&s+r6   eventc                 V    | j                   j                  |g       D ]
  } ||         y)z3Runs all registered callbacks for a specific event.N)r   r   )r0   r   callbacks      r4   r   zBasePredictor.run_callbacksc  s$    **5"5HTN 6r6   c                 @    | j                   |   j                  |       y)zAdd callback.N)r   r   )r0   r   funcs      r4   add_callbackzBasePredictor.add_callbackh  s    u$$T*r6   )NNFr   )T)__name__
__module____qualname____doc__r
   r5   rL   rT   rB   r   r   r   r   r   r   r   r   r   r   rt   r   r   rn   r6   r4   r   r   ;   s    $ '$4 2B(N0!FO\  R- R-hE,,3 
+# +r6   r   )$r   r   pathlibr   r   numpyr@   r>   ultralytics.cfgr   r   ultralytics.datar   ultralytics.data.augmentr   r   ultralytics.nn.autobackendr	   ultralytics.utilsr
   r   r   r   r   r   r   ultralytics.utils.checksr   r   ultralytics.utils.filesr   ultralytics.utils.torch_utilsr   r   r   r   rn   r6   r4   <module>r     sL   8   
   1 2 C 2 [ [ [ > 2 M
o+ o+r6   