a
    DfL                     @   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mZ ddlmZ ddlm  mZ ddlmZ ddlmZmZmZmZmZ ee dd	Z!ee d
d	Z"ee ddZ#zddl$Z$W n e%y   dZ$Y n0 ej&ddd ej&de'd eej(dfddZ)dVddZ*dd Z+dWddZ,eedddZ-dd  Z.dXd#d$Z/d%d& Z0dYd(d)Z1d*d+ Z2d,d- Z3d.d/ Z4ej5fd0d1Z6d2d3 Z7dZd5d6Z8d7d8 Z9d[d;d<Z:d\d?d@Z;d]dBdCZ<d^dHdIZ=d_dLdMZ>d`dPdQZ?G dRdS dSZ@G dTdU dUZAdS )az
PyTorch utils
    N)contextmanager)deepcopy)Path)DistributedDataParallel)LOGGERcheck_versioncolorstr	file_dategit_describe
LOCAL_RANKRANK
WORLD_SIZE   ignorezIUser provided device_type of 'cuda', but CUDA is not available. Disabling)message)categoryz1.9.0c                    s    fdd}|S )Nc                    s    r
t jnt j | S N)torchinference_modeno_grad)fn	torch_1_9 G/data/NAS7/SABIOD/METHODE/ermites/yolo-dyni/yolov5/utils/torch_utils.pydecorate(   s    z&smart_inference_mode.<locals>.decorater   )r   r   r   r   r   smart_inference_mode&   s    r           c                 C   s:   t tjdrtj| dS | dkr2td|  d t S )Nz1.10.0label_smoothingr   u   WARNING ⚠️ label smoothing z requires torch>=1.10.0)r   r   __version__nnCrossEntropyLossr   warningr   r   r   r   smartCrossEntropyLoss.   s
    r%   c                 C   sJ   t tjdddrJ dt tjdr6t| tgtddS t| tgtdS d S )N1.12.0T)pinnedztorch==1.12.0 torchvision==0.13.0 DDP training is not supported due to a known issue. Please upgrade or downgrade torch to use DDP. See https://github.com/ultralytics/yolov5/issues/8395z1.11.0)
device_idsoutput_devicestatic_graph)r(   r)   )r   r   r!   DDPr   modelr   r   r   	smart_DDP7   s    r.     c                 C   s@  ddl m} tt| dr| jn|  d \}}t||rZ|jj|krXt	
|jj||_nt|t	j
r|j|krt| |t	
|j| nt|t	jr<dd |D }t	j
|v r|t	j
}|| j|krt	
|| j|||< n\t	j|v r<|t	j}|| j|kr<t	j|| j||| j|| j|| jd ud||< d S )Nr   )Classifyr-   r   c                 S   s   g | ]}t |qS r   )type.0xr   r   r   
<listcomp>M       z-reshape_classifier_output.<locals>.<listcomp>)bias)models.commonr0   listhasattrr-   named_children
isinstancelinearout_featuresr"   Linearin_featuressetattr
SequentialindexConv2dout_channelsin_channelskernel_sizestrider7   )r-   nr0   namemtypesir   r   r   reshape_classifier_outputB   s$    $


rN   
local_rankc                 c   s6   | dvrt j| gd d V  | dkr2t jdgd d S )N)r   r   )r(   r   )distbarrierrO   r   r   r   torch_distributed_zero_firstX   s
    rS   c                  C   sh   t  dv sJ dz:t  dkr&dnd} ttj| ddddj  d W S  tyb   Y d	S 0 d S )
N)LinuxWindowsz1device_count() only supported on Linux or WindowsrT   znvidia-smi -L | wc -lznvidia-smi -L | find /c /v ""T)shellcapture_outputcheckr   r   )	platformsystemint
subprocessrunstdoutdecodesplit	Exception)cmdr   r   r   device_countb   s    &rc    Tc              
   C   s  dt  pt  dt  dtj d}t|   	dd	dd} | dk}| d	k}|s^|rjd
