
    nf+                        d dl Zd dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
  G d dej                  Z G d dej                  Z G d d	ej                  Z G d
 dej                  Z G d dej        j                  Z G d dej        j                  Z G d dej                  Z G d dej                  Z G d dej                  ZddZdS )    N)ConvDWConv)attempt_downloadc                   &     e Zd Zd fd	Zd Z xZS )	CrossConv            ?Fc                    t          t          |                                            t          ||z            }t	          ||d|fd|f          | _        t	          |||df|df|          | _        |o||k    | _        d S )Nr	   )g)superr   __init__intr   cv1cv2add)
selfc1c2ksr   eshortcutc_	__class__s
            +/var/www/html/yolov7/models/experimental.pyr   zCrossConv.__init__   s    i'')))a[[BAA//BAA!444(b    c                     | j         r+||                     |                     |                    z   n'|                     |                     |                    S N)r   r   r   r   xs     r   forwardzCrossConv.forward   sE    ,0HOq488DHHQKK(((($((488A;;:O:OOr   )r   r	   r	   r
   F__name__
__module____qualname__r   r"   __classcell__r   s   @r   r   r   
   sS        ) ) ) ) ) )P P P P P P Pr   r   c                   &     e Zd Zd fd	Zd Z xZS )SumFc                     t          t          |                                            || _        t	          |dz
            | _        |r4t          j        t          j	        d|           dz  d          | _
        d S d S )Nr	   r
      T)requires_grad)r   r*   r   weightrangeiternn	Parametertorcharangew)r   nr.   r   s      r   r   zSum.__init__   sz    c4!!###!a%LL	 	P\5<A#6#6"6":$OOODFFF	P 	Pr   c                     |d         }| j         r>t          j        | j                  dz  }| j        D ]}|||dz            ||         z  z   }n| j        D ]}|||dz            z   }|S )Nr   r,   r	   )r.   r3   sigmoidr5   r0   )r   r!   yr5   is        r   r"   zSum.forward!   s    aD; 	!df%%)AY ( (!a%1Q4'( Y ! !!a%Lr   Fr#   r(   s   @r   r*   r*      sR        P P P P P P	 	 	 	 	 	 	r   r*   c                   &     e Zd Zd fd	Zd Z xZS )	MixConv2dr	   r   r	   Tc                   	
 t          t          |                                            t                    }|rGt	          j        d|dz
  |                                          

fdt          |          D             	n|gdg|z  z   }t          j	        |dz   |d          }|t          j
        |dd          z  }|t          j                  dz  z  }d|d<   t          j                            ||d 	          d                                         	t          j        	fd
t          |          D                       | _        t          j        |          | _        t          j        dd          | _        d S )Nr   gư>c                 @    g | ]}|k                                     S  )sum).0r   r:   s     r   
<listcomp>z&MixConv2d.__init__.<locals>.<listcomp>4   s%    888Q16,,..888r   r	   )r   )axisr,   )rcondc           
          g | ]>}t          j        t          |                   |         |         d z  d          ?S )r,   F)bias)r1   Conv2dr   )rC   r   r   r   r   r   s     r   rD   z&MixConv2d.__init__.<locals>.<listcomp>=   sH    qqq^_	"c"Q%jj!A$1Q419SX Y Y Yqqqr   g?T)inplace)r   r=   r   lenr3   linspacefloorr/   npeyerollarraylinalglstsqroundr1   
ModuleListmBatchNorm2dbn	LeakyReLUact)r   r   r   r   r   equal_chgroupsbar   r:   r   s    ` ``    @@r   r   zMixConv2d.__init__/   sp   i'')))Q 		>q&4-44::<<A8888%--888BBsV|#Avz6R000AAA&&&&A!!!AAaDAT2215;;==Bqqqqqqqchiocpcpqqqrr.$$<T222r   c           	          |                      |                     t          j        fd| j        D             d                              z   S )Nc                 &    g | ]} |          S rA   rA   )rC   rW   r!   s     r   rD   z%MixConv2d.forward.<locals>.<listcomp>B   s!    .D.D.Dqqtt.D.D.Dr   r	   )r[   rY   r3   catrW   r    s    `r   r"   zMixConv2d.forwardA   sI    488DGGEI.D.D.D.DTV.D.D.Da$H$HIIJJJJr   )r>   r	   Tr#   r(   s   @r   r=   r=   -   sS        3 3 3 3 3 3$K K K K K K Kr   r=   c                   &     e Zd Z fdZddZ xZS )Ensemblec                 V    t          t          |                                            d S r   )r   rd   r   )r   r   s    r   r   zEnsemble.__init__G   s%    h&&(((((r   Fc                     g }| D ]'}|                      |||          d                    (t          j        |d          }|d fS )Nr   r	   )appendr3   rb   )r   r!   augmentr9   modules        r   r"   zEnsemble.forwardJ   sV     	, 	,FHHVVAw''*++++ IaOO$wr   r;   r#   r(   s   @r   rd   rd   E   sL        ) ) ) ) )       r   rd   c                       e Zd ZdZe ej        dg           ej        dg           ej        dg          fd            Zed             ZdS )ORT_NMSzONNX-Runtime NMS operationd   ?      ?c                 Z   |j         }|j        d         }t          j        dd          }t	          j        d||f                                          d                             |          }	t	          j        dd|z                                 |          }
t	          j        |ft          j	                                      |          }t	          j
        |	d          |d          |
