a
    Df                     @   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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ZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ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*Z*ddl+m,Z,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2m3Z3 ee45 Z6e6j7d Z8e9e:ddZ;e<de=de> d Z?ee:de8j@d ZAeBe:ddC dkZDeBe:ddC dkZEdZFdZGe(jHdddd e#jHddd jIid! d"e%jJjK_Le!Md eBe?ejNd#< eO d$kr8d%neBe?ejNd&< dd(d)ZPdd+d,ZQd-d. ZRd/d0 ZSd1d2 ZTeUd3d4d5ZVdd7d8ZWd9ZXeXdfd:d;ZYeYeX eZeXZ[eO d<kre[j\e[j]fD ]Z^e_e[e^j`d=d>  qddAdBZaea ZbG dCdD dDejcZdG dEdF dFejcZeG dGdH dHejcZfdIdJ Zgdeeh dKdLdMZiddNdOZjddQdRZkdSdT ZlddVdWZme4fdXdYZne4fdZd[Zod\d] Zpd^d_ Zqe8fd`daZre, efe8ddddeZsefe8ddfdgZtddidjZuddmdnZve, e8do dPdd'fdpdqZwddsdtZxddudvZyddydzZzdd|d}Z{dd~dZ|eGd6fddZ}dddZ~dd ZdddZdi fddZdddZdd ZdddZdd Zdd ZdddZdd ZdddZde#dfddZdd Zdd Zdd ZdddZdddZdddZdddZdd ZdddZdddZdddZdd Zdd ZdddÄZdddƄZedǃfddɄZdd˄ Zddd̈́Ze!jZe!jfddτZddф Zddӄ Zeee  e!_e!_e!_dS )z
General utils
    N)deepcopy)datetime)repeat)
ThreadPool)Path)check_output)
is_tarfile)Optional)ZipFile
is_zipfile)	TryExceptemojis)curl_downloadgsutil_getsize)box_ioufitness   RANK   ZYOLOv5_DATASETS_DIRdatasetsZYOLOv5_AUTOINSTALLTtrueZYOLOv5_VERBOSEz{l_bar}{bar:10}{r_bar}	Arial.ttfi@     long)	linewidth	precisionprofile
float_kindz{:11.5g})r   	formatter
   ZNUMEXPR_MAX_THREADSdarwin1ZOMP_NUM_THREADS c                 C   s$   t | } t|  ddt| kS )Nasciiignore)strlenencodedecodes r,   C/data/NAS7/SABIOD/METHODE/ermites/yolo-dyni/yolov5/utils/general.pyis_ascii?   s    r.      人工智能c                 C   s   t tdt| S )Nu	   [一-鿿])boolresearchr&   r*   r,   r,   r-   
is_chineseE   s    r3   c                   C   s
   dt jv S )Nzgoogle.colab)sysmodulesr,   r,   r,   r-   is_colabJ   s    r6   c                  C   sD   t t& ddlm}  |  duW  d   S 1 s60    Y  dS )z
    Check if the current script is running inside a Jupyter Notebook.
    Verified on Colab, Jupyterlab, Kaggle, Paperspace.

    Returns:
        bool: True if running inside a Jupyter Notebook, False otherwise.
    r   get_ipythonNF)
contextlibsuppress	ExceptionIPythonr8   r7   r,   r,   r-   
is_jupyterO   s    (r=   c                   C   s    t jddkot jddkS )NZPWDz/kaggle/workingZKAGGLE_URL_BASEzhttps://www.kaggle.com)osenvirongetr,   r,   r,   r-   	is_kaggle]   s    rA   )returnc                  C   sj   t d rdS z@td$} tdd | D W  d   W S 1 sD0    Y  W n tyd   Y dS 0 dS )z4Check if the process runs inside a docker container.z/.dockerenvTz/proc/self/cgroupc                 s   s   | ]}d |v V  qdS )ZdockerNr,   ).0liner,   r,   r-   	<genexpr>h       zis_docker.<locals>.<genexpr>NF)r   existsopenanyOSError)filer,   r,   r-   	is_dockerb   s    
6rL   Fc                 C   sp   |st | t jS t| d }z8t|d W d    n1 s@0    Y  |  W dS  tyj   Y dS 0 d S )Nztmp.txtwTF)r>   accessW_OKr   rH   unlinkrJ   )dirtestrK   r,   r,   r-   is_writeablem   s    rS   yolov5c                 C   sf   t tdd}|r"|dv r"tjntj}tjdd| ddii| d| |d	i| || gdd
id d S )Nr   r   >   r   r   r   Fformatz%(message)szlogging.StreamHandler)classr   level)rW   handlers	propagate)versionZdisable_existing_loggers
formattersrX   loggers)intr>   getenvloggingINFOERRORconfigZ
dictConfig)nameverboserankrW   r,   r,   r-   set_logging~   s,    rf   Windowsc                 C   s   t t| S N)fnr   xr,   r,   r-   <lambda>   rF   rl   UltralyticsYOLOV5_CONFIG_DIRc                 C   sd   t |}|rt|}n<dddd}t |t d }t|rH|ntd|  }|jdd |S )	NzAppData/Roamingz.configzLibrary/Application Support)rg   LinuxDarwinr#   z/tmpT)exist_ok)	r>   r^   r   homer@   platformsystemrS   mkdir)rQ   env_varenvpathcfgr,   r,   r-   user_config_dir   s    

