
    j                        d dl mZ d dlmZ d dlmZ d dlZd dlZd dl	Z	d dl
mZ d dlmc mZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZmZ d dlm Z   G d de          Z!dS )    )annotations)Path)AnyN)Image)SemanticDataset)add_polygon_background)DetectionValidator)LOGGERRANK)ConfusionMatrixSemanticMetrics)plot_imagesc                  v     e Zd ZdZd fd	Zd Z fdZd Zd Zd Z	ddZ
d Zd Zd fdZ fdZd Z xZS )SemanticSegmentationValidatora  Validator for semantic segmentation models.

    This validator evaluates semantic segmentation models using mIoU and pixel accuracy metrics.

    Attributes:
        metrics (SemanticMetrics): Metrics calculator for semantic segmentation.

    Examples:
        >>> from ultralytics.models.yolo.semantic import SemanticSegmentationValidator
        >>> args = dict(model="yolo26n-sem.pt", data="cityscapes8.yaml")
        >>> validator = SemanticSegmentationValidator(args=args)
        >>> validator()
    Nc                    t                                          ||||           d| j        _        d| _        d| _        t                      | _        i | _        d| _	        dS )aJ  Initialize SemanticSegmentationValidator.

        Args:
            dataloader (DataLoader, optional): DataLoader for validation.
            save_dir (Path, optional): Directory to save results.
            args (dict, optional): Arguments for the validator.
            _callbacks (dict, optional): Callback functions.
        semanticN)
super__init__argstaskdatasetresults_dirr   metricsimage_shapes_semantic_target_shape)self
dataloadersave_dirr   
_callbacks	__class__s        g/var/www/html/Carbon-Document/venv/lib/python3.11/site-packages/ultralytics/models/yolo/semantic/val.pyr   z&SemanticSegmentationValidator.__init__&   s^     	XtZ@@@#	&((&*###    c                p   |j         | _         t          | j                   | _        t          | j                   | _        d| _        t          | j        dd          | _        | j        t          | j        dg           ng }d |D             | _	        d| _
        | j        j        r+| j        dz  | _
        | j
                            dd	           | j        j        }|d
k    rOt          | j                   dk    r7dt!          t#          | j                                                             d}nnt'          | j                                                   d t)          t          | j                   |          D             z   fdt)          |          D             }t+          |d          | _        dS )ztInitialize metrics with model class names.

        Args:
            model (nn.Module): Model to validate.
        )namesr   r   Nlabelsc                V    i | ]&}d |v d|v 
|d          t          |d                   'S )im_fileshape)tuple).0lbs     r!   
<dictcomp>z>SemanticSegmentationValidator.init_metrics.<locals>.<dictcomp>C   sB    uuu2S\`bSbSbgnrtgtgtR	]E"W+,>,>gtgtgtr"   resultsT)parentsexist_ok      
background)r   r1   c                ,    g | ]}t          |          S  )str)r*   is     r!   
<listcomp>z>SemanticSegmentationValidator.init_metrics.<locals>.<listcomp>L   s    /^/^/^1A/^/^/^r"   c                "    i | ]}||         S r4   r4   )r*   r6   bases     r!   r,   z>SemanticSegmentationValidator.init_metrics.<locals>.<dictcomp>M   s    999q47999r"   r   )r$   r   )r$   lenncr   r   seengetattrr   r   r   r   r   	save_jsonr   mkdircm_ncnextitervalueslistranger   confusion_matrix)r   modelr%   r@   cm_namesr9   s        @r!   init_metricsz*SemanticSegmentationValidator.init_metrics7   s    [
dj//&TZ888	t	4@@8<8Px444VXuuuuu9 	@#}y8D""4$"???"A::#dj//Q..'Ddj6G6G6I6I1J1J,K,KLLHH
))++,,/^/^c$*ooW\@]@]/^/^/^^D9999E%LL999H /hZ P P Pr"   c                    t                                          |          }|d                             | j        t          j                  |d<   t          |d         j        dd                   | _        |S )zPreprocess a batch of images and masks.

        Args:
            batch (dict): Batch data containing images and masks.

        Returns:
            (dict): Preprocessed batch.
        semantic_mask)dtypeN)	r   
preprocesstodevicetorchint32r)   r(   r   )r   batchr    s     r!   rN   z(SemanticSegmentationValidator.preprocessP   sh     ""5))!&!7!:!:4;ek!:!Z!Zo&+E/,B,H,M&N&N#r"   c                   t          |t          t          f          r|d         }|j        dd         }|d         | j        d         k    s|d         | j        d         k    rt          j        || j        dd          }| j        dk    r3|                    d          	                    t          j                  nD|                    d                              d          	                    t          j                  S )	zConvert logits to class predictions.

        Args:
            preds (torch.Tensor): Raw model output logits [B, nc, H, W].

        Returns:
            (torch.Tensor): Predicted class IDs [B, H, W].
        r   r0   Nr1   bilinearF)sizemodealign_corners)dim)
isinstancer)   rD   r(   r   Finterpolater;   argmaxrO   rQ   rR   gtsqueeze)r   predspred_hws      r!   postprocessz)SemanticSegmentationValidator.postprocess^   s     eeT]++ 	!HE+abb/1:4Q77771:IdefIg;g;gM%d.IPZjopppE6:gkku|||""%%ek222uxxPQ{{GZGZ[\G]G]G`G`afalGmGmmr"   c                    | j         j        r|                     ||           | j                            ||d                    | xj        |j        d         z  c_        dS )zUpdate metrics with predictions and ground truth.

        Args:
            preds (torch.Tensor): Predicted class IDs [B, H, W].
            batch (dict): Batch containing 'semantic_mask'.
        rK   r   N)r   r>   save_pred_masksr   update_statsr<   r(   )r   r`   rS   s      r!   update_metricsz,SemanticSegmentationValidator.update_metricsn   s^     9 	/  ...!!%)?@@@		U[^#				r"   c                   t           dk    s&t          j                    rt          j                    sdS | j        j        >| j        j        }t          j        ||f| j	        t          j
                  | j        _        t          j        | j        j        dt          j        j                   t           dk    rZdgt          j                    z  }t          j        | j        j        |d           t#          j        |d          | j        _        dS t           dk    r#t          j        | j        j        dd           dS dS )zAReduce semantic confusion matrix to rank 0 during DDP validation.N)rP   rL   r   )dstop)ri   )axis)r   distis_availableis_initializedr   matrixr@   rQ   zerosrP   float32reduceReduceOpSUMget_world_sizegather_objectnt_per_imagenpsum)r   r@   gathered_nts      r!   gather_statsz*SemanticSegmentationValidator.gather_statsz   s   2::T.00:8K8M8M:F<&L&E"'+uenT[X]Xe"f"f"fDLDL'Q4=3DEEEE199&4#6#8#88Kt|8+1MMMM(*{(C(C(CDL%%%AXXt|8$AFFFFFF Xr"   r`   torch.TensorrS   dict[str, Any]returnNonec                   | j         dS |                    dg           }|sdS |                                                                }t	          | j        t                    r(| j        j        r| j                            |d          }|	                    t          j        d          }t          ||          D ]\  }}| j                            |          }|r:|j        |k    r/t          j        ||d         |d         ft          j        	          }| j         t%          |                              d
          j        z  }t+          j        |                              |           dS )z6Save semantic predictions as single-channel PNG masks.Nr'   T)inverseF)copyr1   r   )interpolationz.png)r   getcpunumpyrZ   r   r   label_mappingconvert_labelastyperx   uint8zipr   r(   cv2resizeINTER_NEARESTr   with_suffixnamer   	fromarraysave)r   r`   rS   im_filespredr'   