t
jd< nB| r| t
jd< tj rtj t| 	ddksJ d|  d|s|stj r| r| dnd}t|}|dkr|dkr|| dksJ d| d| dt|d  }t|D ]N\}	}
tj|	}||	dkrPdn| d|
 d|j d|jd dd7 }q,d}n<|rttddrtjj r|d7 }d	}n|d7 }d}|s| }t| t|S )Nu   YOLOv5 🚀 z Python-z torch- zcuda:rd   nonecpumpsz-1CUDA_VISIBLE_DEVICES,zInvalid CUDA '--device z<' requested, use '--device cpu' or pass valid CUDA device(s)0r   r   zbatch-size z not multiple of GPU count zCUDA:z (, i   z.0fzMiB)
zcuda:0has_mpsFzMPS
zCPU
)r
   r	   rY   python_versionr   r!   strstriplowerreplaceosenvironcudais_availablerc   lenr`   	enumerateget_device_propertiesrJ   total_memorygetattrbackendsrh   rstripr   infodevice)r   
batch_sizenewlinesrg   rh   devicesrI   spacerM   dpargr   r   r   select_devicel   s<    & 
&
"<"
r   c                   C   s   t j rt j  t S r   )r   ru   rv   synchronizetimer   r   r   r   	time_sync   s    

r   
   c                 C   s  g }t |tjst|}tdddddddddddd	d
d	 t | trX| n| gD ]|}||}d|_t |tr|n|gD ]P}t|dr||n|}t|drt |tj	r|j
tju r| n|}ddg d  }}}	z"tj||fddd d d }
W n ty"   d}
Y n0 zpt|D ]}t |	d< ||}t |	d< z8t |trptdd |D n|  }t |	d< W n  ty   td|	d< Y n0 ||	d |	d  d | 7 }||	d |	d  d | 7 }q0tj r tj d nd}dd ||fD \}}t |tjr>tdd | D nd}t|d|
d|d|d|dt|d	t|d	 |||
|||||g W n8 ty } zt| |d W Y d}~n
d}~0 0 tj  qq^|S ) z YOLOv5 speed/memory/FLOPs profiler
    Usage:
        input = torch.randn(16, 3, 640, 640)
        m1 = lambda x: x * torch.sigmoid(x)
        m2 = nn.SiLU()
        profile(input, [m1, m2], n=100)  # profile over 100 iterations
    Paramsz>12sGFLOPszGPU_mem (GB)z>14szforward (ms)zbackward (ms)inputz>24soutputTtohalfr   )r   r   r   Finputsverbose    eA   r   c                 s   s   | ]}|  V  qd S r   )sum)r3   yir   r   r   	<genexpr>   r6   zprofile.<locals>.<genexpr>nanr/   c                 s   s(   | ] }t |tjrt|jnd V  qdS )r9   N)r<   r   Tensortupleshaper2   r   r   r   r      r6   c                 s   s   | ]}|  V  qd S r   numelr2   r   r   r   r      r6   Z12z12.4gz>14.3fz14.4gN)r<   r   r   r   printr9   r   requires_gradr:   r   dtypefloat16r   thopprofilera   ranger   r   backwardfloatru   rv   memory_reservedr"   Module
parametersro   appendempty_cache)r   opsrI   r   resultsr4   rK   tftbtflops_ymemZs_inZs_outr   er   r   r   r      sR     
."


* (: r   c                 C   s   t | tjjtjjfv S r   )r1   r"   parallelDataParallelr   r,   r   r   r   is_parallel   s    r   c                 C   s   t | r| jS | S r   )r   moduler,   r   r   r   de_parallel   s    r   c                 C   s`   |   D ]R}t|}|tju r q|tju r8d|_d|_q|tjtjtj	tj
tjfv rd|_qd S )NMbP?gQ?T)modulesr1   r"   rD   BatchNorm2depsmomentum	Hardswish	LeakyReLUReLUReLU6SiLUinplace)r-   rK   r   r   r   r   initialize_weights   s    

r   c                    s    fddt | jD S )Nc                    s   g | ]\}}t | r|qS r   )r<   )r3   rM   rK   mclassr   r   r5      r6   z find_modules.<locals>.<listcomp>)rx   module_list)r-   r   r   r   r   find_modules   s    r   c                 C   s:   d\}}|   D ] }|| 7 }||dk 7 }q|| S )N)r   r   r   )r   r   r   )r-   abr   r   r   r   sparsity   s
    r   333333?c                 C   sn   dd l m  m  m} |  D ]0\}}t|tjr |j|d|d ||d q t	
