
    h@                         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=yolo11n.pt data=coco8.yaml imgsz=640

Usage - formats:
    $ yolo mode=val model=yolo11n.pt                 # PyTorch
                          yolo11n.torchscript        # TorchScript
                          yolo11n.onnx               # ONNX Runtime or OpenCV DNN with dnn=True
                          yolo11n_openvino_model     # OpenVINO
                          yolo11n.engine             # TensorRT
                          yolo11n.mlpackage          # CoreML (macOS-only)
                          yolo11n_saved_model        # TensorFlow SavedModel
                          yolo11n.pb                 # TensorFlow GraphDef
                          yolo11n.tflite             # TensorFlow Lite
                          yolo11n_edgetpu.tflite     # TensorFlow Edge TPU
                          yolo11n_paddle_model       # PaddlePaddle
                          yolo11n.mnn                # MNN
                          yolo11n_ncnn_model         # NCNN
                          yolo11n_imx_model          # Sony IMX
                          yolo11n_rknn_model         # Rockchip RKNN
    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ej                  dej                  dej                  de	d	ej                  f
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ed        Zd!dZd Zd Zd Zd Zy)"BaseValidatora  
    A base class for creating validators.

    This class provides the foundation for validation processes, including model evaluation, metric computation, and
    result visualization.

    Attributes:
        args (SimpleNamespace): Configuration for the validator.
        dataloader (DataLoader): Dataloader to use for validation.
        model (nn.Module): Model to validate.
        data (dict): Data dictionary containing dataset information.
        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 mapping.
        seen (int): Number of images seen so far during validation.
        stats (dict): Statistics collected during validation.
        confusion_matrix: Confusion matrix for classification evaluation.
        nc (int): Number of classes.
        iouv (torch.Tensor): IoU thresholds from 0.50 to 0.95 in spaces of 0.05.
        jdict (list): List 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.
        stride (int): Model stride for padding calculations.
        loss (torch.Tensor): Accumulated loss during training validation.

    Methods:
        __call__: Execute validation process, running inference on dataloader and computing performance metrics.
        match_predictions: Match predictions to ground truth objects using IoU.
        add_callback: Append the given callback to the specified event.
        run_callbacks: Run all callbacks associated with a specified event.
        get_dataloader: Get data loader from dataset path and batch size.
        build_dataset: Build dataset from image path.
        preprocess: Preprocess an input batch.
        postprocess: Postprocess the predictions.
        init_metrics: Initialize performance metrics for the YOLO model.
        update_metrics: Update metrics based on predictions and batch.
        finalize_metrics: Finalize and return all metrics.
        get_stats: Return statistics about the model's performance.
        print_results: Print the results of the model's predictions.
        get_desc: Get description of the YOLO model.
        on_plot: Register plots for visualization.
        plot_val_samples: Plot validation samples during training.
        plot_predictions: Plot YOLO model predictions on batch images.
        pred_to_json: Convert predictions to JSON format.
        eval_json: Evaluate and return JSON format of prediction statistics.
    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(                  ,| j                  j*                  dk(  rd	nd
| j                  _        t-        | j                  j.                  d      | j                  _        i | _        |xs t3        j4                         | _        y)a  
        Initialize a BaseValidator instance.

        Args:
            dataloader (torch.utils.data.DataLoader, optional): Dataloader to be used for validation.
            save_dir (Path, optional): Directory to save results.
            args (SimpleNamespace, optional): Configuration for the validator.
            _callbacks (dict, optional): Dictionary to store various callback functions.
        )	overridesNTg        )
preprocess	inferencelosspostprocesslabels)parentsexist_okobbg{Gz?gMbP?   )max_dim)r   args
dataloaderstridedatadevicebatch_itrainingnamesseenstatsconfusion_matrixnciouvjdictspeedr   save_dirsave_txtmkdirconftaskr   imgszplotsr   get_default_callbacks)selfr"   r0   r!   
_callbackss        Z/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/ultralytics/engine/validator.py__init__zBaseValidator.__init__^   s"    d+	$	
	
 $	
$'c3WZ[
 ;L$;%)YY%7%7	!T]]QQZ^imQn99>>!%)YY^^u%<T%DIIN%diiooqA		
