
    FPhD8                         d 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m	Z	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 ddlmZ dd	lmZ dd
lmZmZmZ  G d d      Zy)a  
Check a model's accuracy on a test or val split of a dataset.

Usage:
    $ yolo mode=val model=yolov8n.pt data=coco128.yaml imgsz=640

Usage - formats:
    $ yolo mode=val 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)check_cls_datasetcheck_det_dataset)AutoBackend)LOGGERTQDM	callbackscolorstremojis)check_imgsz)Profile)de_parallelselect_devicesmart_inference_modec                       e Zd ZdZddZ e       dd       ZddZdefdZ	defdZ
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zed        ZddZd Zd Zd Zd Zy)BaseValidatora   
    BaseValidator.

    A base class for creating validators.

    Attributes:
        args (SimpleNamespace): Configuration for the validator.
        dataloader (DataLoader): Dataloader to use for validation.
        pbar (tqdm): Progress bar to update during validation.
        model (nn.Module): Model to validate.
        data (dict): Data dictionary.
        device (torch.device): Device to use for validation.
        batch_i (int): Current batch index.
        training (bool): Whether the model is in training mode.
        names (dict): Class names.
        seen: Records the number of images seen so far during validation.
        stats: Placeholder for statistics during validation.
        confusion_matrix: Placeholder for a confusion matrix.
        nc: Number of classes.
        iouv: (torch.Tensor): IoU thresholds from 0.50 to 0.95 in spaces of 0.05.
        jdict (dict): Dictionary to store JSON validation results.
        speed (dict): Dictionary with keys 'preprocess', 'inference', 'loss', 'postprocess' and their respective
                      batch processing times in milliseconds.
        save_dir (Path): Directory to save results.
        plots (dict): Dictionary to store plots for visualization.
        callbacks (dict): Dictionary to store various callback functions.
    Nc                    t        |      | _        || _        || _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        ddddd| _        |xs t#        | j                        | _        | j                  j&                  r| j$                  dz  n| j$                  j)                  dd       | j                  j*                  d| j                  _        t-        | j                  j.                  d	
      | j                  _        i | _        |xs t3        j4                         | _        y)a  
        Initializes a BaseValidator instance.

        Args:
            dataloader (torch.utils.data.DataLoader): Dataloader to be used for validation.
            save_dir (Path, optional): Directory to save results.
            pbar (tqdm.tqdm): Progress bar for displaying progress.
            args (SimpleNamespace): Configuration for the validator.
            _callbacks (dict): Dictionary to store various callback functions.
        )	overridesNTg        )
preprocess	inferencelosspostprocesslabels)parentsexist_okgMbP?   )max_dim)r   args
dataloaderpbarmodeldatadevicebatch_itrainingnamesseenstatsconfusion_matrixnciouvjdictspeedr   save_dirsave_txtmkdirconfr   imgszplotsr   get_default_callbacks)selfr!   r0   r"   r    
_callbackss         gC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\ultralytics/engine/validator.py__init__zBaseValidator.__init__B   s    d+	$	
	
	
 $	
$'c3WZ[
 ;L$;%)YY%7%7	!T]]QQZ^imQn99>>!"DIIN%diiooqA		
