Ë
    Fêñi¸\  ã                  óÆ   — d dl mZ d dlZd dlm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mZ d dlmZ d dlmZmZmZmZ d dlmZ d d	lmZmZmZ d d
lmZ  G d„ de«      Z y)é    )ÚannotationsN)ÚPath)ÚAny)Úbuild_dataloaderÚbuild_yolo_datasetÚ	converter)ÚBaseValidator)ÚLOGGERÚRANKÚnmsÚops)Úcheck_requirements)ÚConfusionMatrixÚ
DetMetricsÚbox_iou)Úplot_imagesc                  ó
  ‡ — e Zd ZdZddˆ fd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	d d„Z
d!d	„Zd"d
„Zd"d„Zd"d„Zd#d„Zd"d„Zd$d„Zd%d&d„Zd'd„Zd(d„Z	 d)	 	 	 	 	 	 	 	 	 d*d„Zd+d„Zd,d„Zd-d„Zd.d„Z	 	 d/	 	 	 	 	 	 	 	 	 	 	 d0d„Zˆ xZS )1ÚDetectionValidatoray  A class extending the BaseValidator class for validation based on a detection model.

    This class implements validation functionality specific to object detection tasks, including metrics calculation,
    prediction processing, and visualization of results.

    Attributes:
        is_coco (bool): Whether the dataset is COCO.
        is_lvis (bool): Whether the dataset is LVIS.
        class_map (list[int]): Mapping from model class indices to dataset class indices.
        metrics (DetMetrics): Object detection metrics calculator.
        iouv (torch.Tensor): IoU thresholds for mAP calculation.
        niou (int): Number of IoU thresholds.
        lb (list[Any]): List for storing ground truth labels for hybrid saving.
        jdict (list[dict[str, Any]]): List for storing JSON detection results.
        stats (dict[str, list[torch.Tensor]]): Dictionary for storing statistics during validation.

    Examples:
        >>> from ultralytics.models.yolo.detect import DetectionValidator
        >>> args = dict(model="yolo26n.pt", data="coco8.yaml")
        >>> validator = DetectionValidator(args=args)
        >>> validator()
    c                ó
  •— t         ‰| �  ||||«       d| _        d| _        d| _        d| j
                  _        t        j                  ddd«      | _	        | j                  j                  «       | _        t        «       | _        y)a–  Initialize detection validator with necessary variables and settings.

        Args:
            dataloader (torch.utils.data.DataLoader, optional): DataLoader to use for validation.
            save_dir (Path, optional): Directory to save results.
            args (dict[str, Any], optional): Arguments for the validator.
            _callbacks (dict, optional): Dictionary of callback functions.
        FNÚdetectg      à?gffffffî?é
   )ÚsuperÚ__init__Úis_cocoÚis_lvisÚ	class_mapÚargsÚtaskÚtorchÚlinspaceÚiouvÚnumelÚniour   Úmetrics)ÚselfÚ
dataloaderÚsave_dirr   Ú
_callbacksÚ	__class__s        €úd/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/ultralytics/models/yolo/detect/val.pyr   zDetectionValidator.__init__-   sg   ø€ ô 	‰Ñ˜ X¨t°ZÔ@ØˆŒØˆŒØˆŒØ!ˆ�	‰	ŒÜ—N‘N 3¨¨bÓ1ˆŒ	Ø—I‘I—O‘OÓ%ˆŒ	Ü!“|ˆ�ó    c                ó^  — |j                  «       D ]W  \  }}t        |t        j                  «      sŒ!|j	                  | j
                  | j
                  j                  dk(  ¬«      ||<   ŒY | j                  j                  r|d   j                  «       n|d   j                  «       dz  |d<   |S )zØPreprocess batch of images for YOLO validation.

        Args:
            batch (dict[str, Any]): Batch containing images and annotations.

        Returns:
            (dict[str, Any]): Preprocessed batch.
        Úcuda)Únon_blockingÚimgéÿ   )
