
    "f=                     `   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 ej2                  e      Zedefd       ZddZefdZ  ee      jB                  fd	Z"d d
Z#d Z$d!dZ%d Z&d"dZ'd Z(ejR                  fdZ*d Z+d#dZ,d Z-d$dZ.d%dZ/d&dZ0d'dZ1 G d d      Z2 G d dej$                  jf                  jh                  jj                        Z6d Z7 G d dejp                        Z9y# e$ r dZY w xY w)(    N)contextmanager)deepcopy)Path
local_rankc              #      K   | dvrt         j                  j                          d | dk(  rt         j                  j                          yyw)zm
    Decorator to make all processes in distributed training wait for each local_master to do something.
    )r   Nr   )torchdistributedbarrier)r   s    5C:\work2\python\work_new2\yolov7\utils\torch_utils.pytorch_distributed_zero_firstr      sC     
  !!#	Q!!# s   AAc                     t        j                  |        | dk(  rd\  t        _        t        _        y d\  t        _        t        _        y )Nr   )FT)TF)r	   manual_seedcudnn	benchmarkdeterministic)seeds    r   init_torch_seedsr   '   s5    	dqy/:,,/:,,    c                     t         j                   j                  t        |       j                         j                        }|j
                   d|j                   d|j                   S )N-)datetimefromtimestampr   statst_mtimeyearmonthday)pathts     r   date_modifiedr!   0   sL    ''T
(9(B(BCAffXQqwwiq((r   c                     d|  d}	 t        j                  |dt         j                        j                         d d S # t         j                  $ r
}Y d }~y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   s\    
$78A&&qZ=N=NOVVXY\Z\]](( s   6? AAc           
         dt               xs
 t                dt        j                   d}| j	                         dk(  }|rdt
        j                  d<   n>| r<| t
        j                  d<   t        j                  j                         sJ d|  d       | xr t        j                  j                         }|rt        j                  j                         }|d	kD  r|r||z  d
k(  sJ d| d|        dt        |      z  }t        | r| j                  d      n
t        |            D ]S  \  }}t        j                  j                  |      }	||d
k(  rdn| d| d|	j                   d|	j                   dz   dz  }U n|dz  }t"        j%                  t'        j(                         dk(  r |j+                         j-                  dd      n|       t        j.                  |rd      S 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   
ln78@Q@Q?RRSTA
,,.E
!C
-1

)*	-3

)*zz&&(`,MfXU_*``(70uzz..0DJJ##%q5Z>Q&`+j\A\]^\_(``&c!f6fll3/uQxHDAq

003A!q&Be,E!BqvvhbR[A[@\\abbA I 	
W
KK8IY8V
!!'84\]^<<D44e44r   c                      t         j                  j                         rt         j                  j                          t	        j                         S N)r	   r<   r=   synchronizetime r   r   time_synchronizedrX   Y   s.    zz 

 99;r   c                    |xs5 t        j                  t         j                  j                         rdnd      }| j	                  |      } d| _        t        t         j                  |j                  |j                  dk(  rt         j                  j                  d      nd       t        ddd	d
d	dddddddd       t        |t              r|n|gD ]  }t        |d      r|j	                  |      n|}t        |d      rFt        | t         j                        r,| j                  t         j                  u r|j!                         n|}ddg d}}}	 t#        j$                  || fd      d   dz  dz  }t'        |      D ]x  }	t)               |d<    ||       }
t)               |d<   	 |
j+                         j-                         }	t)               |d<   ||d   |d   z
  dz  |z  z  }||d   |d   z
  dz  |z  z  }z t        | t         j                        rt1        | j2                        nd}t        
