o
    ĎiL                     @   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w 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def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 | S t j | S N)torchinference_modeno_grad)fn	torch_1_9 T/home/jeff/fluffinator/venv/lib/python3.10/site-packages/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rt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   sF   t tjdddrJ dt tjdrt| tgtddS t| tgt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   sX  ddl m} tt| dr| jn|  d \}}t||r0|jj|kr.t	
|jj||_d S d S t|t	j
rJ|j|krHt| |t	
|j| d S d S t|t	jrdd |D }t	j
|v rx|t	j
}|| j|krvt	
|| j|||< d S d S t	j|v r|t	j}|| j|krt	j|| j||| j|| j|| jd ud||< d S d S d S d S )Nr   )Classifyr-   r   c                 S   s   g | ]}t |qS r   )type.0xr   r   r   
<listcomp>M   s    z-reshape_classifier_output.<locals>.<listcomp>)bias)yolov5.models.commonr0   listhasattrr-   named_children
isinstancelinearout_featuresr"   Linearin_featuressetattr
SequentialindexConv2dout_channelsin_channelskernel_sizestrider6   )r-   nr0   namemtypesir   r   r   reshape_classifier_outputB   s0   $



8rM   
local_rankc                 c   s<    | dvrt j| gd d V  | dkrt jdgd d S d S )N)r   r   )r(   r   )distbarrier)rN   r   r   r   torch_distributed_zero_firstX   s   rQ   c                  C   sd   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y1   Y d	S w )
N)LinuxWindowsz1device_count() only supported on Linux or WindowsrR   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   &ra    Tc              
   C   s  dt  pt  dt  dtj d}t|   	dd	dd} | dk}| d	k}|s/|r5d
t
jd< n!| rV| t
jd< tj rNtj t| 	ddksVJ d|  d|s|stj r| rf| dnd}t|}|dkr|dkr|| dksJ d| d| dt|d  }t|D ]%\}	}
tj|	}||	dkrdn| d|
 d|j d|jd dd7 }qd}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:rb   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	   rW   python_versionr   r!   strstriplowerreplaceosenvironcudais_availablera   lenr^   	enumerateget_device_propertiesrI   total_memorygetattrbackendsrf   rstripr   infodevice)r}   
batch_sizenewlinesre   rf   devicesrH   spacerL   dpargr   r   r   select_devicel   s<   & 
&
 8

r   c                   C   s   t j r
t j  t S r   )r   rs   rt   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r,| n| gD ]8}||}d|_t |trA|n|gD ]"}t|drQ||n|}t|drht |tj	rh|j
tju rh| n|}ddg d}}}	ztj||fddd d d }
W n ty   d}
Y nw zt|D ]W}t |	d< ||}t |	d< zt |trtdd |D n|  }t |	d< W n ty   td|	d< Y nw ||	d |	d  d | 7 }||	d |	d  d | 7 }qtj rt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 n tya } zt| |d W Y d}~nd}~ww tj  qDq/|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       | ]}|  V  qd S r   )sum)r3   yir   r   r   	<genexpr>       zprofile.<locals>.<genexpr>nanr/   c                 s   s*    | ]}t |tjrt|jnd V  qdS )r8   N)r;   r   Tensortupleshaper2   r   r   r   r      s   ( c                 s   r   r   numelr2   r   r   r   r      r   12z12.4gz>14.3fz14.4gN)r;   r   r}   r   printr8   r   requires_gradr9   r   dtypefloat16r   thopprofiler_   ranger   r   backwardfloatrs   rt   memory_reservedr"   Module
parametersrm   appendempty_cache)r   opsrH   r}   resultsr4   rJ   tftbtflops_ymems_ins_outr   er   r   r   r      s\    
."

