a
    DffE                     @   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mZ ddlm	Z	 e	e
 Zejd Zeeejvrxejee e dkre	ejee	 Z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'm(Z( zddl)Z)W n e*y&   dZ)Y n0 G dd de+j,Z-G dd de-Z.G dd de+j,Z/G dd de/Z0e0Z1G dd de0Z2G dd de/Z3dd Z4e5dkre6 Z7e7j8deddd e7j8de9dd d e7j8d!d"d#d$ e7j8d%d&d'd( e7j8d)d&d*d( e7j8d+d&d,d( e7: Z;ee;j<e;_<ee=e; e'e;j>Z>e?@e;jAd-d.d.Be>ZCe1e;j<Be>ZDe;jErveDeCd/d0 ne;j%re%eCeDgd-d1ZFnte;jGre	ed2 Hd3D ]NZ<ze1e<ZIW n: eJy ZK z eLd4e< d5eK  W Y dZK[Kn
dZK[K0 0 qneDM  dS )6zN
YOLO-specific modules

Usage:
    $ python models/yolo.py --cfg yolov5s.yaml
    N)deepcopy)Path   Windows)*)check_anchor_order)LOGGERcheck_version
check_yamlmake_divisible
print_args)feature_visualization)fuse_conv_and_bninitialize_weights
model_infoprofile	scale_imgselect_device	time_syncc                       sL   e Zd ZdZdZdZd fdd	Zdd	 Zd
d
dee	j
dfddZ  ZS )DetectNFP    Tc                    s   t    | _|d  _t| _t|d d  _dd t jD  _dd t jD  _	 
dt|  jdd t fd	d
|D  _| _d S )N   r      c                 S   s   g | ]}t d qS r   torchempty.0_r   r   A/data/NAS7/SABIOD/METHODE/ermites/yolo-dyni/yolov5/models/yolo.py
<listcomp>2       z#Detect.__init__.<locals>.<listcomp>c                 S   s   g | ]}t d qS r   r   r   r   r   r!   r"   3   r#   anchorsc                 3   s$   | ]}t | j j d V  qdS r   NnnConv2dnonar   xselfr   r!   	<genexpr>5   r#   z"Detect.__init__.<locals>.<genexpr>)super__init__ncr*   lennlr+   rangegridanchor_gridregister_bufferr   tensorfloatviewr(   
ModuleListminplace)r/   r3   r$   chr?   	__class__r.   r!   r2   ,   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|< t| trN|| dd| jd | j| j d fd\}}	}
}| d | j|  | j|  }|	 d d | j|  }	t||	|
 |fd}nj||  dd| jd fd\}}	}
|d | j|  | j|  }|	d d | j|  }	t||	|
fd}|||| j| | | j q| j	r|S | jrt|dfS t|d|fS )Nr   r         r   r   )r6   r5   r>   shaper<   r+   r*   permute
contiguoustrainingdynamicr7   
_make_gridr8   
isinstanceSegmentsplitr3   sigmoidstrider   catappendexport)r/   r-   zibsr    nynxxywhconfmaskyr   r   r!   forward8   s&    0,2 &"zDetect.forward   r   z1.10.0c                 C   s   | j | j}| j | j}d| j||df}tj|||dtj|||d }}	|r^tj||	ddn
t||	\}
}t||
fd|d }| j | | j	|  
d| jdddf|}||fS )Nr   r   )devicedtypeij)indexingg      ?)r$   r_   r`   r+   r   arangemeshgridstackexpandrO   r<   )r/   rW   rV   rT   Z
torch_1_10dtrE   r\   r-   yvxvr7   r8   r   r   r!   rJ   Q   s    "$,zDetect._make_grid)r   r   r   T)__name__
__module____qualname__rO   rI   rR   r2   r]   r	   r   __version__rJ   __classcell__r   r   rA   r!   r   &   s   r   c                       s&   e Zd Zd
 fdd	Zdd	 Z  ZS )rL   r   r          Tc                    sj   t  |||| | _| _d|  j  _t fdd|D  _t|d  j j _	t
j _d S )Nr   c                 3   s$   | ]}t | j j d V  qdS r&   r'   r,   r.   r   r!   r0   c   r#   z#Segment.__init__.<locals>.<genexpr>r   )r1   r2   nmnprr*   r(   r=   r>   Protoprotor   r]   detect)r/   r3   r$   rr   rs   r@   r?   rA   r.   r!   r2   ^   s    zSegment.__init__c                 C   sL   |  |d }| | |}| jr(||fS | jr:|d |fS |d ||d fS )Nr   r   )ru   rv   rH   rR   )r/   r-   pr   r   r!   r]   g   s    zSegment.forward)r   r   rp   rq   r   T)rk   rl   rm   r2   r]   ro   r   r   rA   r!   rL   \   s   	rL   c                       sJ   e Zd ZdddZdddZdd Zdd	 ZdddZ fddZ  Z	S )	BaseModelFc                 C   s   |  |||S N)_forward_once)r/   r-   r   	visualizer   r   r!   r]   o   s    zBaseModel.forwardc                    s   g g  }| j D ]}|jdkrJt|jtr4|j n fdd|jD  |r\| | | |  |j| jv 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-   r\   r   r!   r"   v   r#   z+BaseModel._forward_once.<locals>.<listcomp>)save_dir)
modelfrK   int_profile_one_layerrQ   rT   saver   type)r/   r-   r   r{   dtr>   r   r}   r!   rz   r   s    


,zBaseModel._forward_oncec              	   C   s
  || j d k}tr<tj||r$| n|fddd d d nd}t }tdD ]}||r`| n| qN|t | d  || j d krt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 )Nr%   F)inputsverboser   g    eAr   
   d   z	time (ms)z>10s GFLOPsparamsz  modulez10.2f10.0f  -z  Total)r   thopr   copyr   r6   rQ   r   infonpr   sum)r/   r>   r-   r   corh   r    r   r   r!   r      s    2".zBaseModel._profile_one_layerc                 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   r   r   modulesrK   ConvDWConvhasattrr   convr   delattrforward_fuser]   )r/   r>   r   r   r!   fuse   s    