orig_shape	save_paths           r!   rd   z-SemanticSegmentationValidator.save_pred_masks   sZ   #F99Y++ 	F		!!##dlO44 	D9S 	DL..ud.CCERXE22 11 	2 	2MD'*..w77J idjJ66z$A
1(FVYVghhh(4==+D+DV+L+L+QQIOD!!&&y1111	2 	2r"   c                   | j                             | j        | j        j        | j                   | j         j        i| j         j                                                                        	                                j
                            t                    | j        _        | j                                          | j         j        S )znReturn validation statistics.

        Returns:
            (dict): Dictionary of validation metrics.
        )r   ploton_plot)r   processr   r   plotsr   ro   detachr   r   Tr   floatrF   clear_statsresults_dictr   s    r!   	get_statsz'SemanticSegmentationValidator.get_stats   s     	dm$)/SWS_```<*+/<+>+E+E+G+G+K+K+M+M+S+S+U+U+W+^+^_d+e+eD!(  """|((r"   c                    ddz  S )zReturn a formatted description of evaluation metrics.

        Returns:
            (str): Formatted string with metric names.
        z%22s%11s%11s%11s%11s)ClassImagesPixelsmIoUPixAccr4   r   s    r!   get_descz&SemanticSegmentationValidator.get_desc   s     $'VVVr"   c                    t                                                       | j        j        r%| j         t          j        d| j                    dS dS dS )z0Print training/validation set metrics per class.Nz#Semantic prediction masks saved to )r   print_resultsr   r>   r   r
   infor   r    s    r!   r   z+SemanticSegmentationValidator.print_results   sc    9 	R4#3#?KPd>NPPQQQQQ	R 	R#?#?r"   c                ^    t          t                                                                S )zTParse the dataset YAML and add background metadata for polygon labels when required.)r   r   get_datasetr   s    r!   r   z)SemanticSegmentationValidator.get_dataset   s!    %egg&9&9&;&;<<<r"   c           	     x    t          |d         d|i|d         | j        d| dz  | j        | j                   dS )z.Plot predicted semantic masks on input images.imgrK   r'   	val_batchz	_pred.jpg)imagesr%   pathsfnamer$   r   N)r   r   r$   r   )r   rS   r`   nis       r!   plot_predictionsz.SemanticSegmentationValidator.plot_predictions   sZ    <#U+	"-";b";";";;*L	
 	
 	
 	
 	
 	
r"   )NNNN)r`   r|   rS   r}   r~   r   )r~   r   )__name__
__module____qualname____doc__r   rI   rN   rb   rf   r{   rd   r   r   r   r   r   __classcell__)r    s   @r!   r   r      s&        + + + + + +"Q Q Q2    n n n 
$ 
$ 
$G G G 2 2 2 2$) ) )W W WR R R R R R= = = = =	
 	
 	
 	
 	
 	
 	
r"   r   )"
__future__r   pathlibr   typingr   r   r   rx   rQ   torch.distributeddistributedrl   torch.nn.functionalnn
functionalr[   PILr   ultralytics.data.datasetr   ultralytics.data.utilsr   ultralytics.models.yolo.detectr	   ultralytics.utilsr
   r   ultralytics.utils.metricsr   r   ultralytics.utils.plottingr   r   r4   r"   r!   <module>r      sQ   # " " " " "             



                                 4 4 4 4 4 4 9 9 9 9 9 9 = = = = = = * * * * * * * * F F F F F F F F 2 2 2 2 2 2m
 m
 m
 m
 m
$6 m
 m
 m
 m
 m
r"   