o
    VhЗ                     @   s  d Z ddlZddlZddlZddl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ZddlZddlmZ ddlmZ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mZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZB G dd dZCdS )zz
Train a model on a dataset.

Usage:
    $ yolo mode=train model=yolo11n.pt data=coco8.yaml imgsz=640 epochs=100 batch=16
    N)copydeepcopy)datetime	timedelta)Path)distributed)nnoptim)__version__)get_cfgget_save_dir)check_cls_datasetcheck_det_dataset)attempt_load_one_weightattempt_load_weights)
DEFAULT_CFG
LOCAL_RANKLOGGERRANKTQDM	callbacks	clean_urlcolorstremojis	yaml_save)check_train_batch_size)	check_amp
check_filecheck_imgszcheck_model_file_from_stem
print_args)ddp_cleanupgenerate_ddp_command)get_latest_run)	TORCH_2_4EarlyStoppingModelEMAautocast$convert_optimizer_state_dict_to_fp16
init_seeds	one_cycleselect_devicestrip_optimizertorch_distributed_zero_firstunset_deterministicc                   @   sl  e Zd ZdZeddfddZdefddZdefdd	Zdefd
dZ	dd Z
dd Zdd Zdd Zd[ddZd\ddZd]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^d0d1Zd2d3 Zd_d6d7Zd`d8d9Zdad:d;Zd<d= Zd>d? Z d@dA Z!dBdC Z"dDdE Z#dFdG Z$dHdI Z%dbdJdKZ&dLdM Z'dNdO Z(dPdQ Z)dRdS Z*dcdYdZZ+dS )dBaseTrainera  
    A base class for creating trainers.

    Attributes:
        args (SimpleNamespace): Configuration for the trainer.
        validator (BaseValidator): Validator instance.
        model (nn.Module): Model instance.
        callbacks (defaultdict): Dictionary of callbacks.
        save_dir (Path): Directory to save results.
        wdir (Path): Directory to save weights.
        last (Path): Path to the last checkpoint.
        best (Path): Path to the best checkpoint.
        save_period (int): Save checkpoint every x epochs (disabled if < 1).
        batch_size (int): Batch size for training.
        epochs (int): Number of epochs to train for.
        start_epoch (int): Starting epoch for training.
        device (torch.device): Device to use for training.
        amp (bool): Flag to enable AMP (Automatic Mixed Precision).
        scaler (amp.GradScaler): Gradient scaler for AMP.
        data (str): Path to data.
        trainset (torch.utils.data.Dataset): Training dataset.
        testset (torch.utils.data.Dataset): Testing dataset.
        ema (nn.Module): EMA (Exponential Moving Average) of the model.
        resume (bool): Resume training from a checkpoint.
        lf (nn.Module): Loss function.
        scheduler (torch.optim.lr_scheduler._LRScheduler): Learning rate scheduler.
        best_fitness (float): The best fitness value achieved.
        fitness (float): Current fitness value.
        loss (float): Current loss value.
        tloss (float): Total loss value.
        loss_names (list): List of loss names.
        csv (Path): Path to results CSV file.
        metrics (dict): Dictionary of metrics.
        plots (dict): Dictionary of plots.
    Nc                 C   s  t ||| _| | t| jj| jj| _d| _d| _i | _t	| jj
d t | jjd t| j| _| jj| j_| jd | _tdv r\| jjddd t| j| j_t| jd t| j | jd	 | jd
 | _| _| jj| _| jj| _| jjpxd| _d| _tdkrtt| j | jjdv rd| j_t| jj| _t t! | " \| _#| _$W d   n1 sw   Y  d| _%d| _&d| _'d| _(d| _)d| _*d| _+dg| _,| jd | _-g d| _.d| _/|pt01 | _0tdv rt02|  dS dS )aD  
        Initialize the BaseTrainer class.

        Args:
            cfg (str, optional): Path to a configuration file. Defaults to DEFAULT_CFG.
            overrides (dict, optional): Configuration overrides. Defaults to None.
            _callbacks (list, optional): List of callback functions. Defaults to None.
        N   )deterministicweights   r   T)parentsexist_okz	args.yamlzlast.ptzbest.ptd   r   r4   >   cpumpsLosszresults.csv)r   r0      )3r   argscheck_resumer+   devicebatch	validatormetricsplotsr)   seedr   r1   r   save_dirnamewdirmkdirstrr   varslastbestsave_period
batch_sizeepochsstart_epochr    typeworkersr   modelr-   r   get_datasettrainsettestsetemalf	schedulerbest_fitnessfitnesslosstloss
loss_namescsvplot_idxhub_sessionr   get_default_callbacksadd_integration_callbacks)selfcfg	overrides
_callbacks rg   N/var/www/vscode/kcb/lib/python3.10/site-packages/ultralytics/engine/trainer.py__init__`   sT   	