#Hy'F'F'H    c                     |du _          j                  j                  xr  j                    } j                   rE|j                   _        |j                   _         j                  j
                  dk7  xr |j                   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)                          nt+         j                  j                        j-                  d      r|t/        j0                  d       t3        j4                          t7        |xs  j                  j                  t9         j                  j                   j                  j:                         j                  j<                   j                  j                   j                  j                        }|j                   _        |j>                   j                  _        |j@                  |jB                  |jD                  }}}tG         j                  jH                  |      }|s|stK        |d	d
      su|jL                  jO                  dd       j                  _        t/        jP                  d j                  j:                   d j                  j:                   d| d| d	       t+         j                  j                        jS                  dd      d   dv r%tU         j                  j                         _        n j                  jV                  dk(  r;tY         j                  j                   j                  jZ                         _        nCt]        t_        d j                  j                   d j                  jV                   d             j                  j
                  dv rd j                  _0        |s*tK        |d	d
      r|jb                  rd
 j                  _2        |j@                   _          jf                  xsS  ji                   j                  jO                   j                  jZ                         j                  j:                         _3        |j)                          |jk                  |rdn j                  j:                   j                  d   ||f        jm                  d       to         j                        to         j                        to         j                        to         j                        f}tq         jf                   js                         tu         jf                              }	 jw                  ty        |             g  _=        t}        |	      D ]  \  }
} jm                  d       |
 _?        |d   5   j                  |      }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                  |||
        jm                  d$         j                         }t        t         j                  j                          fd%|D                     _H         j                           j                           jm                  d&        j                   r|j                          i ||j                   j                  j                         tu         jf                        z  d'(      }|j                         D ci c]  \  }}|t        t        |      d)       c}}S t/        jP                   d*j                  t         j                  j                                        j                  j                  r jz                  rt        t+         j                  d+z        d,d-.      5 }t/        jP                  d/|j                   d0       t        j                   jz                  |       ddd        j                  |      } j                  j                  s j                  j                  r,t/        jP                  d1t        d2 j                                |S # 1 sw Y   @xY w# 1 sw Y   2x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)3a  
        Execute validation process, running inference on dataloader and computing performance metrics.

        Args:
            trainer (object, optional): Trainer object that contains the model to validate.
            model (nn.Module, optional): Model to validate if not using a trainer.

        Returns:
            (dict): Dictionary containing validation statistics.
        Ncpu)r%   r   z.yamlz8validating an untrained model YAML will result in 0 mAP.)weightsr%   dnnr$   fp16)r#   dynamicFbatchzSetting batch=z input of shape (z, 3, z, ).>   ymlyamlclassify)splitz	Dataset 'z' for task=u    not found ❌>   r>   mpsr   channels)r5   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xr8   s     r:   	<genexpr>z)BaseValidator.__call__.<locals>.<genexpr>   s0     1g_`!##DOO<S<S8T2TWZ2Z1gs   9<
on_val_endval)prefix   z]Speed: {:.1f}ms preprocess, {:.1f}ms inference, {:.1f}ms loss, {:.1f}ms postprocess per imagezpredictions.jsonwzutf-8)encodingzSaving z...zResults saved to bold)[r'   r!   rR   r%   r$   typeamphalfemamodelfloattorch
zeros_like
loss_itemsr   r6   stopperpossible_stopepochepochsevalstrendswithr	   warningr   add_integration_callbacksr   r   rC   r@   rA   r#   ptjitr   r5   getattrmetadatagetinforsplitr   r4   r   rJ   FileNotFoundErrorr   workersimxrectr"   get_dataloaderwarmuprun_callbacksr   r
   get_descrX   init_metricsr   r.   	enumerater&   r   r   update_metricsplot_val_samplesplot_predictions	get_statsdictzipr/   keysfinalize_metricsprint_resultslabel_loss_itemsr>   itemsroundformattuplevalues	save_jsonopenr0   namejsondump	eval_jsonr   )r8   trainerrh   rR   r#   rv   rw   r5   dtbarr&   rC   predsr*   resultskvfs   `                 r:   __call__zBaseValidator.__call__   s:     t+))##;T]]):==!..DKDI![[--6F7;;DIINKKOO4w}}E$(IINNEJJLE((););GNNSDIIIOOw<<eRYR`R`cdRdAdeOJJL499??#,,W5%-YZ//50$TYY%5%5tyyGIIMMYY^^YY^^E  ,,DK"ZZDIIN#llEHHeiiBF		?E#	5!A"'.."4"4Wa"@		nTYY__,==NtyyN__dejdkkmnsmttuvw499>>"))#q1"5H-diinn=	:--diinnDIIOOT	'499>>:J+VZV_V_VdVdUees/t(uvv{{>1$%		!75)U;EII!&		,,DK"oou1D1DTYY]]SWS\S\SbSbEceienenetet1uDOJJLLLRTYY__dii
>SUZ\abLc>*4;;'4;;'4;;'4;;'	
 4??DOO@TU+e,-
'n 	3NGU34"DLA /./ A =eElG<= A ===IIE5!9!!<<I=
 A 0((/0 u-yy7Q;%%eW5%%eUG<123	34  #djjoo/1gdf1ghi
<(==KKMqq'":":499==?SQUQ`Q`Ma;ajo":"pqG6=mmoFdaAuU1Xq))FFKKvovv4::,,./
 yy""tzz#dmm.@@A3QXY -]^KK'!&& 56IIdjj!,- u-yy$))"5"5/0O/PQRLY/ /= == =
0 0" G- -sC    f0?f=5g
g g$9Ag*0f:	=g	
g	g!	*g3pred_classestrue_classesiou	use_scipyreturnc                 t   t        j                  |j                  d   | j                  j                  d   f      j	                  t
              }|dddf   |k(  }||z  }|j                         j                         }t        | j                  j                         j                               D ]W  \  }}|raddl
}	|||k\  z  }
|
j                         s&|	j                  j                  |
      \  }}|
