Ë
    Fêñi¯Å  ã                  óÄ  — d Z ddlm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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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*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z:m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZM  G d„ d«      ZNy)zz
Train a model on a dataset.

Usage:
    $ yolo mode=train model=yolo26n.pt data=coco8.yaml imgsz=640 epochs=100 batch=16
é    )ÚannotationsN)ÚcopyÚdeepcopy)ÚdatetimeÚ	timedelta)Úpartial)ÚPath)Údistributed)ÚnnÚoptim)Ú__version__)Úget_cfgÚget_save_dir)Úcheck_cls_datasetÚcheck_det_datasetÚ convert_ndjson_to_yolo_if_needed)Úload_checkpoint)ÚMuSGD)ÚDEFAULT_CFGÚGITÚ
LOCAL_RANKÚLOGGERÚRANKÚTQDMÚYAMLÚ	callbacksÚ	clean_urlÚcolorstrÚemojis)Ú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)Úplot_results)Ú	TORCH_2_4ÚEarlyStoppingÚModelEMAÚattempt_compileÚautocastÚ$convert_optimizer_state_dict_to_fp16Ú
init_seedsÚ	one_cycleÚselect_deviceÚstrip_optimizerÚtorch_distributed_zero_firstÚunset_deterministicÚunwrap_modelc                  ó0  — e Zd ZdZeddfd-d„Zd.d„Zd.d„Zd.d„Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd/d„Zd0d„Zd1d2d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd3d„Zd„ Zd4d„Zd5d„Zd6d„Zd„ Zd„ Z d„ Z!d „ Z"d!„ Z#d"„ Z$d#„ Z%d$„ Z&d1d%„Z'd&„ Z(d'„ Z)d(„ Z*d)„ Z+d*„ Z,d+„ Z-d7d,„Z.y)8ÚBaseTrainera*	  A base class for creating trainers.

    This class provides the foundation for training YOLO models, handling the training loop, validation, checkpointing,
    and various training utilities. It supports both single-GPU and multi-GPU distributed training.

    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 (torch.amp.GradScaler): Gradient scaler for AMP.
        data (dict): Dataset dictionary containing paths and metadata.
        ema (ModelEMA): EMA (Exponential Moving Average) of the model.
        resume (bool): Resume training from a checkpoint.
        lf (callable): Learning rate scheduling function.
        scheduler (torch.optim.lr_scheduler._LRScheduler): Learning rate scheduler.
        best_fitness (float): The best fitness value achieved.
        fitness (float): Current fitness value.
        loss (torch.Tensor): Current loss value.
        tloss (torch.Tensor): Running mean of loss items.
        loss_names (list): List of loss names.
        csv (Path): Path to results CSV file.
        metrics (dict): Dictionary of metrics.
        plots (dict): Dictionary of plots.

    Methods:
        train: Execute the training process.
        validate: Run validation on the val set.
        save_model: Save model training checkpoints.
        get_dataset: Get train and validation datasets.
        setup_model: Load, create, or download model.
        build_optimizer: Construct an optimizer for the model.

    Examples:
        Initialize a trainer and start training
        >>> trainer = BaseTrainer(cfg="config.yaml")
        >>> trainer.train()
    Nc                óÒ
  — |j                  dd«      | _        t        ||«      | _        | j	                  |«       t        | j                  j                  «      | _        dt        | j                  «      v rt        j                  d«      nt        | j                  «      | j                  _        d| _
        d| _        i | _        t        | j                  j                  dz   t        z   | j                  j                   ¬«       t#        | j                  «      | _        | j$                  j&                  | j                  _        | j$                  dz  | _        t        dv r·| j(                  j+                  d	d	¬
«       t        | j$                  «      | j                  _        t-        | j                  «      j/                  «       }|j1                  d«      �|d   D �cg c]  }t3        |«      ‘Œ c}|d<   t5        j6                  | j$                  dz  |«       | j(                  dz  | j(                  dz  c| _        | _        | j                  j<                  | _        | j                  j>                  | _         | j                  jB                  xs d| _!        d| _"        t        dk(  rtG        t-        | j                  «      «       | j                  jH                  dv rd| j                  _%        |xs tM        jN                  «       | _&        tQ        | j                  j                  t        «      rNtS        | j                  j                  «      r/tS        | j                  j                  jU                  d«      «      }nˆtQ        | j                  j                  tV        tX        f«      r tS        | j                  j                  «      }n>| j                  j                  dv rd}n#tZ        j\                  j_                  «       rd}nd}|dkD  xr dt        j`                  v| _1        || _2        t        dv r2| jb                  s&tM        jf                  | «       | ji                  d«       tk        | j                  jl                  «      | _6        to        tp        «      5  | js                  «       | _:        ddd«       d| _;        d| _<        d| _=        d| _>        d| _?        d| _@        d| _A        dg| _B        | j$                  dz  | _C        | j†                  j‰                  «       r0| j                  jŠ                  s| j†                  j�                  «        g d¢| _G        d| _H        yc c}w # 1 sw Y   Œ¶xY w)a5  Initialize the BaseTrainer class.

        Args:
            cfg (str | dict | SimpleNamespace, optional): Path to a configuration file or configuration object.
            overrides (dict, optional): Configuration overrides.
            _callbacks (dict, optional): Dictionary of callback functions.
        ÚsessionNÚcudaÚCUDA_VISIBLE_DEVICESé   )ÚdeterministicÚweights¾   r   éÿÿÿÿT©ÚparentsÚexist_okÚaugmentationsz	args.yamlzlast.ptzbest.ptéd   r   rA   >   ÚcpuÚmpsú,r   Úon_pretrain_routine_startÚLosszresults.csv)r   r=   é   )IÚpopÚhub_sessionr   ÚargsÚcheck_resumer2   ÚdeviceÚstrÚosÚgetenvÚ	validatorÚmetricsÚplotsr0   Úseedr   r>   r   Úsave_dirÚnameÚwdirÚmkdirÚvarsr   ÚgetÚreprr   ÚsaveÚlastÚbestÚsave_periodÚbatchÚ
batch_sizeÚepochsÚstart_epochr%   ÚtypeÚworkersr   Úget_default_callbacksÚ
isinstanceÚlenÚsplitÚtupleÚlistÚtorchr;   Úis_availableÚenvironÚddpÚ
world_sizeÚadd_integration_callbacksÚrun_callbacksr$   Úmodelr4   r   Úget_datasetÚdataÚemaÚlfÚ	schedulerÚbest_fitnessÚfitnessÚlossÚtlossÚ
loss_namesÚcsvÚexistsÚresumeÚunlinkÚplot_idxÚnan_recovery_attempts)ÚselfÚcfgÚ	overridesÚ
_callbacksÚ	args_dictÚtrt   s          ú\/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/ultralytics/engine/trainer.pyÚ__init__zBaseTrainer.__init__u   sç  € ð %Ÿ=™=¨°DÓ9ˆÔÜ˜C Ó+ˆŒ	Ø×Ñ˜)Ô$Ü# D§I¡I×$4Ñ$4Ó5ˆŒà@FÌ#ÈdÏkÉkÓJZÑ@Zœ2Ÿ9™9Ð%;Ô<Ô`cÐdh×doÑdoÓ`pˆ�	‰	ÔØˆŒØˆŒØˆŒ
Ü�4—9‘9—>‘> AÑ%¬Ñ,¸D¿I¹I×<SÑ<SÕTô % T§Y¡YÓ/ˆŒØŸ™×+Ñ+ˆ�	‰	ŒØ—M‘M IÑ-ˆŒ	Ü�7‰?Ø�I‰I�O‰O D°4ˆOÔ8Ü!$ T§]¡]Ó!3ˆD�I‰IÔä˜TŸY™Y›×,Ñ,Ó.ˆIØ�}‰}˜_Ó-Ð9à?HÈÑ?YÖ-Z¸!¬d°1­gÒ-Z�	˜/Ñ*Ü�I‰I�d—m‘m kÑ1°9Ô=Ø#Ÿy™y¨9Ñ4°d·i±iÀ)Ñ6KÐˆŒ	�4”9ØŸ9™9×0Ñ0ˆÔàŸ)™)Ÿ/™/ˆŒØ—i‘i×&Ñ&Ò-¨#ˆŒØˆÔÜ�2Š:Ü”t˜DŸI™I“Ô'ð �;‰;×Ñ˜~Ñ-Ø !ˆD�I‰IÔð $ÒH¤y×'FÑ'FÓ'HˆŒä�d—i‘i×&Ñ&¬Ô,´°T·Y±Y×5EÑ5EÔ1FÜ˜TŸY™Y×-Ñ-×3Ñ3°CÓ8Ó9‰JÜ˜Ÿ	™	×(Ñ(¬5´$¨-Ô8Ü˜TŸY™Y×-Ñ-Ó.‰JØ�Y‰Y×Ñ Ñ/Ø‰JÜ�Z‰Z×$Ñ$Ô&Ø‰JàˆJà ‘>ÒD l¼"¿*¹*Ð&DˆŒØ$ˆŒä�7‰? 4§8¢8Ü×/Ñ/°Ô5Ø×ÑÐ:Ô;ô 0°·	±	·±Ó@ˆŒ
Ü)¬*Ó5ñ 	+Ø×(Ñ(Ó*ˆDŒI÷	+ð ˆŒð ˆŒØˆŒð !ˆÔØˆŒØˆŒ	ØˆŒ
Ø!˜(ˆŒØ—=‘= =Ñ0ˆŒØ�8‰8�?‰?Ô T§Y¡Y×%5Ò%5Ø�H‰H�O‰OÔÚ!ˆŒØ%&ˆÕ"ùòs .[÷L	+ð 	+ús   ÇUÒUÕU&c                ó@   — | j                   |   j                  |«       y)z7Append the given callback to the event's callback list.N)r   Úappend©rˆ   ÚeventÚcallbacks      rŽ   Úadd_callbackzBaseTrainer.add_callbackÎ   s   € à�‰�uÑ×$Ñ$ XÕ.ó    c                ó$   — |g| j                   |<   y)zPOverride the existing callbacks with the given callback for the specified event.N)r   r’   s      rŽ   Úset_callbackzBaseTrainer.set_callbackÒ   s   € à!) 
ˆ�‰�uÒr–   c                óV   — | j                   j                  |g «      D ]
  } || «       Œ y)z>Run all existing callbacks associated with a particular event.N)r   r^   r’   s      rŽ   rv   zBaseTrainer.run_callbacksÖ   s)   € àŸ™×*Ñ*¨5°"Ó5ò 	ˆHÙ�T�Nñ	r–   c                ó†  — | j                   rõ| j                  j                  r&t        j                  d«       d| j                  _        | j                  j
                  dk  r)t        d| j                  › d| j                  dz  › d�«      ‚d\  }}	 t        | «      \  }}t        j                  t        d	«      › d
