o
    ™ÄŽi…“  ã                   @   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 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 ddlZddlmZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZ ee ƒ !¡ Z"e"j#d Z$e%e$ƒej&vr€ej& 'e%e$ƒ¡ eej& (e$e )¡ ¡ƒZ$ddl*m+Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z:m;Z;m<Z< ddl=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZU ddlVmWZW ddlXmYZY ddlZm[Z[ ddl\m]Z] ddl^m_Z_ ddl`maZambZbmcZcmdZdmeZemfZfmgZgmhZh eie jdd¡ƒZkeie jdd¡ƒZleie jdd¡ƒZmdejnd< d d!„ Zod,d#d$„Zpe6ƒ fd%d&„Zqd'd(„ Zrd)d*„ Zsetd+krhepƒ Zueqeuƒ dS dS )-aå  
Train a YOLOv5 model on a custom dataset.
Models and datasets download automatically from the latest YOLOv5 release.

Usage - Single-GPU training:
    $ yolov5 train --data coco128.yaml --weights yolov5s.pt --img 640  # from pretrained (recommended)
    $ yolov5 train --data coco128.yaml --weights '' --cfg yolov5s.yaml --img 640  # from scratch

Usage - Multi-GPU DDP training:
    $ python -m torch.distributed.run --nproc_per_node 4 --master_port 1 train.py --data coco128.yaml --weights yolov5s.pt --img 640 --device 0,1,2,3

Models:     https://github.com/ultralytics/yolov5/tree/master/models
Datasets:   https://github.com/ultralytics/yolov5/tree/master/data
Tutorial:   https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data
é    N)Údeepcopy)Údatetime)ÚPath)Úlr_scheduler)Útqdm)Úconvert_coco_dataset_to_yoloÚpush_to_hfhubÚupload_to_s3)Ú__version__)ÚRoboflowConnector)Úattempt_load)ÚModel)Úcheck_anchors)Úcheck_train_batch_size)Ú	Callbacks)Úcreate_dataloader)Úattempt_downloadÚis_urlÚattempt_download_from_hub)ÚLOGGERÚTQDM_BAR_FORMATÚ	check_ampÚcheck_datasetÚ
check_fileÚcheck_git_infoÚcheck_git_statusÚcheck_img_sizeÚcheck_requirementsÚcheck_suffixÚ
check_yamlÚcolorstrÚget_latest_runÚincrement_pathÚ
init_seedsÚintersect_dictsÚlabels_to_class_weightsÚlabels_to_image_weightsÚmethodsÚ	one_cycleÚ
print_argsÚprint_mutationÚstrip_optimizerÚ	yaml_save)ÚLoggers)Úcheck_comet_resume)ÚComputeLoss)Úfitness)Úplot_evolve)ÚEarlyStoppingÚModelEMAÚde_parallelÚselect_deviceÚ	smart_DDPÚsmart_optimizerÚsmart_resumeÚtorch_distributed_zero_firstÚ
LOCAL_RANKéÿÿÿÿÚRANKÚ
WORLD_SIZEé   ÚTrueÚKMP_DUPLICATE_LIB_OKc           Z         sP  t |jƒ|j|j|j|j|j|j|j|j	|j
|j|j|jf\}‰ }}}}}	}
}}}}}| d¡ t||ƒ |d }|r>|jn|jddd |d |d }}tˆtƒrntˆdd}t |¡‰W d   ƒ n1 siw   Y  t td	ƒd
 dd„ ˆ ¡ D ƒ¡ ¡ ˆ ¡ |_|s˜t|d ˆƒ t|d t|ƒƒ | ož|j  }|j!dk}t"|j#d t$ dd t%t&ƒ t'|jƒ}W d   ƒ n1 sÃw   Y  |d |d }}|rÕdnt(|d ƒ}|rét)|d ƒdkréddin|d }t|tƒoö| *d¡}t$dv r/t+|||ˆt|j,t-| .¡ ƒd}t/|ƒD ]‰|j0ˆt1|ˆƒd q|r/|j|j|j|jf\}‰ ‰}|j2r=|j3r=t4||	|ƒ t5|d d}|d urJ|}t6|dƒ | *d¡}|rÉt%t&ƒ t7|ƒ}W d   ƒ n	1 skw   Y  t8j9|dd}t:|
