Ë
    FêñiëG  ã                  óè   — d Z ddlm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 ddlmZmZ ddlmZ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 dd
l m!Z! ddl"m#Z#m$Z$m%Z%m&Z&m'Z'  G d„ d«      Z(y)a3  
Check a model's accuracy on a test or val split of a dataset.

Usage:
    $ yolo mode=val model=yolo26n.pt data=coco8.yaml imgsz=640

Usage - formats:
    $ yolo mode=val model=yolo26n.pt                 # PyTorch
                          yolo26n.torchscript        # TorchScript
                          yolo26n.onnx               # ONNX Runtime or OpenCV DNN with dnn=True
                          yolo26n_openvino_model     # OpenVINO
                          yolo26n.engine             # TensorRT
                          yolo26n.mlpackage          # CoreML (macOS-only)
                          yolo26n_saved_model        # TensorFlow SavedModel
                          yolo26n.pb                 # TensorFlow GraphDef
                          yolo26n.tflite             # TensorFlow Lite
                          yolo26n_edgetpu.tflite     # TensorFlow Edge TPU
                          yolo26n_paddle_model       # PaddlePaddle
                          yolo26n.mnn                # MNN
                          yolo26n_ncnn_model         # NCNN
                          yolo26n_imx_model          # Sony IMX
                          yolo26n_rknn_model         # Rockchip RKNN
                          yolo26n_executorch_model   # ExecuTorch
                          yolo26n_axelera_model      # Axelera AI