dj                  |«      › �«       t        j                  |d¬«       	 |�t        | t!        |«      «       yy| j#                  «        y# t        $ r}|‚d}~ww xY w# |�t        | t!        |«      «       w w xY w)zcExecute the training process, using DDP subprocess for multi-GPU or direct training for single-GPU.zI'rect=True' is incompatible with Multi-GPU training, setting 'rect=False'Fç      ð?zuAutoBatch with batch<1 not supported for Multi-GPU training, please specify a valid batch size multiple of GPU count z, i.e. batch=é   ú.©NNzDDP:z debug command ú T)ÚcheckN)rs   rO   Úrectr   Úwarningrd   Ú
ValueErrorrt   r'   Úinfor   ÚjoinÚ
subprocessÚrunÚ	Exceptionr&   rR   Ú	_do_train)rˆ   ÚcmdÚfileÚes       rŽ   ÚtrainzBaseTrainer.trainÛ   s4  € ð �8Š8à�y‰y�~Š~Ü—‘ÐjÔkØ!&�—	‘	”Ø�y‰y�‰ Ò$Ü ðOØOSÏÉÐN_Ð_lÐmq×m|Ñm|ð  @Añ  nAð  mBð  BCðDóð ð #‰IˆC�ð1Ü0°Ó6‘	��TÜ—‘œx¨Ó/Ð0°ÀÇÁÈÃ¸ÐOÔPÜ—‘˜s¨$Ö/ð Ð#Ü ¤c¨$£iÕ0ð $ð �N‰NÕøô ò Ø�ûðûð Ð#Ü ¤c¨$£iÕ0ð $ús%   ÂAD Ä	D#ÄDÄD#Ä#D& Ä&E c                ó  ‡ — ‰ j                   j                  r1t        d‰ j                   j                  ‰ j                  «      ‰ _        n
ˆ fd„‰ _        t        j                  j                  ‰ j                  ‰ j
                  ¬«      ‰ _
        y)z,Initialize training learning rate scheduler.r=   c                óž   •— t        d| ‰j                  z  z
  d«      d‰j                  j                  z
  z  ‰j                  j                  z   S )Nr=   r   r›   )Úmaxrf   rO   Úlrf)Úxrˆ   s    €rŽ   ú<lambda>z.BaseTrainer._setup_scheduler.<locals>.<lambda>ý   s?   ø€ ¤ A¨¨D¯K©K©Ñ$7¸Ó ;¸sÀTÇYÁYÇ]Á]Ñ?RÑ SÐVZ×V_ÑV_×VcÑVcÑ c€ r–   )Ú	lr_lambdaN)rO   Úcos_lrr1   r±   rf   r{   r   Úlr_schedulerÚLambdaLRÚ	optimizerr|   ©rˆ   s   `rŽ   Ú_setup_schedulerzBaseTrainer._setup_schedulerø   sX   ø€ à�9‰9×ÒÜ  4§9¡9§=¡=°$·+±+Ó>ˆD�GãcˆDŒGÜ×+Ñ+×4Ñ4°T·^±^ÈtÏwÉwÐ4ÓWˆ�r–   c                ó<  — t         j                  j                  t        «       t        j                  dt        «      | _        dt
        j                  d<   t        j                  t        j                  «       rdndt        d¬«      t        | j                  ¬«       y	)
zGInitialize and set the DistributedDataParallel parameters for training.r;   Ú1ÚTORCH_NCCL_BLOCKING_WAITÚncclÚglooi0*  )Úseconds)ÚbackendÚtimeoutÚrankrt   N)rp   r;   Ú
set_devicer   rQ   rS   rr   ÚdistÚinit_process_groupÚis_nccl_availabler   rt   r¹   s    rŽ   Ú
_setup_ddpzBaseTrainer._setup_ddp   se   € ä�
‰
×ÑœdÔ#Ü—l‘l 6¬4Ó0ˆŒØ14Œ�
‰
Ð-Ñ.Ü×ÑÜ"×4Ñ4Ô6‘F¸FÜ eÔ,ÜØ—‘ö		
r–   c                ó@  — | j                   t        | j                  d«      z  }| j                  | j                  d   |t
        d¬«      | _        | j                  | j                  j                  d«      xs | j                  j                  d«      | j                  j                  dk(  r|n|dz  t
        d¬«      | _
        t        t        | j                  j                  | j                   z  «      d«      | _        | j                  j                  | j                   z  | j                  z  | j                  j                  z  }t        j                   t#        | j                  j$                  «      t        | j                   | j                  j                  «      z  «      | j&                  z  }| j)                  | j*                  | j                  j,                  | j                  j.                  | j                  j0                  ||¬«      | _        | j3                  «        y	)
zCBuild dataloaders, optimizer, and scheduler for current batch size.r=   r­   )re   rÃ   ÚmodeÚvalÚtestÚobbrL   )rw   rZ   ÚlrÚmomentumÚdecayÚ
iterationsN)re   r°   rt   Úget_dataloaderry   r   Útrain_loaderr^   rO   ÚtaskÚtest_loaderÚroundÚnbsÚ
accumulateÚweight_decayÚmathÚceilrl   Údatasetrf   Úbuild_optimizerrw   r¸   Úlr0rÏ   rº   )rˆ   re   rÙ   rÑ   s       rŽ   Ú_build_train_pipelinez!BaseTrainer._build_train_pipeline  s—  € à—_‘_¬¨D¯O©O¸QÓ(?Ñ?ˆ
Ø ×/Ñ/Ø�I‰I�gÑ¨:¼JÈWð 0ó 
ˆÔð  ×.Ñ.Ø�I‰I�M‰M˜%Ó Ò9 D§I¡I§M¡M°&Ó$9Ø%)§Y¡Y§^¡^°uÒ%<‘zÀ*ÈqÁ.ÜØð	 /ó 
ˆÔô œe D§I¡I§M¡M°D·O±OÑ$CÓDÀaÓHˆŒØ—y‘y×-Ñ-°·±Ñ?À$Ç/Á/ÑQÐTX×T]ÑT]×TaÑTaÑaˆÜ—Y‘Yœs 4×#4Ñ#4×#<Ñ#<Ó=ÄÀDÇOÁOÐUY×U^ÑU^×UbÑUbÓ@cÑcÓdÐgk×grÑgrÑrˆ
Ø×-Ñ-Ø—*‘*Ø—‘×$Ñ$Ø�y‰y�}‰}Ø—Y‘Y×'Ñ'ØØ!ð .ó 
ˆŒð 	×ÑÕr–   c           	     ó>  ‡
— | j                  «       }| j                  j                  | j                  «      | _        | j	                  «        t        | j                  | j                  | j                  j                  ¬«      | _        t        | j                  j                  t        «      r| j                  j                  nDt        | j                  j                  t        «      rt        | j                  j                  «      ng }dg}|D �cg c]  }d|› d�‘Œ
 c}|z   }|| _        | j                  j                  «       D ]~  \  Š
}t        ˆ
fd„|D «       «      r!t!        j"                  d‰
› d�«       d|_        Œ;|j$                  rŒH|j&                  j(                  sŒ_t!        j*                  d	‰
› d
�«       d|_        Œ€ t-        j.                  | j                  j0                  «      j                  | j                  «      | _        | j0                  rjt2        dv rbt4        j6                  j9                  «       }t-        j.                  t;        | j                  «      | j                  ¬«      | _        |t4        _        t2        dkD  r>| j<                  dkD  r/t?        j@                  | j0                  j                  «       d¬«       tC        | j0                  «      | _        tD        r+t,        j0                  jG                  d| j0                  ¬«      n3t,        jH                  j0                  jG                  | j0                  ¬«      | _%        tM        t        tO        | j                  d«      r$| j                  jP                  jM                  «       nd«      d«      }tS        | j                  jT                  ||d¬«      | j                  _*        || _(        | j<                  dkD  r6tV        jX                  j[                  | j                  t2        gd¬«      | _        | j\                  dk  r/t2        dk(  r&| j_                  «       x| j                  _0        | _.        | jc                  «        | je                  «       | _3        ti        | j                  «      | _5        | jm                  «        t2        dv r€| jf                  jn                  jp                  | js                  d¬«      z   }	tu        tw        |	dgty        |	«      z  «      «      | _7        | j                  jz                  r| j}                  «        t        | j                  j€                  ¬«      dc| _A        | _B        | j‡                  |«       | jˆ                  dz
  | jŠ                  _F        | j�                  d«       yc c}w )zYConfigure model, optimizer, dataloaders, and training utilities before the training loop.)rQ   rÊ   z.dflzmodel.r�   c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­w©N© )Ú.0r²   Úks     €rŽ   ú	<genexpr>z+BaseTrainer._setup_train.<locals>.<genexpr><  s   øè ø€ Ò6˜a�1˜”6Ñ6ùs   ƒzFreezing layer 'ú'Fz/setting 'requires_grad=True' for frozen layer 'zE'. See ultralytics.engine.trainer for customization of frozen layers.Tr@   )rQ   rA   r=   r   ©Úsrcr;   )ÚenabledÚstrideé    )rë   ÚfloorÚmax_dim)Ú
device_idsÚfind_unused_parametersrË   )Úprefix)ÚpatienceÚon_pretrain_routine_endN)HÚsetup_modelrw   ÚtorQ   Úset_model_attributesr-   rO   Úcompilerk   Úfreezero   ÚintÚrangeÚfreeze_layer_namesÚnamed_parametersÚanyr   r¤   Úrequires_gradÚdtypeÚis_floating_pointr¢   rp   ÚtensorÚampr   r   Údefault_callbacksr   r!   rt   rÅ   Ú	broadcastÚboolr*   Ú
GradScalerr;   Úscalerr°   Úhasattrrë   r#   Úimgszr   ÚparallelÚDistributedDataParallelre   Ú
auto_batchrd   rß   Úget_validatorrU   r,   rz   Úset_class_weightsrV   ÚkeysÚlabel_loss_itemsÚdictÚziprl   rW   Úplot_training_labelsr+   rò   ÚstopperÚstopÚresume_trainingrg   r|   Ú
last_epochrv   )rˆ   ÚckptÚfreeze_listÚalways_freeze_namesr²   rû   ÚvÚcallbacks_backupÚgsÚmetric_keysrå   s             @rŽ   Ú_setup_trainzBaseTrainer._setup_train&  s  ø€ à×ÑÓ!ˆØ—Z‘Z—]‘] 4§;¡;Ó/ˆŒ
Ø×!Ñ!Ô#ô % T§Z¡Z¸¿¹È$Ï)É)×J[ÑJ[Ô\ˆŒ
ô
 ˜$Ÿ)™)×*Ñ*¬DÔ1ð �I‰I×Òô ˜$Ÿ)™)×*Ñ*¬CÔ0ô �t—y‘y×'Ñ'Ô(àð 	ð  &˜hÐØ5@ÖA°  q c¨šmÒAÐDWÑWÐØ"4ˆÔØ—J‘J×/Ñ/Ó1ò 
	'‰DˆAˆqäÓ6Ð#5Ô6Ô6Ü—‘Ð.¨q¨c°Ð3Ô4Ø"'�•Ø—_“_¨¯©×)BÓ)BÜ—‘ØEÀaÀSð IYð Yôð #'�•ð
	'ô —<‘< §	¡	§¡Ó.×1Ñ1°$·+±+Ó>ˆŒØ�8Š8œ ™Ü(×:Ñ:×?Ñ?ÓAÐÜ—|‘|¤I¨d¯j©jÓ$9À$Ç+Á+ÔNˆDŒHØ*:ŒIÔ'Ü�"Š9˜Ÿ™¨1Ò,Ü�N‰N˜4Ÿ8™8Ÿ<™<›>¨qÕ1Ü˜Ÿ™“>ˆŒå>GŒE�I‰I× Ñ  °·±Ð Ô:ÌUÏZÉZÏ^É^×MfÑMfÐos×owÑowÐMfÓMxð 	Œô ”´¸¿
¹
ÀHÔ0M�T—Z‘Z×&Ñ&×*Ñ*Ô,ÐSUÓVÐXZÓ[ˆÜ% d§i¡i§o¡o¸bÈÐTUÔVˆ�	‰	ŒØˆŒà�?‰?˜QÒÜŸ™×<Ñ<¸T¿Z¹ZÔUYÐTZÐswÐ<ÓxˆDŒJð �?‰?˜QÒ¤4¨2¢:Ø04·±Ó0AÐAˆD�I‰IŒO˜dœoà×"Ñ"Ô$Ø×+Ñ+Ó-ˆŒÜ˜DŸJ™JÓ'ˆŒØ×ÑÔ Ü�7‰?ØŸ.™.×0Ñ0×5Ñ5¸×8MÑ8MÐUZÐ8MÓ8[Ñ[ˆKÜ¤ K°!°´s¸;Ó7GÑ1GÓ HÓIˆDŒLØ�y‰y�ŠØ×)Ñ)Ô+ä"/¸¿¹×9KÑ9KÔ"LÈeÐˆŒ�d”iØ×Ñ˜TÔ"Ø$(×$4Ñ$4°qÑ$8ˆ�‰Ô!Ø×ÑÐ4Õ5ùòg Bs   ÄVc                ó  — | j                   dkD  r| j                  «        | j                  «        t        | j                  «      }| j
                  j                  dkD  r,t        t        | j
                  j                  |z  «      d«      nd}d}d| _	        t        j                  «       | _        t        j                  «       | _        | j                  d«       t        j                  d| j
                  j                   › d| j
                  j                   › d	| j                  j"                  | j                   xs dz  › d
t%        d| j&                  «      › d�	| j
                  j                  r| j
                  j                  › d�n| j(                  › d�z   «       | j
                  j*                  rJ| j(                  | j
                  j*                  z
  |z  }| j,                  j/                  ||dz   |dz   g«       | j0                  }| j2                  j5                  «        d| _        	 || _        | j                  d«       t;        j<                  «       5  t;        j>                  d«       | j@                  jC                  «        ddd«       | jE                  «        tF        dk7  r%| j                  jH                  jK                  |«       tM        | j                  «      }|| j(                  | j
                  j*                  z
  k(  r*| jO                  «        | j                  jQ                  «        tF        dv rCt        j                  | jS                  «       «       tU        tM        | j                  «      |¬«      }d| _+        |D �]¤  \  }}| j                  d«       |||z  z   }	|	|k  �r#d|g}
t        dtY        t[        j\                  |	|
d| j
                  j^                  | j`                  z  g«      j                  «       «      «      | _1        | j2                  jd                  D ]¦  }t[        j\                  |	|
|jg                  d«      dk(  r| j
                  jh                  nd|d   | jk                  |«      z  g«      |d<   d|v sŒct[        j\                  |	|
| j
                  jl                  | j
                  jn                  g«      |d<   Œ¨ 	 tq        | jr                  «      5  | ju                  |«      }| j
                  jv                  rB| jy                  |d   «      }t{        | jx                  «      j}                  ||«      \  }| _?        n| jy                  |«      \  }| _?        |j�                  «       | _>        tF        dk7  r| xj|                  | j                   z  c_>        | jV                  €| j~                  n!| jV                  |z  | j~                  z   |dz   z  | _+        ddd«       | j‚                  j…                  | j|                  «      j‡                  «        |	|z
  | jb                  k\  r¸| j™                  «        |	}| j
                  j                  r�t        j                  «       | j                  z
  | j
                  j                  d!z  kD  | _M        tF        dk7  r8tF        dk(  r| jš                  ndg}t�        jž                  |d«       |d   | _M        | jš                  r �nLtF        dv �rt        | jV                  j                   «      r| jV                  j                   d   nd}|j£                  d"d#d|z   z  z   |dz   › d$| j(                  › �| j¥                  «       d%›d&�g|dkD  r| jV                  nt‰        j¦                  | jV                  d«      ¢|d'   j                   d   ‘|d   j                   d   ‘­z  «       | j                  d(«       | j
                  j¨                  r |	| j,                  v r| j«                  ||	«       | j                  d)«       | jš                  s�Œ¥ n d| _        | j6                  r| jš                  s�Œ%t­        t{        | jx                  «      j®                  d*«      r-t{        | jx                  «      j®                  j±                  «        tM        | j2                  jd                  «      D ��ci c]  \  }}d+|› �|d   “Œ c}}| _Y        | j                  d,«       tF        dv r)| j´                  j·                  | jx                  g d-¢¬.«       |dz   | j(                  k\  }| j
                  j¸                  s$|s"| jº                  j¼                  s| jš                  rI| j“                  | j¾                  jÀ                  d/k(  rdnd0«       | jÃ                  «       \  | _b        | _c        | jÉ                  |«      r�Œ£d| _e        tF        dv �r| jÍ                  i | jÏ                  | jV                  «      ¥| jÄ                  ¥| j²                  ¥¬1«       | xjš                  | j»                  |dz   | jÆ                  «      xs |z  c_M        | j
                  j                  rN| xjš                  t        j                  «       | j                  z
  | j
                  j                  d!z  kD  z  c_M        | j
                  jÐ                  s|r!| jÓ                  «       r| j                  d2«       t        j                  «       }|| j                  z
  | _	        || _        | j
                  j                  r´|| j                  z
  || j0                  z
  dz   z  }tÕ        jÖ                  | j
                  j                  d!z  |z  «      x| _        | j
                  _        | jÙ                  «        | j8                  | j@                  _K        | xjš                  || j(                  k\  z  c_M        | j                  d3«       | j“                  | j¾                  jÀ                  d/k(  rdnd0«       tF        dk7  r8tF        dk(  r| jš                  ndg}t�        jž                  |d«       |d   | _M        | jš                  rn|dz  }�
ŒUt        j                  «       | j                  z
  }t        j                  d4|| j0                  z
  dz   › d5|d!z  d6›d7�«       | jÛ                  «        tF        dv r7| j
                  j¨                  r| jÝ                  «        | j                  d8«       | j“                  «        tß        «        | j                  d9«       y# 1 sw Y   �
ŒÇxY w# 1 sw Y   �ŒwxY w# tˆ        jŠ                  jŒ                  $ �r� || j0                  kD  s| j6                  dk\  s	tF        dk7  r‚ | xj6                  dz  c_        | j`                  }t        | j`                  dz  d«      x| j
                  _G        | _0        t        j�                  d|› d| j`                  › d| j6                  › d �«       dx}x}}dx| _>        x| _?        | _+        | j“                  «        | j•                  «        | j0                  dz
  | j@                  _K        t        | j                  «      }| j
                  j                  dkD  r,t        t        | j
                  j                  |z  «      d«      nd}d}| j2                  j5                  «        Y  �ŒÏw xY wc c}}w ):zbPerform the full training loop including setup, epoch iteration, validation, and final evaluation.r=   r   rF   rA   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...rL   Úon_train_epoch_startÚignorer@   )ÚtotalÚon_train_batch_startÚparam_groupÚbiasç        Ú
initial_lrrÎ   rÏ   Úimgé   zCUDA out of memory with batch=z. Reducing to batch=z and retrying (z/3).i  z%11s%11sz%11.4gú/z.3gÚGÚclsÚon_batch_endÚon_train_batch_endÚupdatezlr/pgÚon_train_epoch_end)ÚyamlÚncrO   Únamesrë   Úclass_weights)ÚincluderH   g      à?)rV   Úon_model_saveÚon_fit_epoch_endú
z epochs completed in z.3fz hours.Úon_train_endÚteardown)prt   rÈ   r  rl   rÓ   rO   Úwarmup_epochsr°   rÖ   Ú
epoch_timeÚtimeÚepoch_time_startÚtrain_time_startrv   r   r¤   r	  Únum_workersr   rY   rf   Úclose_mosaicr†   Úextendrg   r¸   Ú	zero_gradÚ_oom_retriesÚepochÚwarningsÚcatch_warningsÚsimplefilterr|   ÚstepÚ_model_trainr   ÚsamplerÚ	set_epochÚ	enumerateÚ_close_dataloader_mosaicÚresetÚprogress_stringr   r€   rù   ÚnpÚinterpr×   re   rØ   Úparam_groupsr^   Úwarmup_bias_lrr{   Úwarmup_momentumrÏ   r.   r  Úpreprocess_batchr÷   rw   r6   r   Ú
loss_itemsÚsumr  ÚscaleÚbackwardrp   r;   ÚOutOfMemoryErrorrd   r¢   Ú_clear_memoryrß   r  Úoptimizer_stepr  rÅ   Úbroadcast_object_listÚshapeÚset_descriptionÚ_get_memoryÚ	unsqueezerW   Úplot_training_samplesr  Ú	criterionr2  rÎ   rz   Úupdate_attrrË   r  Úpossible_stoprQ   rh   ÚvalidaterV   r~   Ú_handle_nan_recoveryr‡   Úsave_metricsr  r`   Ú
save_modelrÚ   rÛ   rº   Ú
final_evalÚplot_metricsr5   )rˆ   ÚnbÚnwÚlast_opt_stepÚbase_idxrH  ÚpbarÚird   ÚniÚxir²   Úpredsr   Ú	old_batchÚbroadcast_listÚloss_lengthÚirÚfinal_epochr�   Úmean_epoch_timerÀ   s                         rŽ   r©   zBaseTrainer._do_trainm  s'  € à�?‰?˜QÒØ�O‰OÔØ×ÑÔä�×"Ñ"Ó#ˆØ>B¿i¹i×>UÑ>UÐXYÒ>YŒS”�t—y‘y×.Ñ.°Ñ3Ó4°cÔ:Ð_aˆØˆØˆŒÜ $§	¡	£ˆÔÜ $§	¡	£ˆÔØ×ÑÐ+Ô,Ü�‰Ø˜4Ÿ9™9Ÿ?™?Ð+¨8°D·I±I·O±OÐ3Dð EØ×&Ñ&×2Ñ2°d·o±oÒ6JÈÑKÐLð M"Ü"*¨6°4·=±=Ó"AÐ!Bð C%ð&ð JNÏÉÏÊ¨D¯I©I¯N©NÐ+;¸9Ñ)EÐ`d×`kÑ`kÐ_lÐlvÐ]wñyô	
ð �9‰9×!Ò!ØŸ™ d§i¡i×&<Ñ&<Ñ<ÀÑBˆHØ�M‰M× Ñ  (¨H°q©L¸(ÀQ¹,Ð!GÔHØ× Ñ ˆØ�‰× Ñ Ô"ØˆÔØØˆDŒJØ×ÑÐ5Ô6Ü×(Ñ(Ó*ñ &Ü×%Ñ% hÔ/Ø—‘×#Ñ#Ô%÷&ð ×ÑÔÜ�rŠzØ×!Ñ!×)Ñ)×3Ñ3°EÔ:Ü˜T×.Ñ.Ó/ˆDà˜Ÿ™ t§y¡y×'=Ñ'=Ñ=Ò>Ø×-Ñ-Ô/Ø×!Ñ!×'Ñ'Ô)ä�w‰Ü—‘˜D×0Ñ0Ó2Ô3ÜœI d×&7Ñ&7Ó8ÀÔC�ØˆDŒJØ ó _&‘��5Ø×"Ñ"Ð#9Ô:à˜˜e™‘^�Ø˜“8Ø˜R˜�BÜ&)¨!¬S´·±¸2¸rÀAÀtÇyÁyÇ}Á}ÐW[×WfÑWfÑGfÐCgÓ1h×1nÑ1nÓ1pÓ-qÓ&r�D”OØ!Ÿ^™^×8Ñ8ò o˜ä"$§)¡)ØØà<=¿E¹EÀ-Ó<PÐTZÒ<Z §	¡	× 8Ò 8Ð`cØ ! ,¡°$·'±'¸%³.Ñ @ðó#˜˜$™ð &¨š?Ü,.¯I©I°b¸"¸t¿y¹y×?XÑ?XÐZ^×ZcÑZc×ZlÑZlÐ>mÓ,n˜A˜jšMðoð%Ü! $§(¡(Ó+ñ Ø $× 5Ñ 5°eÓ <˜ØŸ9™9×,Ò,à$(§J¡J¨u°U©|Ó$<˜EÜ4@ÀÇÁÓ4L×4QÑ4QÐRWÐY^Ó4_Ñ1˜D $¥/à48·J±J¸uÓ4EÑ1˜D $¤/Ø$(§H¡H£J˜œ	Ü 2š:Ø ŸIšI¨¯©Ñ8�Ià/3¯z©zÐ/A˜DŸOšOÈÏ
É
ÐUVÉÐY]×YhÑYhÑHhÐmnÐqrÑmrÑGsð œ
÷ð  —K‘K×%Ñ% d§i¡iÓ0×9Ñ9Ô;ð* ˜Ñ%¨¯©Ò8Ø×'Ñ'Ô)Ø$&�Mð —y‘y—~’~Ü%)§Y¡Y£[°4×3HÑ3HÑ%HÈTÏYÉYÏ^É^Ð^bÑMbÑ$c˜œ	Ü 2š:Ü;?À1º9¨d¯iªiÈ$Ð-O˜NÜ ×6Ñ6°~ÀqÔIØ(6°qÑ(9˜DœIØŸ9š9Ú!ô ˜7’?Ü9<¸T¿Z¹Z×=MÑ=MÔ9N $§*¡*×"2Ñ"2°1Ò"5ÐTU�KØ×(Ñ(Ø# h°!°k±/Ñ&BÑBà$ q™y˜k¨¨4¯;©;¨-Ð8Ø#×/Ñ/Ó1°#Ð6°aÐ8ðð -8¸!ªO˜dŸjšjÄÇÁÐQU×Q[ÑQ[Ð]^ÓA_ðð " %™L×.Ñ.¨qÑ1ð	ð
 " %™L×.Ñ.¨rÑ2ññô	ð ×&Ñ& ~Ô6Ø—y‘y—’¨2°·±Ñ+>Ø×2Ñ2°5¸"Ô=à×"Ñ"Ð#7Ô8Ø—9”9Ùðy_&ð~ %&�Ô!à× Ò ¨¯ªÙä”| D§J¡JÓ/×9Ñ9¸8ÔDÜ˜TŸZ™ZÓ(×2Ñ2×9Ñ9Ô;ä:CÀDÇNÁN×D_ÑD_Ó:`×a±°°Q˜˜r˜d�| Q t¡WÑ,ÓaˆDŒGà×ÑÐ3Ô4Ü�w‰Ø—‘×$Ñ$ T§Z¡ZÒ9sÐ$Ôtð   !™) t§{¡{Ñ2ˆKØ�y‰y�}Š}¡¨t¯|©|×/IÒ/IÈTÏYÊYØ×"Ñ"¨4¯;©;×+;Ñ+;¸uÒ+D¡4È#ÔNØ-1¯]©]«_Ñ*�”˜dœlð ×(Ñ(¨Ô/Ùà)*ˆDÔ&Ü�wŠØ×!Ñ!Ð*j¨T×-BÑ-BÀ4Ç:Á:Ó-NÐ*jÐRV×R^ÑR^Ð*jÐbf×biÑbiÐ*jÐ!ÔkØ—	’	˜TŸ\™\¨%°!©)°T·\±\ÓBÒQÀkÑQ•	Ø—9‘9—>’>Ø—I’I¤$§)¡)£+°×0EÑ0EÑ"EÈ$Ï)É)Ï.É.Ð[_ÑJ_Ñ!`Ñ`•Ið —I‘I—N’N¡k°t·±Ô7HØ×&Ñ& Ô7ô —	‘	“ˆAØ $×"7Ñ"7Ñ7ˆDŒOØ$%ˆDÔ!Ø�y‰y�~Š~Ø#$ t×'<Ñ'<Ñ#<ÀÈ×IYÑIYÑAYÐ\]ÑA]Ñ"^�Ü15·±¸4¿9¹9¿>¹>ÈDÑ;PÐSbÑ;bÓ1cÐc�”˜dŸi™iÔ.Ø×%Ñ%Ô'Ø,0¯J©J�—‘Ô)Ø—	’	˜U d§k¡kÑ1Ñ1•	Ø×ÑÐ1Ô2à×Ñ t§{¡{×'7Ñ'7¸5Ò'@™tÀcÔJô �rŠzÜ/3°qªy $§)¢)¸dÐ!C�Ü×*Ñ*¨>¸1Ô=Ø*¨1Ñ-�”	Ø�yŠyØØ�Q‰JˆEñW ôZ —)‘)“+ × 5Ñ 5Ñ5ˆÜ�‰�b˜ ×!1Ñ!1Ñ1°AÑ5Ð6Ð6KÈGÐVZÉNÐ[^ÐK_Ð_fÐgÔhà�‰ÔÜ�7‰?Ø�y‰y�ŠØ×!Ñ!Ô#Ø×Ñ˜~Ô.Ø×ÑÔÜÔØ×Ñ˜:Õ&÷i&ñ &ú÷Nñ ûô" —z‘z×2Ñ2ó Ø˜t×/Ñ/Ò/°4×3DÑ3DÈÒ3IÌTÐUWÊZØØ×%Ò%¨Ñ*Õ%Ø $§¡�IÜ8;¸D¿O¹OÈqÑ<PÐRSÓ8TÐT�D—I‘I”O d¤oÜ—N‘NØ8¸¸ð D-Ø-1¯_©_Ð,=¸_ÈT×M^ÑM^ÐL_Ð_cðeôð ,0Ð/�EÐ/˜D 5Ø?CÐC�D”IÐC ¤°$´*Ø×&Ñ&Ô(Ø×.Ñ.Ô0Ø04×0@Ñ0@À1Ñ0D�D—N‘NÔ-Ü˜T×.Ñ.Ó/�BØJNÏ)É)×JaÑJaÐdeÒJeœœU 4§9¡9×#:Ñ#:¸RÑ#?Ó@À#ÔFÐkm�BØ$&�MØ—N‘N×,Ñ,Ô.Ûð'üó@ bs>   É0u	Óu#Ó"C?u×!;u#ã|õ	uõu 	õu#õ#F|ü|c                óÒ   — t        | j                  j                  d| j                  j                  z   z  «      }t	        | j
                  || j                  | j                  ||¬«      S )zJCalculate optimal batch size based on model and device memory constraints.r=   )rw   r	  r  rd   Úmax_num_objÚdataset_size)rù   rO   r	  Úmulti_scaler    rw   r  re   )rˆ   r€  r�  Ú	max_imgszs       rŽ   r  zBaseTrainer.auto_batch?  sS   € ä˜Ÿ	™	Ÿ™¨1¨t¯y©y×/DÑ/DÑ+DÑEÓFˆ	Ü%Ø—*‘*ØØ—‘Ø—/‘/Ø#Ø%ô