p|d jd |ˆ ;d!¡d" <|¡} |
s”ˆ ;d!¡rš|sšd#gng }!|d  =¡  >¡ }"t?|"|  >¡ |!d$}"| j@|"d%d& t d't)|"ƒ› d(t)|  >¡ ƒ› d)|› ¡ nt:|
d |ˆ ;d!¡d" <|¡} tA| ƒ}#t|t(ƒrä|g}d*d+„ t)|ƒdkrð|ntB|d ƒD ƒ}|  C¡ D ]\‰}$d|$_DtE‡fd,d„|D ƒƒrt d-ˆ› ¡ d%|$_DqütFt(| jG F¡ ƒd.ƒ‰tH|jIˆˆd/ d0}%t$d1krG|d1krGtJ| |%|#ƒ}| Kd2|i¡ d3}&tFtL|&| ƒdƒ}'ˆd4  ||' |& 9  < tM| |jNˆd5 ˆd6 ˆd4 ƒ}(|jOrztPdˆd7 ˆ ƒ})n‡ ‡fd8d9„})tQjR|(|)d:}*t$dv r‘tS| ƒnd }+d;\},}-|r«|r©tT||(|+|ˆ |ƒ\},}-‰ ~~"|rÆt$d1krÆt8jU V¡ dkrÆt Wd<¡ t8jX Y| ¡} |jZrá|rát$d1krát8jXj[ \| ¡ <|¡} t d=¡ t]||%|t^ ˆ|ˆd|j_dkród n|j_|j`t&||ja|jbtd>ƒd|j#d?\}.}/tc d|/jed¡}0t(|0d d …df  F¡ ƒ}1|1|k s2J d@|1› dA|› dB|	› dC|d › ƒ‚t$dv rut]||%|t^ d/ ˆ|ˆ|rGd n|j_dd1|d/ dDtdEƒdFd }2|sn|jfshtg|/| ˆdG |%dH |  h¡  =¡  | dI|0|¡ |rt$d1krti| ƒ} tj| ƒjkd1 jl}3ˆdJ  d |3 9  < ˆdK  |dL d  |3 9  < ˆdM  |%dN d/ d  |3 9  < |jmˆdO< || _nˆ| _to|/je|ƒ <|¡| | _p|| _qtr r¡ }4t)|.ƒ}5tFtLˆdP |5 ƒdQƒ}6d1}7tc s|¡}8dR}9|-d |*_tt8jUjujv|#dS}:tw|jxdTd%};}<ty| ƒ}=| dU¡ t dV|%› dW|%› dX|.jzt^ › dYtdZ|ƒ› d[ˆ › d\¡ tB|-ˆ ƒD ]}>| d]¡ |  {¡  |jarZ| jp |¡  }¡ d|8 d/  | }?t~|/je||?d^}@tj€tB|/jƒ|@|/jd_|/_‚t8jsd |d`}At$d1krl|.jƒ „|>¡ t…|.ƒ}Bt dadb ¡ t$dv rƒt†|B|5t‡dc}B|( ˆ¡  |BD ]n\}C\}D}E}F}G| dd¡ |C|5|>  }H|Dj<|dde =¡ df }D|H|6krúd|6g}ItFdtc ‰|H|Id|&| g¡ L¡ ƒ}'t…|(jŠƒD ]3\}J}Ktc ‰|H|I|Jdkr×ˆdg ndh|Kdi |)|>ƒ g¡|Kdj< d6|Kv røtc ‰|H|Iˆdk ˆd6 g¡|Kd6< qÆ|j‹r7t Œ|%dD |%dl ˆ ¡ˆ ˆ }L|LtF|Djd/d … ƒ ‰ˆdkr7‡‡fdmd+„|Djd/d … D ƒ}MtXjŽj|D|Mdnd%do}Dt8jUju |#¡' | |Dƒ}N|=|N|E <|¡ƒ\}O}Pt$d1krV|Ot^9 }O|jbr^|Odp9 }OW d   ƒ n	1 siw   Y  |: ‘|O¡ ’¡  |H|7 |'kr£|: “|(¡ t8jXj”j•|  –¡ dqdr |: —|(¡ |: ˜¡  |( ˆ¡  |+r¡|+ ˜| ¡ |H}7t$dv r÷|A|C |P |Cd  }At8jU ™¡ r¿t8jU š¡ ds nddt›du}Q|B ›dv|>› d(ˆ d › |Qg|A¢|Ejd ‘|Djd1 ‘R  ¡ | dw| |H|D|E|Ft-|Aƒ¡ |jœr÷  d S q‰dxd+„ |(jŠD ƒ}R|* —¡  t$dv r|jdy|>dz |+j| g d{¢d| |>d ˆ kp#|;jž}S|r*|SrCtŸj||t^ d/ |%|#|+j ||2|d%||=d}\}9}8}T}Gt¡tc ¢|9¡ £dd1¡ƒ}U|;|>|Ud~}<|U|,kr[|U},t-|Aƒt-|9ƒ |R t-|8ƒ t-|Tƒ }V| d|V|>|,|U¡ |r|Sr|s|>|,t¤tj| ƒƒ h¡ t¤|+j ƒ h¡ |+j¥|( >¡ t|ƒt¦ §¡  ¨¡ t©d€œ	}t8 ª||¡ |,|Ukr°t8 ª||¡ |j«dkrÊ|>|j« dkrÊt8 ª||d|>› d ¡ ~|j3rdd‚l¬m­}W dƒtt |j3 ®dƒd„¡ƒ|j¯ d d ƒ ®t°j±d(¡ }Xt td…ƒ› d†¡ |Wt|ƒ|Xd‡}|rt td…ƒ› dˆ|X› ¡ | d‰||>|S|,|U¡ t$d1kr7t$dkr%|<nd g}Yt² ³|Yd¡ t$dkr7|Yd }<|<r< nq&t$dv r!t dŠ|>|- d › d‹tr r¡ |4 dŒ d›dŽ¡ ||fD ]R}| ´¡ r¯tµ|ƒ ||u r¯t d|› d¡ tŸj||t^ d/ |%t¶||ƒ h¡ |r‹d‘nd’||2||d|||=d“\}9}G}G}G|r¯| dt-|Aƒt-|9ƒ |R |>|,|U¡ q^|j3rõdd‚l¬m­}W dƒtt |j3 ®dƒd„¡ƒ|j¯ d d ƒ ®t°j±d(¡ }Xt td…ƒ› d†¡ |Wt|ƒ|Xd‡}|rõt td…ƒ› dˆ|X› ¡ |j·rt¸|j·|j¹|jº|j»||%|9d/ d”d• |j¼rt½ ¾| ¿¡ d( ¡ | d–|||>|9¡ t8jU À¡  |9S )—NÚon_pretrain_routine_startÚweightsT)ÚparentsÚexist_okzlast.ptzbest.ptÚignore©Úerrorszhyperparameters: z, c                 s   s"    | ]\}}|› d |› V  qdS )ú=N© )Ú.0ÚkÚvrI   rI   úH/home/jeff/fluffinator/venv/lib/python3.10/site-packages/yolov5/train.pyÚ	<genexpr>^   s   €  ztrain.<locals>.<genexpr>zhyp.yamlúopt.yamlÚcpur>   )ÚdeterministicÚtrainÚvalÚncÚnamesr   Úitemzcoco/val2017.txt¾   r   r;   )Ú
mmdet_keysÚclass_names)Úcallback)Úhf_tokenz.pt©Úmap_locationÚmodelé   Úanchors)ÚchrT   r`   Úanchor)ÚexcludeF)ÚstrictzTransferred ú/z items from c                 S   s   g | ]}d |› d‘qS )zmodel.Ú.rI   ©rJ   ÚxrI   rI   rM   Ú
<listcomp>š   ó    ztrain.<locals>.<listcomp>c                 3   s    | ]}|ˆ v V  qd S )NrI   rg   )rK   rI   rM   rN   ž   s   € z	freezing é    é   )Úfloorr;   Ú
batch_sizeé@   Úweight_decayÚlr0ÚmomentumÚlrfc                    s    d| ˆ   dˆd   ˆd  S )Nr>   ç      ð?rs   rI   )rh   )ÚepochsÚhyprI   rM   Ú<lambda>µ   s     ztrain.<locals>.<lambda>)Ú	lr_lambda)ç        r   u·   WARNING âš ï¸ DP not recommended, use torch.distributed.run for best DDP Multi-GPU results.
See Multi-GPU Tutorial at https://github.com/ultralytics/yolov5/issues/475 to get started.zUsing SyncBatchNorm()ztrain: )rv   ÚaugmentÚcacheÚrectÚrankÚworkersÚimage_weightsÚquadÚprefixÚshuffleÚseedzLabel class z exceeds nc=z in z. Possible class labels are 0-ç      à?zval: )rv   r{   r|   r}   r~   Úpadr   Úanchor_t)r^   ÚthrÚimgszÚon_pretrain_routine_endÚboxÚclséP   Úobjé€  Úlabel_smoothingÚwarmup_epochséd   )r   r   r   r   r   r   r   )Úenabled)ÚpatienceÚon_train_startzImage sizes z train, z val
Using z' dataloader workers
Logging results to Úboldz
Starting training for z
 epochs...Úon_train_epoch_start)rT   Úclass_weights)rB   rK   )Údevicez
%11s%11s%11s%11s%11s%11s%11s)ÚEpochÚGPU_memÚbox_lossÚobj_lossÚcls_lossÚ	InstancesÚSize)ÚtotalÚ
bar_formatÚon_train_batch_start)Únon_blockingéÿ   Úwarmup_bias_lrry   Ú
initial_lrÚlrÚwarmup_momentumg      ø?c                    s"   g | ]}t  |ˆ ˆ  ¡ˆ  ‘qS rI   )ÚmathÚceilrg   )ÚgsÚsfrI   rM   ri   C  s   " Úbilinear)ÚsizeÚmodeÚalign_cornersç      @ç      $@)Úmax_normg    eÍÍAz.3gÚGz&%11s%11s%11.4g%11.4g%11.4g%11.4g%11.4gÚon_train_batch_endc                 S   s   g | ]}|d  ‘qS )r§   rI   rg   rI   rI   rM   ri   i  s    Úon_train_epoch_end)Úepoch)ÚyamlrT   rv   rU   Ústrider—   )Úinclude)
rn   rˆ   Úhalfr^   Ú
single_clsÚ
dataloaderÚsave_dirÚplotsÚ	callbacksÚcompute_loss)r·   r0   Úon_fit_epoch_end)	r·   Úbest_fitnessr^   ÚemaÚupdatesÚ	optimizerÚoptÚdateÚyolov5pip_versionr·   )Úupload_file_to_s3zs3://Ú zaws:z# Uploading best weight to AWS S3...)Ú
local_fileÚs3_filez/ Best weight has been successfully uploaded to Úon_model_saveÚ
z epochs completed in i  z.3fz hours.z
Validating z...gÍÌÌÌÌÌä?ç333333ã?)rn   rˆ   r^   Ú	iou_thresr¼   r½   r¾   Ú	save_jsonÚverboser¿   rÀ   rÁ   zobject-detection)Úhf_model_idr[   Ú
hf_privateÚhf_dataset_idr¾   Ú
input_sizeÚ	best_ap50ÚtaskÚon_train_end)Ár   r¾   ru   rn   rB   r¼   ÚevolveÚdataÚcfgÚresumeÚnovalÚnosaver~   ÚfreezeÚrunr   ÚparentÚmkdirÚ
isinstanceÚstrÚopenr¸   Ú	safe_loadr   Úinfor    ÚjoinÚitemsÚcopyrv   r,   ÚvarsÚnoplotsÚtyper#   rƒ   r<   r9   r:   r   ÚintÚlenÚendswithr-   Ú
mmdet_tagsÚlistÚvaluesr'   Úregister_actionÚgetattrÚupload_datasetÚs3_upload_dirr	   r   r   r   ÚtorchÚloadr   ÚgetÚtoÚfloatÚ
state_dictr$   Úload_state_dictr   ÚrangeÚnamed_parametersÚrequires_gradÚanyÚmaxr¹   r   rˆ   r   Úon_params_updateÚroundr7   rÆ   Úcos_lrr(   r   ÚLambdaLRr3   r8   ÚcudaÚdevice_countÚwarningÚnnÚDataParallelÚsync_bnÚSyncBatchNormÚconvert_sync_batchnormr   r=   r{   r|   r   r€   ÚnpÚconcatenateÚlabelsÚnoautoanchorr   r»   r6   r4   r^   Únlr   rT   r%   r—   rU   ÚtimeÚzerosÚ
last_epochÚampÚ
GradScalerr2   r“   r/   Únum_workersrR   rP   Únumpyr&   ÚrandomÚchoicesÚnÚindicesÚsamplerÚ	set_epochÚ	enumerater   r   Ú	zero_gradÚinterpÚparam_groupsÚmulti_scaleÚ	randrangeÚshapeÚ
functionalÚinterpolateÚautocastÚscaleÚbackwardÚunscale_ÚutilsÚclip_grad_norm_Ú
parametersÚstepÚupdateÚis_availableÚmemory_reservedÚset_descriptionÚstop_trainingÚupdate_attrÚpossible_stopÚvalidaterÄ   r0   ÚarrayÚreshaper   rÅ   r   ÚnowÚ	isoformatr
   ÚsaveÚsave_periodÚyolov5.utils.awsrÊ   ÚreplaceÚnameÚosÚsepÚdistÚbroadcast_object_listÚexistsr+   r   rÔ   r   r[   rÕ   rÖ   Úroboflow_uploadr   Úupload_modelÚas_posixÚempty_cache)Zrv   rÇ   r˜   rÀ   r¾   rn   rB   r¼   rÛ   rÜ   rÝ   rÞ   rß   rà   r~   rá   ÚwÚlastÚbestÚfr¿   r
  Ú	data_dictÚ
train_pathÚval_pathrT   rU   Úis_cocoÚloggersÚresultÚ
pretrainedÚckptr^   rc   Úcsdr  rL   rˆ   ÚnbsÚ
accumulaterÆ   ÚlfÚ	schedulerrÄ   rÃ   Ústart_epochÚtrain_loaderÚdatasetr  ÚmlcÚ
val_loaderr  Út0ÚnbÚnwÚlast_opt_stepÚmapsÚresultsÚscalerÚstopperÚstoprÁ   r·   ÚcwÚiwÚmlossÚpbarÚiÚimgsÚtargetsÚpathsÚ_ÚniÚxiÚjrh   ÚszÚnsÚpredÚlossÚ
loss_itemsÚmemr§   Úfinal_epochÚmap50sÚfiÚlog_valsrÊ   rÍ   Úbroadcast_listrI   )ru   r«   rv   rK   r¬   rM   rR   M   sŒ  $ÿÿ


ÿ&


ÿ$
 




ÿ("*(€ 


ñ.

õõ 



ÿþ
ý




 4
€ 

€ú	



&.ÿ€

ö
$
÷
2

ÿ
.


ó"€2ø
rR   Fc                 C   sv  t  ¡ }|jdtddd |jdtddd |jdttd	 d
d |jdttd dd |jdtddd |jdtddd |jdddtddd |jdddd |jdddd d!d" |jd#dd$d |jd%dd&d |jd'dd(d |jd)dd*d |jd+tdd,d-d. |jd/tdd0d |jd1tdd2d3d. |jd4dd5d |jd6dd7d8 |jd9dd:d |jd;dd<d |jd=tg d>¢d?d@dA |jdBddCd |jdDtdEdFd |jdGdHdId8 |jdJdKdId8 |jdLddMd |jdNddOd |jdPddQd |jdRtdSdTd |jdUtddVd |jdWdXtdYgdZd[ |jd\td]d^d |jd_tdYd`d |jdatd]dbd |jdcdddd |jded dfd8 |jdgtd]dhd |jditdjdkd |jdltd dmd |jdntd dod |jdptd dqd |jdrddsd |jdttd dud |jdvtd dwd |jdxddyd |jdztd d{d |jd|td d}d |jd~ddd | r·| ¡ dY S | ¡ S )€Nz	--weightsz
yolov5s.ptzinitial weights path)rï   ÚdefaultÚhelpz--cfgrË   zmodel.yaml pathz--datazdata/coco128.yamlzdataset.yaml pathz--hypzdata/hyps/hyp.scratch-low.yamlzhyperparameters pathz--epochsr‘   ztotal training epochsz--batch-sizeé   z/total batch size for all GPUs, -1 for autobatchz--imgszz--imgz
--img-sizerŽ   ztrain, val image size (pixels)z--rectÚ
store_truezrectangular training)Úactionr†  z--resumeú?TFzresume most recent training)ÚnargsÚconstr…  r†  z--nosavezonly save final checkpointz--novalzonly validate final epochz--noautoanchorzdisable AutoAnchorz	--noplotszsave no plot filesz--evolvei,  z(evolve hyperparameters for x generations)rï   r‹  rŒ  r†  z--bucketzgsutil bucketz--cacheÚramzimage --cache ram/diskz--image-weightsz)use weighted image selection for trainingz--devicez%cuda device, i.e. 0 or 0,1,2,3 or cpu)r…  r†  z--multi-scalezvary img-size +/- 50%%z--single-clsz&train multi-class data as single-classz--optimizer)ÚSGDÚAdamÚAdamWrŽ  rÆ   )rï   r  r…  r†  z	--sync-bnz-use SyncBatchNorm, only available in DDP modez	--workersé   z-max dataloader workers (per RANK in DDP mode)z	--projectú
runs/trainzsave to project/namez--nameÚexpz
--exist-okz*existing project/name ok, do not incrementz--quadzquad dataloaderz--cos-lrzcosine LR schedulerz--label-smoothingry   zLabel smoothing epsilonz
--patiencez3EarlyStopping patience (epochs without improvement)z--freezeú+r   z(Freeze layers: backbone=10, first3=0 1 2)r‹  rï   r…  r†  z--save-periodr;   z0Save checkpoint every x epochs (disabled if < 1)z--seedzGlobal training seedz--local_rankz/Automatic DDP Multi-GPU argument, do not modifyz--mmdet_tagsz(Log train/val keys in MMDetection formatz--entityÚEntityz--bbox_intervalz'Set bounding-box image logging intervalz--artifact_aliasÚlatestz"Version of dataset artifact to usez--neptune_tokenzneptune.ai api tokenz--neptune_projectz-https://docs.neptune.ai/api-reference/neptunez--s3_upload_dirz9aws s3 folder directory to upload best weight and datasetz--upload_datasetzupload dataset to aws s3z--hf_model_idz&huggingface.co model_id to be uploadedz
--hf_tokenz*huggingface.co token to be used for uploadz--hf_privatezupload model to private repoz--hf_dataset_idz(huggingface dataset id to link the modelz--roboflow_tokenzroboflow api tokenz--roboflow_uploadzupload model to roboflow)	ÚargparseÚArgumentParserÚadd_argumentræ   ÚROOTrð   rþ   Úparse_known_argsÚ
parse_args)ÚknownÚparserrI   rI   rM   Ú	parse_optë  sd   rŸ  c                    sZ  t dv rtt| ƒƒ tƒ  dt| jƒv r$tj| j| jdt	 
¡  ¡ d| _| jrt| ƒs| jstt| jtƒr:t| jƒntƒ ƒ}|jjd }| j}| ¡ rgt|dd}t |¡}W d   ƒ n1 saw   Y  n	tj|dd	d
 }tjdbi |¤Ž} dt|ƒd| _| _| _t|ƒrŽt|ƒ| _nat| jƒt| jƒt| j ƒt| jƒt| j!ƒf\| _| _| _ | _| _!t"| jƒs½t"| jƒs½J dƒ‚| jrÔ| j!tdƒkrÌtdƒ| _!| jd| _#| _| j$dkràt| jƒj%| _$tt&t| j!ƒ| j$ | j#dƒ| _'t(| j)| j*d}t+dkrYd}| j,r
