Ë
    FêñiÇN  ã                   ó˜  — 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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  ed«      Z e j0                  dd	«      j3                  d
«      Ze› d�Zd„ Z	 erJ ‚ ej:                  dd«      du s& e j0                  d«      s ej:                  d«      sJ ‚ e j0                  d«      xs  ej:                  d«      ZesJ ‚d dlZd dl m!Z!m"Z" d dl#m$Z$  ed¬«      Z%d&d„Z(d'd„Z)d„ Z*d(d„Z+d)d„Z,d„ Z-d*d„Z.d)d„Z/d„ Z0d„ Z1d „ Z2d!„ Z3d"„ Z4d#„ Z5d$„ Z6er	e2e3e4e5e6d%œZ7yi Z7y# e&e'f$ r dZY ŒLw xY w)+é    N)ÚThreadPoolExecutor)Úisfinite)ÚPath)ÚsleepÚtime)	ÚENVIRONMENTÚGITÚLOGGERÚPYTHON_VERSIONÚRANKÚSETTINGSÚTESTS_RUNNINGÚRetryÚcolorstrz
Platform: ÚULTRALYTICS_PLATFORM_URLz https://platform.ultralytics.comú/z/api/webhooksc                 óÔ   — | s| S t        j                  ddt        j                  ddt        | «      j                  «       «      j	                  dd«      «      j                  d«      dd S )zGConvert text to URL-safe slug (e.g., 'My Project 1' -> 'my-project-1').z-+ú-z[^a-z0-9\s-]Ú ú Né€   )ÚreÚsubÚstrÚlowerÚreplaceÚstrip)Útexts    úf/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/ultralytics/utils/callbacks/platform.pyÚslugifyr       sY   € áØˆÜ�6‰6�%˜œbŸf™f _°b¼#¸d»)¿/¹/Ó:KÓL×TÑTÐUXÐZ]Ó^Ó_×eÑeÐfiÓjÐkoÐloÐpÐpó    ÚplatformFTÚULTRALYTICS_API_KEYÚapi_key)ÚConsoleLoggerÚSystemLogger)Úmodel_info_for_loggersé
   )Úmax_workersc                 ó  — ddl }| dd }|j                  d«      }t        j                  d«      xs t	        j
                  d«      }|st        d| › dt        › d	�«      ‚t        }d