t         j                        rt1        |
j2                        nd}t        |t4        j6                        r)t+        t        d |j9                         D                    nd}t        |d|d|d |d t;        |      dt;        |      d         y #  d}Y gxY w#  t/        d      |d<   Y !xY w)!Nr7   r0   Tr<   r   r%   
Paramsz>12sGFLOPSzforward (ms)z>16szbackward (ms)inputz>24soutputtohalf        )ra   ra   ra   Finputsverbose    eA   r2   nani  listc              3   <   K   | ]  }|j                           y wrT   numel.0xs     r   	<genexpr>zprofile.<locals>.<genexpr>   s     71QWWY   12z12.4gz16.4g)r	   rK   r<   r=   r_   requires_gradprintr8   typerC   
isinstancerh   hasattrTensordtypefloat16r`   thopprofilerB   rX   sumbackwardfloattupleshapennModule
parametersstr)rn   opsrM   rK   mdtfdtbr    flops_ys_ins_outrQ   s                 r   r{   r{   `   s    Uu||

0G0G0IHuUF	VAAO	%

V[[QWQ\Q\`fQf%***J*J1*Mlno	Bxoht_^D,A/RVAWX_`dWefnoset
uvsD)Su4#At,ADDL!6*z!U\\/JqwwZ_ZgZgOgAFFHmn"l!S	LLA4?BSH1LE qA$&AaD!A$&AaD$EEG$$&(*! AaD1Q4K4'!++CAaD1Q4K4'!++C  ",Au||!<uQWW~&",Q"=agg6<Fq"))<TC7778Z[2uUmC;s5k#d)D9I#e*UYIZ[\1 5	E$U|!s   "K++K$K!$K7c                     t        |       t        j                  j                  t        j                  j                  fv S rT   )rt   r   parallelDataParallelDistributedDataParallel)models    r   is_parallelr      s*    ;2;;33R[[5X5XYYYr   c                     | j                         D ci c]?  \  }|v st        fd|D              r |j                  |   j                  k(  s=|A c}}S c c}}w )Nc              3   &   K   | ]  }|v  
 y wrT   rW   )rm   rn   ks     r   ro   z"intersect_dicts.<locals>.<genexpr>   s     >Ww!qAvws   )itemsanyr   )dadbexcluder   vs      ` r   intersect_dictsr      sW    XXZsZTQ173>Ww>W;W\]\c\cgijkglgrgr\rAqDZssss   AAAAc                 <   | j                         D ]  }t        |      }|t        j                  u r!|t        j                  u rd|_        d|_        B|t        j                  t        j                  t        j                  t        j                  fv sd|_         y )NgMbP?gQ?T)modulesrt   r   Conv2dBatchNorm2depsmomentum	Hardswish	LeakyReLUReLUReLU6inplace)r   r   r    s      r   initialize_weightsr      sk    ]]_G		>".. AEAJ2<<rwwAAAI r   c                 x    t        | j                        D cg c]  \  }}t        ||      s| c}}S c c}}w rT   )r@   module_listru   )r   mclassrO   r   s       r   find_modulesr      s4    #E$5$56P6$!Q*Q:OA6PPPs   66c                     d\  }}| j                         D ]+  }||j                         z  }||dk(  j                         z  }- ||z  S )N)ra   ra   r   )r   rk   r|   )r   abrQ   s       r   sparsityr      sL    DAq	QWWY	a1f\\^   q5Lr   c                    dd l mc mc m} t	        dd       | j                         D ]F  \  }}t        |t        j                        s!|j                  |d|       |j                  |d       H t	        dt        |       z         y )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      so    ((	
2&&&(aa#!!!(6!BLLH% ) 

!HUO
34r   c           	         t        j                  | j                  | j                  | j                  | j
                  | j                  | j                  d      j                  d      j                  | j                  j                        }| j                  j                         j                  | j                  d      }t        j                  |j                  j!                  t        j"                  |j$                  |j&                  z                     }|j                  j)                  t        j*                  ||      j                  |j                  j,                               | j.                  Dt        j0                  | j                  j3                  d      | j                  j                        n| j.                  }|j.                  |j                  j5                  |j6                        j!                  t        j"                  |j&                  |j$                  z               z
  }|j.                  j)                  t        j*                  ||j9                  dd            j9                  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&6!%"&,,!%#% &4^E%:22dkk>P>P;Q  [[ %%d&7&7<F::biimmEJJrvv/F$GHID588D&166y7G7G7M7MNO MQIIL]U[[))!,T[[5G5GHcgclclF77RYY]]2??377

