§
    ²ÆjÁ  ã                  óº   — d dl mZ d dlmZ d dlmZ d dlmZ d dl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 d d
lmZmZmZ d dlmZmZ  G d„ de¦  «        ZdS )é    )Úannotations)Úcopy)ÚAnyN)ÚImage)Úadd_polygon_background)Úyolo)ÚDetectionTrainer)ÚSemanticSegmentationModel)ÚDEFAULT_CFGÚLOGGERÚRANK)ÚcolorsÚplt_settingsc                  ór   ‡ — e Zd ZdZeddfdˆ fd„Zˆ fd„Zddd„Zd„ Zd„ Z	 e
¦   «         d„ ¦   «         Zˆ xZS )ÚSemanticSegmentationTraineraÐ  Trainer for YOLO semantic segmentation models.

    This trainer handles semantic segmentation training, including dataset building, model initialization, and
    validation setup.

    Examples:
        >>> from ultralytics.models.yolo.semantic import SemanticSegmentationTrainer
        >>> args = dict(model="yolo26n-sem.yaml", data="cityscapes8.yaml", epochs=3)
        >>> trainer = SemanticSegmentationTrainer(overrides=args)
        >>> trainer.train()
    NÚ	overridesúdict[str, Any] | NoneÚ
_callbacksúdict | Nonec                ó`   •— |€i }d|d<   t          ¦   «                              |||¦  «         dS )a  Initialize SemanticSegmentationTrainer.

        Args:
            cfg (dict): Configuration dictionary with default training settings.
            overrides (dict, optional): Dictionary of parameter overrides.
            _callbacks (dict, optional): Callback functions.
        NÚsemanticÚtask)ÚsuperÚ__init__)ÚselfÚcfgr   r   Ú	__class__s       €úi/var/www/html/Carbon-Document/venv/lib/python3.11/site-packages/ultralytics/models/yolo/semantic/train.pyr   z$SemanticSegmentationTrainer.__init__!   s<   ø€ ð ÐØˆIØ&ˆ	&ÑÝ‰Œ×Ò˜˜i¨Ñ4Ô4Ð4Ð4Ð4ó    c                ó^   •— t          t          ¦   «                              ¦   «         ¦  «        S )zTParse the dataset YAML and add background metadata for polygon labels when required.)r   r   Úget_dataset)r   r   s    €r   r!   z'SemanticSegmentationTrainer.get_dataset.   s!   ø€ å%¥e¡g¤g×&9Ò&9Ñ&;Ô&;Ñ<Ô<Ð<r   Tr   ú
str | NoneÚweightsÚverboseÚboolc                óœ   — t          || j        d         | j        d         |o
t          dk    ¬¦  «        }|r|                     |¦  «         |S )a}  Return a SemanticSegmentationModel with optional pretrained backbone.

        Args:
            cfg (str, optional): Path to model configuration file.
            weights (str | Path, optional): Path to model weights.
            verbose (bool): Whether to display model information.

        Returns:
            (SemanticSegmentationModel): Semantic segmentation model.
        ÚncÚchannelséÿÿÿÿ)r'   Úchr$   )r
   Údatar   Úload)r   r   r#   r$   Úmodels        r   Ú	get_modelz%SemanticSegmentationTrainer.get_model2   s[   € õ *ØD”I˜d”O¨¬	°*Ô(=ÀwÐG]ÕSWÐ[]ÒS]ð
ñ 
ô 
ˆð ð 	 ØJŠJwÑÔÐàˆr   c                ó˜   — d| _         t          j                             | j        | j        t          | j        ¦  «        | j        ¬¦  «        S )z<Return a SemanticSegmentationValidator for model evaluation.)Úce_lossÚ	dice_lossÚaux_loss)Úsave_dirÚargsr   )	Ú
loss_namesr   r   ÚSemanticSegmentationValidatorÚtest_loaderr3   r   r4   Ú	callbacks©r   s    r   Úget_validatorz)SemanticSegmentationTrainer.get_validatorE   sB   € à<ˆŒÝŒ}×:Ò:ØÔ t¤}½4ÀÄ	¹?¼?ÐW[ÔWeð ;ñ 
ô 
ð 	
r   c                ó   — dS )aA  Skip detection-style class weight computation for semantic segmentation.

        Semantic segmentation requires pixel-level class frequency counting from masks,
        which is not performed here. The loss function applies Cityscapes weights when
        the dataset YAML stem is 'cityscapes' or 'cityscapes8'.
        N© r9   s    r   Úset_class_weightsz-SemanticSegmentationTrainer.set_class_weightsL   s	   € ð 	ˆr   c           	     ó  — t          j        d| j        dz  › d¦  «         | j        d         }| j        d         }t	          j        |t          j        ¬¦  «        }| j        j        }t          |dg ¦  «        }|st          j
        d¦  «         d	S t          d
t          |¦  «        ¦  «        }t	          j        dt          |¦  «        dz
  |¦  «                             t          ¦  «        }|D ]}	 t	          j        t#          j        ||         ¦  «        ¦  «        }	n# t&          $ r Y Œ=w xY wt)          |d¦  «        r/|j        r(|j                             ¦   «         D ]\  }
}||	|	|
k    <   Œ|	dk    |	|k     z  |	dk    z  }|                     ¦   «         r_t	          j        |	|         d¬¦  «        \  }}t3          ||¦  «        D ]/\  }}|t          |¦  «        xx         t          |¦  «        z  cc<   Œ0Œ	t5          j        dddd¬¦  «        \  }}|                     t;          |¦  «        |d„ t;          |¦  «        D ¦   «         ¬¦  «        }|                     d¦  «         |                     d¦  «         |                      d¦  «         dt          |¦  «        cxk     rdk     rin nf| !                    t;          t          |¦  «        ¦  «        ¦  «         | "                    tG          | $                    ¦   «         ¦  «        dd¬¦  «         |D ]p}| %                    ¦   «         }|dk    rT| &                    | '                    ¦   «         | (                    ¦   «         dz  z   |t          |¦  «        d›ddd ¬!¦  «         Œq|j)         $                    ¦   «         D ]}| *                    d"¦  «         Œ| j        dz  }t5          j+        |d#¬$¦  «         t5          j,        ¦   «          | j-        r|  -                    |¦  «         d	S d	S )%züPlot training labels class distribution for semantic segmentation.

        Samples up to 1000 mask files from the training dataset, accumulates per-class pixel
        counts, and plots a bar chart of class distribution saved to 'labels.jpg'.
        zPlotting labels to z
labels.jpgz...r'   Únames)ÚdtypeÚ
mask_filesz2No semantic mask files found, skipping label plot.Niè  r   é   Úlabel_mappingéÿ   T)Úreturn_counts)é   é   )ÚfigsizeÚtight_layoutc           	     ó\   — g | ])}t          d „ t          |d¦  «        D ¦   «         ¦  «        ‘Œ*S )c              3  ó    K  — | ]	}|d z  V — Œ
dS )g     ào@Nr<   )Ú.0Úcs     r   ú	<genexpr>zNSemanticSegmentationTrainer.plot_training_labels.<locals>.<listcomp>.<genexpr>y   s&   è è € Ð:_Ð:_È¸1¸u¹9Ð:_Ð:_Ð:_Ð:_Ð:_Ð:_r   F)Úlistr   )rL   Úis     r   ú
<listcomp>zDSemanticSegmentationTrainer.plot_training_labels.<locals>.<listcomp>y   s<   € Ð5sÐ5sÐ5sÐdeµdÐ:_Ð:_ÍfÐUVÐX]ÑN^ÔN^Ð:_Ñ:_Ô:_Ñ6_Ô6_Ð5sÐ5sÐ5sr   )ÚcolorÚClassÚPixelsz"Training Labels Class Distributioné   éZ   é
   )ÚrotationÚfontsizeg       @ú,ÚcenterÚbottomrF   )ÚhaÚvarY   FéÈ   )Údpi).r   Úinfor3   r+   ÚnpÚzerosÚint32Útrain_loaderÚdatasetÚgetattrÚwarningÚminÚlenÚlinspaceÚastypeÚintÚarrayr   ÚopenÚ	ExceptionÚhasattrrC   ÚitemsÚanyÚuniqueÚzipÚpltÚsubplotsÚbarÚrangeÚ
set_xlabelÚ
set_ylabelÚ	set_titleÚ
set_xticksÚset_xticklabelsrO   ÚvaluesÚ
get_heightÚtextÚget_xÚ	get_widthÚspinesÚset_visibleÚsavefigÚcloseÚon_plot)r   r'   r?   Úpixel_countsrf   rA   Úsample_sizeÚindicesÚidxÚmaskÚoldÚnewÚvalidÚclassesÚcountsrM   ÚcountÚ_ÚaxÚbarsrx   ÚheightÚspineÚfnames                           r   Úplot_training_labelsz0SemanticSegmentationTrainer.plot_training_labelsU   s  € õ 	ŒÐK¨$¬-¸,Ñ*FÐKÐKÐKÑLÔLÐLØŒYtŒ_ˆØ”	˜'Ô"ˆÝ”x ­"¬(Ð3Ñ3Ô3ˆàÔ#Ô+ˆÝ˜W l°BÑ7Ô7ˆ
Øð 	ÝŒNÐOÑPÔPÐPØˆFå˜$¥ J¡¤Ñ0Ô0ˆÝ”+˜a¥ Z¡¤°1Ñ!4°kÑBÔB×IÒIÍ#ÑNÔNˆàð 	7ñ 	7ˆCðÝ”x¥¤
¨:°c¬?Ñ ;Ô ;Ñ<Ô<øÝð ð ð Øðøøøåw Ñ0Ô0ð ,°WÔ5Jð ,Ø 'Ô 5× ;Ò ;Ñ =Ô =ð ,ð ,‘HC˜Ø(+D˜ šÑ%Ð%Ø˜Q’Y 4¨"¢9Ñ-°¸²Ñ=ˆEØyŠy‰{Œ{ð 7Ý"$¤)¨D°¬KÀtÐ"LÑ"LÔ"L‘˜Ý # G¨VÑ 4Ô 4ð 7ð 7‘HAuØ ¥ Q¡¤Ð(Ð(Ô(­C°©J¬JÑ6Ð(Ð(Ñ(Ð(ùå”˜Q ¨6ÀÐEÑEÔE‰ˆˆ2ØvŠv•e˜B‘i”i Ð5sÐ5sÕinÐoqÑirÔirÐ5sÑ5sÔ5sˆvÑtÔtˆØ
ŠgÑÔÐØ
ŠhÑÔÐØ
ŠÐ9Ñ:Ô:Ð:Øs5‰zŒzÐÐÒÐ˜BÒÐÐÐÐØMŠM%¥ E¡
¤
Ñ+Ô+Ñ,Ô,Ð,Ø×Òt E§L¢L¡N¤NÑ3Ô3¸bÈ2ÐÑNÔNÐNØð 
	ð 
	ˆCØ—^’^Ñ%Ô%ˆFØ˜ŠzˆzØ—’Ø—I’I‘K”K #§-¢-¡/¤/°CÑ"7Ñ7ØÝ˜6‘{”{Ð&Ð&ØØØð ñ ô ð øð ”Y×%Ò%Ñ'Ô'ð 	%ð 	%ˆEØ×Ò˜eÑ$Ô$Ð$Ð$à” Ñ,ˆÝŒE˜sÐ#Ñ#Ô#Ð#ÝŒ	‰ŒˆØŒ<ð 	 ØLŠL˜ÑÔÐÐÐð	 ð 	 s   Ã1,DÄ
D+Ä*D+)r   r   r   r   )NNT)r   r"   r#   r"   r$   r%   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r!   r.   r:   r=   r   rš   Ú__classcell__)r   s   @r   r   r      sÇ   ø€ € € € € ð
ð 
ð 'È4Ðkoð 5ð 5ð 5ð 5ð 5ð 5ð 5ð=ð =ð =ð =ð =ðð ð ð ð ð&
ð 
ð 
ðð ð ð €\^„^ð< ð < ñ „^ð< ð < ð < ð < ð < r   r   )Ú
__future__r   r   Útypingr   Úmatplotlib.pyplotÚpyplotrv   Únumpyrb   ÚPILr   Úultralytics.data.utilsr   Úultralytics.modelsr   Úultralytics.models.yolo.detectr	   Úultralytics.nn.tasksr
   Úultralytics.utilsr   r   r   Úultralytics.utils.plottingr   r   r   r<   r   r   ú<module>r¬      s*  ðð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð à 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø #Ð #Ð #Ð #Ð #Ð #Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø :Ð :Ð :Ð :Ð :Ð :Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;ð~ ð ~ ð ~ ð ~ ð ~ Ð"2ñ ~ ô ~ ð ~ ð ~ ð ~ r   