U
    Hc 6                     @   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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 zddlZW n ek
r   dZY nX ejddd	 e	ed
ddZefddZeej fddZ!dd Z"d:ddZ#dd Z$d;ddZ%dd Z&dd Z'd d! Z(ej)fd"d#Z*d$d% Z+d<d'd(Z,d)d* Z-d=d-d.Z.d>d1d2Z/d?d4d5Z0G d6d7 d7Z1G d8d9 d9Z2dS )@z
PyTorch utils
    N)contextmanager)deepcopy)Path)LOGGERignorezIUser provided device_type of 'cuda', but CUDA is not available. Disabling)messageZ
local_rankc                 c   s6   | dkrt j| gd dV  | dkr2t jdgd dS )zm
    Decorator to make all processes in distributed training wait for each local_master to do something.
    )r   )
device_idsNr   )distbarrierr    r   G/var/www/html/VideoAnalyticsDashboard/src/./yolov5/utils/torch_utils.pytorch_distributed_zero_first!   s
    r   c                 C   s0   t j t|  j}|j d|j d|j S )N-)datetimefromtimestampr   statst_mtimeyearmonthday)pathtr   r   r   date_modified-   s    r   c                 C   sJ   d|  d}z t j|dt jd d d W S  t jk
rD   Y dS X d S )Nzgit -C z  describe --tags --long --alwaysT)shellstderrr	    )
subprocesscheck_outputSTDOUTdecodeCalledProcessError)r   sr   r   r   git_describe3   s
     r$   c                  C   sZ   t  dkstdz*d} ttj| ddddj  d W S  t	k
rT   Y dS X d S )NLinuxz+device_count() function only works on Linuxznvidia-smi -L | wc -lT)r   capture_outputcheckr	   r   )
platformsystemAssertionErrorintr   runstdoutr!   split	Exception)cmdr   r   r   device_count<   s    &r1   r   Tc              
   C   s  dt  pt  dtj d}t|   dd} | dk}|rLdtj	d< nB| r| tj	d< tj
 r~tj
 t| d	dkstd
|  d| otj
 }|rX| r| d	nd}t|}|dkr|dkr|| dkstd| d| dt|d  }t|D ]N\}	}
tj
|	}||	dkr*dn| d|
 d|j d|jd dd7 }qn|d7 }|sn| }tt dkr| ddn| t|rdndS )Nu   YOLOv5 🚀 z torch  zcuda:r   cpuz-1CUDA_VISIBLE_DEVICES,zInvalid CUDA '--device z<' requested, use '--device cpu' or pass valid CUDA device(s)0   r   zbatch-size z not multiple of GPU count zCUDA:z (z, i   z.0fzMiB)
zCPU
Windowsasciir   zcuda:0)r$   r   torch__version__strstriplowerreplaceosenvironcudais_availabler1   lenr*   r.   	enumerateget_device_propertiesnametotal_memoryrstripr   infor(   r)   encoder!   device)rL   
batch_sizenewliner#   r3   rB   devicesnspaceidpr   r   r   select_deviceF   s2    
&
 >(rU   c                   C   s   t j rt j  t S N)r:   rB   rC   synchronizetimer   r   r   r   	time_synce   s    

rY   
   c                 C   s  g }|pt  }tdddddddddddd	d
d	 t| trN| n| gD ]}||}d|_t|trx|n|gD ]z}t|dr||n|}t|drt|tjr|j	tj
kr| n|}dddddg  }}}	z"tj||fddd d d }
W n tk
r   d}
Y nX zt|D ]}t |	d< ||}t |	d< z8t|trjtdd |D n|  }t |	d< W n" tk
r   td|	d< Y nX ||	d |	d  d | 7 }||	d |	d  d | 7 }q*tj rtj d nd}t|tjrt|jnd}t|tjr4t|jnd}t|tjr`ttdd | D nd}t|d|
d|d|d|dt|d	t|d	 |||
|||||g W n6 tk
r } zt| |d  W 5 d }~X Y nX tj  q~qT|S )NParamsz>12sGFLOPszGPU_mem (GB)z>14szforward (ms)zbackward (ms)inputz>24soutputTtohalfr   Finputsverbose    eA   r7   c                 s   s   | ]}|  V  qd S rV   )sum).0yir   r   r   	<genexpr>   s     zprofile.<locals>.<genexpr>nani  listc                 s   s   | ]}|  V  qd S rV   numelrg   xr   r   r   ri      s     Z12z12.4gz>14.3fz14.4g)rU   print
isinstancerk   r_   requires_gradhasattrr:   Tensordtypefloat16r`   thopprofiler/   rangerY   rf   backwardfloatrB   rC   memory_reservedtupleshapennModule
parametersr<   appendempty_cache)r]   opsrP   rL   resultsro   mtftbr   flops_ymemZs_inZs_outrT   er   r   r   rx   l   sJ    	
2
."