J d|› ƒ‚| jrJ d|› ƒ‚| j*dks#J d|› dƒ‚| j*t- dks4J d| j*› dƒ‚tj. /¡ t+ks@J dƒ‚tj. 0t+¡ t )dt+¡}t1j2t1 3¡ rUdnd d! | jsgt4| j | ||ƒ d S i d"d#“d$d%“d&d'“d(d)“d*d+“d,d-“d.d/“d0d1“d2d3“d4d5“d6d3“d7d5“d8d9“d:d;“d<d=“d>d?“d@dA“dBdBdCdBdBdDdEdFdGdFdFdFdHœ¥‰ t| j dd}t |¡}	d<|	vrÁdI|	d<< W d   ƒ n	1 sÌw   Y  | j5rÛ|	d<= ˆ d<= ddt| j'ƒ| _6| _7}
|
dJ |
dK }}| j8rt9 :dL| j8› dM|› ¡ t;| jƒD ]}| <¡ rÑdN}t=j>|dOdPdQdR}t?dSt"|ƒƒ}|t= @tA|ƒ ¡ d |… }tA|ƒtA|ƒ ?¡  dT }|dNksFt"|ƒdQkrT|tBjCt;|ƒ|dUd  }n|dVkrh|| D|dQ¡  Ed¡| E¡  }dW\}}t=jB}| FtGtH H¡ ƒ¡ t= I‡ fdXdY„|	 J¡ D ƒ¡}t"ˆ ƒ}t= K|¡}tL|dQkƒr·|| B|¡|k  | M|¡ | B¡  | dQ  NdZd[¡}tL|dQkƒs–tO|	 J¡ ƒD ]\}}tP||d\  ||  ƒ|	|< q½ˆ  Q¡ D ]$\}}tR|	| |dQ ƒ|	|< t?|	| |dO ƒ|	|< tS|	| dSƒ|	|< qÕt4|	 T¡ | ||ƒ}tUƒ }d]}tV|||	 T¡ |
| j8ƒ qtW|ƒ tX Yd^| j› d_tZd`|
ƒ› da|› ¡ d S )cNrW   zroboflow.comÚdetect)ÚurlÚroboflow_tokenrÙ   ÚlocationrO   rE   rF   rP   r\   rÇ   rË   Tz+either --cfg or --weights must be specifiedr’  zruns/evolveFrÝ   )rD   )rn   r;   z4is not compatible with YOLOv5 Multi-GPU DDP trainingz--image-weights z	--evolve zAutoBatch with --batch-size -1 z", please pass a valid --batch-sizer   z--batch-size z must be multiple of WORLD_SIZEz)insufficient CUDA devices for DDP commandr
  ÚncclÚgloo)Úbackendrq   )r>   gñhãˆµøä>çš™™™™™¹?rs   )r>   g{®Gáz„?rt   rr   )ç333333Ó?rÐ   g\Âõ(\ï?rp   )r>   ry   çü©ñÒMbP?r   )r>   ry   g      @r¨   )r>   ry   gffffffî?r¥   )r>   ry   çš™™™™™É?rŠ   )r>   g{®Gáz”?rª  r‹   )r>   rª  r±   Úcls_pw)r>   r„   ç       @r   Úobj_pwÚiou_t)r   r§  gffffffæ?r†   )r>   r¬  g       @r`   )rl   r¬  r²   Úfl_gamma)r   ry   r¬  Úhsv_h)r>   ry   r§  )r>   ry   gÍÌÌÌÌÌì?)r>   ry   g     €F@)r>   ry   r²   )r   ry   r©  )r>   ry   rt   )r   ry   rt   )Úhsv_sÚhsv_vÚdegreesÚ	translater.  ÚshearÚperspectiveÚflipudÚfliplrÚmosaicÚmixupÚ