d|› �i}t        |«      dk(  r|d   dk(  r|\  }}	}
|› d|› d|
› d�}n2t        |«      dk(  r|\  }}}|› d|› d|› d|› d�}nt        d| › d�«      ‚d|v rdnd}	 t        d«      D ]a  }	  |j                  ||d|¬«      }|j                  dv s|j                  dk\  r*|j                  j                  d|j                  › �|¬«      ‚ n d%j                  cxk  rd&k  r n nd'|j*                  v r|j*                  d'   S |j                  d(k(  rt        d)| › d*�«      ‚|j                  d+k(  rt-        d,| › d-�«      ‚|j                  d.k(  r)|rt/        d/| › �«      ‚t#        j$                  d/| › �«       y|j                  d0k(  rt1        d1| › d2�«      ‚|j3                  «        t1        d3| › d4|j                  › �«      ‚# |j                  j                  |j                  j                   |j                  j                  f$ rH}|dk\  r‚ dd|z  z  }t#        j$                  d|dz   › d | › d!|› d"|› �«       t'        |«       Y d}~�ŒÝd}~ww xY w# t(        $ r9}|rt        d#| › d$|› �«      |‚t#        j$                  d#| › d$|› �«       Y d}~yd}~ww xY w)5a,  Resolve ul:// URIs to signed URLs by authenticating with Ultralytics Platform.

    Formats:
        ul://username/datasets/slug  -> Returns signed URL to NDJSON file
        ul://username/project/model  -> Returns signed URL to .pt file

    Args:
        uri (str): Platform URI starting with "ul://".
        hard (bool): Whether to raise an error if resolution fails.

    Returns:
        (str | None): Signed URL on success, None if not found and hard=False.

    Raises:
        ValueError: If API key is missing/invalid or URI format is wrong.
        PermissionError: If access is denied.
        RuntimeError: If resource is not ready (e.g., dataset still processing).
        FileNotFoundError: If resource not found and hard=True.
        ConnectionError: If network request fails and hard=True.
    r   Né   r   r#   r$   z"ULTRALYTICS_API_KEY required for 'z'. Get key at z	/settingsÚAuthorizationúBearer é   é   Údatasetsz
/datasets/z/exportz/models/z	/downloadzInvalid platform URI: z8. Use ul://user/datasets/name or ul://user/project/model)r(   i  )r(   éZ   F)ÚheadersÚallow_redirectsÚtimeout¾   é˜  é­  éô  zHTTP )Úresponseé   é   zRetry z/5 for z in zs: zFailed to resolve ú: i,  é�  Úlocationi‘  z!Invalid ULTRALYTICS_API_KEY for 'ú'i“  zAccess denied for 'z+'. Check dataset/model visibility settings.i”  zNot found on platform: i™  zResource not ready: z". Dataset may still be processing.z'Unexpected response from platform for 'z': )ÚrequestsÚsplitÚosÚgetenvr   ÚgetÚ
ValueErrorÚPLATFORM_URLÚPLATFORM_API_URLÚlenÚrangeÚheadÚstatus_codeÚ
exceptionsÚ	HTTPErrorÚConnectionErrorÚReadTimeoutr
   Úwarningr   Ú	Exceptionr2   ÚPermissionErrorÚFileNotFoundErrorÚRuntimeErrorÚraise_for_status)ÚuriÚhardr@   ÚpathÚpartsr$   Úbaser2   ÚusernameÚ_ÚslugÚurlÚprojectÚmodelr4   ÚattemptÚrÚeÚdelays                      r   Úresolve_platform_urire   .   sV  € ó* àˆqˆrˆ7€DØ�J‰J�s‹O€Eä�i‰iÐ-Ó.ÒI´(·,±,¸yÓ2I€GÙÜÐ=¸c¸UÀ.ÔQ]ÐP^Ð^gÐhÓiÐiä€DØ '¨'¨Ð 3Ð4€Gô ˆ5ƒz�Q‚˜5 ™8 zÒ1Ø!Ñˆ�!�TØ��j  
¨!¨D¨6°Ð9‰ô 
ˆU‹�qŠØ#(Ñ ˆ�'˜5Ø��h˜x˜j¨¨'¨°!°E°7¸)ÐD‰ô Ð1°#°Ð6nÐoÓpÐpð )¨CÑ/‰j°X€GðÜ˜Q“xò 	ˆGðØ!�H—M‘M #¨wÈÐW^Ô_�Ø—=‘= JÑ.°!·-±-À3Ò2FØ"×-Ñ-×7Ñ7¸%ÀÇÁ¸Ð8OÐZ[Ð7Ó\Ð\Ùð	ð. ˆa�m‰mÔ!˜cÕ! j°A·I±IÑ&=Ø�y‰y˜Ñ$Ð$ð 	‡}�}˜ÒÜÐ<¸S¸EÀÐCÓDÐDØ‡}�}˜ÒÜÐ 3°C°5Ð8cÐdÓeÐeØ‡}�}˜ÒÙÜ#Ð&=¸c¸UÐ$CÓDÐDÜ�‰Ð0°°Ð6Ô7ØØ‡}�}˜ÒÜÐ1°#°Ð6XÐYÓZÐZð ×ÑÔÜ
Ð@ÀÀÀSÈÏÉÈÐXÓ
YÐYøðE ×#Ñ#×3Ñ3Ø×#Ñ#×/Ñ/Ø×#Ñ#×-Ñ-ðò 	ð
 ˜a’<ØØ˜Q ™ZÑ(�Ü—‘ ¨°!© }°G¸C¸5ÀÀUÀGÈ3ÈqÈcÐRÔSÜ�e—’ûð	ûô ò ÙÜ!Ð$6°s°e¸2¸a¸SÐ"AÓBÈÐIÜ�‰Ð+¨C¨5°°1°#Ð6Ô7Üûð	úsD   ÃJ? ÃAH0Ä;J? È0AJ<É4=J7Ê1J? Ê7J<Ê<J? Ê?	LË/K<Ë<Lc           
      ó
  — ddl }| j                  d«      r| j                  d«      s| S |j                  | d   «      |j                  | d   «      }}t        |«      |k  r| S |j	                  |d   |d   |«      }|j
                  dk(  r|j                  |||«      }n0|j                  |D �cg c]  }|j                  |||«      ‘Œ c}«      }i | ¥|j                  «       |j                  «       dœ¥}d| v r| d   |d<   |S c c}w )	z?Interpolate plot curve data to n points to reduce storage size.r   NÚxÚyéÿÿÿÿr/   )rg   rh   Úap)ÚnumpyrD   ÚarrayrH   ÚlinspaceÚndimÚinterpÚtolist)	ÚplotÚnÚnprg   rh   Úx_newÚy_newÚyiÚresults	            r   Ú_interp_plotrx   Œ   sñ   € ãà�8‰8�CŒ= §¡¨¤Øˆà�8‰8�D˜‘IÓ §¡¨¨c©Ó 3€q€AÜ