é    )ÚannotationsN)ÚPath)Úget_cfgÚget_save_dir)Úcheck_cls_datasetÚcheck_det_datasetÚ convert_ndjson_to_yolo_if_needed)ÚAutoBackend)Ú
LOCAL_RANKÚLOGGERÚRANKÚTQDMÚ	callbacksÚcolorstrÚemojis)Úcheck_imgsz)ÚProfile)Úattempt_compileÚselect_deviceÚsmart_inference_modeÚtorch_distributed_zero_firstÚunwrap_modelc                  óÖ   — e Zd ZdZddd„Z e«       dd„«       Z	 d	 	 	 	 	 	 	 	 	 dd„Zdd„Zd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  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 steps 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{®Gáz„?gü©ñÒMbP?é   )Ú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)   r7   r(   Ú
_callbacksr'   s         ú^/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/ultralytics/engine/validator.pyÚ__init__zBaseValidator.__init__h   s%  € ó 	ä dÔ+ˆŒ	Ø$ˆŒØˆŒØˆŒ	ØˆŒØˆŒØˆŒØˆŒ
ØˆŒ	ØˆŒ
Ø $ˆÔØˆŒØˆŒ	ØˆŒ
Ø$'°cÀ3ÐWZÑ[ˆŒ
à Ò;¤L°·±Ó$;ˆŒØ%)§Y¡Y×%7Ò%7ˆ�‰˜Ò	!¸T¿]¹]×QÑQÐZ^ÐimÐQÔnØ�9‰9�>‰>Ð!Ø%)§Y¡Y§^¡^°uÒ%<™TÀ%ˆD�I‰IŒNÜ% d§i¡i§o¡o¸qÔAˆ�	‰	ŒàˆŒ
Ø#ÒH¤y×'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        |d«      rx‰ j                  j<                  �‰ j                  j<                  |_        |j<                  r;|j?                  ‰ j                  j@                  ‰ j                  jB                  ¬	«       tE        tF        «      5  tI        ‰ j                  j                  «      ‰ j                  _        ddd«       tK        |xs ‰ j                  j                  tL        d
k(  rtO        ‰ j                  j                  «      nt        j                  dtL        «      ‰ j                  jP                  ‰ j                  j                  ‰ j                  j                  ¬«      }|j                  ‰ _        |jR                  ‰ j                  _        |jT                  |jV                  }}|dk(  }tY        ‰ j                  jZ                  |¬«      }|dvr‚t]        |dd«      su|j^                  ja                  dd«      ‰ j                  _1        t5        jd                  d‰ j                  jb                  › d‰ j                  jb                  › d|› d|› d�	«       t1        ‰ j                  j                  «      jg                  dd«      d
   dv r%ti        ‰ j                  j                  «      ‰ _        n—‰ j                  jj                  dk(  r;tm        ‰ j                  j                  ‰ j                  jn                  ¬«      ‰ _        nCtq        ts        d‰ j                  j                  › d‰ j                  jj                  › d�«      «      ‚‰ j                  j
                  dv rd ‰ j                  _:        |s#t]        |dd«      r|d!k7  sd‰ j                  _;        |jT                  ‰ _*        ‰ jx                  xsS ‰ j{                  ‰ j                  ja                  ‰ j                  jn                  «      ‰ j                  jb                  «      ‰ _<        |j/                  «        ‰ j                  j                  rt}        |‰ j                  ¬«      }|j                  |rdn‰ j                  jb                  ‰ j                  d"   ||f¬#«       ‰ j�                  d$«       tƒ        ‰ j                  ¬«      tƒ        ‰ j                  ¬«      tƒ        ‰ j                  ¬«      tƒ        ‰ j                  ¬«      f}t…        ‰ jx                  ‰ j‡                  «       t‰        ‰ jx                  «      ¬%«      }	‰ j‹                  t�        |«      «       g ‰ _G        t‘        |	«      D �]$  \  }
}‰ j�                  d&«       |
‰ _I        |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$                  r2|
d*k  r-tL        d+v r%‰ j›                  ||
«       ‰ j�                  |||
«       ‰ j�                  d,«       �Œ' i }‰ jŸ                  «        tL        d+v r|‰ j¡                  «       }t£        t¥        ‰ j¦                  j©                  «       ˆ fd-„|D «       «      «      ‰ _S        ‰ j«                  «        ‰ j­                  «        ‰ j�                  d.«       ‰ j                   ró|j                  «        ‰ j"                  j¯                  «       j±                  «       }|j²                  dkD  r0tµ        j¶                  |d t´        j¸                  jº                  ¬/«       tL        d kD  ryi |¥|j½                  |j¿                  «       t‰        ‰ jx                  «      z  d0¬1«      ¥}|jÁ                  «       D ��ci c]  \  }}|tÃ        t        |«      d2«      “Œ c}}S tL        d kD  r|S t5        jd                   d3jV                  tÅ        ‰ j¦                  jÇ                  «       «      Ž «       ‰ j                  jÈ                  r�‰ jŽ                  r�tË        t1        ‰ jÌ                  d4z  «      d5d6¬7«      5 }t5        jd                  d8|jÎ                  › d9�«       tÑ        jÒ                  ‰ jŽ                  |«       ddd«       ‰ jÕ                  |«      }‰ j                  j$                  s‰ j                  jÈ                  r,t5        jd                  d:t×        d;‰ jÌ                  «      › �«       |S # 1 sw Y   �ŒŸxY w# 1 sw Y   �ŒáxY w# 1 sw Y   �ŒÓx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)<ax  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.Úend2end)Úmax_detÚagnostic_nmséÿÿÿÿÚcuda)Úmodelr,   Údnnr+   Úfp16Úpt)r*   >   rO   ÚtorchscriptÚdynamicFÚbatchzSetting batch=z input of shape (z, 3, z, ú)ú.>   ÚymlÚyamlÚclassify)Úsplitz	Dataset 'z' for task=u    not found â�Œ>   rE   Úmpsr   ÚimxÚchannels)r<   Úon_val_start)ÚdescÚtotalÚon_val_batch_startÚimg)Úaugmenté   é   >   r   rJ   Ú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     €rA   ú	<genexpr>z)BaseValidator.__call__.<locals>.<genexpr>ü   s0   øè ø€ Ò5kÐcd°a·c±c¼CÀÇÁ×@WÑ@WÓ<XÑ6XÐ[^Õ6^Ñ5kùs   ƒ9<Ú
on_val_end)ÚdstÚopÚ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)lr.   r(   ra   r,   r+   ÚtypeÚampÚhalfÚemarL   ÚcompileÚhasattrrF   ÚfloatÚtorchÚ
zeros_likeÚ
loss_itemsr   r=   ÚstopperÚpossible_stopÚepochÚepochsÚevalÚstrÚendswithr   Úwarningr   Úadd_integration_callbacksrG   Úset_head_attrrH   rI   r   r   r	   r
   r   r   rM   rN   r*   Úformatr   r<   ÚgetattrÚmetadataÚgetrR   ÚinfoÚrsplitr   r;   r   rX   ÚFileNotFoundErrorr   ÚworkersÚrectr)   Úget_dataloaderr   ÚwarmupÚrun_callbacksr   r   Úget_descrg   Úinit_metricsr   r5   Ú	enumerater-   r   r    Úupdate_metricsÚplot_val_samplesÚplot_predictionsÚgather_statsÚ	get_statsÚdictÚzipr6   ÚkeysÚfinalize_metricsÚprint_resultsÚcloneÚdetachÚ