#Hy'F'F'H    c           
      f    |du _          j                  j                  xr  j                    } j                   r7|j                   _        |j                   _         j                  j
                  dk7   j                  _        |j                  j                  xs |j                  } j                  j                  r|j                         n|j                         }t        j                  |j                  |j                         _         j                  xj                  |j                  j                   xs |j"                  |j$                  dz
  k(  z  c_        |j'                          ndt)        j*                          t-        |xs  j                  j                  t/         j                  j                   j                  j0                         j                  j2                   j                  j                   j                  j                        }|j                   _        |j4                   j                  _        |j6                  |j8                  |j:                  |j<                  f\  }}}}t?         j                  j@                  |      }|r|jB                   j                  _        n1|s/|s-d j                  _        tE        jF                  d| d| d	       tI         j                  j                  tJ              rO j                  j                  jM                  d
      d   dv r%tO         j                  j                         _        n j                  jP                  dk(  r;tS         j                  j                   j                  jL                         _        nCtU        tW        d j                  j                   d j                  jP                   d             j                  j
                  dv rd j                  _,        |sd j                  _-         j\                  xsS  j_                   j                  ja                   j                  jL                         j                  j0                         _.        |j'                          |jc                  |rdn j                  j0                  d||f        je                  d       tg               tg               tg               tg               f}	ti         j\                   jk                         tm         j\                              }
 jo                  tq        |             g  _9        tu        |
      D ]  \  }} je                  d       | _;        |	d   5   jy                  |      }ddd       |	d   5   ||d   |      }ddd       |	d   5   j                   r( xj                  |j                  |      d   z  c_        ddd       |	d   5   j{                        }ddd        j}                  |        j                  j                  r*|dk  r% j                  ||        j                  |||        je                  d         j                         } j                  |       t        t         j                  j                          fd|	D                     _E         j                           j                           je                  d        j                   r|j                          i ||j                   j                  j                         tm         j\                        z  d !      }|j                         D ci c]  \  }}|t        t        |      d"       c}}S tE        jF                  d#t         j                  j                               z          j                  j                  r jr                  rt        tK         j                  d$z        d%      5 }tE        jF                  d&|j                   d'       t        j                   jr                  |       ddd        j                  |      } j                  j                  s j                  j                  r,tE        jF                  d(t        d) j                                |S # 1 sw Y   ExY w# 1 sw Y   7xY w# 1 sw Y   xY w# 1 sw Y   xY wc c}}w # 1 sw Y   xY w)*zSupports validation of a pre-trained model if passed or a model being trained if trainer is passed (trainer
        gets priority).
        Ncpu)r%   r   )r%   dnnr$   fp16)stridez&Forcing batch=1 square inference (1,3,,z) for non-PyTorch models.)yamlymlclassify)splitz	Dataset 'z' for task=u    not found ❌)r=   mpsr   F   )r4   on_val_start)desctotalon_val_batch_startimg)augment   on_val_batch_endc              3   |   K   | ]3  }|j                   t        j                  j                        z  d z   5 yw)g     @@N)tlenr!   dataset).0xr7   s     r9   	<genexpr>z)BaseValidator.__call__.<locals>.<genexpr>   s3     1gdf_`!##DOO<S<S8T2TWZ2Zdfs   9<
on_val_endval)prefix   zUSpeed: %.1fms preprocess, %.1fms inference, %.1fms loss, %.1fms postprocess per imagezpredictions.jsonwzSaving z...zResults saved to bold)Wr'   r    rO   r%   r$   typehalfemar#   floattorch
zeros_like
loss_itemsr   r5   stopperpossible_stopepochepochsevalr   add_integration_callbacksr   r   batchr>   r?   r@   ptjitenginer   r4   
batch_sizer	   info
isinstancestrrG   r   taskr   FileNotFoundErrorr   workersrectr!   get_dataloadergetwarmuprun_callbacksr   r
   get_descrT   init_metricsr   r.   	enumerater&   r   r   update_metricsplot_val_samplesplot_predictions	get_statscheck_statsdictzipr/   keysfinalize_metricsprint_resultslabel_loss_itemsr=   itemsroundtuplevalues	save_jsonopenr0   namejsondump	eval_jsonr   )r7   trainerr#   rO   r@   rm   rn   ro   r4   dtbarr&   rl   predsr*   resultskvfs   `                  r9   __call__zBaseValidator.__call__g   s   
  t+))##;T]]):==!..DKDI![[--6DIINKKOO4w}}E$(IINNEJJLE((););GNNSDIIIOOw<<eRYR`R`cdRdAdeOJJL//5 8'4TYY5E5Etyy'W$(IIMM%)YY^^%)YY^^	5E  ,,DK"ZZDIIN&+llEHHeii&U#FBV		?E"'"2"2		"#		DUG1UGSklm$))..#.499>>3G3G3LR3PTc3c-diinn=	:--diinnDIIOOT	'499>>:J+VZV_V_VdVdUees/t(uvv{{>1$%		!!&		"oou1D1DTYY]]SWS\S\SbSbEceienenetet1uDOJJLLLRTYY__aNLO>*Y	79gi74??DOO@TU+e,-
'nNGU34"DLA.  AeElG<  A==IIE5!9!!<<I 
 A((/  u-yy7Q;%%eW5%%eUG<123 -4  #djjoo/1gdf1ghi
<(==KKMqq'":":499==?SQUQ`Q`Ma;ajo":"pqG6=mmoFodaAuU1Xq))oFFKKodjj//123 4yy""tzz#dmm.@@A3G1KK'!&& 56IIdjj!, H u-yy$))"5"5/0O/PQRLU   
 $ G
 HGsC   c-7c:5dd d!6Ad'-c7	:d	d	d	'd0c                 x   t        j                  |j                  d   | j                  j                  d   f      j	                  t
              }|dddf   |k(  }||z  }|j                         j                         }t        | j                  j                         j                               D ]Y  \  }}|rcddl
}	|||k\  z  }
|
j                         s&|	j                  j                  |
d      \  }}|
||f   dkD  }|j                         sad|||   |f<   lt        j                  ||k\        }t        j                  |      j                   }|j                  d   s|j                  d   dkD  rt|||dddf   |dddf   f   j#                         ddd      }|t        j$                  |dddf   d      d      }|t        j$                  |dddf   d      d      }d||dddf   j	                  t&              |f<   \ t)        j*                  |t(        j
                  |j,                        S )	a7  
        Matches predictions to ground truth objects (pred_classes, true_classes) using IoU.

        Args:
            pred_classes (torch.Tensor): Predicted class indices of shape(N,).
            true_classes (torch.Tensor): Target class indices of shape(M,).
            iou (torch.Tensor): An NxM tensor containing the pairwise IoU values for predictions and ground of truth
            use_scipy (bool): Whether to use scipy for matching (more precise).

        Returns:
            (torch.Tensor): Correct tensor of shape(N,10) for 10 IoU thresholds.
        r   NT)maximizer   rC   )return_index)dtyper%   )npzerosshaper-   astypeboolr=   numpyr~   tolistscipyanyoptimizelinear_sum_assignmentnonzeroarrayTargsortuniqueintrc   tensorr%   )r7   pred_classestrue_classesiou	use_scipycorrectcorrect_classi	thresholdr   cost_matrix