rz   c                   @   s.   e Zd ZdddZdd Zdd Zdd	 Zd
S )Profile        c                 C   s   || _ tj | _d S rh   )ttorchcudais_available)selfr}   r,   r,   r-   __init__   s    zProfile.__init__c                 C   s   |   | _| S rh   )timestartr   r,   r,   r-   	__enter__   s    
zProfile.__enter__c                 C   s$   |   | j | _|  j| j7  _d S rh   )r   r   dtr}   )r   typevalue	tracebackr,   r,   r-   __exit__   s    zProfile.__exit__c                 C   s   | j rtj   t S rh   )r   r~   synchronizer   r   r,   r,   r-   r      s    
zProfile.timeN)r|   )__name__
__module____qualname__r   r   r   r   r,   r,   r,   r-   r{      s   
r{   c                   @   s4   e Zd ZdddddZdd Zdd	 Zd
d ZdS )Timeoutr#   T)timeout_msgsuppress_timeout_errorsc                C   s   t || _|| _t|| _d S rh   )r]   secondstimeout_messager0   r:   )r   r   r   r   r,   r,   r-   r      s    
zTimeout.__init__c                 C   s   t | jd S rh   )TimeoutErrorr   )r   signumframer,   r,   r-   _timeout_handler   s    zTimeout._timeout_handlerc                 C   s,   t  dkr(ttj| j t| j d S )Nrg   )rs   rt   signalSIGALRMr   alarmr   r   r,   r,   r-   r      s    zTimeout.__enter__c                 C   s,   t  dkr(td | jr(|tu r(dS d S )Nrg   r   T)rs   rt   r   r   r:   r   r   exc_typeexc_valexc_tbr,   r,   r-   r      s    
zTimeout.__exit__N)r   r   r   r   r   r   r   r,   r,   r,   r-   r      s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )WorkingDirectoryc                 C   s   || _ t  | _d S rh   )rQ   r   cwdresolve)r   Znew_dirr,   r,   r-   r      s    zWorkingDirectory.__init__c                 C   s   t | j d S rh   )r>   chdirrQ   r   r,   r,   r-   r      s    zWorkingDirectory.__enter__c                 C   s   t | j d S rh   )r>   r   r   r   r,   r,   r-   r      s    zWorkingDirectory.__exit__N)r   r   r   r   r   r   r,   r,   r,   r-   r      s   r   c                    s    fddt  D S )Nc                    s(   g | ] }t t |r|d s|qS )__)callablegetattr
startswithrC   finstancer,   r-   
<listcomp>   rF   zmethods.<locals>.<listcomp>)rQ   r   r,   r   r-   methods   s    r   argsc           	         s   t  j}t |\}}}}} d u rNt |\ }}} fdd| D  zt| t	
d}W n ty   t|j}Y n0 |r| dnd|r| dnd }tt|ddd   D   d S )Nc                    s   i | ]\}}| v r||qS r,   r,   rC   kvr   r,   r-   
<dictcomp>   rF   zprint_args.<locals>.<dictcomp>r#   z: , c                 s   s    | ]\}}| d | V  qdS )=Nr,   r   r,   r,   r-   rE      rF   zprint_args.<locals>.<genexpr>)inspectcurrentframef_backgetframeinfogetargvaluesitemsr   r   relative_toROOTwith_suffix
ValueErrorstemLOGGERinfocolorstrjoin)	r   Z	show_fileZ	show_funcrk   rK   _funcfrmr+   r,   r   r-   
print_args   s    
$r   c                 C   sx   t |  tj |  t|  tj|  tj|  |rtttjdrtt	d dtj
j_dtjd< t| tjd< d S )Nz1.12.0Tz:4096:8ZCUBLAS_WORKSPACE_CONFIGZPYTHONHASHSEED)randomseednpr~   manual_seedr   manual_seed_allcheck_version__version__use_deterministic_algorithmsbackendscudnndeterministicr>   r?   r&   )r   r   r,   r,   r-   
init_seeds   s    




r   r,   c                    s    fdd|   D S )Nc                    sD   i | ]<\ } v rt  fd dD r|j  jkr |qS )c                 3   s   | ]}| vV  qd S rh   r,   rC   rk   r   r,   r-   rE     rF   z-intersect_dicts.<locals>.<dictcomp>.<genexpr>)allshape)rC   r   dbexcluder   r-   r     rF   z#intersect_dicts.<locals>.<dictcomp>)r   )dar   r   r,   r   r-   intersect_dicts  s    r   c                 C   s   t | }dd |j D S )Nc                 S   s&   i | ]\}}|j tjjur||j qS r,   )defaultr   	Parameteremptyr   r,   r,   r-   r     rF   z$get_default_args.<locals>.<dictcomp>)r   	signature
parametersr   )r   r   r,   r,   r-   get_default_args
  s    