zBaseTrainer.__init__eventc                 C   s   | j | | dS )z7Append the given callback to the event's callback list.N)r   appendrc   rj   callbackrg   rg   rh   add_callback   s   zBaseTrainer.add_callbackc                 C   s   |g| j |< dS )zPOverride the existing callbacks with the given callback for the specified event.N)r   rl   rg   rg   rh   set_callback   s   zBaseTrainer.set_callbackc                 C   s    | j |g D ]}||  qdS )z>Run all existing callbacks associated with a particular event.N)r   getrl   rg   rg   rh   run_callbacks   s   
zBaseTrainer.run_callbacksc              
   C   sN  t | jjtrt| jjrt| jjd}n#t | jjttfr't| jj}n| jjdv r0d}n
tj	
 r8d}nd}|dkrdtjvr| jjrPtd d| j_| jjdk r_td	 d
| j_t|| \}}z1zttd dd|  tj|dd W n ty } z|d}~ww W t| t| dS t| t| w | | dS )zIAllow device='', device=None on Multi-GPU systems to default to device=0.,>   r8   r9   r   r0   r   zI'rect=True' is incompatible with Multi-GPU training, setting 'rect=False'F      ?z['batch<1' for AutoBatch is incompatible with Multi-GPU training, setting default 'batch=16'   zDDP:z debug command  T)checkN)
isinstancer<   r>   rH   lensplittuplelisttorchcudais_availableosenvironrectr   warningr?   r"   infor   join
subprocessrun	Exceptionr!   	_do_train)rc   
world_sizecmdfileerg   rg   rh   train   s:   

"zBaseTrainer.trainc                    sF    j jrtd j j j _n fdd _tjj j	 jd _
dS )z,Initialize training learning rate scheduler.r0   c                    s(   t d|  j  dd jj   jj S )Nr0   r   rs   )maxrN   r<   lrf)xrc   rg   rh   <lambda>   s   ( z.BaseTrainer._setup_scheduler.<locals>.<lambda>)	lr_lambdaN)r<   cos_lrr*   r   rN   rW   r	   lr_schedulerLambdaLR	optimizerrX   r   rg   r   rh   _setup_scheduler   s   zBaseTrainer._setup_schedulerc                 C   sL   t jt t dt| _dtjd< tjt	 rdndt
ddt|d d	S )
zGInitialize and set the DistributedDataParallel parameters for training.r}   1TORCH_NCCL_BLOCKING_WAITncclglooi0*  )seconds)backendtimeoutrankr   N)r|   r}   
set_devicer   r>   r   r   distinit_process_groupis_nccl_availabler   )rc   r   rg   rg   rh   
_setup_ddp   s   

zBaseTrainer._setup_ddpc                    s  |  d |  }| j| j| _|   t| jjt	r | jjnt| jjt
r-t| jjng }dg}dd |D | }|| _| j D ]/\ }t fdd|D r_td  d d	|_qC|jsr|jjrrtd
  d d|_qCt| jj| j| _| jrtdv rtj }tjt| j| jd| _|t_tdkr|dkrtj| j
 dd t| j| _t rtjj!d| jdntj"jj!| jd| _#|dkrt$j%j&| jtgdd| _t't