ˆ1ƒv�‚{Øˆð �K‰K˜˜!™˜a ™e QÓ'€Eð 	‡v�v�‚{Ø—	‘	˜%  AÓ&‰à—‘¸AÖ>°b˜"Ÿ)™) E¨1¨bÕ1Ò>Ó?ˆð @�Ð?˜5Ÿ<™<›>°·±³Ò?€FØˆt�|Ø˜D‘zˆˆt‰à€Mùò ?s   Â,D c                 ó2  — t        | t        «      r-| j                  «       D ��ci c]  \  }}|t        |«      “Œ c}}S t        | t        t
        f«      r| D �cg c]  }t        |«      ‘Œ c}S t        | t        «      rt        | «      r| S dS | S c c}}w c c}w )zSReplace non-finite floats in payloads with None so requests JSON encoding succeeds.N)Ú
isinstanceÚdictÚitemsÚ_sanitize_json_valueÚlistÚtupleÚfloatr   )ÚvalueÚkÚvs      r   r}   r}   ¨   s€   € ä�%œÔØ7<·{±{³}×E©t¨q°!�Ô'¨Ó*Ñ*ÓEÐEÜ�%œ$¤˜Ô'Ø16Ö7¨AÔ$ QÕ'Ò7Ð7Ü�%œÔÜ  œˆuÐ1¨TÐ1Ø€Lùó Fùâ7s   ¤BÁBc                 óÚ   ‡— | ||t        |«      dœŠ|r|‰d<   t        |d¬«      ˆfd„«       }	  |«       S # t        $ r+}t        j                  t
        › d| › d|› �«       Y d}~yd}~ww xY w)	z1Send event to Platform endpoint with retry logic.)Úeventr_   ÚnameÚdataÚmodelIdr/   ©Útimesrd   c                  óª  •— t        j                  t        › d�‰ddt        › �id¬«      } d| j                  cxk  rdk  rZn nW| j                  dvrI	 | j                  «       j                  d	| j                  «      }t        j                  t        › |› �«       y | j                  «        | j                  «       S # t        $ r | j                  }Y ŒUw xY w)
Nz/training/metricsr,   r-   é   ©Újsonr2   r4   r=   r8   r5   Úerror)r@   ÚpostrG   Ú_api_keyrK   rŽ   rD   ÚreasonrQ   r
   rP   ÚPREFIXrU   )rb   ÚmsgÚpayloads     €r   r�   z_send.<locals>.post¹   sº   ø€ ä�M‰MÜÐ Ð 1Ð2ØØ$¨´¨zÐ&:Ð;Øô	
ˆð �!—-‘-Ô% #Õ%¨!¯-©-¸zÑ*IðØ—f‘f“h—l‘l 7¨A¯H©HÓ5�ô �N‰Nœf˜X c UÐ+Ô,ØØ	×ÑÔØ�v‰v‹xˆøô ò Ø—h‘h’ðús   Á*B: Â:CÃCzFailed to send r<   N)r}   r   rQ   r
   Údebugr“   )	r…   r‡   r_   r†   Úmodel_idÚretryr�   rc   r•   s	           @r   Ú_sendr™   ³   sz   ø€ à¨'¸4ÔI]Ð^bÓIcÑd€GÙØ%ˆ�	Ñä