ÚitemsÚ
isinstancer   ÚTensorÚtoÚdeviceÚtyper   ÚhalfÚfloat)r%   ÚbatchÚkÚvs       r*   Ú
preprocesszDetectionValidator.preprocess?   s’   € ð —K‘K“Mò 	V‰DˆAˆqÜ˜!œUŸ\™\Õ*ØŸ4™4 §¡¸$¿+¹+×:JÑ:JÈfÑ:T˜4ÓU��a’ð	Vð 04¯y©y¯~ª~˜˜e™×)Ñ)Ô+À5ÈÁ<×CUÑCUÓCWÐ[^Ñ^ˆˆe‰Øˆr+   c                óž  — | j                   j                  | j                  j                  d«      }t	        |t
        «      xrL d|v xrF |j                  t        j                  › d�«      xs" |j                  t        j                  › d�«      | _	        t	        |t
        «      xr d|v xr | j                   | _
        | j                  rt        j                  «       n*t        t        dt        |j                   «      dz   «      «      | _        | j                  xj$                  | j                  j&                  xr) | j                  xs | j                  xr | j(                   z  c_        |j                   | _        t        |j                   «      | _        t-        |dd«      | _        d	| _        g | _        |j                   | j4                  _        | j4                  j7                  «        | j4                  j9                  «        t;        |j                   | j                  j<                  xr | j                  j>                  ¬
«      | _         y)zŒInitialize evaluation metrics for YOLO detection validation.

        Args:
            model (torch.nn.Module): Model to validate.
        Ú Úcocozval2017.txtztest-dev2017.txtÚlvisé   Úend2endFr   )ÚnamesÚsave_matchesN)!ÚdataÚgetr   Úsplitr2   ÚstrÚendswithÚosÚsepr   r   r   Úcoco80_to_coco91_classÚlistÚrangeÚlenrC   r   Ú	save_jsonÚvalÚtrainingÚncÚgetattrrB   ÚseenÚjdictr$   Úclear_statsÚclear_image_metricsr   ÚplotsÚ	visualizeÚconfusion_matrix)r%   ÚmodelrQ   s      r*   Úinit_metricszDetectionValidator.init_metricsN   s­  € ð �i‰i�m‰m˜DŸI™IŸO™O¨RÓ0ˆä�sœCÓ ò dØ˜#�òdà—‘¤§¡ ¨Ð4Ó5Òb¸¿¹ÌÏÉÈÐP`ÐFaÓ9bð 	Œô
 " #¤sÓ+ÒR°¸#°ÒRÀdÇlÁlÐBRˆŒØ?C¿|º|œ×9Ñ9Ô;ÔQUÔV[Ð\]Ô_bÐch×cnÑcnÓ_oÐrsÑ_sÓVtÓQuˆŒØ�	‰	×Ò˜tŸy™yŸ}™}Òe°$·,±,Ò2NÀ$Ç,Á,ÒeÐX\×XeÑXeÐTeÑeÕØ—[‘[ˆŒ
Ü�e—k‘kÓ"ˆŒÜ˜u i°Ó7ˆŒØˆŒ	ØˆŒ
Ø"Ÿ[™[ˆ�‰ÔØ�‰× Ñ Ô"Ø�‰×(Ñ(Ô*Ü /°e·k±kÐPT×PYÑPY×P_ÑP_ÒPwÐdh×dmÑdm×dwÑdwÔ xˆÕr+   c                ó   — ddz  S )zBReturn a formatted string summarizing class metrics of YOLO model.z%22s%11s%11s%11s%11s%11s%11s)ÚClassÚImagesÚ	InstanceszBox(PÚRÚmAP50z	mAP50-95)© ©r%   s    r*   Úget_desczDetectionValidator.get_descg   s   € à#Ð'kÑkÐkr+   c                ó  — t        j                  || j                  j                  | j                  j                  | j                  j
                  dk(  rdn| j                  d| j                  j                  xs | j                  j                  | j                  j                  | j                  | j                  j
                  dk(  ¬«	      }|D �cg c])  }|dd…dd…f   |dd…df   |dd…df   |dd…d	d…f   d
œ‘Œ+ c}S c c}w )aE  Apply Non-maximum suppression to prediction outputs.

        Args:
            preds (torch.Tensor): Raw predictions from the model.

        Returns:
            (list[dict[str, torch.Tensor]]): Processed predictions after NMS, where each dict contains 'bboxes', 'conf',
                'cls', and 'extra' tensors.
        r   r   TÚobb)rS   Úmulti_labelÚagnosticÚmax_detrB   ÚrotatedNé   é   é   )ÚbboxesÚconfÚclsÚextra)r   Únon_max_suppressionr   rq   Úiour   rS   Ú
single_clsÚagnostic_nmsrk   rB   )r%   ÚpredsÚoutputsÚxs       r*   ÚpostprocesszDetectionValidator.postprocessk   sÔ   € ô ×)Ñ)ØØ�I‰I�N‰NØ�I‰I�M‰MØ—I‘I—N‘N hÒ.‰q°D·G±GØØ—Y‘Y×)Ñ)ÒC¨T¯Y©Y×-CÑ-CØ—I‘I×%Ñ%Ø—L‘LØ—I‘I—N‘N eÑ+ô

ˆð cjÖjÐ]^˜1šQ   ˜U™8¨Qªq°!¨t©W¸QºqÀ!¸t¹WÈqÒQRÐTUÑTVÐQVÉxÓXÒjÐjùÒjs   Ã.Dc                óH  — |d   |k(  }|d   |   j                  d«      }|d   |   }|d   |   }|d   j                  dd }|d	   |   }|j                  d
   r<t        j                  |«      t	        j
                  || j                  ¬«      g d¢   z  }||||||d   |   dœS )a3  Prepare a batch of images and annotations for validation.

        Args:
            si (int): Sample index within the batch.
            batch (dict[str, Any]): Batch data containing images and annotations.

        Returns:
            (dict[str, Any]): Prepared batch with processed annotations.
        Ú	batch_idxrr   éÿÿÿÿrp   Ú	ori_shaper/   é   NÚ	ratio_padr   )r5   )rA   r   rA   r   Úim_file)rr   rp   r   Úimgszr�   r‚   )ÚsqueezeÚshaper   Ú	xywh2xyxyr   Útensorr5   )	r%   Úsir9   Úidxrr   Úbboxr   rƒ   r�   s	            r*   Ú_prepare_batchz!DetectionValidator._prepare_batch‚   sÇ   € ð �KÑ  BÑ&ˆØ�E‰l˜3Ñ×'Ñ'¨Ó+ˆØ�X‰˜sÑ#ˆØ˜+Ñ& rÑ*ˆ	Ø�e‘×"Ñ" 1 2Ð&ˆØ˜+Ñ& rÑ*ˆ	Ø�9‰9�QŠ<Ü—=‘= Ó&¬¯©°eÀDÇKÁKÔ)PÒQ]Ñ)^Ñ^ˆDàØØ"ØØ"Ø˜YÑ'¨Ñ+ñ