t(| jdr| jj)' ndd}t*| jj+||dd| j_+|| _)| j,dk rtdkr| -  | j_.| _,| j,t'|d }	| j/| j0|	t1dd| _2tdv rg| j/| j3| jj4dkr2|	n|	d ddd| _5| 6 | _7| j7j8j9| j:dd }
t;t<|
dgt=|
 | _8t>| j| _?| jj@rg| A  t'tB| jjC| j, d| _D| jjE| j, | jD | jjC }tFGt=| j2jHt'| j,| jjC | jI }| jJ| j| jjK| jjL| jjM||d| _K| N  tO| jjPd d	| _Q| _R| S| | jTd | jU_V|  d! d"S )#z8Build dataloaders and optimizer on correct rank process.on_pretrain_routine_startz.dflc                 S   s   g | ]}d | dqS )zmodel..rg   .0r   rg   rg   rh   
<listcomp>   s    z,BaseTrainer._setup_train.<locals>.<listcomp>c                 3   s    | ]}| v V  qd S Nrg   r   krg   rh   	<genexpr>   s    z+BaseTrainer._setup_train.<locals>.<genexpr>zFreezing layer ''Fz/setting 'requires_grad=True' for frozen layer 'zE'. See ultralytics.engine.trainer for customization of frozen layers.Tr3   )r>   r4   r0   r   )srcr}   )enabled)
device_idsfind_unused_parametersstride    )r   floormax_dimr   )rM   r   modeobbr;   val)prefix)rR   rE   lrmomentumdecay
iterations)patienceon_pretrain_routine_endN)Wrq   setup_modelrR   tor>   set_model_attributesrw   r<   freezer{   intrangefreeze_layer_namesnamed_parametersanyr   r   requires_graddtypeis_floating_pointr   r|   tensorampr   r   default_callbacksr   r   r   	broadcastboolr$   
GradScalerr}   scalerr   parallelDistributedDataParallelr   hasattrr   r   imgszrM   
auto_batchr?   get_dataloaderrT   r   train_loaderrU   tasktest_loaderget_validatorr@   rA   keyslabel_loss_itemsdictziprx   r&   rV   rB   plot_training_labelsroundnbs
accumulateweight_decaymathceildatasetrN   build_optimizerr   lr0r   r   r%   r   stopperstopresume_trainingrO   rX   
last_epoch)rc   r   ckptfreeze_listalways_freeze_namesr   vcallbacks_backupgsrM   metric_keysr   r   rg   r   rh   _setup_train   s   



&&
 

(	
zBaseTrainer._setup_trainr0   c                 C   sB  |dkr	|  | | | t| j}| jjdkr$tt| jj| dnd}d}d| _t		 | _
t		 | _| d td| jj d| jj d	| jj|pMd  d
td| j d	| jj	rc| jj	 dn| j d  | jjr| j| jj | }| j||d |d g | j}| j  	 || _| d t  td | j  W d   n1 sw   Y  |    t!dkr| jj"#| t$| j}|| j| jj kr| %  | j&  t!dv rt| '  t(t$| j|d}d| _)|D ]h\}}	| d |||  }
|
|kr]d|g}tdt*t+,|
|d| jj-| j. g | _/t$| jj0D ]4\}}t+,|
||dkr9| jj1nd|d | 2| g|d< d|v r[t+,|
|| jj3| jj4g|d< q(t5| j6< | 7|	}	| 8|	\}| _9|: | _;t!dkr|  j;|9  _;| j)dur| j)| | j9 |d  n| j9| _)W d   n	1 sw   Y  | j<=| j;>  |
| | j/kr| ?  |
}| jj	rt		 | j | jj	d k| _@t!dkrt!dkr| j@ndg}tAB|d |d | _@| j@r nkt!dv rWt| j)jCr| j)jCd nd}|Dddd|   |d  d| j | E ddg|dkr(| j)ntFG| j)d|	d  jCd |	d! jCd R   | d" | jjHrW|
| jv rW| I|	|
 | d# qd$d% t$| jj0D | _J| d& t!dv r|d | jk}| jKjL| j8g d'd( | jjMs|s| jNjOs| j@r| P \| _Q| _R| jSi | T| j)| jQ| jJd) |  j@| N|d | jRp|O  _@| jj	r|  j@t		 | j | jj	d kO  _@| jjUs|r| V  | d* t		 }|| j
 | _|| _