* ,:rx   c                 C   s   t | tjjtjjfkS rV   )typer   parallelDataParallelDistributedDataParallelmodelr   r   r   is_parallel   s    r   c                 C   s   t | r| jS | S rV   )r   moduler   r   r   r   de_parallel   s    r   c                 C   s`   |   D ]R}t|}|tjkr q|tjkr8d|_d|_q|tjtjtj	tj
tjfkrd|_qd S )NgMbP?gQ?T)modulesr   r   Conv2dBatchNorm2depsmomentum	Hardswish	LeakyReLUReLUReLU6SiLUinplace)r   r   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   )rq   )rg   rR   r   mclassr   r   
<listcomp>   s     
 z find_modules.<locals>.<listcomp>)rE   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   rm   rf   )r   abrT   r   r   r   sparsity   s
    r   333333?c                 C   sr   dd l m  m  m} tddd |  D ]0\}}t|tjr,|j|d|d |	|d q,tdt
|   d S )Nr   zPruning model... r   )endweight)rG   amountz %.3g global sparsity)Ztorch.nn.utils.pruner   utilsprunerp   named_modulesrq   r   Zl1_unstructuredremover   )r   r   r   rG   r   r   r   r   r      s    r   c              	   C   s  t 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 krtj| j
d| j
jdn| j}|j|j
|jt|j|j  }|jt||ddd|  |S )NT)kernel_sizestridepaddinggroupsbiasFr	   r   rL   r7   )r   r   in_channelsout_channelsr   r   r   r   requires_grad_r_   r   rL   cloneviewr:   diagdivsqrtr   running_varcopy_mmr~   r   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  qzzddlm} t| drtt| j dnd}	tjd| jdd|	|	ft|  jd}
|t| |
fddd d d  }t|trL|n||g}d!||d  |	 |d  |	  }W n ttfk
r   d}Y nX td"tt|   d#| d$| d%|  d S )&Nc                 s   s   | ]}|  V  qd S rV   rl   rn   r   r   r   ri      s     zmodel_info.<locals>.<genexpr>c                 s   s   | ]}|j r| V  qd S rV   )rr   rm   rn   r   r   r   ri      s      layerz>5r2   rG   z>40gradientz>9r   z>12r~   z>20muz>10sigmazmodule_list.r   z$%5g %40s %9s %12g %20s %10.3g %10.3gr   )rx   r       r7   ch   r   Fra   rd   re   z, %.1f GFLOPszModel Summary: z	 layers, z parameters, z
 gradients) rf   r   rp   rE   named_parametersr?   rr   rm   rk   r~   meanstdrw   rx   rs   maxr+   r   r:   r   yamlgetnextrL   r   rq   ImportErrorr/   r   rJ   rD   r   )r   rc   img_sizen_pZn_grR   rG   rT   rx   r   imgr   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 d S )Nr   re   bilinearF)r   modealign_cornersc                 3   s$   | ]}t |     V  qd S rV   )mathceilrn   gsratior   r   ri     s     zscale_img.<locals>.<genexpr>r   r7   gS㥛?)value)r~   r+   Finterpolatepad)r   r   
same_shaper   hwr#   r   r   r   	scale_img   s    r   r   c                 C   sJ   |j  D ]:\}}t|r"||ks
|ds
||kr8q
q
t| || q
d S )Nr   )__dict__itemsrD   
startswithsetattr)r   r   includeexcludekvr   r   r   	copy_attr  s    "r   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 )Ng        r   infF)best_fitness
best_epochr{   patiencepossible_stop)selfr   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 )Nr7   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   r   r   r  r   rJ   )r  epochfitnessdeltastopr   r   r   __call__  s    


$zEarlyStopping.__call__N)r   )__name__
__module____qualname__r  r  r   r   r   r   r     s   
r   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                    sD   t t| | _|| _ fdd| _| j D ]}|d q0d S )Nc                    s    dt |  d   S )Nr7   i  )r   exp)ro   decayr   r   <lambda>7      z#ModelEMA.__init__.<locals>.<lambda>F)r   r   evalemaupdatesr  r   r   )r  r   r  r  rT   r   r  r   r  1  s
    zModelEMA.__init__c              	   C   s~   t  l |  jd7  _| | j}t| }| j  D ]0\}}|jj	r>||9 }|d| || 
  7 }q>W 5 Q R X d S )Nr7   )r:   no_gradr  r  r   
state_dictr  r   ru   is_floating_pointdetach)r  r   rS   Zmsdr   r   r   r   r   update;  s    
zModelEMA.updater   process_groupreducerc                 C   s   t | j||| d S rV   )r   r  )r  r   r   r   r   r   r   update_attrG  s    zModelEMA.update_attrN)r  r   )r   r  )r	  r
  r  __doc__r  r  r  r   r   r   r   r  +  s   

r  )r   r   T)rZ   N)r   )Fr   )r   Fr   )r   r   )3r  r   r   r@   r(   r   rX   warnings
contextlibr   copyr   pathlibr   r:   torch.distributeddistributedr   torch.nnr   torch.nn.functional
functionalr   utils.generalr   rw   r   filterwarningsr+   r   __file__r   parentr$   r1   rU   rY   rx   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   <module>   sP   
	


4	



	