ð 	
r+   c                óL   — | j                   j                  r|dxx   dz  cc<   |S )a  Prepare predictions for evaluation against ground truth.

        Args:
            pred (dict[str, torch.Tensor]): Post-processed predictions from the model.

        Returns:
            (dict[str, torch.Tensor]): Prepared predictions in native space.
        rr   r   )r   rv   )r%   Úpreds     r*   Ú_prepare_predz DetectionValidator._prepare_pred�   s$   € ð �9‰9×ÒØ�‹K˜1Ñ‹KØˆr+   c                óf  — t        |«      D �]¢  \  }}| xj                  dz  c_        | j                  ||«      }| j                  |«      }|d   j	                  «       j                  «       }|d   j                  d   dk(  }| j                  j                  i | j                  ||«      ¥|t        j                  |«      |rt        j                  d«      n |d   j	                  «       j                  «       |rt        j                  d«      n |d   j	                  «       j                  «       t        |d   «      j                  dœ¥«       | j                  j                   rx| j"                  j%                  ||| j                  j&                  ¬«       | j                  j(                  r0| j"                  j+                  |d   |   |d   | j,                  «       |r�ŒÑ| j                  j.                  s| j                  j0                  r| j3                  ||«      }	| j                  j.                  r| j5                  	|«       | j                  j0                  s�ŒO| j7                  	| j                  j8                  |d	   | j,                  d
z  t        |d   «      j:                  › d�z  «       �Œ¥ y)zìUpdate metrics with new predictions and ground truth.

        Args:
            preds (list[dict[str, torch.Tensor]]): List of predictions from the model.
            batch (dict[str, Any]): Batch data containing ground truth.
        rA   rr   r   rq   r‚   )Ú
target_clsÚ
target_imgrq   Úpred_clsÚim_name)rq   r/   r   Úlabelsz.txtN)Ú	enumeraterU   r‹   rŽ   ÚcpuÚnumpyr…   r$   Úupdate_statsÚ_process_batchÚnpÚuniqueÚzerosr   Únamer   rY   r[   Úprocess_batchrq   rZ   Úplot_matchesr'   rP   Úsave_txtÚscale_predsÚpred_to_jsonÚsave_one_txtÚ	save_confÚstem)
r%   rx   r9   rˆ   r�   ÚpbatchÚprednrr   Úno_predÚpredn_scaleds
             r*   Úupdate_metricsz!DetectionValidator.update_metricsª   s3  € ô " %Ó(ó %	‰HˆB�Ø�IŠI˜‰N�IØ×(Ñ(¨¨UÓ3ˆFØ×&Ñ& tÓ,ˆEà˜‘-×#Ñ#Ó%×+Ñ+Ó-ˆCØ˜E‘l×(Ñ(¨Ñ+¨qÑ0ˆGØ�L‰L×%Ñ%ðØ×)Ñ)¨%°Ó8ðà"%Ü"$§)¡)¨C£.Ù+2œBŸH™H QœK¸¸f¹×8IÑ8IÓ8K×8QÑ8QÓ8SÙ/6¤§¡¨¤¸EÀ%¹L×<LÑ<LÓ<N×<TÑ<TÓ<VÜ# F¨9Ñ$5Ó6×;Ñ;òô	ð �y‰y�ŠØ×%Ñ%×3Ñ3°E¸6ÈÏ	É	ÏÉÐ3ÔWØ—9‘9×&Ò&Ø×)Ñ)×6Ñ6°u¸U±|ÀBÑ7GÈÐPYÑIZÐ\`×\iÑ\iÔjáÙð �y‰y×"Ò" d§i¡i×&8Ò&8Ø#×/Ñ/°°vÓ>�Ø�y‰y×"Ò"Ø×!Ñ! ,°Ô7Ø�y‰y×!Ô!Ø×!Ñ!Ø Ø—I‘I×'Ñ'Ø˜;Ñ'Ø—M‘M HÑ,´$°v¸iÑ7HÓ2I×2NÑ2NÐ1OÈtÐ/TÑTö	ñA%	r+   c                óD  — | j                   j                  r9dD ]4  }| j                  j                  | j                  || j
                  ¬«       Œ6 | j                  | j                  _        | j                  | j                  _        | j                  | j                  _        y)z8Set final values for metrics speed and confusion matrix.)TF)r'   Ú	normalizeÚon_plotN)r   rY   r[   Úplotr'   r­   Úspeedr$   )r%   r¬   s     r*   Úfinalize_metricsz#DetectionValidator.finalize_metricsØ   sv   € à�9‰9�?Š?Ø(ò n�	Ø×%Ñ%×*Ñ*°D·M±MÈYÐ`d×`lÑ`lÐ*Õmðnà!ŸZ™Zˆ�‰ÔØ(,×(=Ñ(=ˆ�‰Ô%Ø $§¡ˆ�‰Õr+   c                ón  — t         dk(  rpdgt        j                  «       z  }t        j                  |j                  |d¬«       |j                  «        |D ]   }|sŒ|j                  j                  |«       Œ" yt         dkD  r3t        j                  |j                  dd¬«       |j                  «        yy)zBGather per-image metrics from all GPUs for a single metric object.r   N©Údst)r   ÚdistÚget_world_sizeÚgather_objectÚimage_metricsrX   Úupdate)r%   ÚmetricÚgathered_image_metricsr·   s       r*   Ú_gather_image_metricsz(DetectionValidator._gather_image_metricsá   s�   € ä�1Š9Ø&* V¬d×.AÑ.AÓ.CÑ%CÐ"Ü×Ñ˜v×3Ñ3Ð5KÐQRÕSØ×&Ñ&Ô(Ø!7ò ?�Ú Ø×(Ñ(×/Ñ/°Õ>ñ?ô �AŠXÜ×Ñ˜v×3Ñ3°T¸qÕAØ×&Ñ&Õ(ð r+   c                ó  — t         dk(  �rYdgt        j                  «       z  }t        j                  | j                  j
                  |d¬«       | j                  j
                  j                  «       D �ci c]  }|g “Œ }}|D ]   }|D ]  }||   j                  ||   «       Œ Œ" dgt        j                  «       z  }t        j                  | j                  |d¬«       g | _        |D ]  }| j                  j                  |«       Œ || j                  _        | j                  | j                  j                  «       t        | j                  j                  «      | _        yt         dkD  r•t        j                  | j                  j
                  dd¬«       t        j                  | j                  dd¬«       | j                  | j                  j                  «       g | _        | j                  j                  «        yyc c}w )zGather stats from all GPUs.r   Nr²   )r   r´   rµ   r¶   r$   ÚstatsÚkeysÚextendrV   r»   ÚboxrO   r&   ÚdatasetrU   rW   )r%   Úgathered_statsÚkeyÚmerged_statsÚ