| jj	r*|| j || j d  }tWX| jj	d |  | _| j_| Y  | j| j_Z|  j@|| jkO  _@| d+ | jEdd,d-kr<| [  t!dkrWt!dkrI| j@ndg}tAB|d |d | _@| j@r\n|d7 }qt!dv rt		 | j }td.|| j d  d/|d d0d1 | \  | jjHr| ]  | d2 | [  t^  | d3 dS )4z.Train the model with the specified world size.r0   r   r7   r4   Non_train_startzImage sizes z train, z val
Using z' dataloader workers
Logging results to boldz
Starting training for z	 hours...z
 epochs...r;   Ton_train_epoch_startignorer3   )totalon_train_batch_start        
initial_lrr   r   i  z%11s%11sz%11.4g/z.3gGclsimgon_batch_endon_train_batch_endc                 S   s    i | ]\}}d | |d qS )zlr/pgr   rg   )r   irr   rg   rg   rh   
<dictcomp>  s     z)BaseTrainer._do_train.<locals>.<dictcomp>on_train_epoch_end)yamlncr<   namesr   class_weights)include)rA   on_model_saveon_fit_epoch_end)fractiong      ?
z epochs completed in z.3fz hours.on_train_endteardown)_r   r   rx   r   r<   warmup_epochsr   r   
epoch_timetimeepoch_time_starttrain_time_startrq   r   r   r   num_workersr   rD   rN   close_mosaicr_   extendrO   r   	zero_gradepochwarningscatch_warningssimplefilterrX   step_model_trainr   sampler	set_epoch	enumerate_close_dataloader_mosaicresetprogress_stringr   r\   r   npinterpr   rM   r   param_groupswarmup_bias_lrrW   warmup_momentumr   r'   r   preprocess_batchrR   
loss_itemssumr[   r   scalebackwardoptimizer_stepr   r   broadcast_object_listshapeset_description_get_memoryr|   	unsqueezerB   plot_training_samplesr   rV   update_attrr   r   possible_stopvalidaterA   rZ   save_metricsr   save
save_modelr   r   r   r   _clear_memory
final_evalplot_metricsr.   )rc   r   nbnwlast_opt_stepbase_idxr  pbarir?   nixijr   r[   broadcast_listloss_lengthfinal_epochtmean_epoch_timer   rg   rg   rh   r   B  s  


&



 







,*



(







"$"
$

 




}(

zBaseTrainer._do_trainr   c                 C   s   t | j| jj| j| j|dS )zJCalculate optimal batch size based on model and device memory constraints.)rR   r   r   r?   max_num_obj)r   rR   r<   r   r   rM   )rc   rR  rg   rg   rh   r     s   zBaseTrainer.auto_batchFc                 C   s   d\}}| j jdkrtj }|rtd jd S n| j jdkr0tj	 }|r0tj
| j j}|r<|dkr:|| S dS |d S )zJGet accelerator memory utilization in GB or as a fraction of total memory.)r   r   r9   psutilr7   r8   r   i   @)r>   rP   r|   r9   driver_allocated_memory
__import__virtual_memorypercentr}   memory_reservedget_device_propertiestotal_memory)rc   r  memoryr   rg   rg   rh   r8    s   

 zBaseTrainer._get_memoryc                 C   s@   t   | jjdkrtj  dS | jjdkrdS tj  dS )zIClear accelerator memory by calling garbage collector and emptying cache.r9   r8   N)gccollectr>   rP   r|   r9   empty_cacher}   r   rg   rg   rh   rA    s   zBaseTrainer._clear_memoryc                 C   s   ddl }|| jjddS )z0Read results.csv into a dictionary using pandas.r   Nr{   )orient)pandasread_csvr^   to_dict)rc   pdrg   rg   rh   read_results_csv  s   zBaseTrainer.read_results_csvc                    sN   | j   | j  D ]\ }tt fdd| jr$t|tjr$|	  q
dS )zSet model in training mode.c                    s   |  v S r   rg   )fnrg   rh   r     s    z*BaseTrainer._model_train.<locals>.<lambda>N)
rR   r   named_modulesr   filterr   rw   r   BatchNorm2deval)rc   mrg   rf  rh   r#  
  s   