�˜aÔ óó !ðð"Ù‹vˆøÜò Ü�‰œ�x˜¨u¨g°R¸°sÐ;Ô<Üûðús   ¯6 ¶	A*¿!A%Á%A*c                 ó@   — t         j                  t        | ||||«       y)z4Send event asynchronously using bounded thread pool.N)Ú	_executorÚsubmitr™   )r…   r‡   r_   r†   r—   s        r   Ú_send_asyncr�   Ò   s   € ä×Ñ”U˜E 4¨°$¸ÕAr!   c                 ó~   — |r;|j                  d«      r)d|d<   d| _        t        j                  t        › d�«       yyy)aS  Apply centralized stop signals returned by Platform webhook responses.

    Notes:
        ``ctx["cancelled"]`` is the durable cancellation signal. During startup, trainer setup later resets
        ``trainer.stop``, so early stop requests still rely on ``on_pretrain_routine_end()`` to reapply the flag after
        setup completes.
    Ú	cancelledTu'   Training cancelled from Platform âš ï¸�N)rD   Ústopr
   Úinfor“   )ÚtrainerÚctxr9   s      r   Ú_handle_control_responser¤   ×   s>   € ñ �H—L‘L Ô-ØˆˆKÑØˆŒÜ�‰”v�hÐEÐFÕGð .€xr!   c                 ót  ‡ ‡‡‡— ddl m} t        ‰ «      Š ‰ j                  «       st	        j
                  t        › d‰ › �«       yt        dd¬«      ˆˆ ˆˆfd„«       }	  |«       } |‰ |d
   ||¬«      r|j                  d«      S y# t        $ r(}	t	        j
                  t        › d	|	› �«       Y d}	~	yd}	~	ww xY w)z3Upload model checkpoint to Platform via signed URL.r   )Úsafe_uploadzModel file not found: Nr.   r;   r‰   c                  óÄ   •— ‰‰‰j                   dœ} ‰r‰| d<   t        j                  t        › d�| ddt        › �id¬«      }|j                  «        |j                  «       S )N)r_   r†   Úfilenamerˆ   z/models/uploadr,   r-   rŒ   r�   )r†   r@   r�   rG   r‘   rU   rŽ   )r•   rb   r—   Ú
model_pathr†   r_   s     €€€€r   Úget_signed_urlz%_upload_model.<locals>.get_signed_urlï   sg   ø€ à%¨tÀÇÁÑQˆÙØ!)ˆG�IÑÜ�M‰MÜÐ  Ð/ØØ$¨´¨zÐ&:Ð;Øô	
ˆð 	
×ÑÔØ�v‰v‹xˆr!   zFailed to get upload URL: Ú	uploadUrl)Úfiler^   r˜   ÚprogressÚgcsPath)
Úultralytics.utils.uploadsr¦   r   Úexistsr
   rP   r“   r   rQ   rD   )
r©   r_   r†   r­   r˜   r—   r¦   rª   r‡   rc   s
   ```  `    r   Ú_upload_modelr±   å   s´   û€ å5ä�jÓ!€JØ×ÑÔÜ�‰œ&˜Ð!7¸
