U
    Hcm:                     @   sR  d Z ddlZddlZddlmZ ddlmZ ee Z	e	j
d Zeeejkr`ejee ddlT ddlT ddlmZ ddlmZmZmZmZmZ dd	lmZ dd
lmZmZmZmZm Z m!Z! zddl"Z"W n e#k
r   dZ"Y nX G dd de$j%Z&G dd de$j%Z'dd Z(e)dkrNe* Z+e+j,deddd e+j,dddd e+j,dddd e+j,dddd e+- Z.ee.j/e._/ee	j0e. e e.j1Z1e'e.j/2e1Z3e34  e.j5re67e6j89 rd ndd!d"d"2e1Z:e3e:d#d$Z;e.j<rNeed% =d&D ]LZ/ze'e/Z>W n8 e?k
rH Z@ zeAd'e/ d(e@  W 5 dZ@[@X Y nX q dS ))zV
YOLO-specific modules

Usage:
    $ python path/to/models/yolo.py --cfg yolov5s.yaml
    N)deepcopy)Path   )*)check_anchor_order)LOGGERcheck_version
check_yamlmake_divisible
print_args)feature_visualization)fuse_conv_and_bninitialize_weights
model_info	scale_imgselect_device	time_syncc                       s8   e Zd ZdZdZd fdd	Zdd	 ZdddZ  ZS )DetectNFP    Tc                    s   t    | _|d  _t| _t|d d  _tdg j  _	tdg j  _
 dt|  jdd t fdd|D  _| _d S )	N   r      r   anchorsc                 3   s$   | ]}t | j j d V  qdS )r   N)nnConv2dnona.0xselfr   A/var/www/html/VideoAnalyticsDashboard/src/./yolov5/models/yolo.py	<genexpr>.   s     z"Detect.__init__.<locals>.<genexpr>)super__init__ncr   lennlr   torchzerosgridanchor_gridregister_buffertensorfloatviewr   
ModuleListminplace)r"   r'   r   chr4   	__class__r!   r#   r&   %   s    


"zDetect.__init__c              	   C   s  g }t | jD ]}| j| || ||< || j\}}}}|| || j| j||ddddd ||< | j	s| j
s| j| jdd || jdd kr| |||\| j|< | j|< ||  }| jr8|dddf d d | j|  | j|  |dddf< |dddf d d | j|  |dddf< nl|dddf d d | j|  | j|  }	|dddf d d | j|  }
t|	|
|ddd f fd}|||d| j q| j	r|S t|d|fS )	Nr   r         r   .g      ?r   )ranger)   r3   shaper1   r   r   permute
contiguoustrainingonnx_dynamicr,   
_make_gridr-   sigmoidr4   strider*   catappend)r"   r    zibs_nynxyxywhr   r   r#   forward1   s"    0,80,"zDetect.forward   r   c           	      C   s   | j | j}ttjdrDtjtj||dtj||dgdd\}}n&ttj||dtj||dg\}}t||fdd| j	||df
 }| j |  | j|  d| j	dddfd| j	||df
 }||fS )Nz1.10.0)deviceij)indexingr   r   )r   rP   r   r*   __version__meshgridarangestackexpandr   r0   clonerB   r1   )	r"   rJ   rI   rF   dyvxvr,   r-   r   r   r#   r@   H   s    ,&&zDetect._make_grid)r   r   r   T)rO   rO   r   )	__name__
__module____qualname__rB   r?   r&   rN   r@   __classcell__r   r   r6   r#   r   !   s
   r   c                       s   e Zd Zd fdd	ZdddZd	d
 Zd ddZdd Zdd Zdd Z	d!ddZ
dd Zdd Zd"ddZ fddZ  ZS )#Modelyolov5s.yamlr8   Nc                    s  t    t|tr|| _n:dd l}t|j| _t|ddd}|	|| _W 5 Q R X | j
d| }| jd< |r|| jd krtd| jd  d|  || jd< |rtd	|  t|| jd
< tt| j|gd\| _| _dd t| jd D | _| j
dd| _| jd }t|trd | j|_t fdd| td|  D |_| j|jddd  _t| |j| _|   t|  |   td d S )Nr   asciiignore)encodingerrorsr5   r'   zOverriding model.yaml nc=z	 with nc=z+Overriding model.yaml anchors with anchors=r   r5   c                 S   s   g | ]}t |qS r   )str)r   rF   r   r   r#   
<listcomp>h   s     z"Model.__init__.<locals>.<listcomp>r4   Tr      c                    s   g | ]} |j d   qS ))r;   r   sr   r#   rh   p   s     r    ) r%   r&   
isinstancedictyamlr   nameZ	yaml_fileopen	safe_loadgetr   inforoundparse_modelr   modelsaver:   namesr4   r   r*   r/   rN   r+   rB   r   r1   r   _initialize_biasesr   )r"   cfgr5   r'   r   rp   fr3   r6   rk   r#   r&   U   s:    



,zModel.__init__Fc                 C   s   |r|  |S | |||S N)_forward_augment_forward_once)r"   r    augmentprofile	visualizer   r   r#   rN   {   s    
zModel.forwardc           
      C   s   |j dd  }dddg}d dd g}g }t||D ]V\}}t|rH||n||t| j d}| |d }	| |	|||}	|	|	 q0| 
|}t|dd fS )Nrj   r   g(\?gq=
ףp?r8   )gsr   )r;   zipr   flipintrB   maxr   _descale_predrD   _clip_augmentedr*   rC   )
r"   r    img_sizerl   r}   rK   sifixiyir   r   r#   r      s    

&
zModel._forward_augmentc                    s   g g  }| j D ]}|jdkrJt|jtr4|j n fdd|jD  |r\| | | |  |j| jkrx nd  |rt |j	|j|d q S )Nr   c                    s    g | ]}|d kr n| qS )r   r   )r   jr    rK   r   r#   rh      s     z'Model._forward_once.<locals>.<listcomp>)save_dir)
rx   r}   rn   r   _profile_one_layerrD   rF   ry   r   type)r"   r    r   r   dtr3   r   r   r#   r      s    


,zModel._forward_oncec              	   C   s   | j rZ|dd df  |  < |dkr<|d |d  |d< q|dkr|d |d  |d< n|dddf | |dddf | |dddf |   }}}|dkr|d | }n|dkr|d | }t||||ddd f fd	}|S )
N.r9   r   r   ).r   r8   r   ).r   r   )r4   r*   rC   )r"   pflipsscaler   r    rK   rM   r   r   r#   r      s    @ zModel._descale_predc                    s   | j d j tdd t D }d}|d jd | tdd t|D  }|d d d d | f |d< |d jd | t fddt|D  }|d d d |d f |d< |S )Nr   c                 s   s   | ]}d | V  qdS r9   Nr   r   r   r   r#   r$      s     z(Model._clip_augmented.<locals>.<genexpr>r   r   c                 s   s   | ]}d | V  qdS r   r   r   r   r   r#   r$      s     c                 3   s   | ]}d  d |  V  qdS )r9   r   Nr   r   r)   r   r#   r$      s     )rx   r)   sumr:   r;   )r"   rK   gerF   r   r   r#   r      s    (,zModel._clip_augmentedc              	   C   s
  t |t}tr8tj||r | n|fddd d d nd}t }tdD ]}||r\| n| qJ|t | d  || jd krt	
dd	d
dd	d
dd	dd  t	
|d dd
|dd
|jdd|j  |rt	
t|dd
dd	d
dd	d d S )NF)inputsverboser   g    eAr   
   d   z	time (ms)z>10s GFLOPsparams  moduler   z10.2f10.0f-z  Total)rn   r   thopr   copyr   r:   rD   rx   r   ru   npr   r   )r"   r3   r    r   cotrH   r   r   r#   r      s    
2&.zModel._profile_one_layerc              	   C   s   | j d }t|j|jD ]\}}|j|jd}|jd d df  t	dd| d  7  < |jd d dd f  |d krt	d|j
d  nt	||  7  < tjj|dd	d
|_qd S )Nr   r9        r   r   g333333?g!?T)requires_grad)rx   r   r3   rB   biasr1   r   datamathlogr'   r*   r   r   	Parameter)r"   cfr3   mirl   br   r   r#   r{      s    
,HzModel._initialize_biasesc              	   C   sn   | j d }|jD ]X}|j |jdj}td|j	j
d f|d d d |dd   f  qd S )Nr   z4%6g Conv2d.bias:%10.3g%10.3g%10.3g%10.3g%10.3g%10.3gr   r   )rx   r3   r   detachr1   r   Tr   ru   weightr;   meantolist)r"   r3   r   r   r   r   r#   _print_biases   s    

6zModel._print_biasesc                 C   s`   t d | j D ]>}t|ttfrt|drt|j	|j
|_	t|d |j|_q|   | S )NzFusing layers... bn)r   ru   rx   modulesrn   ConvDWConvhasattrr   convr   delattrforward_fuserN   )r"   r3   r   r   r#   fuse   s    