$zBaseTrainer._model_trainc                 C   s   ddl }| }t| j| jdt| jj | jj	t
t| j t| ji | jd| ji|  t  tddd| | }| j| | j| jkrT| j| | jdkrp| j| j dkrr| jd| j d | dS dS dS )	z9Save model training checkpoints with additional metadata.r   NrZ   z*AGPL-3.0 (https://ultralytics.com/license)zhttps://docs.ultralytics.com)r  rY   rR   rV   updatesr   
train_argstrain_metricstrain_resultsdateversionlicensedocsr  .pt)ioBytesIOr|   r?  r  rY   r   rV   halfrm  r(   r   
state_dictrI   r<   rA   rZ   rd  r   now	isoformatr
   getvaluerJ   write_bytesrK   rL   rF   )rc   rv  bufferserialized_ckptrg   rg   rh   r@    s4   
zBaseTrainer.save_modelc              
   C   s   z0| j jdkrt| j j}n!| j jdd dv s| j jdv r/t| j j}d|v r/|d | j _W n tyM } zttdt	| j j d| |d	}~ww || _| j j
rftd
 ddi| jd< d| jd< |d |dpr|dfS )z
        Get train and validation datasets from data dictionary.

        Returns:
            (tuple): A tuple containing the training and validation/test datasets.
        classifyr   r4   >   ymlr
  >   r   posedetectsegment	yaml_filez	Dataset 'u   ' error ❌ Nz)Overriding class names with single class.r   itemr  r0   r  r   r   test)r<   r   r   datary   r   r   RuntimeErrorr   r   
single_clsr   r   rp   )rc   r  r   rg   rg   rh   rS   5  s$   ""

zBaseTrainer.get_datasetc                 C   s   t | jtjjr
dS | jd}}d}t| jdr%t| j\}}|j}nt | j	j
ttfr6t| j	j
\}}| j||tdkd| _|S )z
        Load, create, or download model for any task.

        Returns:
            (dict): Optional checkpoint to resume training from.
        Nru  r4   )rd   r2   verbose)rw   rR   r|   r   ModulerH   endswithr   r
  r<   
pretrainedr   	get_modelr   )rc   rd   r2   r   _rg   rg   rh   r   Q  s   zBaseTrainer.setup_modelc                 C   sd   | j | j tjjj| j dd | j 	| j | j 
  | j  | jr0| j
| j dS dS )zVPerform a single step of the training optimizer with gradient clipping and EMA update.g      $@)max_normN)r   unscale_r   r|   r   utilsclip_grad_norm_rR   
parametersr"  updater  rV   r   rg   rg   rh   r4  e  s   

zBaseTrainer.optimizer_stepc                 C   s   |S )zRAllows custom preprocessing model inputs and ground truths depending on task type.rg   )rc   r?   rg   rg   rh   r/  o     zBaseTrainer.preprocess_batchc                 C   sD   |  | }|d| j    }| jr| j|k r|| _||fS )z
        Run validation on test set using self.validator.

        Returns:
            (tuple): A tuple containing metrics dictionary and fitness score.
        rZ   )r@   popr[   detachr8   numpyrY   )rc   rA   rZ   rg   rg   rh   r=  s  s
   
zBaseTrainer.validateTc                 C      t d)z>Get model and raise NotImplementedError for loading cfg files.z3This task trainer doesn't support loading cfg filesNotImplementedError)rc   rd   r2   r  rg   rg   rh   r       zBaseTrainer.get_modelc                 C   r  )zHReturns a NotImplementedError when the get_validator function is called.z1get_validator function not implemented in trainerr  r   rg   rg   rh   r     r  zBaseTrainer.get_validatorrt   r   c                 C   r  )z6Returns dataloader derived from torch.data.Dataloader.z2get_dataloader function not implemented in trainerr  )rc   dataset_pathrM   r   r   rg   rg   rh   r     r  zBaseTrainer.get_dataloaderc                 C   r  )zBuild dataset.z1build_dataset function not implemented in trainerr  )rc   img_pathr   r?   rg   rg   rh   build_dataset  r  zBaseTrainer.build_datasetc                 C   s   |durd|iS dgS )z
        Returns a loss dict with labelled training loss items tensor.

        Note:
            This is not needed for classification but necessary for segmentation & detection
        Nr[   rg   )rc   r0  r   rg   rg   rh   r     s   zBaseTrainer.label_loss_itemsc                 C   s   | j d | j_dS )z/Set or update model parameters before training.r  N)r  rR   r  r   rg   rg   rh   r     s   z BaseTrainer.set_model_attributesc                 C      dS )z.Builds target tensors for training YOLO model.Nrg   )rc   predstargetsrg   rg   rh   build_targets  r  zBaseTrainer.build_targetsc                 C   r  )z.Returns a string describing training progress. rg   r   rg   rg   rh   r)    r  zBaseTrainer.progress_stringc                 C   r  )z,Plots training samples during YOLO training.Nrg   )rc   r?   rJ  rg   rg   rh   r:    r  z!BaseTrainer.plot_training_samplesc                 C   r  )z%Plots training labels for YOLO model.Nrg   r   rg   rg   rh   r     r  z BaseTrainer.plot_training_labelsc                 C   s   t | t | }}t|d }| j rdnd| tddg|  dd }t | j	 }t