r   .c                 C   s,   t j |  ddd}|r(t|tjjdS dS )Nz/**/last*.ptT	recursive)keyr#   )globmaxr>   rx   getctime)Z
search_dirZ	last_listr,   r,   r-   get_latest_run  s    r   c                 C   s"   t  t t|  j }|jS rh   )r   nowfromtimestampr   statst_mtimedays)rx   r   r,   r,   r-   file_age  s    r   c                 C   s.   t t|  j}|j d|j d|j S )N-)r   r   r   r   r   yearmonthday)rx   r}   r,   r,   r-   	file_date  s    r   c                 C   sN   d}t | } |  r"|  j| S |  rFtdd | dD | S dS d S )Ni   c                 s   s    | ]}|  r| jV  qd S rh   )is_filer   st_sizer   r,   r,   r-   rE   )  rF   zfile_size.<locals>.<genexpr>z**/*r|   )r   r   r   r   is_dirsumr   )rx   mbr,   r,   r-   	file_size"  s    r   c                     s    dd l   fdd} |  p|  S )Nr   c                      s,   z  dd W dS  ty&   Y dS 0 d S )N)z1.1.1.1i  r   TF)create_connectionrJ   r,   socketr,   r-   run_once2  s
    zcheck_online.<locals>.run_oncer   )r   r,   r   r-   check_online.  s    r  c                 C   sP   z6t | d  sJ td|  ddd d d W S  tyJ   Y dS 0 d S )N.gitzgit -C z  describe --tags --long --alwaysTshellr   r#   )r   r   r   r)   r;   rx   r,   r,   r-   git_describe=  s
    "r  ultralytics/yolov5masterc              
      sp  d  }d| }t d}td s8J |d | t sNJ |d | tjdtdd	d
 d} fdd|D }t|r||	d	d  }nd}td| d| d	d
 td| d	dd tdd	d
 
 }ttd| d| d| dd	d
}	|	dkrR|dkrdnd| d| }
|d|	 dd |	dk  d!|
 d"| d#	7 }n|d$| d%7 }t| d S )&Nzhttps://github.com/z, for updates see zgithub: r  z%skipping check (not a git repository)zskipping check (offline)z\szgit remote -vTr  )patternstringc                    s   g | ]} |v qS r,   r,   )rC   r+   repor,   r-   r   Q  rF   z$check_git_status.<locals>.<listcomp>r   Zultralyticszgit remote add  z
git fetch r   )r  timeoutzgit rev-parse --abbrev-ref HEADzgit rev-list z../z --countr   originzgit pullz	git pull u    ⚠️ YOLOv5 is out of date by z commitr+   z. Use 'z' or 'git clone z' to update.zup to date with u    ✅)r   r   rG   r  r1   splitr   r)   rI   indexstripr]   r   r   )r  branchurlmsgr+   splitsmatchesremoteZlocal_branchnpullr,   r  r-   check_git_statusF  s&    

$
,r  c                 C   s   t d dd l}zX|| }|jjjdd}|jjj	}z|j
j}W n tyZ   d }Y n0 |||dW S  |jjy   d d d d Y S 0 d S )NZ	gitpythonr   r  r#   )r  r  commit)check_requirementsgitZRepoZremotesr  r  replaceheadr  ZhexshaZactive_branchrc   	TypeErrorexcZInvalidGitRepositoryError)rx   r  r  r  r  r  r,   r,   r-   check_git_infob  s    


r$  3.7.0c                 C   s   t t | ddd d S )NzPython T)rc   hard)r   rs   python_version)minimumr,   r,   r-   check_pythont  s    r)  0.0.0version c                 C   sn   dd | |fD \} }|r"| |kn| |k}d| | d| |  d}|rX|sXJ t ||rj|sjt| |S )Nc                 s   s   | ]}t |V  qd S rh   )pkgparse_versionr   r,   r,   r-   rE   {  rF   z check_version.<locals>.<genexpr>u   WARNING ⚠️ z is required by YOLOv5, but z is currently installed)r   r   warning)currentr(  rc   Zpinnedr&  rd   resultr+   r,   r,   r-   r   y  s    
r   zrequirements.txtc                    s  t ddd}t  t| tr|  }| s@J | d| d| (} fddt|D } W d    q1 sv0    Y  nt| t	r| g} d}d	}| D ]F}	zt
|	 W q tjtjfy   |d
|	 d7 }|d7 }Y q0 q|r|rtrt| dd|dk  d| d zzttd| d| dd  dt v rP|n| }
| d| dd|dk  d|
 d| dt dd d}t| W n: ty } z t| d|  W Y d }~n
d }~0 0 d S )Nredboldzrequirements:r  z not found, check failed.c                    s&   g | ]}|j  vr|j  |j qS r,   )rc   Z	specifierr   r   r,   r-   r     rF   z&check_requirements.<locals>.<listcomp>r#   r   "z" r   z YOLOv5 requirementr+   z#not found, attempting AutoUpdate...zpip install Tr  rK   z packagez updated per 
u    ⚠️ z;Restart runtime or rerun command for updates to take effectu    ❌ )r   r)  
isinstancer   r   rG   rH   r,  Zparse_requirementsr&   requireZVersionConflictZDistributionNotFoundAUTOINSTALLr   r   r   r)   localsr;   r.  )requirementsr   installcmdsprefixrK   r   r+   r  rsourceer,   r3  r-   r    s<    

8
$" r      c                    sd   t | tr tt| t }nt| }  fdd| D }|| kr`td|  d d|  |S )Nc                    s    g | ]}t t|t qS r,   )r   make_divisibler]   r   floorr+   r,   r-   r     rF   z"check_img_size.<locals>.<listcomp>u   WARNING ⚠️ --img-size z  must be multiple of max stride z, updating to )r6  r]   r   rB  listr   r.  )imgszr+   rD  new_sizer,   rC  r-   check_img_size  s    
rH  c              
   C   s   zHt  rJ t rJ tdtd td t  td W dS  ty } z"| rlt	
d|  W Y d }~dS d }~0 0 d S )NrR   )r   r      r   TuM   WARNING ⚠️ Environment does not support cv2.imshow() or PIL Image.show()
F)r=   rL   cv2imshowr   zeroswaitKeydestroyAllWindowsr;   r   r.  )warnr@  r,   r,   r-   check_imshow  s    



rP  
yolov5s.ptz.ptc                 C   sn   | rj|rjt |tr|g}t | ttfr*| n| gD ]8}t|j }t|r0||v s0J | | d| q0d S )Nz acceptable suffix is )r6  r&   rE  tupler   suffixlowerr'   )rK   rT  r  r   r+   r,   r,   r-   check_suffix  s    
rV  z.yamlz.ymlc                 C   s
   t | |S rh   )
check_file)rK   rT  r,   r,   r-   
check_yaml  s    rY  c                 C   sb  t | | t| } tj| s"| s&| S | dr| }ttj	| 
dd j} tj| rttd| d|   nRtd| d|  d tj||  t|  rt|  jdksJ d	| | S | d
rdtjv sJ d| S g }dD ](}|tjtt| d |  dd qt|s4J d|  t|dksVJ d|  d| |d S d S )N)zhttp:/zhttps:/?r   zFound z locally at Downloading  to ...zFile download failed: z
clearml://Zclearmlz[ClearML is not installed, so cannot use ClearML dataset. Try running 'pip install clearml'.)datamodelsutilsz**Tr   zFile not found: r   zMultiple files match 'z', specify exact path: )rV  r&   r>   rx   isfiler   r   urllibparseunquoter  rc   r   r   r~   hubdownload_url_to_filerG   r   r   r4   r5   extendr   r   r'   )rK   rT  r  filesdr,   r,   r-   rX    s,    

,
&"rX  c                 C   s`   t | } t| j }|  s\| s\d| j }td| d| d tjj|t	||d d S )Nzhttps://ultralytics.com/assets/r[  r\  r]  progress)
r   
CONFIG_DIRrc   rG   r   r   r~   re  rf  r&   )fontrk  rK   r  r,   r,   r-   
check_font  s    
rn  c                    s|  d}t  ttfrjt s"t rjt t dt j ddddd ttt j 	d  j
d }}t  ttfrt  dD ] }| v sJ td	| d
qt  d ttfrtt d  d< tdd  d  D sJ dt d  d< t|p dpd s6t   d< dD ]} |r:t  | tr |   }| s | dr | dd    }t| |< nfdd | D  |< q: fdddD \}}}}|rZdd t |tr|n|gD }tdd |D sZtddd |D   |r@|sHtdt }	|dr|drt|j}
td| d |
 d! t j!"||
 ttj#ddd" t$|
td# t|
%  d }n<|d$rtd%| d& t&j'|dd'}nt(|d( i}d)t)t |	 d d*}|d+v r>d,| d-t*d.t n
d/| d0}td1|  t+t, d rnd2nd3dd4  S )5Nr#   r  TFr   )rQ   unzipdeletecurlthreadsz*.yaml)trainvalnameszdata.yaml 'u   :' field missing ❌ru  c                 s   s   | ]}t |tV  qd S rh   )r6  r]   )rC   r   r,   r,   r-   rE     rF   z check_dataset.<locals>.<genexpr>z2data.yaml names keys must be integers, i.e. 2: carncrx   )rs  rt  rR   z../rI  c                    s   g | ]}t  |  qS r,   )r&   r   r   r  r,   r-   r     rF   z!check_dataset.<locals>.<listcomp>c                 3   s   | ]}  |V  qd S rh   )r@   r   )r^  r,   r-   rE      rF   )rs  rt  rR   downloadc                 S   s   g | ]}t | qS r,   )r   r   r   r,   r,   r-   r   "  rF   c                 s   s   | ]}|  V  qd S rh   )rG   r   r,   r,   r-   rE   #  rF   u+   
Dataset not found ⚠️, missing paths %sc                 S   s   g | ]}|  st|qS r,   )rG   r&   r   r,   r,   r-   r   $  rF   u   Dataset not found ❌httpz.zipr[  r\  r]  parentsrq   r  zbash zRunning z ...r  yaml(zs))r   Nu   success ✅ z, saved to r2  zfailure u    ❌zDataset download r   zArial.Unicode.ttfrj  )-r6  r&   r   r   r   rw  DATASETS_DIRr   nextrglobparent	yaml_loadr   rE  rS  dict	enumerater   keysr'   r@   is_absoluter   r   rG   r   r   r   r;   r   endswithrc   r~   re  rf  ru   
unzip_filerP   
subprocessrunexecroundr   rn  r.   )r^  autodownloadextract_dirr   rk   rs  rt  rR   r+   r}   r   r>  r   r,   )r^  rx   r-   check_dataset  sd    $"
 
,r  c                    s   ddl m m}  fdd}td}t|  j}|jdv r@dS td d	 d
 }|	 r\|nt
 rfdntd}z8|t| |s||d||sJ t| d W dS  ty   d}t| d|  Y dS 0 d S )Nr   )	AutoShapeDetectMultiBackendc                    sJ    | dd}||j d }d|_||j d }|j|jkoHtj||ddS )NF)rd   r   Tg?)atol)xywhnampr   r~   allclose)modelimmabr  r,   r-   amp_allclose@  s
    zcheck_amp.<locals>.amp_allclosezAMP: )cpumpsFr^  imageszbus.jpgz&https://ultralytics.com/images/bus.jpg)  r  rI  z
yolov5n.ptu   checks passed ✅Tz1https://github.com/ultralytics/yolov5/issues/7908u<   checks failed ❌, disabling Automatic Mixed Precision. See )models.commonr  r  r   r~  r   devicer   r   rG   r  r   onesr   r   r   r;   r.  )r  r  r  r=  r  r   r  Zhelp_urlr,   r  r-   	check_amp<  s     
 "r  	data.yamlc                 C   s:   t | dd}t|W  d    S 1 s,0    Y  d S )Nr%   )errors)rH   r{  	safe_load)rK   r   r,   r,   r-   r  X  s    r  c                 C   sL   t | d.}tjdd | D |dd W d    n1 s>0    Y  d S )NrM   c                 S   s(   i | ] \}}|t |tr t|n|qS r,   )r6  r   r&   r   r,   r,   r-   r   a  rF   zyaml_save.<locals>.<dictcomp>F	sort_keys)rH   r{  	safe_dumpr   )rK   r^  r   r,   r,   r-   	yaml_save^  s    r  z	.DS_StoreZ__MACOSXc                    sp   |d u rt | j}t| B}| D ]( t fdd|D r$|j |d q$W d    n1 sb0    Y  d S )Nc                 3   s   | ]}| vV  qd S rh   r,   r   r   r,   r-   rE   j  rF   zunzip_file.<locals>.<genexpr>r  )r   r  r
   namelistr   extract)rK   rx   r   ZzipObjr,   r  r-   r  d  s    

r  c                 C   s0   t t| dd} ttj| jdd S )Nz:/z://rZ  r   )r&   r   r   rb  rc  rd  rc   r  )r  r,   r,   r-   url2filen  s    r  rI  c           	         s    fddt |}|jddd dkrjt}|fddt| t| |  |  n(t| t	t fr~| gn| D ]}|| qd S )Nc              
      s~  d}t j| rt| }n|t| j }td|  d| d td D ]} rht| |dkd}nt	j
j| |dkd | }|r qqL|k rtd|d  d	 d
|  d qLtd|  d qLrz|rz|jdkst|st|rztd| d t|r t|| nLt|rFtjdd|d|jgdd n&|jdkrltjdd|d|jgdd rz|  d S )NTr[  r\  r]  r   )silentrj  u"   ⚠️ Download failure, retrying r  r  u   ❌ Failed to download z.gzz
Unzipping tarxfz--directory)checkZxfz)r>   rx   ra  r   rc   r   r   ranger   r~   re  rf  r   r.  rT  r   r   r  r  r  r  rP   )r  rQ   successr   i)rq  rp  retryrr  ro  r,   r-   download_onev  s2    
$(

zdownload.<locals>.download_oneTry  r   c                    s    |  S rh   r,   rj   )r  r,   r-   rl     rF   zdownload.<locals>.<lambda>)
r   ru   r   imapzipr   closer   r6  r&   )	r  rQ   ro  rp  rq  rr  r  poolur,   )rq  rp  r  r  rr  ro  r-   rw  t  s     
rw  c                 C   s*   t |tjrt| }t| | | S rh   )r6  r~   Tensorr]   r   mathceil)rk   divisorr,   r,   r-   rB    s    rB  c                 C   s   t jdd| dS )Nu"   [|@#!¡·$€%&()=?¿^*;:,¨´><+]r   )r	  replr
  )r1   subr*   r,   r,   r-   	clean_str  s    r  r|         ?d   c                    s    fddS )Nc                    s(   dt | t j    d    S )Nr      )r  cospirj   stepsy1y2r,   r-   rl     rF   zone_cycle.<locals>.<lambda>r,   )r  r  r  r,   r  r-   	one_cycle  s    r  c                     sv   t | dkr| ndd| d f^ }}ddddd	d
dddddddddddddd d fdd|D |   d  S )Nr   bluer2  r   z[30mz[31mz[32mz[33mz[34mz[35mz[36mz[37mz[90mz[91mz[92mz[93mz[94mz[95mz[96mz[97mz[0mz[1mz[4m)blackr1  greenyellowr  magentacyanwhiteZbright_blackZ
bright_redZbright_greenZbright_yellowZbright_blueZbright_magentaZbright_cyanZbright_whiteendr2  	underliner#   c                 3   s   | ]} | V  qd S rh   r,   r   colorsr,   r-   rE     rF   zcolorstr.<locals>.<genexpr>r  )r'   r   )inputr   r
  r,   r  r-   r     s,    $r   P   c                 C   sr   | d d u rt  S t| d} | d d df t}tj||d}d||dk< d| }||  }t |	 S )Nr   	minlengthr   )
r~   r  r   concatenateastyper]   bincountr   
from_numpyfloat)labelsrv  classesweightsr,   r,   r-   labels_to_class_weights  s    r  c                    s.   t  fdd| D }|d | dS )Nc                    s,   g | ]$}t j|d d df t dqS )Nr   r  )r   r  r  r]   r   rv  r,   r-   r     rF   z+labels_to_image_weights.<locals>.<listcomp>r   )r   arrayreshaper   )r  rv  class_weightsZclass_countsr,   r  r-   labels_to_image_weights  s    r  c                   C   s   g dS )N)Pr   r  rI     r         r   	   r                                                       rA  !   "   #   $   %   &   '   (   )   *   +   ,   .   /   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?   @   A   C   F   H   I   J   K   L   M   N   O   r  Q   R   T   U   V   W   X   Y   Z   r,   r,   r,   r,   r-   coco80_to_coco91_class  s    r4  c                 C   sz   t | tjr|  nt| }| d | d  d |d< | d | d  d |d< | d | d  |d< | d | d  |d< |S N.r   .r  r  .r   .rI  r6  r~   r  cloner   copyrk   yr,   r,   r-   	xyxy2xywh  s    r?  c                 C   s   t | tjr|  nt| }| d | d d  |d< | d | d d  |d< | d | d d  |d< | d | d d  |d< |S r5  r:  r=  r,   r,   r-   	xywh2xyxy  s    r@  r  c                 C   s   t | tjr|  nt| }|| d | d d   | |d< || d | d d   | |d< || d | d d   | |d< || d | d d   | |d< |S r5  r:  rk   rM   hpadwpadhr>  r,   r,   r-   
xywhn2xyxy  s        rE  c                 C   s   |rt | || || f t| tjr.|  nt| }| d | d  d | |d< | d | d  d | |d< | d | d  | |d< | d | d  | |d< |S r5  )
clip_boxesr6  r~   r  r;  r   r<  )rk   rM   rB  clipepsr>  r,   r,   r-   
xyxy2xywhn  s    rI  c                 C   sJ   t | tjr|  nt| }|| d  | |d< || d  | |d< |S )Nr6  r8  r:  rA  r,   r,   r-   xyn2xy  s    rJ  c                 C   sp   | j \}}|dk|dk@ ||k@ ||k@ }|| ||  }}t|rft| | | | gS tdS )Nr   )r   r  )TrI   r   r  minr   rL  )segmentwidthheightrk   r>  insider,   r,   r-   segment2box%  s    
 rQ  c                 C   sH   g }| D ]0}|j \}}|| | | | g qtt|S rh   )rK  appendrL  r   r?  r   r  )segmentsboxesr+   rk   r>  r,   r,   r-   segments2boxes-  s
    
$rU    c                    s   t | D ]|\} tj  ddd d f fdd tdt d |tt t fddtdD ddj| |< q| S )Nr   r   )axisc              	      s&   g | ]}t  d d |f qS rh   )r   interp)rC   r  r+   rk   xpr,   r-   r   <  rF   z%resample_segments.<locals>.<listcomp>r  r   )	r  r   r  linspacer'   aranger  r  rK  )rS  r  r  r,   rY  r-   resample_segments6  s    "0r]  c                 C   s   |d u r\t | d |d  | d |d  }| d |d |  d | d |d |  d f}n|d d }|d }|dddgf  |d 8  < |dddgf  |d 8  < |dd df  |  < t|| |S )Nr   r   r  .rI  r  )rL  rF  )
img1_shaperT  
img0_shape	ratio_padgainpadr,   r,   r-   scale_boxes@  s    "2
rc  c                 C   s   |d u r\t | d |d  | d |d  }| d |d |  d | d |d |  d f}n|d d }|d }|d d df  |d 8  < |d d df  |d 8  < || }t|| |r|d d df  |d   < |d d df  |d   < |S )Nr   r   r  )rL  clip_segments)r^  rS  r_  r`  	normalizera  rb  r,   r,   r-   scale_segmentsP  s    "2
rf  c                 C   s   t | tjr^| d d|d  | d d|d  | d d|d  | d d|d  nP| dddgf d|d | dddgf< | ddd	gf d|d | ddd	gf< d S )
Nr6  r   r   r8  r7  r9  .r  rI  r6  r~   r  clamp_rG  )rT  r   r,   r,   r-   rF  c  s    (rF  c                 C   s   t | tjrF| d d df d|d  | d d df d|d  nP| d d df d|d | d d df< | d d df d|d | d d df< d S )Nr   r   rg  )rS  r   r,   r,   r-   rd  o  s
    (rd        ??,  c	           %      C   s  d|  krdks&n J d| dd|  kr:dksLn J d| dt | ttfrb| d } | j}	d|	jv }
|
r~|  } | jd }| jd | d }| d	 |k}d
}d}dd|  }d}||dkM }d}t }d| }tj	dd| f| jdg| }t
| D ]\}}|||  }|rt|| r|| }tj	t||| d f|jd}|ddddf |ddddf< d|dddf< d|tt||dddf  d f< t||fd}|jd sҐq|ddddf  |ddddf 9  < t|ddddf }|dd|df }|r|ddd|f |kjddj\}}t|| ||d| df |dddf  || fd}nH|ddd|f jddd\}}t||| |fd|d|k }|dur||ddddf tj||jdkd }|jd }|s&q||dddf jddd|  }|ddddf |rfdn| } |ddddf |  |dddf  }!}"tj|!|"|}|d| }|rDd|  k rdk rDn npt|!| |!|k}#|#|"d  }$t|$|ddddf  |$jddd ||ddf< |rD||#ddk }|| ||< |
rh|| |	||< t | |krt d|dd  qq|S )zNon-Maximum Suppression (NMS) on inference results to reject overlapping detections

    Returns:
         list of detections, on (n,6) tensor per image [xyxy, conf, cls]
    r   r   zInvalid Confidence threshold z&, valid values are between 0.0 and 1.0zInvalid IoU r  r  r   ).r  i   i0u  g      ?g?TFr  )r  Nr  r  )as_tuple)keepdimr   )
descendingg     p@u   WARNING ⚠️ NMS time limit z.3fz
s exceeded)!r6  rE  rS  r  r   r  r   r   r~   rL  r  r'   r  r   catr@  nonzerorK  r  r   viewtensorrI   argsorttorchvisionopsnmsr   mmr   tor   r.  )%Z
prediction
conf_thres	iou_thresr  agnosticmulti_labelr  max_detnmr  r  bsrv  xcZmax_whZmax_nms
time_limitZ	redundantmerger}   mioutputxirk   lbr   boxmaskr  jconfr  crT  scoresiour  r,   r,   r-   non_max_suppressiony  s|    &&

 $(,&<"&
.
$"*":
r  best.ptc              	   C   s   t j| t dd}|dr*|d |d< dD ]}d ||< q.d|d< |d   |d  D ]
}d|_q\t ||pt|  tj	
|p| d	 }td
|  d|rd| dnd d|dd d S )Nr  )map_locationemar  )	optimizerbest_fitnessr  updatesr   epochFg    .AzOptimizer stripped from ,z
 saved as r#   r  z.1fMB)r~   loadr  r@   halfr   requires_gradsaver>   rx   getsizer   r   )r   r+   rk   r   pr   r,   r,   r-   strip_optimizer  s    

r  zevolve: c                 C   sz  |d }|d }t | t |  } t dd | D } |t |  }t| }	|rd| d}
t|
| rv| jndkrt	dd	|
 | g | rd
nd|	 |  
dd }t|d0}||d|	 | 
d d  W d    n1 s0    Y  t|d}tj|dd}|jdd d}tt|jd d d df }t|}|dd| d d|d  d d ddd | d d D  d d ddd |j|d df D  d   tj|j| dd   |d!d" W d    n1 s0    Y  t|| d# | dd$d | D  d | dd%d |D  d   |rvt	dd	| | d| g d S )&Nz
evolve.csvzhyp_evolve.yamlc                 s   s   | ]}|  V  qd S rh   r  r   r,   r,   r-   rE     rF   z!print_mutation.<locals>.<genexpr>zgs://z/evolve.csvr   gsutilcpr#   z%20s,r  r5  r  z%20.5g,rM   T)skipinitialspacec                 S   s   |   S rh   r  rj   r,   r,   r-   rl     rF   z print_mutation.<locals>.<lambda>)columnsr  z*# YOLOv5 Hyperparameter Evolution Results
z# Best generation: z# Last generation: r   z# r   c                 s   s   | ]}|  d V  qdS z>20sNr  r   r,   r,   r-   rE     rF   r  c                 s   s   | ]}|d V  qdS )z>20.5gNr,   r   r,   r,   r-   rE     rF   z

Fr  z' generations finished, current result:
c                 s   s   | ]}|  d V  qdS r  r  r   r,   r,   r-   rE     rF   c                 s   s   | ]}|d V  qdS )z20.5gNr,   r   r,   r,   r-   rE     s   )rS  r  valuesr'   r   rG   r   r   r  r  rstriprH   writepdread_csvrenamer   argmaxr   r   r{  r  locto_dictr   r   )r  resultshypsave_dirbucketr=  
evolve_csvevolve_yamlvalsr  r  r+   r   r^  r  Zgenerationsr,   r,   r-   print_mutation  sb    ">  B
r  c                 C   s  t |tjr|gn|}t| D ]\}}|d urt|r| }t|d d d df }|d d dd f dd d|d d dd f< |d d dd f d d |d d dd f< t	|
 |d d d df< t|jdd  |d d d df || j |d d df 
 }g }|D ]}	|| t|	d t|	d t|	d t|	d f }
t|
d	}|d d d d d d d
f ddd}tj|tjd}|d }|| q|t||jd}| | ||k | |< q| S )Nr  r  r   r   g?   r   rI  )   r  r   )dtype   )r6  r   ndarrayr  r'   r;  r?  r   	unsqueezer@  r   rc  r   r]   rJ  resize	transposeascontiguousarrayfloat32rR  r~   r  rx  r  r  )rk   r  imgim0r  ri  r  Z	pred_cls1imsr  cutoutr  Z	pred_cls2r,   r,   r-   apply_classifier!  s*    4,,8&r  c                 C   s   t | } |  rt|st|  r,| d| jfn| df\} }tddD ](}|  | | | }tj|sB qlqBt |} |r| jddd | S )Nr#   r  i'  Try  )	r   rG   r   r   rT  r  r>   rx   ru   )rx   rq   sepru   rT  r  r  r,   r,   r-   increment_pathD  s    $	r  c                 C   s   t t| tj|S rh   )rJ  imdecoder   fromfileuint8)rx   flagsr,   r,   r-   imreadb  s    r  c                 C   s<   z"t t| j|d |  W dS  ty6   Y dS 0 d S )Nr   TF)rJ  imencoder   rT  tofiler;   rx   r  r,   r,   r-   imwritef  s
    r  c                 C   s   t | d | d S )Nunicode_escape)imshow_r(   r)   r  r,   r,   r-   rK  n  s    rK  )r#   )r/   )F)rm   rn   )NTF)r   F)r,   )r   )r  r  )r   )r%  )r*  r*  r+  FFF)rA  r   )F)rQ  rR  r#   )rW  )r#   )T)r  )Nr  )r   TTFr   rI  )r|   r  r  )r  )r  r  r   r   )r  r  Fr|   )r  r  r   r   )r  r  )rV  )N)NF)ri  rj  NFFr,   rk  r   )r  r#   )Fr#   F)__doc__r9   r   r   r_   Zlogging.configr  r>   rs   r   r1   r   r  r4   r   rb  r<  r   r   	itertoolsr   multiprocessing.poolr   pathlibr   r   tarfiler   typingr	   zipfiler
   r   rJ  numpyr   pandasr  pkg_resourcesr,  r~   rt  r{  r`  r   r   utils.downloadsr   r   utils.metricsr   r   __file__r   FILErz  r   r]   r^   r   rL  r   	cpu_countNUM_THREADSr  r}  r&   rU  r8  VERBOSETQDM_BAR_FORMATZFONTset_printoptionsrU   optionsdisplaymax_columnssetNumThreadsr?   rt   r.   r3   r6   r=   rA   r0   rL   rS   ZLOGGING_NAMErf   	getLoggerr   r   r.  ri   setattrr   rz   rl  ContextDecoratorr{   r   r   r   r  r   r   r   r   r   r   r   r   r  r  r  r$  r)  r   r  rH  rP  rV  rY  rX  rn  r  r  r  r  r  r  rw  rB  r  r  r   r  r  r  r4  r?  r@  rE  rI  rJ  rQ  rU  r]  rc  rf  rF  rd  r  r  r  r  r  rK  r  IMREAD_COLORr  r  r,   r,   r,   r-   <module>   s  


 







	

"






B



.








	



        
q
'#