dt| dd d S )Nr   weight)rJ   amountzModel pruned to z.3gz global sparsity)Ztorch.nn.utils.pruner"   utilsprunenamed_modulesr<   rD   Zl1_unstructuredremover   r~   r   )r-   r   r   rJ   rK   r   r   r   r      s    r   c              
   C   s  t j| j| j| j| j| j| j| jdd	d
| jj}| j | jd}t|jt|j|j }|jt|||jj | jd u rtj| jd| jjdn| j}|j|j|jt|j|j  }|jt||ddd|  |S )NT)rG   rH   paddingdilationgroupsr7   Fr   r   r   r   )r"   rD   rF   rE   rG   rH   r   r   r   requires_grad_r   r   r   cloneviewr   diagdivsqrtr   running_varcopy_mmr   r7   zerossizemulrunning_meanreshape)convbnZ	fusedconvZw_convZw_bnZb_convZb_bnr   r   r   fuse_conv_and_bn   s(    
 *(&r   F  c                 C   s  t dd |  D }t dd |  D }|rtddddddd	d
dddddddddddd t|  D ]F\}\}}|dd}td|||j| t|j	|
 | f  qzzt|  }t| drtt| j dnd}tjd|j	d ||f|jd}	tjt| |	fddd d d }
t|trB|n||g}d|
|d  | |d  | dd }W n ty   d}Y n0 t| d!rt| jjd"d#nd$}t| d%tt|   d&| d'| d(| 	 d S ))Nc                 s   s   | ]}|  V  qd S r   r   r2   r   r   r   r     r6   zmodel_info.<locals>.<genexpr>c                 s   s   | ]}|j r| V  qd S r   )r   r   r2   r   r   r   r     r6   layerz>5re   rJ   z>40gradientz>9r   z>12r   z>20muz>10sigmazmodule_list.rd   z$%5g %40s %9s %12g %20s %10.3g %10.3grH       r   r   Fr   r   r   r   rl   z.1fz GFLOPs	yaml_fileyolov5ZYOLOv5Modelz
 summary: z	 layers, z parameters, z
 gradients) r   r   r   rx   named_parametersrr   r   r   r9   r   meanstdnextr:   maxr[   rH   r   emptyr   r   r   r   r<   ra   r   r   stemr   r~   rw   r   )r-   r   imgszn_pZn_grM   rJ   r   rH   imr   fsr   r   r   
model_info  s(    >$""*
$r        ?r   c                    s   dkr| S | j dd  \}}t| t| f}tj| |ddd} |sh fdd||fD \}}tj| d||d	  d||d  gd
dS )Nr  r   bilinearF)r   modealign_cornersc                 3   s$   | ]}t |     V  qd S r   )mathceilr2   gsratior   r   r   1  r6   zscale_img.<locals>.<genexpr>r   r   gS㥛?)value)r   r[   Finterpolatepad)imgr
  
same_shaper	  hwr   r   r  r   	scale_img)  s    r  r   c                 C   sJ   |j  D ]:\}}t|r"||vs
|ds
||v r8q
q
t| || q
d S )Nr   )__dict__itemsrw   
startswithrA   )r   r   includeexcludekvr   r   r   	copy_attr5  s    "r  Adamr   ?h㈵>c                 C   s  g g g f}t dd tj D }|  D ]b}|jddD ]P\}}	|dkrZ|d |	 q:|dkr|t||r||d |	 q:|d |	 q:q*|d	krtj	j
|d ||d
fd}
nz|dkrtj	j|d ||d
fdd}
nT|dkrtj	j|d ||d}
n4|dkrtj	j|d ||dd}
ntd| d|
|d |d |
|d dd ttd dt|
j d| dt|d  dt|d  d| dt|d  d |
S )Nc                 s   s   | ]\}}d |v r|V  qdS )NormNr   )r3   r  r  r   r   r   r   A  r6   z"smart_optimizer.<locals>.<genexpr>r   )recurser7   r   r   r   r  g+?)lrbetasAdamWr   )r!  r"  weight_decayZRMSProp)r!  r   SGDT)r!  r   nesterovz
Optimizer z not implemented.)paramsr$  z
optimizer:re   z(lr=z) with parameter groups z weight(decay=0.0), z weight(decay=z), z bias)r   r"   r  r  r   r   r   r<   r   optimr  r#  RMSpropr%  NotImplementedErroradd_param_groupr   r~   r   r1   __name__rw   )r-   rJ   r!  r   decaygr   r  Zp_namer   	optimizerr   r   r   smart_optimizer>  s<    

 