stats_dictÚgathered_jdictrV   s          r*   Úgather_statszDetectionValidator.gather_statsî   s›  € ä�1‹9Ø"˜V¤d×&9Ñ&9Ó&;Ñ;ˆNÜ×Ñ˜tŸ|™|×1Ñ1°>ÀqÕIØ/3¯|©|×/AÑ/A×/FÑ/FÓ/HÖI¨˜C ™GÐIˆLÐIØ,ò >�
Ø'ò >�CØ  Ñ%×,Ñ,¨Z¸©_Õ=ñ>ð>ð #˜V¤d×&9Ñ&9Ó&;Ñ;ˆNÜ×Ñ˜tŸz™z¨>¸qÕAØˆDŒJØ'ò )�Ø—
‘
×!Ñ! %Õ(ð)à!-ˆD�L‰LÔØ×&Ñ& t§|¡|×'7Ñ'7Ô8Ü˜DŸO™O×3Ñ3Ó4ˆD�IÜ�AŠXÜ×Ñ˜tŸ|™|×1Ñ1°4¸QÕ?Ü×Ñ˜tŸz™z¨4°QÕ7Ø×&Ñ& t§|¡|×'7Ñ'7Ô8ØˆDŒJØ�L‰L×$Ñ$Õ&ð ùò Js   Á5
Hc                óî   — | j                   j                  | j                  | j                  j                  | j
                  ¬«       | j                   j                  «        | j                   j                  S )zˆCalculate and return metrics statistics.

        Returns:
            (dict[str, Any]): Dictionary containing metrics results.
        )r'   r®   r­   )r$   Úprocessr'   r   rY   r­   rW   Úresults_dictre   s    r*   Ú	get_statszDetectionValidator.get_stats  sP   € ð 	�‰×Ñ d§m¡m¸$¿)¹)¿/¹/ÐSW×S_ÑS_ÐÔ`Ø�‰× Ñ Ô"Ø�|‰|×(Ñ(Ð(r+   c                ó”  — ddt        | j                  j                  «      z  z   }t        j                  |d| j
                  | j                  j                  j                  «       g| j                  j                  «       ¢­z  «       | j                  j                  j                  «       dk(  r-t        j                  d| j                  j                  › d�«       | j                  j                  r×| j                  sÊ| j                  dkD  rºt        | j                  j                  «      ršt!        | j                  j"                  «      D ]w  \  }}t        j                  || j$                  |   | j                  j&                  |   | j                  j                  |   g| j                  j)                  |«      ¢­z  «       Œy yyyyy)	z0Print training/validation set metrics per class.z%22s%11i%11iz%11.3gÚallr   zno labels found in z+ set, cannot compute metrics without labelsrA   N)rO   r$   r¾   r
   ÚinforU   Únt_per_classÚsumÚmean_resultsÚwarningr   r   ÚverboserR   rS   r½   r•   Úap_class_indexrC   Únt_per_imageÚclass_result)r%   ÚpfÚiÚcs       r*   Úprint_resultsz DetectionValidator.print_results  s]  € à  8¬c°$·,±,×2CÑ2CÓ.DÑ#DÑDˆÜ�‰�B˜% §¡¨D¯L©L×,EÑ,E×,IÑ,IÓ,KÐjÈdÏlÉl×NgÑNgÓNiÑjÑjÔkØ�<‰<×$Ñ$×(Ñ(Ó*¨aÒ/Ü�N‰NÐ0°·±·±Ð0@Ð@kÐlÔmð �9‰9×Ò T§]¢]°t·w±wÀ²{ÄsÈ4Ï<É<×K]ÑK]ÔG^Ü! $§,¡,×"=Ñ"=Ó>ò 	‘��1Ü—‘ØàŸ
™
 1™ØŸ™×1Ñ1°!Ñ4ØŸ™×1Ñ1°!Ñ4ðð Ÿ™×2Ñ2°1Ó5ñ	ñõñ	ð H_°{ ]Ðr+   c                óZ  — |d   j                   d   dk(  s|d   j                   d   dk(  r9dt        j                  |d   j                   d   | j                  ft        ¬«      iS t        |d   |d   «      }d| j                  |d   |d   |«      j                  «       j                  «       iS )aÃ  Return correct prediction matrix.

        Args:
            preds (dict[str, torch.Tensor]): Dictionary containing prediction data with 'bboxes' and 'cls' keys.
            batch (dict[str, Any]): Batch dictionary containing ground truth data with 'bboxes' and 'cls' keys.

        Returns:
            (dict[str, np.ndarray]): Dictionary containing 'tp' key with correct prediction matrix of shape (N, 10) for
                10 IoU levels.
        rr   r   Útp©Údtyperp   )	r…   rš   rœ   r#   Úboolr   Úmatch_predictionsr–   r—   )r%   rx   r9   ru   s       r*   r™   z!DetectionValidator._process_batch$  s§   € ð �‰<×Ñ˜aÑ  AÒ%¨¨u©×);Ñ);¸AÑ)>À!Ò)CØœ"Ÿ(™( E¨%¡L×$6Ñ$6°qÑ$9¸4¿9¹9Ð#EÌTÔRÐSÐSÜ�e˜H‘o u¨X¡Ó7ˆØ�d×,Ñ,¨U°5©\¸5À¹<ÈÓM×QÑQÓS×YÑYÓ[Ð\Ð\r+   c                ó`   — t        | j                  ||| j                  || j                  ¬«      S )ac  Build YOLO Dataset.

        Args:
            img_path (str): Path to the folder containing images.
            mode (str): `train` mode or `val` mode, users are able to customize different augmentations for each mode.
            batch (int, optional): Size of batches, this is for `rect`.

        Returns:
            (Dataset): YOLO dataset.
        )ÚmodeÚstride)r   r   rE   rã   )r%   Úimg_pathrâ   r9   s       r*   Úbuild_datasetz DetectionValidator.build_dataset4  s(   € ô " $§)¡)¨X°u¸d¿i¹iÈdÐ[_×[fÑ[fÔgÐgr+   c           	     ó²   — | j                  ||d¬«      }t        ||| j                  j                  dd| j                  j                  | j
                  ¬«      S )z÷Construct and return dataloader.

        Args:
            dataset_path (str): Path to the dataset.
            batch_size (int): Size of each batch.

        Returns:
            (torch.utils.data.DataLoader): DataLoader for validation.
        rQ   )r9   râ   Fr~   )ÚshuffleÚrankÚ	drop_lastÚ
