
    Զf=                     8   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c mZ d dlmZ d dlmc mZ d dlZ	 d dlZn# e$ r dZY nw xY w ej        e          Zedefd            Zd)dZefdZ  ee          j!        fd	Z"d*dZ#d Z$d+dZ%d Z&d,dZ'd Z(ej)        fdZ*d Z+d-dZ,d Z-d.dZ.d/dZ/d0d Z0d1d!Z1 G d" d#          Z2 G d$ d%ej        j3        j4        j5                  Z6d& Z7 G d' d(ej8                  Z9dS )2    N)contextmanager)deepcopy)Path
local_rankc              #      K   | dvrt           j                                         dV  | dk    r t           j                                         dS dS )zm
    Decorator to make all processes in distributed training wait for each local_master to do something.
    )r   Nr   )torchdistributedbarrier)r   s    )/var/www/html/yolov7/utils/torch_utils.pytorch_distributed_zero_firstr      s\      
   !!###	EEEQ!!#####     c                     t          j        |            | dk    rd\  t          _        t          _        d S d\  t          _        t          _        d S )Nr   )FT)TF)r	   manual_seedcudnn	benchmarkdeterministic)seeds    r   init_torch_seedsr   '   sF    	dqyy/:,,,,/:,,,,r   c                     t           j                             t          |                                           j                  }|j         d|j         d|j         S )N-)datetimefromtimestampr   statst_mtimeyearmonthday)pathts     r   date_modifiedr!   0   sM    ''T

(9(9(BCCAf((qw(((((r   c                     d|  d}	 t          j        |dt           j                                                  d d         S # t           j        $ r}Y d }~dS d }~ww xY w)Nzgit -C z  describe --tags --long --alwaysT)shellstderrr    )
subprocesscheck_outputSTDOUTdecodeCalledProcessError)r   ses      r   git_describer-   6   sy    8$888A&qZ=NOOOVVXXY\Z\Y\]](   rrrrrs   :A AAr%   c           
         dt                      pt                       dt          j         d}|                                 dk    }|rdt
          j        d<   n=| r;| t
          j        d<   t          j                                        sJ d|  d            | ot          j                                        }|rt          j        	                                }|d	k    r|r||z  d
k    sJ d| d|             dt          |          z  }t          | r|                     d          nt          |                    D ]J\  }}t          j                            |          }	||d
k    rdn| d| d|	j         d|	j        dz   dz  }Kn|dz  }t"                              t'          j                    dk    r(|                                                    dd          n|           t          j        |rdnd          S )Nu   YOLOR 🚀 z torch  cpuz-1CUDA_VISIBLE_DEVICESz!CUDA unavailable, invalid device z
 requested   r   zbatch-size z not multiple of GPU count ,r%   zCUDA:z (z, i   zMB)
zCPU
Windowsasciiignorecuda:0)r-   r!   r	   __version__lowerosenvironcudais_availabledevice_countlen	enumeratesplitrangeget_device_propertiesnametotal_memoryloggerinfoplatformsystemencoder)   device)
rK   
batch_sizer+   r0   r<   nspaceidps
             r   select_devicerR   ?   s   Tlnn7TT@QTTTA
,,..E
!C
 a-1
)**	 a-3
)*z&&((``*`f*`*`*````70uz..00D 	J##%%q55Z5>Q&&&(`j(`(`]^(`(`&&&c!ff6Gfll3///uQxxHH 	c 	cDAq
0033A!q&&BBebb!bbqvbbR[A[bbbbAA	c 	
W
KK8I8IY8V8V

!!'8444\]^^^<D3e444r   c                      t           j                                        rt           j                                         t	          j                    S N)r	   r<   r=   synchronizetime r   r   time_synchronizedrX   Y   s8    z   !
   9;;r   d   c                    |p3t          j        t           j                                        rdnd          }|                     |          } d| _        t          t           j        |j        |j        dk    rt           j        	                    d          nd           t          ddd	d
d	dddddddd           t          |t                    r|n|gD ]h}t          |d          r|                    |          n|}t          |d          rAt          | t           j                  r'| j        t           j        u r|                                n|}ddg d}}}	 t#          j        || fd          d         dz  dz  }n	#  d}Y nxY wt'          |          D ]}	t)                      |d<    ||           }
t)                      |d<   	 |
                                                                }	t)                      |d<   n#  t/          d          |d<   Y nxY w||d         |d         z
  dz  |z  z  }||d         |d         z
  dz  |z  z  }t          | t           j                  rt1          | j                  nd}t          |