r0  ultralytics/yolov5yolov5sc                 K   sr   t tjdrd|d< t tjdr(d|d< ztjj| |fi |W S  tyl   tjj| |fddi| Y S 0 d S )Nz1.9.1Tskip_validationr&   
trust_repoforce_reload)r   r   r!   hubloadra   )repor-   kwargsr   r   r   smart_hub_load]  s    r:  
yolov5s.pt,  c              	   C   s   d}| d d }| d d ur2| | d  | d }|rb| drb|j | d    | d |_|r|dksJ | d	| d
| dtd| d| d| d ||k rt| d| d  d| d || d 7 }|||fS )Nr   epochr   r/  best_fitnessemaupdatesr   z training to zo epochs is finished, nothing to resume.
Start a new training without --resume, i.e. 'python train.py --weights 'zResuming training from z from epoch z to z total epochsz has been trained for z epochs. Fine-tuning for z more epochs.)load_state_dictgetr?  r   
state_dictr@  r   r~   )ckptr/  r?  weightsepochsresumer>  start_epochr   r   r   smart_resumei  s"    

 rJ  c                   @   s   e Zd ZdddZdd ZdS )EarlyStopping   c                 C   s$   d| _ d| _|ptd| _d| _d S )Nr   r   infF)r>  
best_epochr   patiencepossible_stop)selfrO  r   r   r   __init__  s    zEarlyStopping.__init__c              	   C   sf   || j kr|| _|| _ || j }|| jd k| _|| jk}|rbtd| j d| j d| j d |S )Nr   z;Stopping training early as no improvement observed in last z( epochs. Best results observed at epoch z@, best model saved as best.pt.
To update EarlyStopping(patience=zr) pass a new patience value, i.e. `python train.py --patience 300` or use `--patience 0` to disable EarlyStopping.)r>  rN  rO  rP  r   r~   )rQ  r=  fitnessdeltastopr   r   r   __call__  s    



zEarlyStopping.__call__N)rL  )r,  
__module____qualname__rR  rV  r   r   r   r   rK  }  s   
rK  c                   @   s,   e Zd ZdZdddZdd ZdddZdS )ModelEMAa$   Updated Exponential Moving Average (EMA) from https://github.com/rwightman/pytorch-image-models
    Keeps a moving average of everything in the model state_dict (parameters and buffers)
    For EMA details see https://www.tensorflow.org/api_docs/python/tf/train/ExponentialMovingAverage
    H.?  r   c                    sF   t t| | _|| _ fdd| _| j D ]}|d q2d S )Nc                    s    dt |     S Nr   )r  exp)r4   r-  taur   r   <lambda>  r6   z#ModelEMA.__init__.<locals>.<lambda>F)r   r   evalr?  r@  r-  r   r   )rQ  r-   r-  r_  r@  r   r   r^  r   rR    s
    zModelEMA.__init__c                 C   sj   |  j d7  _ | | j }t| }| j  D ]0\}}|jjr4||9 }|d| ||   7 }q4d S r\  )	r@  r-  r   rD  r?  r  r   is_floating_pointdetach)rQ  r-   r   Zmsdr  r  r   r   r   update  s    zModelEMA.updater   process_groupreducerc                 C   s   t | j||| d S r   )r  r?  )rQ  r-   r  r  r   r   r   update_attr  s    zModelEMA.update_attrN)rZ  r[  r   )r   re  )r,  rW  rX  __doc__rR  rd  rh  r   r   r   r   rY    s   
rY  )r   )r/   )rd   r   T)r   N)r   )Fr   )r  Fr   )r   r   )r  r   r  r  )r1  r2  )Nr;  r<  T)Bri  r  rs   rY   r\   r   warnings
contextlibr   copyr   pathlibr   r   torch.distributeddistributedrQ   torch.nnr"   torch.nn.functional
functionalr  Ztorch.nn.parallelr   r+   utils.generalr   r   r   r	   r
   r[   getenvr   r   r   r   ImportErrorfilterwarningsUserWarningr!   r   r%   r.   rN   rS   rc   r   r   r   r   r   r   rD   r   r   r   r   r  r  r  r0  r:  rJ  rK  rY  r   r   r   r   <module>   sb   

	
	

$
3	




	