copy_paster_   zhyp_evolve.yamlz
evolve.csvzgsutil cp gs://z/evolve.csv Úsinglerl   ú,r>   )ÚndminÚ	delimiterÚskiprowsé   gíµ ÷Æ°>)rB   Úweighted)gš™™™™™é?rª  c                    s   g | ]}ˆ | d  ‘qS )r   rI   )rJ   rK   ©ÚmetarI   rM   ri   ¥  rj   zmain.<locals>.<listcomp>r¨  g      @é   )zmetrics/precisionzmetrics/recallzmetrics/mAP_0.5zmetrics/mAP_0.5:0.95zval/box_losszval/obj_losszval/cls_lossz"Hyperparameter evolution finished z generations
Results saved to r•   z%
Usage example: $ yolov5 train --hyp rI   )[r<   r)   rí   r   ræ   rÜ   r   Údownload_datasetr¢  rš  ÚabsoluterM  rÞ   r.   rÛ   r   rå   r   r!   rã   Úis_filerç   r¸   rè   rú   rû   r—  Ú	NamespacerÝ   rB   r   r   rv   Úprojectrñ   rD   rE  Ústemr"   r¾   r5   r˜   rn   r:   r   r=   r
  r  Ú
set_devicerH  Úinit_process_groupÚis_nccl_availablerR   r  rß   rà   ÚbucketrF  Úsystemr  rJ  r  ÚloadtxtÚminÚargsortr0   r  r  r>  Úsumrƒ   rð   r  r=  ÚkeysÚonesÚallÚrandnÚclipr$  rþ   rë   r  r  rì   r   r*   r1   r   ré   r    )rÇ   rÀ   rP  Úopt_yamlÚopt_datarR  Údr˜   Úmsgrv   r¾   Úevolve_yamlÚ
evolve_csvrv  rã   rh   r   rO  ÚmpÚsÚnprÚgÚngrL   rr  rK   rj  rÕ  rI   rÃ  rM   Úmain+  s   
ü ÿ€
€*ÿ

 
"ÿþýüûúùø	÷
öõôóòñðïã