d          gd          j                                        }|                    t          j	                  }|S )Nr   rl   dtype)deviceshaperandomrandintr3   sorttor4   zerosint64rb   T
contiguous)ctxboxesscoresmax_output_boxes_per_classiou_thresholdscore_thresholdrr   batchnum_detbatchesidxsrx   selected_indicess                r   r"   zORT_NMS.forwardY   s     Q.C((-57*55::<<Q?BB6JJ|Cw//226::WJek:::==fEE 9gdmU4[$t*%MqQQS^^``+..u{;;r   c                 6    |                      d|||||          S )NNonMaxSuppressionop)r   r}   r~   r   r   r   s         r   symboliczORT_NMS.symbolicj   s"    tt'8RTacrsssr   N)	r$   r%   r&   __doc__staticmethodr3   tensorr"   r   rA   r   r   rk   rk   W   s        $$ ,85<+>+>*elD622 ,dV 4 4      \   t t \t t tr   rk   c                   ^    e Zd ZdZe	 	 	 	 	 	 	 dd	            Ze	 	 	 	 	 	 	 dd
            ZdS )TRT_NMSzTensorRT NMS operationrE   r	   rm   rl   1r   rn   c
                 
   |j         \  }
}}t          j        d||
dft          j                  }t          j        |
|d          }t          j        |
|          }t          j        d||
|ft          j                  }||||fS )Nr   r	   rp      )rs   r3   ru   int32randn)r|   r}   r~   background_class
box_codingr   max_output_boxesplugin_versionscore_activationr   
batch_size	num_boxesnum_classesr   	det_boxes
det_scoresdet_classess                    r   r"   zTRT_NMS.forwardq   s     .4\*
I{-#3j!_EKXXXK
,<a@@	[-=>>
mA{ZAQ4RZ_Zefff	:{::r   c
                 \    |                      d|||||||||	d          }
|
\  }}}}||||fS )NzTRT::EfficientNMS_TRTr   )background_class_ibox_coding_iiou_threshold_fmax_output_boxes_iplugin_version_sscore_activation_iscore_threshold_foutputsr   )r   r}   r~   r   r   r   r   r   r   r   outnumsclassess                r   r   zTRT_NMS.symbolic   s\     dd*&6 *#0&6$2&6%4  
 
 (+$eVWUFG++r   N)rE   r	   rm   rl   r   r   rn   )r$   r%   r&   r   r   r"   r   rA   r   r   r   r   o   s          
 ; ; ; \;&  #%#"% #"#!%, , , \, , ,r   r   c                   *     e Zd ZdZd
 fd	Zd	 Z xZS )ONNX_ORTz,onnx module with ONNX-Runtime NMS operation.rl   rm   rn     NP   c                    t                                                       |r|nt          j        d          | _        t          j        |g                              |          | _        t          j        |g                              |          | _        t          j        |g                              |          | _        || _	        t          j        g dg dg dg dgt          j
        | j                  | _        || _        d S )Ncpu)r	   r   r	   r   )r   r	   r   r	   )      r         ?r   )r   r   r   r   )rq   rr   )r   r   r3   rr   r   rw   max_objr   r   max_whfloat32convert_matrix	n_classesr   r   	iou_thresscore_thresr   rr   r   r   s          r   r   zONNX_ORT.__init__   s     &?ffEL,?,?|WI..11&99"\9+6699&AA$|[M::==fEE#lLLL,,,HYHYHY[l[l[l+m1626+? ? ? !r   c                    |d d d d d df         }|d d d d ddf         }|d d d d dd f         }| j         dk    r|}n||z  }|| j        z  }|                    dd          \  }}|                                | j        z  }||z   }|                    dd                                          }	t                              ||	| j	        | j
        | j                  }