pin_memory)rå   r   r   ÚworkersÚcompilerR   )r%   Údataset_pathÚ
batch_sizerÁ   s       r*   Úget_dataloaderz!DetectionValidator.get_dataloaderA  sU   € ð ×$Ñ$ \¸È%Ð$ÓPˆÜØØØ�I‰I×ÑØØØ—i‘i×'Ñ'Ø—}‘}ô
ð 	
r+   c                ót   — t        ||d   | j                  d|› d�z  | j                  | j                  ¬«       y)z¦Plot validation image samples.

        Args:
            batch (dict[str, Any]): Batch containing images and annotations.
            ni (int): Batch index.
        r‚   Ú	val_batchz_labels.jpg)r”   ÚpathsÚfnamerC   r­   N)r   r'   rC   r­   )r%   r9   Únis      r*   Úplot_val_samplesz#DetectionValidator.plot_val_samplesV  s:   € ô 	ØØ˜	Ñ"Ø—-‘- I¨b¨T°Ð"=Ñ=Ø—*‘*Ø—L‘Lö	
r+   c                ó   — |syt        |«      D ]#  \  }}t        j                  |d   «      |z  |d<   Œ% |d   j                  «       }|xs | j                  j
                  }|D ��	ci c].  }|t        j                  |D �	cg c]
  }	|	|   d| ‘Œ c}	d¬«      “Œ0 }
}}	t        j                  |
d   «      |
d<   t        |d   |
|d   | j                  d	|› d
�z  | j                  | j                  ¬«       yc c}	w c c}	}w )ai  Plot predicted bounding boxes on input images and save the result.

        Args:
            batch (dict[str, Any]): Batch containing images and annotations.
            preds (list[dict[str, torch.Tensor]]): List of predictions from the model.
            ni (int): Batch index.
            max_det (int | None): Maximum number of detections to plot.
        Nrq   r}   r   ©Údimrp   r/   r‚   rñ   z	_pred.jpg)Úimagesr”   rò   ró   rC   r­   )r•   r   Ú	ones_liker¾   r   rk   Úcatr   Ú	xyxy2xywhr   r'   rC   r­   )r%   r9   rx   rô   rk   rØ   r�   r¾   r:   rz   Úbatched_predss              r*   Úplot_predictionsz#DetectionValidator.plot_predictionse  sú   € ñ ØÜ  Ó'ò 	B‰GˆAˆtÜ %§¡°°V±Ó =ÀÑ AˆD�Òð	Bà�Q‰x�}‰}‹ˆØÒ.˜TŸY™Y×.Ñ.ˆØW[×\ÐRS˜œEŸI™I¸uÖ&E¸! q¨¡t¨H¨W¢~Ò&EÈ1ÔMÑMÐ\ˆÑ\Ü"%§-¡-°¸hÑ0GÓ"Hˆ�hÑÜØ˜‘<Ø Ø˜	Ñ"Ø—-‘- I¨b¨T°Ð";Ñ;Ø—*‘*Ø—L‘Lö	
ùò 'FùÓ\s   Á'C:Â C5ÂC:Ã5C:c                ó2  — ddl m}  |t        j                  |d   |d   ft        j                  ¬«      d| j
                  t        j                  |d   |d   j                  d«      |d	   j                  d«      gd¬