2>>TVTZTZCZ8[\\DNN$r1(=>FFrJTQRr   c                 >   t        d | j                         D              }t        d | j                         D              }|rt        ddz         t        | j	                               D ]v  \  }\  }}|j                  dd      }t        d|||j                  |j                         t        |j                        |j                         |j                         fz         x 	 dd	lm} t        | d
      r-t        t!        | j"                  j                               d      nd}	t%        j&                  d| j(                  j+                  dd      |	|	ft-        | j                               j.                        }
 |t1        |       |
fd      d   dz  dz  }t3        |t              r|n||g}d||d   z  |	z  |d   z  |	z  z  }t8        j;                  dt=        t        | j?                                      d| d| d|        y # t4        t6        f$ r d}Y Uw xY w)Nc              3   <   K   | ]  }|j                           y wrT   rj   rl   s     r   ro   zmodel_info.<locals>.<genexpr>   s     4!3Aaggi!3rp   c              3   V   K   | ]!  }|j                   s|j                          # y wrT   )rr   rk   rl   s     r   ro   zmodel_info.<locals>.<genexpr>   s     G!3Aqaggi!3s   ))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   Frb   re   rf   z, %.1f GFLOPSzModel Summary: z	 layers, z parameters, z
 gradients) r|   r   rs   r@   named_parametersreplacerr   rk   rh   r   meanstdrz   r{   rv   maxintr   r	   r   yamlgetnextrK   r   ru   ImportError	ExceptionrF   rG   r?   r   )r   rd   img_sizen_pn_grO   rD   rQ   r{   r   imgr   fss                r   
model_infor      s   
4!1!1!34
4C
G!1!1!3G
GC03vvw%e&<&<&>?LAya<<3D8dAOOQWWYQWWqvvxQRQVQVQXYZ [ @
 5<UH5MS))+,b1SUkk1ejjnnT15vvFtTYTdTdTfOgOnOnoFqICORSS)(D98(?S 3f <x{ JV ST KK/#d5==?&;"<!=Yse=Y\X]]ghjgklm # s   $C"H HHc                    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 hhoo##A&GLLQtDEHHMll5;;q'#:$OEHHOEHHLr   c           	      ^   |dk(  r| S | j                   dd  \  }}t        ||z        t        ||z        f}t        j                  | |dd      } |s1||fD cg c]   }t	        j
                  ||z  |z        |z  " c}\  }}t        j                  | d||d   z
  d||d   z
  gd	      S c c}w )
N      ?rf   bilinearF)r   modealign_cornersr   r2   gS㥛?)value)r   r   Finterpolatemathceilpad)r   ratio
same_shapegshwr+   rn   s           r   	scale_imgr     s    |
yy}1U^SU^,mmCajN=>FCFqDIIa%i"n-2FCDAquuS1a!A$h1qt84EBB Ds   %B*c                     |j                   j                         D ]7  \  }}t        |      r||vs|j                  d      s||v r+t	        | ||       9 y )Nr   )r   r   r?   
startswithsetattr)r   r   includer   r   r   s         r   	copy_attrr    sK    

  "1LQg-!,,s2CqG|Aq!	 #r   c                   &    e Zd ZdZddZd ZddZy)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.
    c                     t        t        |      r|j                  n|      j                         | _        || _        fd| _        | j                  j                         D ]  }|j                  d        y )Nc                 B    dt        j                  |  dz        z
  z  S )Nr2   i  )r  exp)rn   decays    r   <lambda>z#ModelEMA.__init__.<locals>.<lambda>  s    uDHHaR$Y,?(?@r   F)	r   r   moduleevalemaupdatesr  r   r   )selfr   r  r   rQ   s     `  r   __init__zModelEMA.__init__  sZ    K,>ELLEJOOQ @