t           j                  rt1          |
j                  nd}t          |t4          j                  r8t+          t          d |                                D                                 nd}t          |d|d|d |d t;          |          dt;          |          d           jd S )!Nr7   r0   Tr<   r   r%   
Paramsz>12sGFLOPSzforward (ms)z>16szbackward (ms)inputz>24soutputtohalf        )rb   rb   rb   Finputsverbose    eA   r2   nani  listc              3   >   K   | ]}|                                 V  d S rT   numel.0xs     r   	<genexpr>zprofile.<locals>.<genexpr>   s*      771QWWYY777777r   12z12.4gz16.4g)r	   rK   r<   r=   r`   requires_gradprintr8   typerC   
isinstanceri   hasattrTensordtypefloat16ra   thopprofilerB   rX   sumbackwardfloattupleshapennModule
parametersstr)ro   opsrM   rK   mdtfdtbr    flops_ys_ins_outrQ   s                 r   r{   r{   `   sN    Uu|
0G0G0I0I$THHuUUF	VAAO	%
V[QWQ\`fQfQf%**J*J1*M*M*Mlnooo	
ux
u
uh
u
u^
u
u/
u
uX_
u
ufn
u
u
uvvvsD))4SSu ] ]#At,,3ADDLLL!6**nz!U\/J/JnqwZ_ZgOgOgAFFHHHmn"lll!S	LA4???BSH1LEE	EEEq 
	, 
	,A$&&AaD!A$&&AaD$EEGG$$&&(**!$U||!AaD1Q4K4'!++CAaD1Q4K4'!++CC!+Au|!<!<HuQW~~~&",Q"="=Iag6<Fq")<T<T[C7777777888Z[[[u[[C[[s[[#d))[[#e**[[[\\\\1] ]s   $FF
7HHc                 d    t          |           t          j        j        t          j        j        fv S rT   )rt   r   parallelDataParallelDistributedDataParallel)models    r   is_parallelr      s"    ;;2;3R[5XYYYr   rW   c                 H    fd|                                  D             S )Nc                     i | ]=\  }v 	t          fd D                       $|j                 j        k    :|>S )c              3       K   | ]}|v V  	d S rT   rW   )rn   ro   ks     r   rp   z-intersect_dicts.<locals>.<dictcomp>.<genexpr>   s'      >W>W!qAv>W>W>W>W>W>Wr   )anyr   )rn   vr   dbexcludes     @r   
<dictcomp>z#intersect_dicts.<locals>.<dictcomp>   sa    sssTQ1773>W>W>W>Ww>W>W>W;W;W7\]\cgijkglgr\r\rAq\r\r\rr   )items)dar   r   s    ``r   intersect_dictsr      s)    sssssRXXZZssssr   c                    |                                  D ]t}t          |          }|t          j        u r |t          j        u rd|_        d|_        =|t          j        t          j        t          j	        t          j
        fv rd|_        ud S )NgMbP?gQ?T)modulesrt   r   Conv2dBatchNorm2depsmomentum	Hardswish	LeakyReLUReLUReLU6inplace)r   r   r    s      r   initialize_weightsr      s}    ]]__  GG	>>".  AEAJJ2<rwAAAAI r   c                 D    fdt          | j                  D             S )Nc                 :    g | ]\  }}t          |          |S rW   )ru   )rn   rO   r   mclasss      r   
<listcomp>z find_modules.<locals>.<listcomp>   s,    PPP$!Q*Q:O:OPAPPPr   )r@   module_list)r   r   s    `r   find_modulesr      s(    PPPP)E$566PPPPr   c                     d\  }}|                                  D ]4}||                                z  }||dk                                    z  }5||z  S )N)rb   rb   r   )r   rl   r|   )r   abrQ   s       r   sparsityr      sX    DAq  	QWWYY	a1f\\^^q5Lr   333333?c                 B   dd l mc mc m} t	          dd           |                                 D ]M\  }}t          |t          j                  r.|                    |d|           |	                    |d           Nt	          dt          |           z             d S )Nr   zPruning model... r%   )endweight)rD   amountz %.3g global sparsity)torch.nn.utils.pruner   utilspruners   named_modulesru   r   l1_unstructuredremover   )r   r   r   rD   r   s        r   r   r      s    ((((((((((((	
2&&&&&&(( & &aa## 	&!!!(6!BBBLLH%%%	
!HUOO
344444r   c           	      R   t          j        | j        | j        | j        | j        | j        | j        d                              d          	                    | j
        j                  }| j
                                                            | j        d          }t          j        |j
                            t          j        |j        |j        z                                 }|j
                            t          j        ||                              |j
        j                             | j        8t          j        | j
                            d          | j
        j                  n| j        }|j        |j
                            |j                                      t          j        |j        |j        z                       z
  }|j                            t          j        ||                    dd                                        d          |z              |S )NT)kernel_sizestridepaddinggroupsbiasFr   r   rK   r2   )r   r   in_channelsout_channelsr   r   r   r   requires_grad_r`   r   rK   cloneviewr	   diagdivsqrtr   running_varcopy_mmr   r   zerossizemulrunning_meanreshape)convbn	fusedconvw_convw_bnb_convb_bns          r   fuse_conv_and_bnr      s   	$*+&*&6!%"&,!%#% % % &4^E%:%:22dk>P;Q;Q  [  %%d&7<<F:bimmEJrv/F$G$GHHIID58D&1166y7G7MNNOOO MQIL]U[))!,,T[5GHHHHcgclF7RY]]2?3377
2>TVTZCZ8[8[\\\DN$r1(=(=>>FFrJJTQRRRr   F  c                    t          d |                                 D                       }t          d |                                 D                       }|rt          ddz             t          |                                           D ]\  }\  }}|                    dd          }t          d|||j        |                                t          |j	                  |
                                |                                fz             	 dd	lm} t          | d
          r4t          t!          | j                                                  d          nd}	t%          j        d| j                            dd          |	|	ft-          |                                           j                  }
 |t1          |           |
fd          d         dz  dz  }t3          |t                    r|n||g}d||d         z  |	z  |d         z  |	z  z  }n# t4          t6          f$ r d}Y nw xY wt8                              dt=          t          |                                                      d| d| d|            d S )Nc              3   >   K   | ]}|                                 V  d S rT   rk   rm   s     r   rp   zmodel_info.<locals>.<genexpr>   s*      44Aaggii444444r   c              3   L   K   | ]}|j         	|                                V   d S rT   )rr   rl   rm   s     r   rp   zmodel_info.<locals>.<genexpr>   s1      GGAqGaggiiGGGGGGr   z %5s %40s %9s %12s %20s %10s %10s)layerrD   gradientr   r   musigmazmodule_list.r%   z$%5g %40s %9s %12g %20s %10.3g %10.3gr   )r{   r       r2   ch   r   Frc   rf   rg   z, %.1f GFLOPSzModel Summary: z	 layers, z parameters, z
 gradients) r|   r   rs   r@   named_parametersreplacerr   rl   ri   r   meanstdrz   r{   rv   maxintr   r	   r   yamlgetnextrK   r   ru   ImportError	ExceptionrF   rG   r?   r   )r   re   img_sizen_pn_grO   rD   rQ   r{   r   imgr   fss                r   
model_infor      s   
44!1!1!3!3444
4
4C
GG!1!1!3!3GGG
G
GC [03vvwww%e&<&<&>&>?? 	[ 	[LAya<<33D8dAOQWWYYQWqvvxxQRQVQVQXQXYZ [ [ [ [      5<UH5M5MUS))++,,b111SUk1ejnnT155vvFtTYTdTdTfTfOgOgOnoooFFFqICORSS)(D99S88(?S 3f <x{ JV ST#    KKl#d5==??&;&;"<"<llsllY\llhjllmmmmms   DH H,+H,	resnet101rg   c                 V   t          j        j        |          d          }|j        j        j        d         }t          j        t          j	        |          d          |j        _
        t          j        t          j	        ||          d          |j        _        ||j        _        |S )NT)
pretrainedr2   )rr   )torchvisionmodels__dict__fcr   r   r   	Parameterr	   r   r   out_features)rD   rM   r   filterss       r   load_classifierr     s    '->>>E ho#A&GLQtDDDEHMl5;q'#:#:$OOOEHOEHLr         ?r   c           	      8   dk    r| S | j         dd          \  }}t          |z            t          |z            f}t          j        | |dd          } |sfd||fD             \  }}t          j        | d||d         z
  d||d         z
  gd	
          S )Nr  rg   bilinearF)r   modealign_cornersc                 J    g | ]}t          j        |z  z            z   S rW   )mathceil)rn   ro   gsratios     r   r   zscale_img.<locals>.<listcomp>   s0    CCCqDIa%i"n--2CCCr   r   r2   gS㥛?)value)r   r   Finterpolatepad)r   r  
same_shaper  hwr+   s    ` `   r   	scale_imgr     s    ||
y}1U^^SU^^,mCajNNN 	DCCCCCQFCCCDAquS1a!A$h1qt84EBBBBr   c                     |j                                         D ]C\  }}t          |          r||vs|                    d          s||v r2t	          | ||           Dd S )Nr   )r  r   r?   
startswithsetattr)r   r   includer   r   r   s         r   	copy_attrr    sv    
  ""  1LL 	Qg--!,,s2C2C-qG||Aq!	 r   c                   (    e Zd ZdZd
dZd ZddZd	S )ModelEMAa    Model Exponential Moving Average from https://github.com/rwightman/pytorch-image-models
    Keep a moving average of everything in the model state_dict (parameters and buffers).
    This is intended to allow functionality like
    https://www.tensorflow.org/api_docs/python/tf/train/ExponentialMovingAverage
    A smoothed version of the weights is necessary for some training schemes to perform well.
    This class is sensitive where it is initialized in the sequence of model init,
    GPU assignment and distributed training wrappers.
    H.?r   c                    t          t          |          r|j        n|                                          | _        || _        fd| _        | j                                        D ]}|                    d           d S )Nc                 @    dt          j        |  dz            z
  z  S )Nr2   i  )r  exp)ro   decays    r   <lambda>z#ModelEMA.__init__.<locals>.<lambda>  s!    uDHaR$Y,?,?(?@ r   F)	r   r   moduleevalemaupdatesr$  r   r   )selfr   r$  r)  rQ   s     `  r   __init__zModelEMA.__init__  s    K,>,>IELLEJJOOQQ @@@@
$$&& 	$ 	$AU####	$ 	$r   c                    t          j                    5  | xj        dz  c_        |                     | j                  }t	          |          r|j                                        n|                                }| j                                                                        D ]9\  }}|j	        j
        r(||z  }|d|z
  ||                                         z  z  }:	 d d d            d S # 1 swxY w Y   d S )Nr2   r  )r	   no_gradr)  r$  r   r&  
state_dictr(  r   rx   is_floating_pointdetach)r*  r   rP   msdr   r   s         r   updatezModelEMA.update!  s.   ]__ 	4 	4LLALL

4<((A/:5/A/AY%,))+++uGWGWGYGYC++--3355 4 417, 4FA"q&CFMMOO33A4	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   CC..C25C2rW   process_groupreducerc                 4    t          | j        |||           d S rT   )r  r(  )r*  r   r  r   s       r   update_attrzModelEMA.update_attr-  s    $(E7G44444r   N)r   r   )rW   r3  )__name__
__module____qualname____doc__r+  r2  r7  rW   r   r   r  r    sU         $ $ $ $
4 
4 
45 5 5 5 5 5r   r  c                       e Zd Zd ZdS )BatchNormXdc                     d S rT   rW   )r*  r^   s     r   _check_input_dimzBatchNormXd._check_input_dim3  s	     	r   N)r8  r9  r:  r?  rW   r   r   r=  r=  2  s#        	 	 	 	 	r   r=  c                 R   | }t          | t          j        j        j        j                  rt          }t          | j        | j        | j	        | j
        | j                  }| j
        rCt          j                    5  | j        |_        | j        |_        d d d            n# 1 swxY w Y   | j        |_        | j        |_        | j        |_        t%          | d          r| j        |_        |                                 D ](\  }}|                    |t-          |                     )~ |S )Nqconfig)ru   r	   r   r   	batchnormSyncBatchNormr=  num_featuresr   r   affinetrack_running_statsr-  r   r   r   r   num_batches_trackedrv   rA  named_children