ð 	
r–   c                óÈ  — d\  }}| j                   j                  dk(  rFt        j                  j	                  «       }|r’t        d«      j                  «       j                  dz  S | j                   j                  dk7  rSt        j                  j                  «       }|r3t        j                  j                  | j                   «      j                  }|r|dkD  r||z  S dS |dz  S )zJGet accelerator memory utilization in GB or as a fraction of total memory.©r   r   rH   ÚpsutilrF   rG   r   i   @)rQ   rh   rp   rH   Údriver_allocated_memoryÚ
__import__Úvirtual_memoryÚpercentr;   Úmemory_reservedÚget_device_propertiesÚtotal_memory)rˆ   ÚfractionÚmemoryr%  s       rŽ   rd  zBaseTrainer._get_memoryK  s·   € à‰ˆ�Ø�;‰;×Ñ˜uÒ$Ü—Y‘Y×6Ñ6Ó8ˆFÙÜ! (Ó+×:Ñ:Ó<×DÑDÀsÑJÐJØ�[‰[×Ñ Ò&Ü—Z‘Z×/Ñ/Ó1ˆFÙÜŸ
™
×8Ñ8¸¿¹ÓE×RÑR�Ù9A E¨A¢I�˜%‘ÐW°1ÐWÈÐQVÉÐWr–   c                óp  — |r0d|cxk  rdk  sJ d«       ‚ J d«       ‚| j                  d¬«      |k  ryt        j                  «        | j                  j                  dk(  rt
        j                  j                  «        y| j                  j                  dk(  ryt
        j                  j                  «        y)	zIClear accelerator memory by calling garbage collector and emptying cache.r   r=   z"Threshold must be between 0 and 1.T)rŽ  NrH   rG   )	rd  ÚgcÚcollectrQ   rh   rp   rH   Úempty_cacher;   )rˆ   Ú	thresholds     rŽ   r_  zBaseTrainer._clear_memoryX  s“   € áØ˜	Ô& QÒ&ÐLÐ(LÓLÑ&ÐLÐ(LÓLÐ&Ø×Ñ¨ÐÓ.°)Ò;ØÜ
�
‰
ŒØ�;‰;×Ñ˜uÒ$Ü�I‰I×!Ñ!Õ#Ø�[‰[×Ñ Ò&Øä�J‰J×"Ñ"Õ$r–   c                óˆ   — ddl }	 |j                  | j                  d¬«      j                  d¬«      S # t        $ r i cY S w xY w)z0Read results.csv into a dictionary using polars.r   N)Úinfer_schema_lengthF)Ú	as_series)ÚpolarsÚread_csvr‚   Úto_dictr¨   )rˆ   Úpls     rŽ   Úread_results_csvzBaseTrainer.read_results_csvf  sD   € ãð	Ø—;‘;˜tŸx™x¸T�;ÓB×JÑJÐUZÐJÓ[Ð[øÜò 	ØŠIð	ús   †,3 ³AÁ Ac                ó  ‡— | j                   j                  «        | j                   j                  «       D ]S  \  Š}t        t	        ˆfd„| j
                  «      «      sŒ)t        |t        j                  «      sŒD|j                  «        ŒU y)zSet model in training mode.c                ó   •— | ‰v S râ   rã   )ÚfÚns    €rŽ   r³   z*BaseTrainer._model_train.<locals>.<lambda>t  s   ø€  A¨ F€ r–   N)
