
    .h5B                         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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)attempt_compileselect_devicesmart_inference_modeunwrap_modelc                   (   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                    ddl }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                  j0                  d      | j                  _        i | _        |xs t5        j6                         | _        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.
        r   N)	overridesTg        )
preprocess	inferencelosspostprocesslabels)parentsexist_okobbg{Gz?gMbP?   )max_dim)torchvisionr   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$   r2   r#   
_callbacksr"   s         Z/var/www/html/ai-service/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                 x    |du _          j                  j                  xr  j                    } j                   rs|j                   _        |j                   _         j                  j
                  dk7  xr |j                   j                  _        |j                  j                  xs |j                  }|j                  j                  rt        |d      r|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/                          nt1         j                  j                        j3                  d      r|t5        j6                  d       t9        j:                          t=        |xs  j                  j                  t?         j                  j                         j                  j@                   j                  j                   j                  j                        }|j                   _        |jB                   j                  _        |jD                  |jF                  |jH                  }}}tK         j                  jL                  |	      }|s|stO        |d
d      su|jP                  jS                  dd       j                  _*        t5        jV                  d j                  jT                   d j                  jT                   d| d| d	       t1         j                  j                        jY                  dd      d   dv r%t[         j                  j                         _        n j                  j\                  dk(  r;t_         j                  j                   j                  j`                         _        nCtc        te        d j                  j                   d j                  j\                   d             j                  j
                  dv rd j                  _3        |s*tO        |d
d      r|jh                  rd j                  _5        |jD                   _"         jl                  xsS  jo                   j                  jS                   j                  j`                         j                  jT                         _6        |j/                           j                  j                  rtq        | j                        }|js                  |rdn j                  jT                   j                  d   ||f        ju                  d       tw         j                        tw         j                        tw         j                        tw         j                        f}ty         jl                   j{                         t}         jl                              }	 j                  t        |             g  _A        t        |	      D ]  \  }
} ju                  d        |
 _C        |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                  |||
        ju                  d%         j                         }t        t         j                  j                          fd&|D                     _L         j                           j                           ju                  d'        j                   r|j                          i ||j                   j"                  j                         t}         jl                        z  d()      }|j                         D ci c]  \  }}|t        t        |      d*       c}}S t5        jV                   d+j                  t         j                  j                                        j                  j                  r j                  rt        t1         j                  d,z        d-d./      5 }t5        jV                  d0|j                   d1       t        j                   j                  |       ddd        j                  |      } j                  j$                  s j                  j                  r,t5        jV                  d2t        d3 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)4a  
        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	_orig_mod)r'   r    z.yamlz8validating an untrained model YAML will result in 0 mAP.)modelr'   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)r7   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xr:   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#   rU   r'   r&   typeamphalfemarB   compilehasattrrA   floattorch
zeros_like
loss_itemsr   r8   stopperpossible_stopepochepochsevalstrendswithr	   warningr   add_integration_callbacksr   r   rC   rD   r%   ptjitr   r7   getattrmetadatagetrF   inforsplitr   r6   r   rM   FileNotFoundErrorr   workersimxrectr$   get_dataloaderr   warmuprun_callbacksr   r
   get_descr[   init_metricsr   r0   	enumerater(   r   r   update_metricsplot_val_samplesplot_predictions	get_statsdictzipr1   keysfinalize_metricsprint_resultslabel_loss_itemsr@   itemsroundformattuplevalues	save_jsonopenr2   namejsondump	eval_jsonr   )r:   trainerrB   rU   r%   rz   r{   r7   dtbarr(   rF   predsr,   resultskvfs   `                 r<   __call__zBaseValidator.__call__   sl     t+))##;T]]):==!..DKDI![[--6F7;;DIINKKOO4w}}E||##{(C$(IINNEJJLE((););GNNSDIIIOOw<<eRYR`R`cdRdAdeOJJL499??#,,W5%-YZ//5.tyy$TYY%5%56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yy  'dkkBLLRTYY__dii
>SUZ\abLc>*4;;'4;;'4;;'4;;'	
 4??DOO@TU,u-.
'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   &g6h 5h"h h*?Ah06h 	h	h	h'	0h9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    rI   )return_index)dtyper'   )npzerosshaper/   astypeboolr@   numpyr   tolistscipyanyoptimizelinear_sum_assignmentnonzeroarrayTargsortuniqueintrn   tensorr'   )r:   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r:   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   r~   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)r:   dataset_path
batch_sizes      r<   r   zBaseValidator.get_dataloader3  s    !"^__r>   c                     t        d      )zBuild dataset from image path.z3build_dataset function not implemented in validatorr   )r:   img_paths     r<   build_datasetzBaseValidator.build_dataset7  s    !"WXXr>   c                     |S )zPreprocess an input batch. )r:   rF   s     r<   r   zBaseValidator.preprocess;      r>   c                     |S )zPostprocess the predictions.r   )r:   r   s     r<   r   zBaseValidator.postprocess?  r   r>   c                      y)z2Initialize performance metrics for the YOLO model.Nr   )r:   rB   s     r<   r   zBaseValidator.init_metricsC      r>   c                      y)z.Update metrics based on predictions and batch.Nr   r:   r   rF   s      r<   r   zBaseValidator.update_metricsG  r   r>   c                      y)z Finalize and return all metrics.Nr   r:   s    r<   r   zBaseValidator.finalize_metricsK  r   r>   c                     i S )z0Return statistics about the model's performance.r   r   s    r<   r   zBaseValidator.get_statsO  s    	r>   c                      y)z-Print the results of the model's predictions.Nr   r   s    r<   r   zBaseValidator.print_resultsS  r   r>   c                      y)z"Get description of the YOLO model.Nr   r   s    r<   r   zBaseValidator.get_descW  r   r>   c                     g S )z8Return the metric keys used in YOLO training/validation.r   r   s    r<   metric_keyszBaseValidator.metric_keys[  s	     	r>   c                 ^    |t        j                          d| j                  t        |      <   y)z!Register plots for visualization.)r&   	timestampN)timer8   r   )r:   r   r&   s      r<   on_plotzBaseValidator.on_plot`  s    *.TYY[!I

4:r>   c                      y)z(Plot validation samples during training.Nr   )r:   rF   nis      r<   r   zBaseValidator.plot_val_samplesd  r   r>   c                      y)z,Plot YOLO model predictions on batch images.Nr   )r:   rF   r   r   s       r<   r   zBaseValidator.plot_predictionsh  r   r>   c                      y)z#Convert predictions to JSON format.Nr   r   s      r<   pred_to_jsonzBaseValidator.pred_to_jsonl  r   r>   c                      y)z9Evaluate and return JSON format of prediction statistics.Nr   )r:   r,   s     r<   r   zBaseValidator.eval_jsonp  r   r>   )NNNN)NN)F)N)__name__
__module____qualname____doc__r=   r   r   rn   Tensorr   r   rv   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J y yx lq)S!LL)S8=)SKP<<)Sdh)S	)SV/# /3 
`Y  Jr>   r   ) r   r   r   pathlibr   r   r   rn   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>   r<   <module>r     sB   0      1 G 2 G G 0 ) l lH Hr>   