((: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      r   c                 C   s   t | r| jS | S r   )r   moduler,   r   r   r   de_parallel   s   r   c                 C   s`   |   D ])}t|}|tju rq|tju rd|_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"   rC   BatchNorm2depsmomentum	Hardswish	LeakyReLUReLUReLU6SiLUinplace)r-   rJ   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   rL   rJ   mclassr   r   r5      s    z find_modules.<locals>.<listcomp>)rv   module_list)r-   r   r   r   r   find_modules   r   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 ]\}}t|tjr(|j|d|d ||d qt	
dt| dd d S )Nr   weight)rI   amountzModel pruned to z.3gz global sparsity)torch.nn.utils.pruner"   utilsprunenamed_modulesr;   rC   l1_unstructuredremover   r|   r   )r-   r   r   rI   rJ   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 rWtj| jd| jjdn| j}|j|j|jt|j|j  }|jt||ddd|  |S )NT)rF   rG   paddingdilationgroupsr6   Fr   r   r}   r   )r"   rC   rE   rD   rF   rG   r   r   r   requires_grad_r   r   r}   cloneviewr   diagdivsqrtr   running_varcopy_mmr   r6   zerossizemulrunning_meanreshape)convbn	fusedconvw_convw_bnb_convb_bnr   r   r   fuse_conv_and_bn   s$   
 *(&r   F  c                 C   s  t dd |  D }t dd |  D }|ratddddddd	d
dddddddddddd t|  D ]#\}\}}|dd}td|||j| t|j	|
 | f  q=zWt|  }t| drwtt| j dnd}tjd|j	d ||f|jd}	tjt| |	fddd d d }
t|tr|n||g}d|
|d  | |d  | dd }W n ty   d}Y nw t| d!rt| jjd"d#nd$}t| d%tt|   d&| d'| d(| 	 d S ))Nc                 s   r   r   r   r2   r   r   r   r     r   zmodel_info.<locals>.<genexpr>c                 s   s    | ]
}|j r| V  qd S r   )r   r   r2   r   r   r   r     s    layerz>5rc   rI   z>40gradientz>9r   z>12r   z>20muz>10sigmazmodule_list.rb   z$%5g %40s %9s %12g %20s %10.3g %10.3grG       r   r   Fr   r   r   r   rj   z.1fz GFLOPs	yaml_fileyolov5YOLOv5Modelz
 summary: z	 layers, z parameters, z
 gradients) r   r   r   rv   named_parametersrp   r   r   r8   r   meanstdnextr9   maxrY   rG   r   emptyr}   r   r   r   r;   r_   r   r   stemr   r|   ru   r   )r-   r   imgszn_pn_grL   rI   r   rG   imr   fsr   r   r   
model_info  s*   >$""*"6r        ?r   c                    s   dkr| S | j dd  \}}t| t| f}tj| |ddd} |s4 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  s   $ zscale_img.<locals>.<genexpr>r   r   gS㥛?)value)r   rY   Finterpolatepad)imgr  
same_shaper  hwr   r   r  r   	scale_img)  s   (r   r   c                 C   sH   |j  D ]\}}t|r||vs|ds||v rqt| || qd S )Nr   )__dict__itemsru   
startswithr@   )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 ]1}|jddD ](\}}	|dkr-|d |	 q|dkr>t||r>|d |	 q|d |	 qq|d	krYtj	j
|d ||d
fd}
n<|dkrltj	j|d ||d
fdd}
n)|dkr|tj	j|d ||d}
n|dkrt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  s    z"smart_optimizer.<locals>.<genexpr>r   )recurser6   r   r   r   r)  g+?)lrbetasAdamWr   )r.  r/  weight_decayRMSProp)r.  r   SGDT)r.  r   nesterovz
Optimizer z not implemented.)paramsr1  z
optimizer:rc   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)  r0  RMSpropr3  NotImplementedErroradd_param_groupr   r|   r   r1   __name__ru   )r-   rI   r.  r   decaygr   r'  p_namer   	optimizerr   r   r   smart_optimizer>  s>   
 



r?  ultralytics/yolov5yolov5sc                 K   sn   t tjdr
d|d< t tjdrd|d< ztjj| |fi |W S  ty6   tjj| |fddi| Y S w )Nz1.9.1Tskip_validationr&   
trust_repoforce_reload)r   r   r!   hubloadr_   )repor-   kwargsr   r   r   smart_hub_load]  s   rI  
yolov5s.pt,  c              	   C   s   d}| d d }| d d ur| | d  | d }|r1| dr1|j | d    | d |_|rS|dksDJ | d	| d
| dtd| d| d| d ||k rmt| 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getrN  r   
state_dictrO  r   r|   )ckptr>  rN  weightsepochsresumerM  start_epochr   r   r   smart_resumei  s"   

 
rY  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)rM  
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}|r1t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.)rM  r]  r^  r_  r   r|   )r`  rL  fitnessdeltastopr   r   r   __call__  s   



zEarlyStopping.__call__N)r[  )r:  
__module____qualname__ra  re  r   r   r   r   rZ  }  s    
rZ  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 qd S )Nc                    s    dt |     S Nr   )r  exp)r4   r;  taur   r   <lambda>  s    z#ModelEMA.__init__.<locals>.<lambda>F)r   r   evalrN  rO  r;  r   r   )r`  r-   r;  rn  rO  r   r   rm  r   ra    s   zModelEMA.__init__c                 C   sj   |  j d7  _ | | j }t| }| j  D ]\}}|jjr2||9 }|d| ||   7 }qd S rk  )	rO  r;  r   rS  rN  r"  r   is_floating_pointdetach)r`  r-   r   msdr&  r'  r   r   r   update  s   zModelEMA.updater   process_groupreducerc                 C   s   t | j||| d S r   )r(  rN  )r`  r-   r$  r%  r   r   r   update_attr  s   zModelEMA.update_attrN)ri  rj  r   )r   ru  )r:  rf  rg  __doc__ra  rt  rx  r   r   r   r   rh    s
    
rh  )r   )r/   )rb   r   T)r   N)r   )Fr   )r  Fr   )r   r   )r)  r   r*  r+  )r@  rA  )NrJ  rK  T)Bry  r  rq   rW   rZ   r   warnings
contextlibr   copyr   pathlibr   r   torch.distributeddistributedrO   torch.nnr"   torch.nn.functional
functionalr  torch.nn.parallelr   r+   yolov5.utils.generalr   r   r   r	   r
   rY   getenvr   r   r   r   ImportErrorfilterwarningsUserWarningr!   r   r%   r.   rM   rQ   ra   r   r   r   r   r   r   rC   r   r   r   r   r  r   r(  r?  rI  rY  rZ  rh  r   r   r   r   <module>   sf   
	
	

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




	