zBaseModel.fuse  c                 C   s   t | || d S ry   )r   )r/   r   img_sizer   r   r!   r      s    zBaseModel.infoc                    sd   t  |} | jd }t|ttfr`||j|_tt||j	|_	t|j
tr`tt||j
|_
| S )Nr%   )r1   _applyr   rK   r   rL   rO   listmapr7   r8   )r/   fnr>   rA   r   r!   r      s    
zBaseModel._apply)FF)FF)Fr   )
rk   rl   rm   r]   rz   r   r   r   r   ro   r   r   rA   r!   rx   m   s   



rx   c                       sJ   e Zd Zd fdd	ZdddZd	d
 Zdd Zdd ZdddZ  Z	S )DetectionModelyolov5s.yamlrC   Nc              
      s  t    t|tr|_nNdd l}t|j_t|ddd}|	|_W d    n1 s`0    Y  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tfrdj _ fdd}tfdd|td|D  _t    j jddd  _ j_  t   td d S )Nr   asciiignore)encodingerrorsr@   r3   zOverriding model.yaml nc=z	 with nc=z+Overriding model.yaml anchors with anchors=r$   r@   c                 S   s   g | ]}t |qS r   )str)r   rT   r   r   r!   r"      r#   z+DetectionModel.__init__.<locals>.<listcomp>r?   Tr%   rq   c                    s"   t  tr| d S | S )Nr   )rK   rL   r]   )r-   )r>   r/   r   r!   <lambda>   r#   z)DetectionModel.__init__.<locals>.<lambda>c                    s   g | ]} |j d   qS ))rE   r,   )sr   r!   r"      r#   r    ) r1   r2   rK   dictyamlr   name	yaml_fileopen	safe_loadgetr   r   roundparse_modelr   r   r   r6   namesr?   r   rL   r   r:   zerosrO   r   r$   r<   _initialize_biasesr   )r/   cfgr@   r3   r$   r   r   r]   rA   )r>   r   r/   r!   r2      s<    

*

*zDetectionModel.__init__Fc                 C   s   |r|  |S | |||S ry   )_forward_augmentrz   )r/   r-   augmentr   r{   r   r   r!   r]      s    
zDetectionModel.forwardc           
      C   s   |j dd  }g d}g d}g }t||D ]V\}}t|rD||n||t| j d}| |d }	| |	|||}	|	|	 q,| 
|}t|dd fS )Nr   )r   g(\?gq=
ףp?)NrC   N)gsr   r   )rE   zipr   flipr   rO   maxrz   _descale_predrQ   _clip_augmentedr   rP   )
r/   r-   r   r   r   r\   sifixiyir   r   r!   r      s    &
zDetectionModel._forward_augmentc              	   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.rD   r   r   ).r   rC   r   ).r   r%   )r?   r   rP   )r/   rw   flipsscaler   r-   r\   rY   r   r   r!   r      s    @ zDetectionModel._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 rD   Nr   r,   r   r   r!   r0      r#   z1DetectionModel._clip_augmented.<locals>.<genexpr>r   r   c                 s   s   | ]}d | V  qdS r   r   r,   r   r   r!   r0      r#   c                 3   s   | ]}d  d |  V  qdS )rD   r   Nr   r,   r5   r   r!   r0      r#   )r   r5   r   r6   rE   )r/   r\   gerT   r   r   r!   r      s    (,zDetectionModel._clip_augmentedc              	   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|j
 f  |d u rt	d|j
d  nt	||  7  < tjj|dd	d
|_qd S )Nr%   rD      r   r   r   g333333?gwJ?T)requires_grad)r   r   r>   rO   biasr<   r+   datamathlogr3   r   r   r(   	Parameter)r/   cfr>   mir   br   r   r!   r      s    
,Nz!DetectionModel._initialize_biases)r   rC   NN)FFF)N)
rk   rl   rm   r2   r]   r   r   r   r   ro   r   r   rA   r!   r      s   '
r   c                       s   e Zd Zd fdd	Z  ZS )SegmentationModelyolov5s-seg.yamlrC   Nc                    s   t  |||| d S ry   )r1   r2   )r/   r   r@   r3   r$   rA   r   r!   r2     s    zSegmentationModel.__init__)r   rC   NN)rk   rl   rm   r2   ro   r   r   rA   r!   r     s   r   c                       s0   e Zd Zd
 fdd	ZdddZdd	 Z  ZS )ClassificationModelN  r   c                    s.   t    |d ur | |||n| | d S ry   )r1   r2   _from_detection_model
_from_yaml)r/   r   r   r3   cutoffrA   r   r!   r2     s    
zClassificationModel.__init__c                 C   s   t |tr|j}|jd | |_|jd }t|dr<|jjn|jjj}t||}|j|j	d  |_|_	|_
||jd< |j| _|j| _g | _|| _d S )Nr%   r   zmodels.common.Classify)rK   DetectMultiBackendr   r   r   in_channelscv1ClassifyrT   r   r   rO   r   r3   )r/   r   r3   r   r>   r@   r   r   r   r!   r     s    



z)ClassificationModel._from_detection_modelc                 C   s
   d | _ d S ry   )r   )r/   r   r   r   r!   r   &  s    zClassificationModel._from_yaml)NNr   r   )r   r   )rk   rl   rm   r2   r   r   ro   r   r   rA   r!   r     s   
r   c                    s"  t dddddddddd	d
ddd | d | d | d | d | df\}}}}}|rt|t_t td d|  t|trt	|d d n|}||d  }g g d   }	}
}t
| d | d  D ]4\\}} ttrtnt
 D ]R\}}tt, t|tr0t|n| |< W d    n1 sN0    Y  q|dkrxtt|| dn| }}ttttttttttttttttj t!t"hv r|  d  }}||krt#|| d}||g dd   ttttt"hv r $d| d}ntj%u r,| g nt&u rNt'fdd|D }nt(t)hv rȈ *fdd |D  t d t+rtt, d d gt	|  d< t)u rt# d! | d d!< nHt-u r|  d d  }n(t.u r|  d d  }n| }|dkr8tj/ fd"dt,|D  n  }tdd# 0d$d}t'd%d |1 D }|||f\|_2|_3|_4|_5t dt|d|d|d&d	|dt d |
6fd'dt|t+r|gn|D  |	*| dkrg *| qtj/|	 t7|
fS )(N
r   z>3fromz>18nr   z>10r   modulez<40	argumentsz<30r$   r3   Zdepth_multipleZwidth_multiple
activationzactivation:r   r   r   r   r%   backboneheadr   r   c                 3   s   | ]} | V  qd S ry   r   r,   r   r   r!   r0   K  r#   zparse_model.<locals>.<genexpr>c                    s   g | ]} | qS r   r   r,   r   r   r!   r"   N  r#   zparse_model.<locals>.<listcomp>rC   c                 3   s   | ]}  V  qd S ry   r   r   )argsr>   r   r!   r0   Z  r#   r   z	__main__.c                 s   s   | ]}|  V  qd S ry   )numelr,   r   r   r!   r0   \  r#   r   c                 3   s   | ]}|d kr|  V  qdS )r%   Nr   r,   )rT   r   r!   r0   _  r#   )8r   r   r   evalr   default_actcolorstrrK   r   r4   	enumerater   
contextlibsuppress	NameErrorr   r   	GhostConv
BottleneckGhostBottleneckSPPSPPFr   	MixConv2dFocus	CrossConvBottleneckCSPC3C3TRC3SPPC3Ghostr(   ConvTranspose2dDWConvTranspose2dC3xr   insertBatchNorm2dConcatr   r   rL   rQ   r   r6   ContractExpand
Sequentialreplace
parametersrT   r   r   r   extendsorted)rg   r@   r$   r3   gdgwactr+   r*   layersr   c2r   r   r|   an_c1m_rh   r   r   )r   r@   rT   r>   r!   r   +  sf    2.
&@$

"


08*

r   __main__z--cfgr   z
model.yaml)r   defaulthelpz--batch-sizeztotal batch size for all GPUsz--devicer   z%cuda device, i.e. 0 or 0,1,2,3 or cpu)r  r  z	--profile
store_truezprofile model speed)actionr  z--line-profilez"profile model speed layer by layerz--testztest all yolo*.yamlrC   r   T)r   )inputopsr   modelsz
yolo*.yamlz	Error in z: )N__doc__argparser   osplatformsysr   r   pathlibr   __file__resolveFILEparentsROOTr   pathrQ   systemrelpathcwdmodels.commonmodels.experimentalutils.autoanchorr   utils.generalr   r	   r
   r   r   utils.plotsr   utils.torch_utilsr   r   r   r   r   r   r   r   ImportErrorr(   Moduler   rL   rx   r   Modelr   r   r   rk   ArgumentParserparseradd_argumentr   
parse_argsoptr   varsr_   r   rand
batch_sizetoimr   Zline_profileresultstestrglobr    	Exceptionr   printr   r   r   r   r!   <module>   sp   
$
68c<

0