rw   r­   Únamed_modulesrý   Úfilterrû   rk   r   ÚBatchNorm2dÚeval)rˆ   Úmr   s     @rŽ   rM  zBaseTrainer._model_traino  sc   ø€ à�
‰
×ÑÔà—J‘J×,Ñ,Ó.ò 	‰DˆAˆqÜ”6Ó*¨D×,CÑ,CÓDÕEÌ*ÐUVÔXZ×XfÑXfÕJgØ—‘•ñ	r–   c                óL  — ddl }t        t        | j                  j                  «      «      j	                  «       }t        d„ |j                  «       j                  «       D «       «      s$t        j                  d| j                  › d�«       y|j                  «       }t        j                  | j                  | j                  d|| j                  j                  t!        t        | j"                  j                  «       «      «      | j$                  j                  «       t'        | j(                  «      i | j*                  ¥d| j,                  i¥| j/                  «       t1        j2                  «       j5                  «       t6        t9        t:        j<                  «      t:        j>                  t:        j@                  t:        jB                  dœd	d
dœ|«       |jE                  «       }| jF                  jI                  dd¬«       | jJ                  jM                  |«       | j                  | j,                  k(  r| jN                  jM                  |«       | jP                  dkD  rH| j                  | jP                  z  dk(  r,| jF                  d| j                  › d�z  jM                  |«       y)z9Save model training checkpoints with additional metadata.r   Nc              3  ó˜   K  — | ]B  }t        |t        j                  «      sŒt        j                  |«      j	                  «       –— ŒD y ­wrâ   ©rk   rp   ÚTensorÚisfiniteÚall©rä   r  s     rŽ   ræ   z)BaseTrainer.save_model.<locals>.<genexpr>|  s4   è ø€ Òm¨qÔQ[Ð\]Ô_d×_kÑ_kÕQl”5—>‘> !Ó$×(Ñ(×*Ñmùó
   ‚A
¢(A
z"Skipping checkpoint save at epoch z: EMA contains NaN/InfFr~   )ÚrootÚbranchÚcommitÚoriginz*AGPL-3.0 (https://ultralytics.com/license)zhttps://docs.ultralytics.com)rH  r}   rw   rz   Úupdatesr¸   r  Ú
train_argsÚtrain_metricsÚtrain_resultsÚdateÚversionÚgitÚlicenseÚdocsTrB   rH  ú.pt))Úior   r6   rz   Úhalfr«  Ú
state_dictÚvaluesr   r¢   rH  ÚBytesIOrp   r`   r}   r²  r/   r¸   r  r]   rO   rV   r~   rœ  r   ÚnowÚ	isoformatr   rR   r   r®  r¯  r°  r±  Úgetvaluer[   r\   ra   Úwrite_bytesrb   rc   )rˆ   r¼  rz   ÚbufferÚserialized_ckpts        rŽ   rm  zBaseTrainer.save_modelw  sê  € ãä”| D§H¡H§L¡LÓ1Ó2×7Ñ7Ó9ˆÜÑm°C·N±NÓ4D×4KÑ4KÓ4MÔmÔmÜ�N‰NÐ?ÀÇ
Á
¸|ÐKaÐbÔcØð —‘“ˆÜ�
‰
àŸ™Ø $× 1Ñ 1ØØØŸ8™8×+Ñ+ÜAÄ(È4Ï>É>×KdÑKdÓKfÓBgÓhØŸ+™+×0Ñ0Ó2Ü" 4§9¡9›oØ!N D§L¡LÐ!N°YÀÇÁÐ4MÐ!NØ!%×!6Ñ!6Ó!8Ü Ÿ™›×0Ñ0Ó2Ü&ä¤§¡›MÜ!Ÿj™jÜ!Ÿj™jÜ!Ÿj™jñ	ð HØ6ñ)ð, ô/	
ð2 !Ÿ/™/Ó+ˆð 	�	‰	�‰ ¨tˆÔ4Ø�	‰	×Ñ˜oÔ.Ø×Ñ §¡Ò,Ø�I‰I×!Ñ! /Ô2Ø×Ñ˜qÒ  t§z¡z°D×4DÑ4DÑ'DÈÒ'IØ�Y‰Y˜5 §¡ ¨CÐ0Ñ0×=Ñ=¸oÔNØr–   c           	     óÜ  — 	 t        | j                  j                  «      | j                  _        | j                  j                  dk(  r t	        | j                  j                  «      }nƒt        | j                  j                  «      j                  dd«      d   dv s| j                  j                  dv r7t        | j                  j                  «      }d|v r|d   | j                  _        | j                  j                  r!t        j                  d«       ddid<   d|d<   S # t        $ r=}t        t        dt        | j                  j                  «      › d	|› �«      «      |‚d
}~ww xY w)z·Get train and validation datasets from data dictionary.

        Returns:
            (dict): A dictionary containing the training/validation/test dataset and category names.
        Úclassifyr�   r=   rA   >   Úymlr4  >   rÍ   ÚposeÚdetectÚsegmentÚ	yaml_filez	Dataset 'u   ' error â�Œ Nz)Overriding class names with single class.r   Úitemr6  r5  )r   rO   ry   rÔ   r   rR   Úrsplitr   r¨   ÚRuntimeErrorr   r   Ú
single_clsr   r¤   )rˆ   ry   r¬   s      rŽ   rx   zBaseTrainer.get_dataset¦  s(  € ð	fÜ=¸d¿i¹i¿n¹nÓMˆD�I‰IŒNð �y‰y�~‰~ Ò+Ü(¨¯©¯©Ó8‘Ü�T—Y‘Y—^‘^Ó$×+Ñ+¨C°Ó3°BÑ7¸?ÑJÈdÏiÉiÏnÉnð añ Oô )¨¯©¯©Ó8�Ø $Ñ&Ø%)¨+Ñ%6�D—I‘I”Nð �9‰9×ÒÜ�K‰KÐCÔDØ ˜KˆD�‰MØˆD�‰JØˆøô ò 	fÜœv¨	´)¸D¿I¹I¿N¹NÓ2KÐ1LÈLÐYZÐX[Ð&\Ó]Ó^ÐdeÐeûð	fús   ‚C*D% Ä%	E+Ä.8E&Å&E+c                óì  — t        | j                  t        j                  j                  «      ry| j                  d}}d}t        | j                  «      j                  d«      r%t        | j                  «      \  }}|j                  }nLt        | j                  j                  t
        t        f«      r"t        | j                  j                  «      \  }}| j                  ||t        dv ¬«      | _        |S )z«Load, create, or download model for any task.

        Returns:
            (dict | None): Checkpoint to resume training from, or None if no checkpoint is loaded.
        Nr»  r@   )r‰   r?   Úverbose)rk   rw   rp   r   ÚModulerR   Úendswithr   r4  rO   Ú
pretrainedr	   Ú	get_modelr   )rˆ   r‰   r?   r  Ú_s        rŽ   rô   zBaseTrainer.setup_modelÃ  s¯   € ô �d—j‘j¤%§(¡(§/¡/Ô2Øà—z‘z 4ˆWˆØˆÜˆt�z‰z‹?×#Ñ# EÔ*Ü+¨D¯J©JÓ7‰MˆG�TØ—,‘,‰CÜ˜Ÿ	™	×,Ñ,¬s´D¨kÔ:Ü(¨¯©×)=Ñ)=Ó>‰JˆG�QØ—^‘^¨°WÄdÈgÀo�^ÓVˆŒ
Øˆr–   c                óê  — | j                   j                  | j                  «       t        j                  j
                  j                  | j                  j                  «       d¬«       | j                   j                  | j                  «       | j                   j                  «        | j                  j                  «        | j                  r&| j                  j                  | j                  «       yy)zVPerform a single step of the training optimizer with gradient clipping and EMA update.g      $@)Úmax_normN)r  Úunscale_r¸   rp   r   ÚutilsÚclip_grad_norm_rw   Ú
parametersrL  r2  rF  rz   r¹   s    rŽ   r`  zBaseTrainer.optimizer_stepÖ  s–   € à�‰×Ñ˜TŸ^™^Ô,Ü�‰�‰×&Ñ& t§z¡z×'<Ñ'<Ó'>ÈÐ&ÔNØ�‰×Ñ˜Ÿ™Ô(Ø�‰×ÑÔØ�‰× Ñ Ô"Ø�8Š8Ø�H‰H�O‰O˜DŸJ™JÕ'ð r–   c                ó   — |S )zTAllow custom preprocessing of model inputs and ground truths depending on task type.rã   )rˆ   rd   s     rŽ   rY  zBaseTrainer.preprocess_batchà  s   € àˆr–   c                óº  — | j                   rO| j                  dkD  r@| j                   j                   j                  «       D ]  }t        j                  |d¬«       Œ | j                  | «      }|€y|j                  d| j                  j                  «       j                  «       j                  «        «      }| j                  r| j                  |k  r|| _        ||fS )aP  Run validation on val set using self.validator.

        Returns:
            (tuple): A tuple containing:
                - metrics (dict | None): Dictionary of validation metrics, or None if validation was skipped.
                - fitness (float | None): Fitness score for the validation, or None if validation was skipped.
        r=   r   rè   rž   r~   )rz   rt   ÚbuffersrÅ   r  rU   rM   r   ÚdetachrG   Únumpyr}   )rˆ   rÅ  rV   r~   s       rŽ   rj  zBaseTrainer.validateä  sµ   € ð �8Š8˜Ÿ™¨!Ò+àŸ(™(Ÿ,™,×.Ñ.Ó0ò .�Ü—‘˜v¨1Ö-ð.à—.‘. Ó&ˆØˆ?ØØ—+‘+˜i¨$¯)©)×*:Ñ*:Ó*<×*@Ñ*@Ó*B×*HÑ*HÓ*JÐ)JÓKˆØ× Ò  D×$5Ñ$5¸Ò$?Ø 'ˆDÔØ˜ÐÐr–   c                ó   — t        d«      ‚)z>Get model and raise NotImplementedError for loading cfg files.z3This task trainer doesn't support loading cfg files©ÚNotImplementedError)rˆ   r‰   r?   rÓ  s       rŽ   r×  zBaseTrainer.get_modelø  s   € ä!Ð"WÓXÐXr–   c                ó   — t        d«      ‚)z>Raise NotImplementedError (must be implemented by subclasses).z1get_validator function not implemented in trainerrå  r¹   s    rŽ   r  zBaseTrainer.get_validatorü  ó   € ä!Ð"UÓVÐVr–   c                ó   — t        d«      ‚)zVRaise NotImplementedError (must return a `torch.utils.data.DataLoader` in subclasses).z2get_dataloader function not implemented in trainerrå  )rˆ   Údataset_pathre   rÃ   rÊ   s        rŽ   rÒ   zBaseTrainer.get_dataloader   s   € ä!Ð"VÓWÐWr–   c                ó   — t        d«      ‚)zBuild dataset.z1build_dataset function not implemented in trainerrå  )rˆ   Úimg_pathrÊ   rd   s       rŽ   Úbuild_datasetzBaseTrainer.build_dataset  rè  r–   c                ó   — |�d|iS dgS )zÚReturn a loss dict with labeled training loss items, or a list of loss names if loss_items is None.

        Notes:
            This is not needed for classification but necessary for segmentation & detection.
        r   rã   )rˆ   rZ  rñ   s      rŽ   r  zBaseTrainer.label_loss_items  s   € ð (2Ð'=�˜
Ð#ÐKÀFÀ8ÐKr–   c                ó@   — | j                   d   | j                  _        y)z/Set or update model parameters before training.r6  N)ry   rw   r6  r¹   s    rŽ   rö   z BaseTrainer.set_model_attributes  s   € àŸ9™9 WÑ-ˆ�
‰
Õr–   c                 ó   — y)zSCompute and set class weights for handling class imbalance. Override in subclasses.Nrã   r¹   s    rŽ   r  zBaseTrainer.set_class_weights  ó   € àr–   c                 ó   — y)z-Build target tensors for training YOLO model.Nrã   )rˆ   rx  Útargetss      rŽ   Úbuild_targetszBaseTrainer.build_targets  rñ  r–   c                 ó   — y)z-Return a string describing training progress.Ú rã   r¹   s    rŽ   rS  zBaseTrainer.progress_string  s   € àr–   c                 ó   — y)z+Plot training samples during YOLO training.Nrã   )rˆ   rd   rv  s      rŽ   rf  z!BaseTrainer.plot_training_samples!  rñ  r–   c                 ó   — y)z$Plot training labels for YOLO model.Nrã   r¹   s    rŽ   r  z BaseTrainer.plot_training_labels%  rñ  r–   c                ó`  — t        |j                  «       «      t        |j                  «       «      }}t        |«      dz   }t	        j                  «       | j
                  z
  }| j                  j                  j                  dd¬«       | j                  j                  «       rdnd|z  ddg|¢­z  j                  d«      d	z   }t        | j                  d
d¬«      5 }|j                  |d|z  | j                  dz   |g|¢­z  j                  d«      z   d	z   «       ddd«       y# 1 sw Y   yxY w)z$Save training metrics to a CSV file.rL   TrB   rö  z%s,rH  r@  rI   r;  Úazutf-8)Úencodingz%.6g,r=   N)ro   r  r¿  rl   r@  rB  r‚   Úparentr\   rƒ   ÚrstripÚopenÚwriterH  )rˆ   rV   r  Úvalsr   r�   ÚsrŸ  s           rŽ   rl  zBaseTrainer.save_metrics)  s  € ä˜'Ÿ,™,›.Ó)¬4°·±Ó0@Ó+AˆdˆÜ�‹L˜1ÑˆÜ�I‰I‹K˜$×/Ñ/Ñ/ˆØ�‰�‰×Ñ d°TÐÔ:Ø—(‘(—/‘/Ô#‰B¨%°!©)°wÀÐ6NÈÑ6NÑ*N×)VÑ)VÐWZÓ)[Ð^bÑ)bˆÜ�$—(‘(˜C¨'Ô2ð 	W°aØ�G‰G�A˜ 1™¨¯
©
°Q©¸Ð'A¸DÑ'AÑA×IÑIÈ#ÓNÑNÐQUÑUÔV÷	W÷ 	Wñ 	Wús   Ã?D$Ä$D-c                óF   — t        | j                  | j                  ¬«       y)zPlot metrics from a CSV file.)r«   Úon_plotN)r)   r‚   r  r¹   s    rŽ   ro  zBaseTrainer.plot_metrics3  s   € ä˜$Ÿ(™(¨D¯L©LÖ9r–   c                ób   — t        |«      }|t        j                  «       dœ| j                  |<   y)z2Register plots (e.g. to be consumed in callbacks).)ry   Ú	timestampN)r	   r@  rW   )rˆ   rZ   ry   Úpaths       rŽ   r  zBaseTrainer.on_plot7  s$   € ä�D‹zˆØ$(´t·y±y³{ÑCˆ�
‰
�4Òr–   c                ó¶  — | j                   j                  «       r| j                   nd}t        t        «      5  t        dv r[| j
                  j                  «       rt        | j
                  «      ni }|r(t        | j                   d|j                  d«      i¬«       ddd«       |r¨t        j                  d|› d�«       | j                  j                  | j                  j                  _        d| j                  j                  _        | j                  |¬«      | _        | j                  j                  d	d«       | j!                  d
«       yy# 1 sw Y   Œ´xY w)z;Perform final evaluation and validation for the YOLO model.Nr@   rµ  )r²  z
Validating z...F)rw   r~   r:  )rb   rƒ   r4   r   r   ra   r3   r^   r   r¤   rO   rW   rU   r÷   rV   rM   rv   )rˆ   rw   r  s      rŽ   rn  zBaseTrainer.final_eval<  s  € à!ŸY™Y×-Ñ-Ô/�—	’	°TˆÜ)¬*Ó5ñ 	eÜ�w‰Ø59·Y±Y×5EÑ5EÔ5G” t§y¡yÔ1ÈR�Ùä# D§I¡I¸ÈÏÉÐRaÓIbÐ7cÕd÷	eñ Ü�K‰K˜-¨ w¨cÐ2Ô3Ø(,¯	©	¯©ˆD�N‰N×ÑÔ%Ø*/ˆD�N‰N×ÑÔ'ØŸ>™>°˜>Ó6ˆDŒLØ�L‰L×Ñ˜Y¨Ô-Ø×ÑÐ1Õ2ð ÷	eð 	eús   ¸A$EÅEc                ó  — | j                   j                  }|�rJ	 t        |t        t        f«      xr t	        |«      j                  «       }t	        |rt        |«      n	t        «       «      }t        |«      d   j                   }t        |d   t        «      s5t	        |d   «      j                  «       s| j                   j                  |d<   d}t        |«      | _         t        |«      x| j                   _        | j                   _        dD ]!  }||v sŒt        | j                   |||   «       Œ# |j                  d«      �t        j                   d|d   › d�«       || _        y|| _        y# t"        $ r}t%        d	«      |‚d}~ww xY w)
zCCheck if resume checkpoint exists and update arguments accordingly.r   ry   T)r	  rd   rQ   rD  rE   rc   ri   Úcacherò   r@  rø   rË   rW   rE   Na  Custom Albumentations transforms were used in the original training run but are not being restored. To preserve custom augmentations when resuming, you need to pass the 'augmentations' parameter again to get expected results. Example: 
model.train(resume=True, augmentations=ú)zzResume checkpoint not found. Please pass a valid checkpoint to resume from, i.e. 'yolo train resume model=path/to/last.pt')rO   r„   rk   rR   r	   rƒ   r"   r(   r   r  ry   r   rw   Úsetattrr^   r   r¢   r¨   ÚFileNotFoundError)rˆ   rŠ   r„   rƒ   ra   Ú	ckpt_argsrå   r¬   s           rŽ   rP   zBaseTrainer.check_resumeM  sk  € à—‘×!Ñ!ˆÚð*Ü# F¬S´$¨KÓ8ÒR¼TÀ&»\×=PÑ=PÓ=R�Ü±&œJ vÔ.¼nÓ>NÓO�Ü+¨DÓ1°!Ñ4×9Ñ9�	Ü! )¨FÑ"3´TÔ:Ä4È	ÐRXÑHYÓCZ×CaÑCaÔCcØ(,¯	©	¯©�I˜fÑ%à�Ü# IÓ.�”	Ü58¸³YÐ>�—	‘	” $§)¡)Ô"2ðò <�Að ˜I’~Ü §	¡	¨1¨i¸©lÕ;ð!<ð& —=‘= Ó1Ð=ä—N‘NðBð CLÈOÑB\ÐA]Ð]^ð`ôð ˆ��fˆ�øô ò Ü'ðEóð ðûðús   ›C7E, ÄA	E, Å,	FÅ5FÆFc                ó  — |j                  d«      �| j                  j                  |d   «       |j                  d«      �| j                  j                  |d   «       | j                  rƒ|j                  d«      rrt        | j                  «      | _        | j                  j                  j                  |d   j                  «       j                  «       «       |d   | j                  _	        |j                  dd«      | _
        y)z>Load optimizer, scaler, EMA, and best_fitness from checkpoint.r¸   Nr  rz   r²  r}   r)  )r^   r¸   Úload_state_dictr  rz   r,   rw   Úfloatr¾  r²  r}   )rˆ   r  s     rŽ   Ú_load_checkpoint_statez"BaseTrainer._load_checkpoint_state~  s½   € à�8‰8�KÓ Ð,Ø�N‰N×*Ñ*¨4°Ñ+<Ô=Ø�8‰8�HÓÐ)Ø�K‰K×'Ñ'¨¨X©Ô7Ø�8Š8˜Ÿ™ œÜ §