add_modulerevert_sync_batchnorm)r&  module_outputnew_clsrD   childs        r   rJ  rJ  >  sa    M&%(*4BCC 3#F$7/5z6?/5}/5/IK K = 	1 1 1'-}$%+["1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 &,%8"$*$6!,2,F)69%% 	3$*NM!,,.. E Ee  '<U'C'CDDDDs   9BB"%B"c                   (     e Zd Zd fd	ZddZ xZS )TracedModelNr   r   c                    t          t          |                                            t          d           |j        | _        |j        | _        || _        t          | j                  | _        | j                            d           | j        	                                 | j        j        d         | _
        d| j        _        t          j        dd||          }t          j                            | j        |d          }|                    d	           t          d
           || _        | j                            |           | j
                            |           t          d           d S )Nz" Convert model to Traced-model... r0   r   Tr2   r   F)strictztraced_model.ptz traced_script_module saved! z model is traced! 
)superrO  r+  rs   r   namesr   rJ  r`   r'  detect_layertracedr	   randjittracesave)r*  r   rK   r   rand_exampletraced_script_module	__class__s         r   r+  zTracedModel.__init__Y  s7   k4  ))+++2333l[

*4:66

e
 J,R0 
z!Q(;;$ytz<PUVV!!"3444-...)

fV$$$$%%%%%r   Fc                 Z    |                      |          }|                     |          }|S rT   )r   rU  )r*  ro   augmentr{   outs        r   forwardzTracedModel.forwards  s)    jjmm$$
r   )NNrP  )FF)r8  r9  r:  r+  ra  __classcell__)r]  s   @r   rO  rO  W  sQ        & & & & & &4       r   rO  )r   )r%   N)rY   N)rW   )r   )Fr   )r   rg   )r  Fr   )rW   rW   ):r   loggingr  r:   rH   r&   rV   
contextlibr   copyr   pathlibr   r	   torch.backends.cudnnbackendsr   torch.nnr   torch.nn.functional
functionalr  r   rz   r   	getLoggerr8  rF   r   r   r   __file__r!   parentr-   rR   rX   r{   r   r   r   r   r   r   r   r   r   r  r  r  r  r   rB  
_BatchNormr=  rJ  r   rO  rW   r   r   <module>rp     s[      				       % % % % % %              $ $ $ $ $ $ $ $ $                   KKKK   DDD		8	$	$ $S $ $ $ $; ; ; ;   ) ) ) ) d8nn+    5 5 5 54  $] $] $] $]NZ Z Zt t t t
	 	 	  "y Q Q Q Q
  5 5 5 5  .n n n n0   &
C 
C 
C 
C   "5 "5 "5 "5 "5 "5 "5 "5J
 
 
 
 
%(",7 
 
 
  2    ")     s   A AA