°|ÐDÔEØô �˜!Ôöó ððÙÓˆñ ˜
¨¨[Ñ(9ÀÐQYÕZØ�x‰x˜	Ó"Ð"Øøô ò Ü�‰œ&˜Ð!;¸A¸3Ð?Ô@Üûðús   ÁB Â	B7ÂB2Â2B7c                 ó@   — t         j                  t        | |||¬«       y)z6Upload model asynchronously using bounded thread pool.©r—   N)r›   rœ   r±   )r©   r_   r†   r—   s       r   Ú_upload_model_asyncr´   	  s   € ä×Ñ”] J°¸ÈÐÕQr!   c                  óÔ  — ddl } ddl}ddl}ddlm} ddlm}m} |j                  «       }| j                  d«      }|t        j                  «       t        j                  «       t        t        t        j                   t#        j$                  «       xs d |«       dj'                  t        j(                  «      t+        |j,                  dz  d«      t+        |j,                  dz  d«      d	œ}	 t.        j0                  rlt.        j2                  rt.        j2                  |d
<   t.        j4                  rt.        j4                  |d<   t.        j6                  rt.        j6                  dd |d<   	 |j:                  j=                  «       rG|j:                  j?                  «       |d<   |j:                  j?                  «       dkD  r |d«      nd|d<   |S # t8        $ r Y Œow xY w# t8        $ r Y |S w xY w)zLCollect comprehensive environment info using existing ultralytics utilities.r   N)Ú__version__)Úget_cpu_infoÚget_gpu_infor   r   i   @r/   )ÚultralyticsVersionÚhostnamerB   ÚenvironmentÚpythonVersionÚpythonExecutableÚcpuCountÚcpuÚcommandÚ
totalRamGbÚtotalDiskGbÚgitRepositoryÚ	gitBranché   Ú	gitCommitÚgpuCountÚgpuType) ÚshutilÚpsutilÚtorchÚultralyticsr¶   Úultralytics.utils.torch_utilsr·   r¸   Úvirtual_memoryÚ
disk_usageÚsocketÚgethostnamer"   r   r   ÚsysÚ
executablerB   Ú	cpu_countÚjoinÚargvÚroundÚtotalr	   Úis_repoÚoriginÚbranchÚcommitrQ   ÚcudaÚis_availableÚdevice_count)	rÉ   rÊ   rË   r¶   r·   r¸   ÚmemoryrÏ   Úenvs	            r   Ú_get_environment_inforâ     s€  € ããÛå'ßHð ×"Ñ"Ó$€FØ×"Ñ" 3Ó'€Jð *Ü×&Ñ&Ó(Ü×ÑÓ!Ü"Ü'ÜŸN™NÜ—L‘L“NÒ' aÙ‹~Ø—8‘8œCŸH™HÓ%Ü˜FŸL™L¨GÑ4°aÓ8Ü˜Z×-Ñ-°Ñ9¸1Ó=ñ€Cð	Ü�;Š;Ü�zŠzÜ'*§z¡z��OÑ$Ü�zŠzÜ#&§:¡:��KÑ Ü�zŠzÜ#&§:¡:¨c¨r ?��KÑ ð
Ø�:‰:×"Ñ"Ô$Ø#Ÿj™j×5Ñ5Ó7ˆC�
‰OØ05·
±
×0GÑ0GÓ0IÈAÒ0M™\¨!œ_ÐSWˆC�	‰Nð €Jøô ò Ùðûô ò Øà€Jðús&   Ã+A<G Å(A!G Ç	GÇGÇ	G'Ç&G'c                 ó  — t        | j                  j                  «      }|j                  dd«      }t	        |«      dk(  r|d   › dt        |d   «      › �n
t        |«      }|t        t        | j                  j                  xs d«      «      fS )z1Get slugified project and name from trainer args.r   r/   r;   r   Útrain)r   Úargsr_   rA   rH   r    r†   )r¢   ÚrawrY   r_   s       r   Ú_get_project_namerç   A  sy   € ä
ˆg�l‰l×"Ñ"Ó
#€CØ�I‰I�c˜1Ó€EÜ36°u³:À²?��q‘�
˜!œG E¨!¡HÓ-Ð.Ñ/ÌÐPSË€GØ”GœC §¡× 1Ñ 1Ò <°WÓ=Ó>Ð>Ð>r!   c                 óJ  ‡‡	‡
— t         dvs| j                  j                  syt        | «      \  Š
Š	t	        j
                  t        › d�«       dt        «       ddddœŠ‰| _        ˆˆ	ˆ
fd„}t        dd|¬	«      ‰d
<   ‰d
   j                  «        t        «       }t        | j                  «      j                  «       D ��ci c]  \  }}|t        |«      “Œ }}}t        d|| j                   t        | j"                  «      |dœ‰
‰	d¬«      }|ro|j%                  d«      r^|d   ‰d<   |j%                  d«      r7|d   ‰d<   t&        › d‰
› d‰d   › �}t	        j
                  t        › d|› �«       t)        | ‰|«       yt	        j*                  t        › d�«       d| _        yc c}}w )z.Initialize Platform logging at training start.¾   r   ri   Nz&Streaming training metrics to PlatformF)r—   Úlast_uploadrŸ   Úconsole_loggerÚsystem_loggerc                 ó2   •— t        d|| |dœ‰‰‰d   «       y)z0Send batched console output to Platform webhook.Úconsole_output)ÚchunkIdÚcontentÚ	lineCountr—   N)r�   )rð   Ú