¡
Ó+ˆDŒHØ�H‰H�L‰L×(Ñ(¨¨e©×):Ñ):Ó)<×)GÑ)GÓ)IÔJØ# I™ˆD�H‰HÔØ ŸH™H ^°SÓ9ˆÕr–   c                óº  — | j                   duxr | j                   j                  «        }| j                  duxr  t        j                  | j                  «       }| j                  xr  | j                  dkD  xr | j                  dk(  }t
        dv xr
 |xr |xs |}|rdn|rdnd}t
        dk7  r)t
        dk(  r|ndg}t        j                  |d«       |d   }|sy|| j                  k(  rt        j                  |› d	�«       y| j                  j                  «       st        |› d
�«      ‚| xj                  dz  c_        | j                  dkD  rt        d| j                  › d�«      ‚t        j                  |› d| j                  › d�«       | j                  «        t!        | j                  «      \  }}	|	d   j#                  «       j%                  «       }
t'        d„ |
j)                  «       D «       «      st        d| j                  › d�«      ‚t+        | j,                  «      j/                  |
«       | j1                  |	«       ~	~
|dz
  | j2                  _        y)zUDetect and recover from NaN/Inf loss and fitness collapse by loading last checkpoint.Nr   r@   zLoss NaN/InfzFitness NaN/InfzFitness collapserA   Fz- detected but can not recover from last.pt...z8 detected but no valid last.pt is available for recoveryr=   r,  z#Training failed: NaN persisted for z epochsz detected (attempt z/3), recovering from last.pt...rz   c              3  ó˜   K  — | ]B  }t        |t        j                  «      sŒt        j                  |«      j	                  «       –— ŒD y ­wrâ   r¨  r¬  s     rŽ   ræ   z3BaseTrainer._handle_nan_recovery.<locals>.<genexpr>£  s3   è ø€ Òf¨qÌ*ÐUVÔX]×XdÑXdÕJe”5—>‘> !Ó$×(Ñ(×*Ñfùr­  zCheckpoint z" is corrupted with NaN/Inf weightsT)r   rª  r~   rT  r}   r   rÅ   ra  rg   r   r¢   ra   rƒ   rÐ  r‡   rM  r   r  r¾  r«  r¿  r6   rw   r  r  r|   r  )rˆ   rH  Úloss_nanÚfitness_nanÚfitness_collapseÚ	corruptedÚreasonrz  rØ  r  Ú	ema_states              rŽ   rk  z BaseTrainer._handle_nan_recoveryŠ  s  € à—9‘9 DÐ(ÒE°·±×1CÑ1CÓ1EÐ-EˆØ—l‘l¨$Ð.ÒP´r·{±{À4Ç<Á<Ó7PÐ3PˆØ×,Ñ,Ò\°×1BÑ1BÀQÑ1FÒ\È4Ï<É<Ð[\ÑK\ÐÜ˜G�OÒV¨ÒV°kÒ6UÐEUˆ	Ù#+‘ÁkÑ1BÐWiˆÜ�2Š:Ü+/°1ª9™i¸$Ð?ˆNÜ×&Ñ& ~°qÔ9Ø& qÑ)ˆIÙØØ�D×$Ñ$Ò$Ü�N‰N˜f˜XÐ%RÐSÔTØØ�y‰y×ÑÔ!Ü & Ð)aÐbÓcÐcØ×"Ò" aÑ'Õ"Ø×%Ñ%¨Ò)ÜÐ!DÀT×E_ÑE_ÐD`Ð`gÐhÓiÐiÜ�‰˜&˜Ð!4°T×5OÑ5OÐ4PÐPoÐpÔqØ×ÑÔÜ! $§)¡)Ó,‰ˆˆ4Ø˜‘K×%Ñ%Ó'×2Ñ2Ó4ˆ	ÜÑf°I×4DÑ4DÓ4FÔfÔfÜ ¨T¯Y©Y¨KÐ7YÐZÓ[Ð[Ü�T—Z‘ZÓ ×0Ñ0°Ô;Ø×#Ñ# DÔ)Ø�)Ø$)¨A¡Iˆ�‰Ô!Ør–   c           	     ó  — |�| j                   sy|j                  dd«      dz   }|dkD  sBJ | j                  j                  › d| j                  › d| j                  j                  › d�«       ‚t        j                  d	| j                  j                  › d