world_sizeÚdistÚreduceÚReduceOpÚAVGÚlabel_loss_itemsrE   ÚitemsÚroundÚtupleÚvaluesÚ	save_jsonÚopenr7   ÚnameÚjsonÚdumpÚ	eval_jsonr   )r?   ÚtrainerrL   ra   r*   ÚfmtrO   r<   ÚdtÚbarr-   rR   Úpredsr1   r   ÚresultsÚkÚvÚfs   `                  rA   Ú__call__zBaseValidator.__call__Œ   s‹  ø€ ð   tÐ+ˆŒØ—)‘)×#Ñ#Ò;¨T¯]©]Ð):ˆØ�=‹=Ø!Ÿ.™.ˆDŒKØŸ™ˆDŒIà!Ÿ[™[×-Ñ-°Ñ6ÒF¸7¿;¹;ˆD�I‰IŒNØ—K‘K—O‘OÒ4 w§}¡}ˆEØ�|‰|×#Ò#¬°°{Ô(CØŸ™�Ø$(§I¡I§N¢N�E—J‘J”L¸¿¹»ˆEÜ×(Ñ(¨×);Ñ);ÀGÇNÁNÔSˆDŒIØ�I‰I�OŠO˜wŸ™×<Ñ<ÒeÀÇÁÐRY×R`ÑR`ÐcdÑRdÑAdÑe�OØ�J‰JŽLä�4—9‘9—?‘?Ó#×,Ñ,¨WÔ5¸%¸-Ü—‘ÐYÔZÜ×/Ñ/°Ô5Ü�u˜iÔ(Ø—9‘9×$Ñ$Ð0Ø$(§I¡I×$5Ñ$5�E”MØ—=’=Ø×'Ñ'°·	±	×0AÑ0AÐPT×PYÑPY×PfÑPfÐ'ÔgÜ-¬jÓ9ñ RÜ!AÀ$Ç)Á)Ç.Á.Ó!Q�—	‘	”÷RäØÒ.˜tŸy™yŸ™Ü:>À"º*”} T§Y¡Y×%5Ñ%5Ô6Ì%Ï,É,ÐW]Ô_cÓJdØ—I‘I—M‘MØ—Y‘Y—^‘^Ø—Y‘Y—^‘^ôˆEð  Ÿ,™,ˆDŒKØ"ŸZ™ZˆD�I‰IŒNØŸ,™,¨¯©�CˆFØ˜‘ˆBÜ §	¡	§¡¸Ô?ˆEØÐ/Ñ/¼ÀÀyÐRWÔ8XØ"'§.¡.×"4Ñ"4°W¸aÓ"@�—	‘	”Ü—‘˜n¨T¯Y©Y¯_©_Ð,=Ð=NÈtÏyÉyÏÉÐN_Ð_dÐejÐdkÐkmÐnsÐmtÐtuÐvÔwä�4—9‘9—>‘>Ó"×)Ñ)¨#¨qÓ1°"Ñ5¸ÑHÜ-¨d¯i©i¯n©nÓ=�•	Ø—‘—‘ :Ò-Ü-¨d¯i©i¯n©nÀDÇIÁIÇOÁOÔT�•	ä'¬°¸4¿9¹9¿>¹>Ð:JÈ+ÐVZ×V_ÑV_×VdÑVdÐUeÐesÐ/tÓ(uÓvÐvà�{‰{×Ñ >Ñ1Ø$%�—	‘	Ô!Ùœ7 5¨)°UÔ;ÀÀuÂØ!&�—	‘	”ØŸ,™,ˆDŒKØ"Ÿo™oÒu°×1DÑ1DÀTÇYÁYÇ]Á]ÐSW×S\ÑS\×SbÑSbÓEcÐei×enÑen×etÑetÓ1uˆDŒOà�J‰JŒLØ�y‰y× Ò Ü'¨°d·k±kÔB�Ø�L‰L¡R¡¨T¯Y©Y¯_©_¸d¿i¹iÈ
Ñ>SÐUZÐ\aÐbˆLÔcà×Ñ˜>Ô*ä˜4Ÿ;™;Ô'Ü˜4Ÿ;™;Ô'Ü˜4Ÿ;™;Ô'Ü˜4Ÿ;™;Ô'ð	
ˆô �4—?‘?¨¯©«ÄÀDÇOÁOÓ@TÔUˆØ×Ñœ, uÓ-Ô.ØˆŒ
Ü'¨›nó 	3‰NˆG�UØ×ÑÐ3Ô4Ø"ˆDŒLà�A‘ñ /ØŸ™¨Ó.�÷/ð �A‘ñ =Ù˜e E™l°GÔ<�÷=ð �A‘ñ =Ø—=’=Ø—I’I §¡¨E°5Ó!9¸!Ñ!<Ñ<•I÷=ð
 �A‘ñ 0Ø×(Ñ(¨Ó/�÷0ð ×Ñ  uÔ-Ø�y‰y�Š 7¨Q¢;´4¸7±?Ø×%Ñ% e¨WÔ5Ø×%Ñ% e¨U°GÔ<à×ÑÐ1Ö2ð3	3ð6 ˆØ×ÑÔÜ�7‰?Ø—N‘NÓ$ˆEÜœc $§*¡*§/¡/Ó"3Ó5kÐhjÔ5kÓlÓmˆDŒJØ×!Ñ!Ô#Ø×ÑÔ Ø×Ñ˜|Ô,à�=Š=Ø�K‰KŒMà—9‘9—?‘?Ó$×+Ñ+Ó-ˆDØ×!Ñ! AÒ%Ü—‘˜D a¬D¯M©M×,=Ñ,=Õ>Ü�aŠxØØl˜Ðl '×":Ñ":¸4¿8¹8»:ÌÈDÏOÉOÓH\Ñ;\ÐejÐ":Ó"kÐlˆGØ6=·m±m³o×F©d¨a°�A”uœU 1›X qÓ)Ñ)ÓFÐFä�aŠxØ�Ü�K‰KØvÐo×vÑvÜ˜4Ÿ:™:×,Ñ,Ó.Ó/ðôð
 �y‰y×"Ò" t§z¢zÜœ#˜dŸm™mÐ.@Ñ@ÓAÀ3ÐQXÔYð -Ð]^Ü—K‘K '¨!¯&©&¨°Ð 5Ô6Ü—I‘I˜dŸj™j¨!Ô,÷-ð Ÿ™ uÓ-�Ø�y‰y�Š $§)¡)×"5Ò"5Ü—‘Ð/´¸ÀÇÁÓ0OÐ/PÐQÔRØˆL÷YRñ Rú÷f/ñ /ú÷=ñ =ú÷=ñ =ú÷
0ñ 0üó8 G÷-ð -úsO   Ê/m)Þm6Þ$nÞ?5nànç: n*ê2An0í)m3í6n 	în	în	în'	î0n9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 )	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   NT)Úmaximizer%   rJ   )Úreturn_index)Údtyper,   )ÚnpÚzerosÚshaper4   ÚastypeÚboolrE   Únumpyr—   ÚtolistÚscipyÚanyÚoptimizeÚlinear_sum_assignmentÚnonzeroÚarrayÚTÚargsortÚuniqueÚintr|   Útensorr,   )r?   Úpred_classesÚtrue_classesÚiouÚ	use_scipyÚcorrectÚcorrect_classÚiÚ	thresholdrÉ   Úcost_matrixÚ
labels_idxÚdetections_idxÚvalidÚmatchess                  rA   Úmatch_predictionszBaseValidator.match_predictions  s  € ô —(‘(˜L×.Ñ.¨qÑ1°4·9±9·?±?À1Ñ3EÐFÓG×NÑNÌtÓTˆà$¢Q¨ WÑ-°Ñ=ˆØ�MÑ!ˆØ�g‰g‹i�o‰oÓˆÜ% d§i¡i§m¡m£o×&<Ñ&<Ó&>Ó?ó 	A‰LˆAˆyÙÛà! S¨IÑ%5Ñ6�Ø—?‘?Õ$Ø16·±×1UÑ1UÐVaÐlpÐ1UÓ1qÑ.�J Ø'¨
°NÐ(BÑCÀaÑG�EØ—y‘y•{Ø<@˜ ¨uÑ 5°qÐ 8Ò9äŸ*™* S¨IÑ%5Ó6�ÜŸ(™( 7Ó+×-Ñ-�Ø—=‘= Ó#Ø—}‘} QÑ'¨!Ò+Ø")¨#¨g²a¸°d©m¸WÂQÈÀT¹]Ð.JÑ*K×*SÑ*SÓ*UÑVZÐXZÐVZÑ*[Ñ"\˜Ø")¬"¯)©)°GºA¸q¸D±MÐPTÔ*UÐVWÑ*XÑ"Y˜Ø")¬"¯)©)°GºA¸q¸D±MÐPTÔ*UÐVWÑ*XÑ"Y˜Ø<@�G˜G¢A q D™M×0Ñ0´Ó5°qÐ8Ó9ð%	Aô& �|‰|˜G¬5¯:©:¸l×>QÑ>QÔRÐRrC   c                ó@   — | j                   |   j                  |«       y)z1Append the given callback to the specified event.N)r   Úappend©r?   ÚeventÚcallbacks      rA   Úadd_callbackzBaseValidator.add_callbackE  s   € à�‰�uÑ×$Ñ$ XÕ.rC   c                óV   — | j                   j                  |g «      D ]
  } || «       Œ y)z4Run all callbacks associated with a specified event.N)r   rŒ   rä   s      rA   r”   zBaseValidator.run_callbacksI  s)   € àŸ™×*Ñ*¨5°"Ó5ò 	ˆHÙ�T�Nñ	rC   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      rA   r’   zBaseValidator.get_dataloaderN  s   € ä!Ð"^Ó_Ð_rC   c                ó   — t        d«      ‚)zBuild dataset from image path.z3build_dataset function not implemented in validatorrê   )r?   Úimg_paths     rA   Úbuild_datasetzBaseValidator.build_datasetR  s   € ä!Ð"WÓXÐXrC   c                ó   — |S )zPreprocess an input batch.© )r?   rR   s     rA   r   zBaseValidator.preprocessV  ó   € àˆrC   c                ó   — |S )zPostprocess the predictions.rò   )r?   r¸   s     rA   r    zBaseValidator.postprocessZ  ró   rC   c                 ó   — y)z2Initialize performance metrics for the YOLO model.Nrò   )r?   rL   s     rA   r–   zBaseValidator.init_metrics^  ó   € àrC   c                 ó   — y)z.Update metrics based on predictions and batch.Nrò   ©r?   r¸   rR   s      rA   r˜   zBaseValidator.update_metricsb  rö   rC   c                 ó   — y)z Finalize and return all metrics.Nrò   ©r?   s    rA   r    zBaseValidator.finalize_metricsf  rö   rC   c                ó   — i S )z0Return statistics about the model's performance.rò   rú   s    rA   rœ   zBaseValidator.get_statsj  s   € àˆ	rC   c                 ó   — y)zAGather statistics from all the GPUs during DDP training to GPU 0.Nrò   rú   s    rA   r›   zBaseValidator.gather_statsn  rö   rC   c                 ó   — y)z-Print the results of the model's predictions.Nrò   rú   s    rA   r¡   zBaseValidator.print_resultsr  rö   rC   c                 ó   — y)z"Get description of the YOLO model.Nrò   rú   s    rA   r•   zBaseValidator.get_descv  rö   rC   c                ó   — g S )z8Return the metric keys used in YOLO training/validation.rò   rú   s    rA   Úmetric_keyszBaseValidator.metric_keysz  s	   € ð ˆ	rC   c                óè   ‡— |r|j                  d«      ndŠ‰r-t        ˆfd„| j                  j                  «       D «       «      ry|t	        j                  «       dœ| j                  t        |«      <   y)z8Register plots for visualization, deduplicating by type.ru   Nc              3  ól   •K  — | ]+  }|j                  d «      xs i j                  d«      ‰k(  –— Œ- y­w)r+   ru   N)rŒ   )ri   r»   Ú	plot_types     €rA   rk   z(BaseValidator.on_plot.<locals>.<genexpr>‚  s/   øè ø€ ÒiÐPQ˜aŸe™e F›mÒ1¨r×6Ñ6°vÓ>À)ÕKÑiùs   ƒ14)r+   Ú	timestamp)rŒ   rÊ   r=   r­   Útimer   )r?   r°   r+   r  s      @rA   Úon_plotzBaseValidator.on_plot  sU   ø€ á(,�D—H‘H˜VÔ$°$ˆ	ÙœÓiÐUY×U_ÑU_×UfÑUfÓUhÔiÔiØØ*.¼T¿Y¹Y»[Ñ!Iˆ�
‰
”4˜“:ÒrC   c                 ó   — y)z(Plot validation samples during training.Nrò   )r?   rR   Únis      rA   r™   zBaseValidator.plot_val_samples†  rö   rC   c                 ó   — y)z,Plot YOLO model predictions on batch images.Nrò   )r?   rR   r¸   r  s       rA   rš   zBaseValidator.plot_predictionsŠ  rö   rC   c                 ó   — y)z#Convert predictions to JSON format.Nrò   rø   s      rA   Úpred_to_jsonzBaseValidator.pred_to_jsonŽ  rö   rC   c                 ó   — y)z9Evaluate and return JSON format of prediction statistics.Nrò   )r?   r1   s     rA   r³   zBaseValidator.eval_json’  rö   rC   )NNNN)r@   zdict | None)NN)F)
rÔ   útorch.TensorrÕ   r  rÖ   r  r×   rÆ   Úreturnr  )rå   r„   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rB   r   r½   rá   rç   r”   r’   rð   r   r    r–   r˜   r    rœ   r›   r¡   r•   Úpropertyr   r  r™   rš   r  r³   rò   rC   rA   r   r   5   sÕ   „ ñ0ôd"IñH ÓòMó ðMð` lqð'SØ(ð'SØ8Dð'SØKWð'SØdhð'Sà	ó'SóR/óò
`òYòòòòòòòòòð ñó ðóJòòòórC   r   ))r  Ú
__future__r   r±   r  Úpathlibr   rÇ   rÂ   r|   Útorch.distributedÚdistributedr¥   Úultralytics.cfgr   r   Úultralytics.data.utilsr   r   r	   Úultralytics.nn.autobackendr
   Úultralytics.utilsr   r   r   r   r   r   r   Úultralytics.utils.checksr   Úultralytics.utils.opsr   Úultralytics.utils.torch_utilsr   r   r   r   r   r   rò   rC   rA   ú<module>r     sR   ðñõ4 #ã Û Ý ã Û Ý  ç 1ß iÑ iÝ 2ß Y× YÑ YÝ 0Ý )÷õ ÷_ò _rC   