$$&AU# 'r   c                    t        j                         5  | xj                  dz  c_        | j                  | j                        }t	        |      r|j
                  j                         n|j                         }| j                  j                         j                         D ]=  \  }}|j                  j                  s||z  }|d|z
  ||   j                         z  z  }? 	 d d d        y # 1 sw Y   y xY w)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    ]]_LLAL

4<<(A/:5/A%,,))+uGWGWGYC++-335177,,FA"q&CFMMO33A 6 __s   B*C- #C--C6c                 4    t        | j                  |||       y rT   )r  r  )r!  r   r  r   s       r   update_attrzModelEMA.update_attr-  s    $((E7G4r   N)gH.?r   )rW   )process_groupreducer)__name__
__module____qualname____doc__r"  r)  r+  rW   r   r   r  r    s    $
45r   r  c                       e Zd Zd Zy)BatchNormXdc                      y rT   rW   )r!  r]   s     r   _check_input_dimzBatchNormXd._check_input_dim3  s     	r   N)r.  r/  r0  r5  rW   r   r   r3  r3  2  s    	r   r3  c                    | }t        | t        j                  j                  j                  j
                        rt        }t        | j                  | j                  | j                  | j                  | j                        }| j                  r?t        j                         5  | j                  |_        | j                  |_        d d d        | j                  |_        | j                   |_        | j"                  |_        t%        | d      r| j&                  |_        | j)                         D ]   \  }}|j+                  |t-        |             " ~ |S # 1 sw Y   xY w)Nqconfig)ru   r	   r   r   	batchnormSyncBatchNormr3  num_featuresr   r   affinetrack_running_statsr$  r   r   r   r   num_batches_trackedrv   r7  named_children
add_modulerevert_sync_batchnorm)r  module_outputnew_clsrD   childs        r   r@  r@  >  s    M&%((**44BBC#F$7$7/5zz6??/5}}/5/I/IK =='-}}$%+[[" ! &,%8%8"$*$6$6!,2,F,F)69%$*NNM!,,.e  '<U'CD / !s   "#EEc                   (     e Zd Zd fd	ZddZ xZS )TracedModelc                    t         t        |           t        d       |j                  | _        |j
                  | _        || _        t        | j                        | _        | j                  j                  d       | j                  j                          | j                  j                  d   | _
        d| j                  _        t        j                  dd||      }t        j                  j                  | j                  |d      }|j!                  d	       t        d
       || _        | j                  j                  |       | j                  j                  |       t        d       y )Nz" Convert model to Traced-model... r0   r   Tr2   r   F)strictztraced_model.ptz traced_script_module saved! z model is traced! 
)superrE  r"  rs   r   namesr   r@  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  s   k4)+23ll[[

*4::6


e

 JJ,,R0 

zz!Q(;$yytzz<PUV!!"34-.)


fV$$%r   c                 J    | j                  |      }| j                  |      }|S rT   )r   rJ  )r!  rn   augmentr{   outs        r   forwardzTracedModel.forwards  s$    jjm$
r   )NN)  rW  )FF)r.  r/  r0  r"  rV  __classcell__)rR  s   @r   rE  rE  W  s    &4r   rE  )r   )r%   N)d   N)rW   )g333333?)FrW  )	resnet101rf   )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   	getLoggerr.  rF   r   r   r   __file__r!   parentr-   rR   rX   r{   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r8  
_BatchNormr3  r@  r   rE  rW   r   r   <module>rh     sC      	    %    $ $     
		8	$ $S $ $;   ) 8n++ 54$]NZt
	  "yy Q
5.n0&
C"5 "5J
%(("",,77 
2")) C
  Ds   D# #D-,D-