|dz   › d| j                  › d�«       | j                  |k  rMt        j                  | j                  › d|d   › d| j                  › d�«       | xj                  |d   z  c_        | j                  |«       t        t        | j                  «      dd«      r�t        | j                  «      j                  «       t        | j                  «      _        |dz
  t        | j                  «      j                  _        t        | j                  «      j                  j                  «        || _        || j                  | j                  j                  z
  kD  r| j!                  «        yy)z-Resume YOLO training from a given checkpoint.NrH  rA   r=   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.Úend2endF)r„   r^   rO   rw   rf   r   r¤   r  Úgetattrr6   Úinit_criterionrg  r²  r2  rg   rD  rQ  )rˆ   r  rg   s      rŽ   r  zBaseTrainer.resume_training«  s°  € àˆ<˜tŸ{š{ØØ—h‘h˜w¨Ó+¨aÑ/ˆØ˜QŠð 	
Ø�y‰y�‰Ð˜}¨T¯[©[¨Mð :MØMQÏYÉYÏ_É_ÐL]Ð]^ð`ó	
ˆô 	�‰Ð(¨¯©¯©Ð(9¸ÀkÐTUÁoÐEVÐVZÐ[_×[fÑ[fÐZgÐgtÐuÔvØ�;‰;˜Ò$Ü�K‰KØ—:‘:�,Ð4°T¸'±]°OÐC\Ð]a×]hÑ]hÐ\iÐivÐwôð �KŠK˜4 ™=Ñ(�KØ×#Ñ# DÔ)Ü”< §
¡
Ó+¨Y¸Ô>ä1=¸d¿j¹jÓ1I×1XÑ1XÓ1ZŒL˜Ÿ™Ó$Ô.Ø9DÀq¹ŒL˜Ÿ™Ó$×.Ñ.Ô6Ü˜Ÿ™Ó$×.Ñ.×5Ñ5Ô7Ø&ˆÔØ˜$Ÿ+™+¨¯	©	×(>Ñ(>Ñ>Ò?Ø×)Ñ)Õ+ð @r–   c                óX  — t        | j                  j                  d«      rd| j                  j                  _        t        | j                  j                  d«      rOt	        j
                  d«       | j                  j                  j                  t        | j                  «      ¬«       yy)z5Update dataloaders to stop using mosaic augmentation.ÚmosaicFrD  zClosing dataloader mosaic)ÚhypN)	r  rÓ   rÜ   r  r   r¤   rD  r   rO   r¹   s    rŽ   rQ  z$BaseTrainer._close_dataloader_mosaicÄ  sy   € ä�4×$Ñ$×,Ñ,¨hÔ7Ø/4ˆD×Ñ×%Ñ%Ô,Ü�4×$Ñ$×,Ñ,¨nÔ=Ü�K‰KÐ3Ô4Ø×Ñ×%Ñ%×2Ñ2´t¸D¿I¹I³Ð2ÕGð >r–   c                óä  — i i i i g}t        d„ t        j                  j                  «       D «       «      }|dk(  ržt	        j
                  t        d«      › d| j                  j                  › d| j                  j                  › d�«       | j                  j                  dd«      }	t        d	d
|	z   z  d«      }
|dkD  rdnd|
df\  }}}d| j                  _        |dk(  }t        |«      j                  «       D ]r  \  }}|j!                  d¬«      D ]X  \  }}|r|› d|› �n|}|j"                  dk\  r|r	||d   |<   Œ+d|v r	||d   |<   Œ8t%        ||«      sd|v r	||d   |<   ŒQ||d   |<   ŒZ Œt |s |dd D �cg c]  }|j'                  «       ‘Œ }}h d£}|D �ci c]  }|j)                  «       |“Œ c}j                  |j)                  «       «      }|dv rt+        ||dfd¬«      }n>|d k(  rt+        ||¬!«      }n+|d"k(  s|dk(  rt+        ||d#¬$«      }nt-        d%|› d&|› d'�«      ‚t/        |d   «      t/        |d   «      t/        |d   «      g}d(|d   i|¥d)di¥|d<   d(|d   i|¥|d*d+œ¥|d<   d(|d   i|¥dd,d+œ¥|d<   d-\  }}|rÞt/        |d   «      |d<   d(|d   i|¥|d#d.d/œ¥|d<   ddl}|j3                  d0«      }g }|D ]�  }|j5                  d(«      }|j                  «       D ��cg c]  \  }}|j7                  |«      sŒ|‘Œ }}}|j                  «       D ��cg c]  \  }}|j7                  |«      rŒ|‘Œ }}}|j9                  d(|i|¥d1|dz  i¥d(|i|¥g«       ŒŸ |} t;        t<        |t?        t@        ||¬2«      «      |¬3«      }t	        j
                  t        d«      › d4tC        |«      jD                  › d5|› d6|› d7|d   › d8|d   › d9|› d:|d   › d;�«       |S c c}w c c}w c c}}w c c}}w )<aÖ  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.
            lr (float, optional): The learning rate for the optimizer.
            momentum (float, optional): The momentum factor for the optimizer.
            decay (float, optional): The weight decay for the optimizer.
            iterations (float, optional): The number of iterations, which determines the optimizer if name is 'auto'.

        Returns:
            (torch.optim.Optimizer): The constructed optimizer.
        c              3  ó0   K  — | ]  \  }}d |v sŒ|–— Œ y­w)ÚNormNrã   )rä   rå   r  s      rŽ   ræ   z.BaseTrainer.build_optimizer.<locals>.<genexpr>Ü  s   è ø€ ÒD™˜˜A¸À!º”1ÑDùs   ‚�Úautoz
optimizer:z' 'optimizer=auto' found, ignoring 'lr0=z' and 'momentum=zJ' and determining best 'optimizer', 'lr0' and 'momentum' automatically... r5  é
   ç{®Gáz„?é   é   i'  )r   r&  çÍÌÌÌÌÌì?ÚAdamWr)  r)  r   F)Úrecurser�   rL   r,  r(  Úlogit_scaler=   r   N>	   ÚSGDÚAdamr$  r*  r   ÚNAdamÚRAdamÚAdamaxÚRMSProp>   r.  r*  r/  r0  r1  g+‡ÙÎ÷ï?)rÎ   ÚbetasrÙ   r2  )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'  Úweight)rÙ   r'  Úbn)gš™™™™™É?r›   Úmuon)rÙ   Úuse_muonr'  z(?=.*23)(?=.*cv3)|proto\.semsegrÎ   )r8  Úsgd)r5  rŸ   z(lr=z, momentum=z) with parameter groups z weight(decay=0.0), z weight(decay=z), z bias(decay=0.0))#rn   r   Ú__dict__Úitemsr   r¤   r   rO   rÞ   rÏ   ry   r^   rÖ   rW  r6   r¡  rü   Úndimrk   r¿  Úlowerr  ræ  rl   Úrer÷   rM   ÚsearchrE  r  r   r   r   rh   Ú__name__) rˆ   rw   rZ   rÎ   rÏ   rÐ   rÑ   Úgr7  r5  Úlr_fitr9  Úmodule_nameÚmoduleÚ
param_nameÚparamÚfullnamer²   Ú
optimizersÚ
optim_argsÚ
num_paramsr8  r:  r?  ÚpatternÚg_Úprå   r  Úp1Úp2r¸   s                                    rŽ   rÝ   zBaseTrainer.build_optimizerÌ  s}  € ð ��R˜ÐˆÜÑD¤§¡×!2Ñ!2Ó!4ÔDÓDˆØ�6Š>Ü�K‰KÜ˜LÓ)Ð*ð +!Ø!%§¡§¡ Ð/?ÀÇ	Á	×@RÑ@RÐ?Sð TWðXôð
 —‘—‘˜t RÓ(ˆBÜ˜9¨¨B©Ñ/°Ó3ˆFØ9CÀeÒ9KÑ!5ÐRYÐ[aÐcfÐQgÑˆD�"�hØ'*ˆD�I‰IÔ$à˜7‘?ˆÜ#/°Ó#6×#DÑ#DÓ#Fò 	+ÑˆK˜Ø%+×%<Ñ%<ÀUÐ%<Ó%Kò 
+Ñ!�
˜EÙ<G˜k˜]¨!¨J¨<Ñ8ÈZ�Ø—:‘: ’?¡xØ%*�A�a‘D˜’NØ˜xÑ'Ø%*�A�a‘D˜’NÜ ¨Ô+¨}ÀÑ/Hà%*�A�a‘D˜’Nà%*�A�a‘D˜’Nñ
+ð	+ñ Ø%& r¨ UÖ+ �—‘•Ð+ˆAÐ+âeˆ
Ø&0Ö1 �—‘“	˜1‘Ò1×5Ñ5°d·j±j³lÓCˆØÐ@Ñ@Ü ¨H°eÐ+<È3ÔO‰JØ�YÒÜ ¨hÔ7‰JØ�UŠ]˜d gšoÜ ¨hÀÔF‰Jä%Ø˜d˜VÐ#OÐPZÈ|ð \ið ióð ô
 ˜!˜A™$“i¤ Q q¡T£¬C°°!±«IÐ6ˆ
Ø˜!˜A™$ÐD *ÐD¨m¸VÑDˆˆ!‰Ø˜!˜A™$Ð] *Ð]¸eÐT\Ò]ˆˆ!‰Ø˜!˜A™$ÐW *ÐW¸cÐRVÒWˆˆ!‰Ø‰	ˆˆcÙÜ  !¡›IˆJ�q‰MØ˜a ™dÐq jÐqÀ%ÐUYÐjpÒqˆAˆa‰DÛð —j‘jÐ!CÓDˆGØˆBØò T�Ø—E‘E˜(“O�Ø$%§G¡G£I×C™D˜A˜q°·±ÀÕ1B’aÐC�ÑCØ$%§G¡G£I×G™D˜A˜q°W·^±^ÀAÕ5F’aÐG�ÑGØ—	‘	˜H bÐ<¨AÐ<¨t°R¸!±VÑ<¸xÈÐ>QÈqÐ>QÐRÕSð	Tð
 ˆAØL”GœE 4¬´¸TÀsÔ)KÓLÐTUÔVˆ	ä�‰Ü˜Ó%Ð& a¬¨Y«×(@Ñ(@Ð'AÀÀbÀTÈÐU]ÐT^Ð^vØ˜!‰}ˆoÐ1°*¸Q±-°ÀÈuÈgÐUXÐYcÐdeÑYfÐXgÐgwðyô	
ð ÐùòS ,ùò 2ùó8 DùÛGs$   Å4OÆO!Ë%O&Ë?O&ÌO,Ì3O,)r‹   zdict | None)r“   rR   r…  )Frâ   )r”  zfloat | None)NNT)é   r   r­   )r­   N)Nr­   )r$  gü©ñÒMbP?r)  gñhãˆµøä>g     jø@)/rA  Ú
__module__Ú__qualname__Ú__doc__r   r�   r•   r˜   rv   r­   rº   rÈ   rß   r  r©   r  rd  r_  rœ  rM  rm  rx   rô   r`  rY  rj  r×  r  rÒ   rí  r  rö   r  rô  rS  rf  r  rl  ro  r  rn  rP   r  rk  r  rQ  rÝ   rã   r–   rŽ   r8   r8   C   sø   „ ñ/ðb '°$ÐRVô W'ór/ó+óò
ò:Xò

ò ò4E6òNP'ód

óXô%òòò-ò^ò:ò&(òò ó(YòWóXóWóLò.òòòò
òòWò:óDò
3ò"/òb
:òòB,ò2HôSr–   r8   )OrT  Ú
__future__r   r‘  rÚ   rS   r¦   r@  rI  r   r   r   r   Ú	functoolsr   Úpathlibr	   rã  rT  rp   r
   rÅ   r   r   Úultralyticsr   Úultralytics.cfgr   r   Úultralytics.data.utilsr   r   r   Úultralytics.nn.tasksr   Úultralytics.optimr   Úultralytics.utilsr   r   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.plottingr)   Úultralytics.utils.torch_utilsr*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r8   rã   r–   rŽ   ú<module>rd     s“   ðñõ #ã 	Û Û 	Û Û Û ß ß (Ý Ý ã Û Ý %ß å #ß 1ß iÑ iÝ 0Ý #÷÷ ÷ ñ õ ?ß oÕ oß DÝ 2Ý 3÷÷ ÷ õ ÷"\ò \r–   