labels_idxdetections_idxvalidmatchess                  r9   match_predictionszBaseValidator.match_predictions   s    ((L..q1499??13EFGNNtT$QW-=M!ggioo%diimmo&<&<&>?LAy!SI%56??$161U1UValp1U1q.J'
N(BCaGEyy{<@u 5q 89**SI%56((7+--==#}}Q'!+")#gadmWQT].J*K*S*S*UVZXZVZ*["\")"))GAqDMPT*UVW*X"Y")"))GAqDMPT*UVW*X"Y<@GGAqDM005q89' @( ||G5::l>Q>QRRr;   eventc                 @    | j                   |   j                  |       y)zAppends the given callback.N)r   appendr7   r   callbacks      r9   add_callbackzBaseValidator.add_callback   s    u$$X.r;   c                 V    | j                   j                  |g       D ]
  } ||         y)z5Runs all callbacks associated with a specified event.N)r   ry   r   s      r9   r{   zBaseValidator.run_callbacks   s$    **5"5HTN 6r;   c                     t        d      )z1Get data loader from dataset path and batch size.z:get_dataloader function not implemented for this validatorNotImplementedError)r7   dataset_pathrp   s      r9   rx   zBaseValidator.get_dataloader  s    !"^__r;   c                     t        d      )zBuild dataset.z3build_dataset function not implemented in validatorr   )r7   img_paths     r9   build_datasetzBaseValidator.build_dataset  s    !"WXXr;   c                     |S )zPreprocesses an input batch. )r7   rl   s     r9   r   zBaseValidator.preprocess	      r;   c                     |S )zQDescribes and summarizes the purpose of 'postprocess()' but no details mentioned.r   )r7   r   s     r9   r   zBaseValidator.postprocess  r   r;   c                      y)z2Initialize performance metrics for the YOLO model.Nr   )r7   r#   s     r9   r}   zBaseValidator.init_metrics      r;   c                      y)z/Updates metrics based on predictions and batch.Nr   r7   r   rl   s      r9   r   zBaseValidator.update_metrics  r   r;   c                      y)z"Finalizes and returns all metrics.Nr   )r7   r    kwargss      r9   r   zBaseValidator.finalize_metrics  r   r;   c                     i S )z1Returns statistics about the model's performance.r   r7   s    r9   r   zBaseValidator.get_stats  s    	r;   c                      y)zChecks statistics.Nr   r7   r*   s     r9   r   zBaseValidator.check_stats!  r   r;   c                      y)z.Prints the results of the model's predictions.Nr   r   s    r9   r   zBaseValidator.print_results%  r   r;   c                      y)z"Get description of the YOLO model.Nr   r   s    r9   r|   zBaseValidator.get_desc)  r   r;   c                     g S )z9Returns the metric keys used in YOLO training/validation.r   r   s    r9   metric_keyszBaseValidator.metric_keys-  s	     	r;   c                 ^    |t        j                          d| j                  t        |      <   y)z2Registers plots (e.g. to be consumed in callbacks))r$   	timestampN)timer5   r   )r7   r   r$   s      r9   on_plotzBaseValidator.on_plot2  s    *.TYY[!I

4:r;   c                      y)z)Plots validation samples during training.Nr   )r7   rl   nis      r9   r   zBaseValidator.plot_val_samples7  r   r;   c                      y)z-Plots YOLO model predictions on batch images.Nr   )r7   rl   r   r   s       r9   r   zBaseValidator.plot_predictions;  r   r;   c                      y)z#Convert predictions to JSON format.Nr   r   s      r9   pred_to_jsonzBaseValidator.pred_to_json?  r   r;   c                      y)z9Evaluate and return JSON format of prediction statistics.Nr   r   s     r9   r   zBaseValidator.eval_jsonC  r   r;   )NNNNN)NN)F)N)__name__
__module____qualname____doc__r:   r   r   r   rs   r   r{   rx   r   r   r   r}   r   r   r   r   r   r|   propertyr   r   r   r   r   r   r   r;   r9   r   r   %   s    8#IJ e eN'SR/# /3 
`Y  J
r;   r   )r   r   r   pathlibr   r   r   rc   ultralytics.cfgr   r   ultralytics.data.utilsr   r   ultralytics.nn.autobackendr   ultralytics.utilsr	   r
   r   r   r   ultralytics.utils.checksr   ultralytics.utils.opsr   ultralytics.utils.torch_utilsr   r   r   r   r   r;   r9   <module>r      sB   &      1 G 2 G G 0 ) Z Z` `r;   