| jdd	d
"}||d| t| jd |g|  d d  W d   dS 1 s_w   Y  dS )z$Save training metrics to a CSV file.r;   r  z%s,r  r  rr   r  azutf-8)encodingz%.6g,r0   N)r{   r   valuesrx   r^   existsrz   rstripr  r  openwriter  )rc   rA   r   valsrg  srP  re  rg   rg   rh   r>    s   04"zBaseTrainer.save_metricsc                 C   r  )z"Plot and display metrics visually.Nrg   r   rg   rg   rh   rC    r  zBaseTrainer.plot_metricsc                 C   s    t |}|t d| j|< dS )z3Registers plots (e.g. to be consumed in callbacks).)r  	timestampN)r   r  rB   )rc   rE   r  pathrg   rg   rh   on_plot  s   zBaseTrainer.on_plotc                 C   s   i }| j | jfD ]J}| rR|| j u rt|}q|| ju rRd}t|||v r+||| indd td| d | jj| jj_| j|d| _	| j	
dd | d qdS )	zHPerform final evaluation and validation for object detection YOLO model.rp  N)rm  z
Validating z...)rR   rZ   r  )rJ   rK   r  r,   r   r   r<   rB   r@   rA   r  rq   )rc   r   re  r   rg   rg   rh   rB    s   


 
zBaseTrainer.final_evalc              
   C   s   | j j}|rozWt|ttfot| }t|rt|nt }t|j }t|d t	s9t|d  s9| j j
|d< d}t|| _ t| | j _| j _dD ]}||v r[t| j |||  qLW n tyn } ztd|d}~ww || _dS )zCCheck if resume checkpoint exists and update arguments accordingly.r  T)r   r?   r>   r  zzResume checkpoint not found. Please pass a valid checkpoint to resume from, i.e. 'yolo train resume model=path/to/last.pt'N)r<   resumerw   rH   r   r  r   r#   r   r   r  r   rR   setattrr   FileNotFoundError)rc   re   r  r  rJ   	ckpt_argsr   r   rg   rg   rh   r=     s2   

	
zBaseTrainer.check_resumec              	   C   sF  |du s| j s	dS d}|ddd }|dddur'| j|d  |d }| jrB|drB| jj|d    |d	 | j_|d
ksXJ | jj	 d| j
 d| jj	 dtd| jj	 d|d  d| j
 d | j
|k rt| j	 d|d  d| j
 d |  j
|d 7  _
|| _|| _|| j
| jj kr|   dS dS )z7Resume YOLO training from given epoch and best fitness.Nr   r  r4   r0   r   rY   rV   rm  r   z training to zf epochs is finished, nothing to resume.
Start a new training without resuming, i.e. 'yolo train model=r   zResuming training z from epoch z to z total epochsz has been trained for z epochs. Fine-tuning for z more epochs.)r  rp   r   load_state_dictrV   floatry  rm  r<   rR   rN   r   r   rY   rO   r  r'  )rc   r   rY   rO   rg   rg   rh   r     s4   
(
zBaseTrainer.resume_trainingc                 C   sN   t | jjdrd| jj_t | jjdr%td | jjjt| jd dS dS )z5Update dataloaders to stop using mosaic augmentation.mosaicFr  zClosing dataloader mosaic)hypN)	r   r   r   r  r   r   r  r   r<   r   rg   rg   rh   r'    s   