z
Model.fuser   c                 C   s   t | || d S r~   )r   )r"   r   r   r   r   r#   ru      s    z
Model.infoc                    s`   t  |} | jd }t|tr\||j|_tt||j|_t|j	tr\tt||j	|_	| S )Nr   )
r%   _applyrx   rn   r   rB   listmapr,   r-   )r"   fnr3   r6   r   r#   r      s    

zModel._apply)ra   r8   NN)FFF)FF)N)Fr   )r\   r]   r^   r&   rN   r   r   r   r   r   r{   r   r   ru   r   r_   r   r   r6   r#   r`   T   s   &





r`   c                    s  t dddddddddd	d
ddd | d | d | d | d f\}}}}t|trpt|d d n|}||d  }g g d   }}	}
t| d | d  D ]\\}} ttrtnt D ]>\}}zt|trt|n| |< W q tk
r   Y qX q|dkr4t	t
|| dn| }}tttttttttttttttfkrƈ|  d  }}
|
|krt|
| d}
||
f dd   ttttfkr d| d}n؈tjkrވ| g ntkr tfdd|D }
nt krV !fdd|D  t d t"rtt# d d gt|  d< nHt$krv|  d d  }
n(t%kr|  d d  }
n| }
|dkrtj& fddt#|D  n  }tdd 'd d}td!d |( D }|||f\|_)|_*|_+|_,t dt|d|d|d"d	|dt d |	-fd#dt|t"rp|gn|D  |!| dkrg !|
 qtj&| t.|	fS )$N
rm   z>3fromz>18nr   z>10r   r   z<40	argumentsz<30r   r'   Zdepth_multipleZwidth_multipler   r   r   r   backboneheadr   r   c                 3   s   | ]} | V  qd S r~   r   r   rf   r   r#   r$     s     zparse_model.<locals>.<genexpr>c                    s   g | ]} | qS r   r   r   rf   r   r#   rh     s     zparse_model.<locals>.<listcomp>c                 3   s   | ]}  V  qd S r~   r   )r   rH   )argsr3   r   r#   r$     s     rj   z	__main__.c                 s   s   | ]}|  V  qd S r~   )numelr   r   r   r#   r$     s     r   c                 3   s   | ]}|d kr|  V  qdS )r   Nr   r   )rF   r   r#   r$   !  s      )/r   ru   rn   r   r(   	enumeraterg   eval	NameErrorr   rv   r   	GhostConv
BottleneckGhostBottleneckSPPSPPFr   	MixConv2dFocus	CrossConvBottleneckCSPC3C3TRC3SPPC3Ghostr
   insertr   BatchNorm2dConcatr   r   rD   r   r:   ContractExpand
Sequentialreplace
parametersrF   r}   r   r   extendsorted)rY   r5   r   r'   gdgwr   r   layersry   c2r}   r   r   an_c1Zm_r   r   r   )r   r5   rF   r3   r#   rw      sf    2$&$    


$

08*

rw   __main__z--cfgra   z
model.yaml)r   defaulthelpz--devicerm   z%cuda device, i.e. 0 or 0,1,2,3 or cpu)r   r   z	--profile
store_truezprofile model speed)actionr   z--testztest all yolo*.yamlr   r8   r   T)r   modelsz
yolo*.yamlz	Error in z: )B__doc__argparsesysr   r   pathlibr   __file__resolveFILEparentsROOTrg   pathrD   models.commonmodels.experimentalZutils.autoanchorr   utils.generalr   r   r	   r
   r   utils.plotsr   utils.torch_utilsr   r   r   r   r   r   r   ImportErrorr   Moduler   r`   rw   r\   ArgumentParserparseradd_argument
parse_argsoptr|   stemrP   torx   trainr   r*   randcudais_availableimgrK   testrglobrH   	Exceptionr   printr   r   r   r#   <module>   sV   
 
3  6

&