line_countÚchunk_idr£   r†   r_   s      €€€r   Úsend_console_outputz6on_pretrain_routine_start.<locals>.send_console_outputV  s%   ø€ äØØ ¨WÀ:ÑNØØØ�
‰Oõ	
r!   r+   g      @)Ú
batch_sizeÚflush_intervalÚon_flushrë   Útraining_started)Ú	trainArgsÚepochsÚdevicer»   r:   ©r˜   rˆ   r—   Ú	modelSlugÚ
model_slugr   zView model at z(Training will not be tracked on Platform)r   rå   r_   rç   r
   r¡   r“   r   r"   r%   Ústart_capturerâ   Úvarsr|   r   r™   rú   rû   rD   rF   r¤   rP   )r¢   rô   r»   r‚   rƒ   Ú
train_argsr9   r^   r£   r†   r_   s           @@@r   Úon_pretrain_routine_startr  I  s—  ú€ ä�7Ñ '§,¡,×"6Ò"6Øä% gÓ.�M€GˆTÜ
‡K�K”6�(Ð@ÐAÔBð ¬D«FÀÐZ^ÐquÑ
v€CØ€GÔö
ô *°QÀsÐUhÔi€CÐÑØÐÑ×'Ñ'Ô)ô (Ó)€Kô )-¨W¯\©\Ó(:×(@Ñ(@Ó(B×C¡  1�!”S˜“V‘)ÐC€JÑCô Øà#Ø—n‘nÜ˜'Ÿ.™.Ó)Ø&ñ		
ð 	ØØô€Hñ �H—L‘L Ô+Ø" 9Ñ-ˆˆJ‰à�<‰<˜Ô$Ø (¨Ñ 5ˆC�ÑÜ!�N ! G 9¨A¨c°,Ñ.?Ð-@ÐAˆCÜ�K‰Kœ6˜( .°°Ð6Ô7ä  ¨#¨xÕ8ä�‰œ&˜Ð!IÐJÔKØˆÕùó5 Ds   Â?Fc                 óv   — t        | dd«      }|r*|d   r$t        j                  t        › d�«       d| _        yyy)zDApply pre-start cancellation after _setup_train resets trainer.stop.r"   NrŸ   u4   Training cancelled from Platform before starting âœ…T)Úgetattrr
   r¡   r“   r    )r¢   r£   s     r   Úon_pretrain_routine_endr  †  s<   € ä
�'˜: tÓ
,€CÙ
ˆs�;ÒÜ�‰”v�hÐRÐSÔTØˆ�ð  €sr!   c                 ó*  ‡ ‡‡‡‡	— t        ‰ dd«      Š‰rt        dvs‰ j                  j                  syt	        ‰ «      \  Š	Ši ‰ j                  ‰ j                  d¬«      ¥‰ j                  ¥}‰ j                  r5‰ j                  j                  r‰ j                  j                  d   d   |d<   d}‰ j                  dk(  rB	 t        ‰ «      }|j                  dd«      |j                  d	d«      |j                  d
d«      dœ}i }	 ‰d   st        «       ‰d<   ‰d   j                  d¬«      }‰ j                  ||‰ j                   ‰ j"                  dœŠ|r|‰d<   ˆˆˆˆ	ˆ fd„}t$        j'                  |«       y# t        $ r Y Œ�w xY w# t        $ r Y Œfw xY w)z-Log training and system metrics at epoch end.r"   Nré   rä   )Úprefixr   Úlrzmodel/parameterszmodel/GFLOPszmodel/speed_PyTorch(ms))Ú
parametersÚgflopsÚspeedMsrì   T)Úrates)ÚepochÚmetricsÚsystemÚfitnessÚbest_fitnessÚ	modelInfoc                  óH   •— t        d‰‰‰‰d   d¬«      } t        ‰‰| «       y)zOSend epoch_end and check response for cancellation (runs in background thread).Ú	epoch_endr—   r/   rü   N)r™   r¤   )r9   r£   r†   r•   r_   r¢   s    €€€€€r   Ú_send_and_check_cancelz0on_fit_epoch_end.<locals>._send_and_check_cancelº  s(   ø€ ä˜ g¨w¸¸cÀ*¹oÐUVÔWˆÜ  ¨#¨xÕ8r!   )r  r   rå   r_   rç   Úlabel_loss_itemsÚtlossr  Ú	optimizerÚparam_groupsr  r'   rD   rQ   r&   Úget_metricsr  r  r›   rœ   )
r¢   r  Ú
model_infor¡   r  r  r£   r†   r•   r_   s
   `     @@@@r   Úon_fit_epoch_endr  Ž  s™  ü€ ä
�'˜: tÓ
,€CÙ”$˜gÑ%¨W¯\©\×-AÒ-AØä% gÓ.�M€GˆTØ\�×)Ñ)¨'¯-©-ÀÐ)ÓHÐ\ÈGÏOÉOÐ\€Gà×Ò˜W×.Ñ.×;Ò;Ø×)Ñ)×6Ñ6°qÑ9¸$Ñ?ˆ�‰ð €JØ‡}�}˜Òð	Ü)¨'Ó2ˆDà"Ÿh™hÐ'9¸1Ó=ØŸ(™( >°1Ó5ØŸ8™8Ð$=¸qÓAñˆJð €FðØ�?Ò#Ü#/£>ˆC�Ñ Ø�_Ñ%×1Ñ1¸Ð1Ó=ˆð
 —‘ØØØ—?‘?Ø×,Ñ,ñ€Gñ Ø)ˆ�Ñ÷9ð 9ô
 ×ÑÐ+Õ,øô7 ò 	Ùð	ûô ò Ùðús%   Ã AE7 Ä'F Å7	FÆFÆ	FÆFc                 óv  — t        | dd«      }|rt        dvs| j                  j                  syt	        «       |d   z
  dk  ry| j
                  r/t        | j
                  «      j                  «       r| j
                  n| j                  }|syt        | «      \  }}t        ||||d   ¬«       t	        «       |d<   y)z7Upload model checkpoint (rate limited to every 15 min).r"   Nré   rê   i„  r—   r³   )r  r   rå   r_   r   Úbestr   r°   Úlastrç   r´   )r¢   r£   r©   r_   r†   s        r   Úon_model_saver   Â  s    € ä
�'˜: tÓ
,€CÙ”$˜gÑ%¨W¯\©\×-AÒ-AØô ƒv��MÑ"Ñ" SÒ(Øà!(§¢´$°w·|±|Ó2D×2KÑ2KÔ2M�—’ÐSZ×S_ÑS_€JÙØä% gÓ.�M€GˆTÜ˜
 G¨T¸CÀ
¹OÕLÜ›€CˆÒr!   c           	      ó  — t        | dd«      }|rt        dvs| j                  j                  syt	        | «      \  }}|d   rt        j                  t        › d�«       |d   r|d   j                  «        d|d<   d}d}| j                  rŒt        | j                  «      j                  «       rit        | j                  «      j                  «       j                  }t        | j                  ||dd|d	   ¬
«      }|st        j                  t        › d�«       i }t        | di «      j!                  «       D ]7  }|j#                  d«      sŒ|d   j#                  d«      sŒ*|d   ||d   d   <   Œ9 t        t        | dd«      di «      j!                  «       D ]D  }|j#                  d«      sŒ|d   j#                  d«      sŒ*|j%                  |d   d   |d   «       ŒF |j!                  «       D �cg c]  }t'        |«      ‘Œ }	}t        t        | dd«      dd«      xs | j(                  xs i j#                  d«      }
t+        |
t,        «      rt/        |
j!                  «       «      n|
rt/        |
«      nd}t1        di | j2                  ¥d| j4                  i¥t        | d| j6                  «      | j8                  ||dœ||	dœ|||d	   d¬«       t:        › d|› d|j#                  d|«      › �}t        j                  t        › d|› �«       yc c}w )zDLog final results, upload best model, and send validation plot data.r"   Nré   rŸ   z0Uploading partial results for cancelled trainingrë   Tr.   r—   )r­   r˜   r—   zDModel will not be available for download on Platform (upload failed)Úplotsr‡   ÚtypeÚ	validatorÚnamesÚtraining_completer  Ú
best_epoch)r  Ú	bestEpochÚbestFitnessÚ	modelPathÚ	modelSize)ÚresultsÚ
classNamesr"  r:   rü   r   rþ   zView results at )r  r   rå   r_   rç   r
   r¡   r“   Ústop_capturer  r   r°   ÚstatÚst_sizer±   rP   ÚvaluesrD   Ú
setdefaultrx   r‡   rz   r{   r~   r™   r  r  r  r  rF   )r¢   r£   r_   r†   Úgcs_pathÚ
model_sizeÚplots_by_typer¡   Úpr"  r%  Úclass_namesr^   s                r   Úon_train_endr8  Õ  sÞ  € ä
�'˜: tÓ
,€CÙ”$˜gÑ%¨W¯\©\×-AÒ-AØä% gÓ.�M€GˆTà
ˆ;ÒÜ�‰”v�hÐNÐOÔPð ÐÒØÐÑ×*Ñ*Ô,Ø $ˆÐÑð €HØ€JØ‡|‚|œ˜WŸ\™\Ó*×1Ñ1Ô3Ü˜'Ÿ,™,Ó'×,Ñ,Ó.×6Ñ6ˆ
Ü  §¡¨w¸ÀtÐSTÐ_bÐcmÑ_nÔoˆÙÜ�N‰Nœf˜XÐ%iÐjÔkð €MÜ˜ ¨"Ó-×4Ñ4Ó6ò ?ˆØ�8‰8�FÕ  V¡× 0Ñ 0°Õ 8Ø26°v±,ˆM˜$˜v™, vÑ.Ò/ð?ô œ ¨°dÓ;¸WÀbÓI×PÑPÓRò IˆØ�8‰8�FÕ  V¡× 0Ñ 0°Õ 8Ø×$Ñ$ T¨&¡\°&Ñ%9¸4À¹<ÕHðIð '4×&:Ñ&:Ó&<Ö= Œ\˜!�_Ð=€EÐ=ô ”G˜G [°$Ó7¸À$ÓGÒlÈGÏLÉLÒL^Ð\^×KcÑKcÐdkÓKl€EÜ*4°U¼DÔ*A”$�u—|‘|“~Ô&ÑV[ÄtÈEÄ{Ðae€Kä	Øð K˜gŸo™oÐJ¨y¸'¿/¹/ÑJÜ$ W¨l¸G¿M¹MÓJØ&×3Ñ3Ø%Ø'ñð &Øñ
	
ð 	ØØˆJ‰Øõ!ô$ ˆN˜!˜G˜9 A c§g¡g¨l¸DÓ&AÐ%BÐ
C€CÜ
‡K�K”6�(Ð*¨3¨%Ð0Õ1ùò3 >s   Ç-L)r  r  r  r   r8  )T)ée   )Nr;   )N)Fr/   N)8rB   r"   r   rÐ   rÒ   Úconcurrent.futuresr   Úmathr   Úpathlibr   r   r   Úultralytics.utilsr   r	   r
   r   r   r   r   r   r   r“   rC   ÚrstriprF   rG   r    rD   r‘   r@   Úultralytics.utils.loggerr%   r&   rÍ   r'   r›   ÚAssertionErrorÚImportErrorre   rx   r}   r™   r�   r¤   r±   r´   râ   rç   r  r  r  r   r8  Ú	callbacks© r!   r   ú<module>rD     sŠ  ðó 
Û Û 	Û Û 
Ý 1Ý Ý ß ç v× vÕ vá	�,Ó	€ð ˆr�y‰yÐ3Ð5WÓX×_Ñ_Ð`cÓd€Ø"�^ =Ð1Ð òqðÙÐÐØˆ8�<‰<˜
 EÓ*¨dÑ2°i°b·i±iÐ@UÔ6VÐZfÐZb×ZfÑZfÐgpÔZqÐqÐqØˆr�y‰yÐ.Ó/ÒJ°<°8·<±<À	Ó3J€HÙ€Oˆ8ãçDÝDá"¨rÔ2€Ió[Zó|ò8óó>Bò
Hó!óHRò
0òf?ò: òzò1-òh ò&:2ñJ ð &?Ø#:Ø,Ø&Ø$ññ 
ð 
ñ 
øðQ 	˜Ð$ò Ø‚Hðús   Á8BD= Ä=	E	ÅE	