«      ¬«      j                  ||¬«       y)a®  Save YOLO detections to a txt file in normalized coordinates in a specific format.

        Args:
            predn (dict[str, torch.Tensor]): Dictionary containing predictions with keys 'bboxes', 'conf', and 'cls'.
            save_conf (bool): Whether to save confidence scores.
            shape (tuple[int, int]): Shape of the original image (height, width).
            file (Path): File path to save the detections.
        r   )ÚResultsrA   rÝ   Nrp   rq   r~   rr   r÷   )ÚpathrC   Úboxes)r¤   )
Úultralytics.engine.resultsr   rš   rœ   Úuint8rC   r   rû   Ú	unsqueezer    )r%   r§   r¤   r…   Úfiler   s         r*   r£   zDetectionValidator.save_one_txt�  s‚   € õ 	7áÜ�H‰H�e˜A‘h  a¡Ð)´·±Ô:ØØ—*‘*Ü—)‘)˜U 8™_¨e°F©m×.EÑ.EÀbÓ.IÈ5ÐQVÉ<×KaÑKaÐbdÓKeÐfÐlmÔnô		
÷
 ‰(�4 9ˆ(Õ
-r+   c                ó<  — t        |d   «      }|j                  }|j                  «       rt        |«      n|}t	        j
                  |d   «      }|dd…dd…fxx   |dd…dd…f   dz  z  cc<   t        |j                  «       |d   j                  «       |d   j                  «       «      D ]i  \  }}}	| j                  j                  ||j                  | j                  t        |	«         |D �
cg c]  }
t        |
d«      ‘Œ c}
t        |d«      d	œ«       Œk yc c}
w )
a¡  Serialize YOLO predictions to COCO json format.

        Args:
            predn (dict[str, torch.Tensor]): Predictions dictionary containing 'bboxes', 'conf', and 'cls' keys with
                bounding box coordinates, confidence scores, and class predictions.
            pbatch (dict[str, Any]): Batch dictionary containing 'imgsz', 'ori_shape', 'ratio_pad', and 'im_file'.

        Examples:
             >>> result = {
             ...     "image_id": 42,
             ...     "file_name": "42.jpg",
             ...     "category_id": 18,
             ...     "bbox": [258.15, 41.29, 348.26, 243.78],
             ...     "score": 0.236,
             ... }
        r‚   rp   Nr€   rq   rr   é   rn   )Úimage_idÚ	file_nameÚcategory_idrŠ   Úscore)r   r¥   Ú	isnumericÚintr   rü   ÚzipÚtolistrV   Úappendr�   r   Úround)r%   r§   r¦   r  r¥   r	  rÀ   ÚbÚsrÙ   rz   s              r*   r¢   zDetectionValidator.pred_to_json“  s÷   € ô" �F˜9Ñ%Ó&ˆØ�y‰yˆØ $§¡Ô 0”3�t”9°dˆÜ�m‰m˜E (™OÓ,ˆØŠAˆr�ˆrˆE‹