|
d d df         |
d d df         }}|||d d f         }|||d d f                                         }|||d d f         }|                    d                                          }t          j        ||||gd          S )Nr      r	   r,   T)keepdimr   )r   r   maxfloatr   	transposer{   rk   applyr   r   r   	unsqueezer3   rb   )r   r!   r}   confr~   	max_scorecategory_iddisnmsboxmax_score_tpr   XYselected_boxesselected_categoriesselected_scoress                   r   r"   zONNX_ORT.forward   s   !!!QQQ(AAAqs|111aaa8>QFF dNF$$!'At!<!<	;!!DK/ **1a00;;=="==t|TM_aeauvv1%'71'=1q!QQQw)!Q'288::#Aq!!!G,KKNN  ""y!^-@/RTUVVVr   )rl   rm   rn   r   Nr   r$   r%   r&   r   r   r"   r'   r(   s   @r   r   r      sY        66
! 
! 
! 
! 
! 
!W W W W W W Wr   r   c                   *     e Zd ZdZd	 fd	Zd Z xZS )
ONNX_TRTz(onnx module with TensorRT NMS operation.rl   rm   rn   Nr   c                     t                                                       |J |r|nt          j        d          | _        d| _        d| _        || _        || _        d| _        d| _	        || _
        || _        d S )Nr   )rE   )r	   r   r   )r   r   r3   rr   r   r   r   r   r   r   r   r   r   s          r   r   zONNX_TRT.__init__   s}    ~~~ &?ffEL,?,? #&! !* r   c                 .   |d d d d d df         }|d d d d ddf         }|d d d d dd f         }| j         dk    r|}n||z  }t                              ||| j        | j        | j        | j        | j        | j        | j	        	  	        \  }}}}||||fS )Nr   r   r	   )
r   r   r   r   r   r   r   r   r   r   )	r   r!   r}   r   r~   r   r   r   r   s	            r   r"   zONNX_TRT.forward   s    !!!QQQ(AAAqs|111aaa8>QFF dNF6=mmE6SWShjnjyDHDVX\XdDHDWY]YnDHDX7Z 7Z3J 	:{::r   rl   rm   rn   NNr   r   r(   s   @r   r   r      sR        22! ! ! ! ! !; ; ; ; ; ; ;r   r   c                   *     e Zd ZdZd	 fd	Zd Z xZS )
End2Endz1export onnx or tensorrt model with NMS operation.rl   rm   rn   Nr   c                    t                                                       |r|nt          j        d          }t	          |t
                    s|J |                    |          | _        d| j        j        d         _        |t          nt          | _        |                     ||||||          | _        | j                                         d S )Nr   TrE   )r   r   r3   rr   
isinstancer   rw   modelend2endr   r   patch_modeleval)	r   r   r   r   r   r   rr   r   r   s	           r   r   zEnd2End.__init__   s    !:u|E':':&#''96>>>XXf%%
'+
$'-~888''KQWYbccr   c                 Z    |                      |          }|                     |          }|S r   )r   r   r    s     r   r"   zEnd2End.forward   s%    JJqMMLLOOr   r   r   r(   s   @r   r   r      sR        ;;           r   r   c           	         t                      }t          | t                    r| n| gD ]}t          |           t	          j        ||          }|                    ||                    d          rdnd                                         	                                
                                           |                                D ]}t          |          t          j        t          j        t          j        t          j        t          j        fv rd|_        Rt          |          t          j        u rd |_        ut          |          t,          u rt/                      |_        t3          |          dk    r|d         S t5          d| z             dD ]'}t7          ||t9          |d         |                     (|S )	N)map_locationemar   Tr	   rE   zEnsemble created with %s
)namesstride)rd   r   listr   r3   loadrg   getr   fuser   modulestyper1   	HardswishrZ   ReLUReLU6SiLUrK   Upsamplerecompute_scale_factorr   set_non_persistent_buffers_setrL   printsetattrgetattr)weightsr   r   r5   ckptrW   r   s          r   attempt_loadr      s   JJE"7D11@WWy X Xz!,777T488E???%%@FFHHMMOOTTVVWWWW ]]__ 2 277r|R\27BHbgNNNAII!WW##'+A$$!WW__,/EEA)
5zzQRy*W4555$ 	5 	5AE1geBi334444r   r   )numpyrO   rt   r3   torch.nnr1   models.commonr   r   utils.google_utilsr   Moduler   r*   r=   rV   rd   autogradFunctionrk   r   r   r   r   r   rA   r   r   <module>r      s1               & & & & & & & & / / / / / /P P P P P	 P P P    ")   *K K K K K	 K K K0    r}   $t t t t ten% t t t0-, -, -, -, -,en% -, -, -,`"W "W "W "W "Wry "W "W "WH; ; ; ; ;ry ; ; ;>    bi   *     r   