€ý


4ÿ ÿþrå  c                  K   s2   t dƒ}|  ¡ D ]
\}}t|||ƒ qt|ƒ |S )NT©rŸ  rë   Úsetattrrå  ©ÚkwargsrÇ   rK   rL   rI   rI   rM   râ   Â  s
   râ   c                  K   s2   t dƒ}|  ¡ D ]
\}}t|||ƒ qt|ƒ dS )z&
    To be called from yolov5.cli
    TNræ  rè  rI   rI   rM   Úrun_cliË  s   rê  Ú__main__)F)vÚ__doc__r—  r©   rF  r  Úsysr  rì   r   r   Úpathlibr   r  r  rú   Útorch.distributedÚdistributedrH  Útorch.nnr  r¸   Útorch.optimr   r   Úyolov5.helpersr   r   r	   Úyolov5r
   Úyolov5.utils.roboflowr   Ú__file__ÚresolveÚFILErC   rš  ræ   ÚpathÚappendÚrelpathÚcwdÚ
yolov5.valrS   r<  Úyolov5.models.experimentalr   Úyolov5.models.yolor   Úyolov5.utils.autoanchorr   Úyolov5.utils.autobatchr   Úyolov5.utils.callbacksr   Úyolov5.utils.dataloadersr   Úyolov5.utils.downloadsr   r   r   Úyolov5.utils.generalr   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   Úyolov5.utils.loggersr-   Ú&yolov5.utils.loggers.comet.comet_utilsr.   Úyolov5.utils.lossr/   Úyolov5.utils.metricsr0   Úyolov5.utils.plotsr1   Úyolov5.utils.torch_utilsr2   r3   r4   r5   r6   r7   r8   r9   rð   Úgetenvr:   r<   r=   ÚenvironrR   rŸ  rå  râ   rê  Ú__name__rÇ   rI   rI   rI   rM   Ú<module>   sr   
h(
   
!@ 	

þ