�cš!˜Q™R˜%‘j 1‘nÑ$‹
Ü˜3Ÿ:™:›<¨¨v©×)=Ñ)=Ó)?ÀÀuÁ×ATÑATÓAVÓWò 		‰GˆAˆq�!Ø�J‰J×Ñà (Ø!%§¡Ø#'§>¡>´#°a³&Ñ#9Ø23Ö4¨QœU 1 a�[Ò4Ü" 1 a›[ñõñ		ùò 5s   Ã/Dc           	     ót   — i |¥dt        j                  |d   |d   j                  «       |d   |d   ¬«      i¥S )z.Scales predictions to the original image size.rp   rƒ   r   r�   )r�   )r   Úscale_boxesÚclone)r%   r§   r¦   s      r*   r¡   zDetectionValidator.scale_preds´  sN   € ð
Øð
à”c—o‘oØ�w‘Ø�h‘×%Ñ%Ó'Ø�{Ñ#Ø  Ñ-ô	ñ
ð 	
r+   c                ó¼   — | j                   dz  }| j                  d   dz  | j                  rdnd| j                  j                  › d�z  }| j                  |||«      S )a  Evaluate YOLO output in JSON format and return performance statistics.

        Args:
            stats (dict[str, Any]): Current statistics dictionary.

        Returns:
            (dict[str, Any]): Updated statistics dictionary with COCO/LVIS evaluation results.
        zpredictions.jsonr  r   zinstances_val2017.jsonÚlvis_v1_z.json)r'   rE   r   r   rG   Úcoco_evaluate)r%   r½   Ú	pred_jsonÚ	anno_jsons       r*   Ú	eval_jsonzDetectionValidator.eval_jsonÀ  sh   € ð —M‘MÐ$6Ñ6ˆ	à�I‰I�fÑØñà+/¯<ª<Ñ'¸xÈÏ	É	ÏÉÐGXÐX]Ð=^ñ`ð 	ð
 ×!Ñ! %¨°IÓ>Ð>r+   c           	     óÈ  — | j                   j                  �r–| j                  s| j                  �r}t	        | j
                  «      �rgt        j                  d|› d|› d�«       	 ||fD ]  }|j                  «       rŒJ |› d�«       ‚ t        |t        «      r|gn|}t        |t        «      r|gn|}t        d«       ddlm}m}  ||«      }	|	j                  |«      }
t!        |«      D �]¬  \  }} ||	|
|| j                  t        j                  ¬«      }| j"                  j$                  j&                  D �cg c]   }t)        t+        |«      j,                  «      ‘Œ" c}|j.                  _        |j3                  «        |j5                  «        |j7                  «        |j8                  d	   |d
||   d   › d�<   |j8                  d   |d||   d   › d�<   |j8                  d   |d<   |j8                  d   |d<   |j8                  d   |d<   d|j8                  d   z  d|j8                  d	   z  z   |d<   | j                  s�ŒY|j8                  d   |d||   d   › d�<   |j8                  d   |d||   d   › d�<   |j8                  d   |d||   d   › d�<   �Œ¯ | j                  r|d   |d<   |S |S c c}w # t:        $ r#}t        j<                  d|› �«       Y d}~|S d}~ww xY w) am  Evaluate COCO/LVIS metrics using faster-coco-eval library.

        Performs evaluation using the faster-coco-eval library to compute mAP metrics for object detection. Updates the
        provided stats dictionary with computed metrics including mAP50, mAP50-95, and LVIS-specific metrics if
        applicable.

        Args:
            stats (dict[str, Any]): Dictionary to store computed metrics and statistics.
            pred_json (str | Path): Path to JSON file containing predictions in COCO format.
            anno_json (str | Path): Path to JSON file containing ground truth annotations in COCO format.
            iou_types (str | list[str]): IoU type(s) for evaluation. Can be single string or list of strings. Common
                values include "bbox", "segm", "keypoints". Defaults to "bbox".
            suffix (str | list[str]): Suffix to append to metric names in stats dictionary. Should correspond to
                iou_types if multiple types provided. Defaults to "Box".

        Returns:
            (dict[str, Any]): Updated stats dictionary containing the computed COCO/LVIS evaluation metrics.
        z'
Evaluating faster-coco-eval mAP using z and z...z file not foundzfaster-coco-eval>=1.6.7r   )ÚCOCOÚCOCOeval_faster)ÚiouTypeÚ
lvis_styleÚprint_functionÚAP_50zmetrics/mAP50(ú)ÚAP_allzmetrics/mAP50-95(ÚAP_smallzmetrics/mAP_small(B)Ú	AP_mediumzmetrics/mAP_medium(B)ÚAP_largezmetrics/mAP_large(B)gÍÌÌÌÌÌì?gš™™™™™¹?ÚfitnessÚAPrzmetrics/APr(ÚAPczmetrics/APc(ÚAPfzmetrics/APf(zmetrics/mAP50-95(B)z faster-coco-eval unable to run: N)r   rP   r   r   rO   rV   r
   rÎ   Úis_filer2   rH   r   Úfaster_coco_evalr  r   ÚloadResr•   r&   rÁ   Úim_filesr  r   r¥   ÚparamsÚimgIdsÚevaluateÚ
accumulateÚ	summarizeÚstats_as_dictÚ	ExceptionrÒ   )r%   r½   r  r  Ú	iou_typesÚsuffixrz   r  r   Úannor�   rØ   Úiou_typerQ   Úes                  r*   r  z DetectionValidator.coco_evaluateÑ  sê  € ð4 �9‰9×Ó D§L¢L°D·L³LÄcÈ$Ï*É*ÅoÜ�K‰KÐBÀ9À+ÈUÐS\ÐR]Ð]`ÐaÔbð%GØ" IÐ-ò >�AØŸ9™9�;Ð=¨1¨#¨_Ð(=Ó=˜;ð>ä+5°iÄÔ+E˜Y™KÈ9�	Ü%/°¼Ô%<˜&™À&�Ü"Ð#<Ô=ßBá˜I“�Ø—|‘| IÓ.�Ü#,¨YÓ#7ó Y‘K�A�xÙ)Ø˜d¨HÀÇÁÔ^d×^iÑ^iô�Cð EIÇOÁO×D[ÑD[×DdÑDdÖ(e¸q¬¬T°!«W¯\©\Õ):Ò(e�C—J‘JÔ%Ø—L‘L”NØ—N‘NÔ$Ø—M‘M”Oð ?B×>OÑ>OÐPWÑ>X�E˜N¨6°!©9°Q©<¨.¸Ð:Ñ;ØAD×ARÑARÐS[ÑA\�EÐ-¨f°Q©i¸©l¨^¸1Ð=Ñ>à47×4EÑ4EÀjÑ4Q�EÐ0Ñ1Ø58×5FÑ5FÀ{Ñ5S�EÐ1Ñ2Ø47×4EÑ4EÀjÑ4Q�EÐ0Ñ1à'*¨S×->Ñ->¸xÑ-HÑ'HÈ3ÐQT×QbÑQbÐcjÑQkÑKkÑ'k�E˜)Ñ$à—|”|Ø@C×@QÑ@QÐRWÑ@X˜ ¨V°A©Y°q©\¨N¸!Ð<Ñ=Ø@C×@QÑ@QÐRWÑ@X˜ ¨V°A©Y°q©\¨N¸!Ð<Ñ=Ø@C×@QÑ@QÐRWÑ@X˜ ¨V°A©Y°q©\¨N¸!Ð<Ó=ð-Yð0 —<’<Ø',Ð-BÑ'C�E˜)Ñ$ð ˆˆuˆùò1 )føô, ò GÜ—‘Ð!AÀ!ÀÐE×FÐFØˆûðGús9   Á$J5 Á<B:J5 Ä6%J0ÅC$J5 ÉA+J5 Ê0J5 Ê5	K!Ê>KËK!)NNNN)r(   zdict | NoneÚreturnÚNone)r9   údict[str, Any]r>  r@  )r\   ztorch.nn.Moduler>  r?  )r>  rH   )rx   ztorch.Tensorr>  úlist[dict[str, torch.Tensor]])rˆ   r  r9   r@  r>  r@  )r�   údict[str, torch.Tensor]r>  rB  )rx   rA  r9   r@  r>  r?  )r>  r?  )r>  r@  )rx   rB  r9   r@  r>  zdict[str, np.ndarray])rQ   N)rä   rH   râ   rH   r9   ú
int | Noner>  ztorch.utils.data.Dataset)rí   rH   rî   r  r>  ztorch.utils.data.DataLoader)r9   r@  rô   r  r>  r?  )N)
r9   r@  rx   rA  rô   r  rk   rC  r>  r?  )
r§   rB  r¤   rß   r…   ztuple[int, int]r  r   r>  r?  )r§   rB  r¦   r@  r>  r?  )r§   rB  r¦   r@  r>  rB  )r½   r@  r>  r@  )rŠ   ÚBox)r½   r@  r  rH   r  rH   r9  ústr | list[str]r:  rE  r>  r@  )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r<   r]   rf   r{   r‹   rŽ   rª   r°   r»   rÇ   rË   rÚ   r™   rå   rï   rõ   rþ   r£   r¢   r¡   r  r  Ú__classcell__)r)   s   @r*   r   r      sú   ø„ ñö.$ó$óyó2lókó.
ó6ó,ó\.ó)ó'ó0)óó(]ô hó
ó*
ð  koð
Ø#ð
Ø,Ið
ØORð
Ø]gð
à	ó
ó8.ó$óB

ó?ð, &,Ø"'ðBàðBð ðBð ð	Bð
 #ðBð  ðBð 
÷Br+   r   )!Ú
__future__r   rJ   Úpathlibr   Útypingr   r—   rš   r   Útorch.distributedÚdistributedr´   Úultralytics.datar   r   r   Úultralytics.engine.validatorr	   Úultralytics.utilsr
   r   r   r   Úultralytics.utils.checksr   Úultralytics.utils.metricsr   r   r   Úultralytics.utils.plottingr   r   rd   r+   r*   ú<module>rV     sE   ðõ #ã 	Ý Ý ã Û Ý  ç LÑ LÝ 6ß 4Ó 4Ý 7ß JÑ JÝ 2ô~˜õ ~r+   