||f   dkD  }|j                         s_d|||   |f<   jt        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<   Z t)        j*                  |t(        j
                  |j,                        S )a$  
        Match predictions to ground truth objects 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 truth.
            use_scipy (bool, optional): Whether to use scipy for matching (more precise).

        Returns:
            (torch.Tensor): Correct tensor of shape (N, 10) for 10 IoU thresholds.
        r   NTr   rF   )return_index)dtyper%   )npzerosshaper-   astypeboolr>   numpyr   tolistscipyanyoptimizelinear_sum_assignmentnonzeroarrayTargsortuniqueintrj   tensorr%   )r8   r   r   r   r   correctcorrect_classi	thresholdr   cost_matrix
labels_idxdetections_idxvalidmatchess                  r:   match_predictionszBaseValidator.match_predictions   s     ((L..q1499??13EFGNNtT$QW-=M!ggioo%diimmo&<&<&>? 	ALAy!SI%56??$161U1UVa1b.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'	A( ||G5::l>Q>QRRr<   eventc                 @    | j                   |   j                  |       y)z1Append the given callback to the specified event.N)r   appendr8   r   callbacks      r:   add_callbackzBaseValidator.add_callback$  s    u$$X.r<   c                 V    | j                   j                  |g       D ]
  } ||         y)z4Run all callbacks associated with a specified event.N)r   rz   r   s      r:   r   zBaseValidator.run_callbacks(  s)    **5"5 	HTN	r<   c                     t        d      )z1Get data loader from dataset path and batch size.z:get_dataloader function not implemented for this validatorNotImplementedError)r8   dataset_path
batch_sizes      r:   r   zBaseValidator.get_dataloader-  s    !"^__r<   c                     t        d      )zBuild dataset from image path.z3build_dataset function not implemented in validatorr   )r8   img_paths     r:   build_datasetzBaseValidator.build_dataset1  s    !"WXXr<   c                     |S )zPreprocess an input batch. )r8   rC   s     r:   r   zBaseValidator.preprocess5      r<   c                     |S )zPostprocess the predictions.r   )r8   r   s     r:   r   zBaseValidator.postprocess9  r   r<   c                      y)z2Initialize performance metrics for the YOLO model.Nr   )r8   rh   s     r:   r   zBaseValidator.init_metrics=      r<   c                      y)z.Update metrics based on predictions and batch.Nr   r8   r   rC   s      r:   r   zBaseValidator.update_metricsA  r   r<   c                      y)z Finalize and return all metrics.Nr   r8   s    r:   r   zBaseValidator.finalize_metricsE  r   r<   c                     i S )z0Return statistics about the model's performance.r   r   s    r:   r   zBaseValidator.get_statsI  s    	r<   c                      y)z-Print the results of the model's predictions.Nr   r   s    r:   r   zBaseValidator.print_resultsM  r   r<   c                      y)z"Get description of the YOLO model.Nr   r   s    r:   r   zBaseValidator.get_descQ  r   r<   c                     g S )z8Return the metric keys used in YOLO training/validation.r   r   s    r:   metric_keyszBaseValidator.metric_keysU  s	     	r<   c                 ^    |t        j                          d| j                  t        |      <   y)z!Register plots for visualization.)r$   	timestampN)timer6   r   )r8   r   r$   s      r:   on_plotzBaseValidator.on_plotZ  s    *.TYY[!I

4:r<   c                      y)z(Plot validation samples during training.Nr   )r8   rC   nis      r:   r   zBaseValidator.plot_val_samples^  r   r<   c                      y)z,Plot YOLO model predictions on batch images.Nr   )r8   rC   r   r   s       r:   r   zBaseValidator.plot_predictionsb  r   r<   c                      y)z#Convert predictions to JSON format.Nr   r   s      r:   pred_to_jsonzBaseValidator.pred_to_jsonf  r   r<   c                      y)z9Evaluate and return JSON format of prediction statistics.Nr   )r8   r*   s     r:   r   zBaseValidator.eval_jsonj  r   r<   )NNNN)NN)F)N)__name__
__module____qualname____doc__r;   r   r   rj   Tensorr   r   rr   r   r   r   r   r   r   r   r   r   r   r   r   propertyr   r   r   r   r   r   r   r<   r:   r   r   *   s    1f!IF u up lq)S!LL)S8=)SKP<<)Sdh)S	)SV/# /3 
`Y  Jr<   r   )r   r   r   pathlibr   r   r   rj   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<   r:   <module>r      sB   0      1 G 2 G G 0 ) Z ZB Br<   