z$BaseTrainer._close_dataloader_mosaicautoMbP??h㈵>     j@c                 C   sD  g g g f}t dd tj D }|dkrKttd d| jj d| jj	 d | j
dd	}	td
d|	  d}
|dkr?dnd|
df\}}}d| j_| D ]>\}}|jddD ]3\}}|rf| d| n|}d|v rt|d | qYt||s}d|v r|d | qY|d | qYqOh d}dd |D | }|dv rtt|tj|d ||dfdd}n*|d krtj|d ||d!}n|d"krtj|d ||d#d$}ntd%| d&| d'||d |d( ||d dd( ttd d)t|j d*| d+| d,t|d  d-t|d  d.| d/t|d  d0 |S )1a;  
        Construct an optimizer for the given model.

        Args:
            model (torch.nn.Module): The model for which to build an optimizer.
            name (str, optional): The name of the optimizer to use. If 'auto', the optimizer is selected
                based on the number of iterations. Default: 'auto'.
            lr (float, optional): The learning rate for the optimizer. Default: 0.001.
            momentum (float, optional): The momentum factor for the optimizer. Default: 0.9.
            decay (float, optional): The weight decay for the optimizer. Default: 1e-5.
            iterations (float, optional): The number of iterations, which determines the optimizer if
                name is 'auto'. Default: 1e5.

        Returns:
            (torch.optim.Optimizer): The constructed optimizer.
        c                 s   s     | ]\}}d |v r|V  qdS )NormNrg   )r   r   r   rg   rg   rh   r   %  s    z.BaseTrainer.build_optimizer.<locals>.<genexpr>r  z
optimizer:z' 'optimizer=auto' found, ignoring 'lr0=z' and 'momentum=zJ' and determining best 'optimizer', 'lr0' and 'momentum' automatically... r  
   {Gz?      i'  )SGDr  r  AdamWr  r   F)recurser   biasr;   logit_scaler0   r   >   r  Adamr  r  NAdamRAdamAdamaxRMSPropc                 S   s   i | ]}|  |qS rg   )lowerr   rg   rg   rh   r  =  s    z/BaseTrainer.build_optimizer.<locals>.<dictcomp>>   r  r  r  r  r  g+?)r   betasr   r  )r   r   r  T)r   r   nesterovzOptimizer 'z,' not found in list of available optimizers zX. Request support for addition optimizers at https://github.com/ultralytics/ultralytics.)paramsr   ru   z(lr=z, momentum=z) with parameter groups z weight(decay=0.0), z weight(decay=z), z bias(decay=0.0))rz   r   __dict__itemsr   r   r   r<   r   r   r  rp   r   r-  rh  r   rk   rw   r  getattrr	   r  RMSpropr  r  add_param_grouprP   __name__rx   )rc   rR   rE   r   r   r   r   gbnr  lr_fitmodule_namemodule
param_nameparamfullname
optimizersr   rg   rg   rh   r     s`   


$"


zBaseTrainer.build_optimizer)r0   )r   )F)NNT)rt   r   r   )r   N)Nr   r   )r  r  r  r  r  ),r  
__module____qualname____doc__r   ri   rH   rn   ro   rq   r   r   r   r   r   r   r8  rA  rd  r#  r@  rS   r   r4  r/  r=  r  r   r   r  r   r   r  r)  r:  r   r>  rC  r  rB  r=   r   r'  r   rg   rg   rg   rh   r/   ;   sR    $A&
Y 
"


#




		
 r/   )Dr  r\  r   r   r   r  r  r   r   r   r   pathlibr   r  r*  r|   r   r   r   r	   ultralyticsr
   ultralytics.cfgr   r   ultralytics.data.utilsr   r   ultralytics.nn.tasksr   r   ultralytics.utilsr   r   r   r   r   r   r   r   r   r   ultralytics.utils.autobatchr   ultralytics.utils.checksr   r   r   r   r    ultralytics.utils.distr!   r"   ultralytics.utils.filesr#   ultralytics.utils.torch_utilsr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   rg   rg   rg   rh   <module>   s2   04