
    "f+                        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y)    N)ConvDWConv)attempt_downloadc                   &     e Zd Zd fd	Zd Z xZS )	CrossConvc                     t         t        |           t        ||z        }t	        ||d|fd|f      | _        t	        |||df|df|      | _        |xr ||k(  | _        y )N   )g)superr   __init__intr   cv1cv2add)
selfc1c2ksr
   eshortcutc_	__class__s
            7C:\work2\python\work_new2\yolov7\models\experimental.pyr   zCrossConv.__init__   sc    i')a[BAA/BAA!4(b    c                     | j                   r#|| j                  | j                  |            z   S | j                  | j                  |            S N)r   r   r   r   xs     r   forwardzCrossConv.forward   s:    ,0HHq488DHHQK((O$((488A;:OOr   )   r	   r	         ?F__name__
__module____qualname__r   r    __classcell__r   s   @r   r   r   
   s    )Pr   r   c                   &     e Zd Zd fd	Zd Z xZS )Sumc                     t         t        |           || _        t	        |dz
        | _        |r5t        j                  t        j                  d|       dz  d      | _
        y y )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__   sS    c4!#!a%L	\\5<<A#6"6":$ODF r   c                     |d   }| j                   rFt        j                  | j                        dz  }| j                  D ]  }|||dz      ||   z  z   } |S | j                  D ]  }|||dz      z   } |S )Nr   r,   r	   )r.   r3   sigmoidr5   r0   )r   r   yr5   is        r   r    zSum.forward!   s~    aD;;dff%)AYY!a%1Q4' 
  YY!a%L r   Fr#   r(   s   @r   r*   r*      s    P	r   r*   c                   &     e Zd Zd fd	Zd Z xZS )	MixConv2dc                 L   t         t        |           t        |      }|rRt	        j
                  d|dz
  |      j                         }t        |      D cg c]  }||k(  j                          }	}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                  j                  ||
d       d   j                         }	t!        j"                  t        |      D cg c]2  }t!        j$                  |t'        |	|         ||   |||   dz  d	
      4 c}      | _        t!        j*                  |      | _        t!        j.                  dd      | _        y c c}w c c}w )Nr   gư>r	   )r   )axisr,   )rcondF)biasg?T)inplace)r   r=   r   lenr3   linspacefloorr/   sumnpeyerollarraylinalglstsqroundr1   
ModuleListConv2dr   mBatchNorm2dbn	LeakyReLUact)r   r   r   r   r   equal_chgroupsr:   r
   r   bar   s               r   r   zMixConv2d.__init__/   s`   i')Qq&4-4::<A*/-8-Q16,,.-B8sV|#Avz6R0AAA&&A!!!AAaDAT215;;=Bchiocpqcp^_		"c"Q%j!A$1Q419SX Ycpqr..$<<T2 9  rs   F"7F!c                     || j                  | j                  t        j                  | j                  D cg c]
  } ||       c}d                  z   S c c}w )Nr	   )rU   rS   r3   catrQ   )r   r   rQ   s      r   r    zMixConv2d.forwardA   sD    488DGGEIITVV.DVqtV.Da$HIJJJ.Ds   A))r	   r!   r	   Tr#   r(   s   @r   r=   r=   -   s    3$Kr   r=   c                   &     e Zd Z fdZddZ xZS )Ensemblec                 *    t         t        |           y r   )r   r]   r   )r   r   s    r   r   zEnsemble.__init__G   s    h&(r   c                 ~    g }| D ]  }|j                   |||      d           t        j                  |d      }|d fS )Nr   r	   )appendr3   r[   )r   r   augmentr9   modules        r   r    zEnsemble.forwardJ   sC    FHHVAw'*+  IIaO$wr   r;   r#   r(   s   @r   r]   r]   E   s    )r   r]   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y)ORT_NMSzONNX-Runtime NMS operationd   ?      ?c                 D   |j                   }|j                  d   }t        j                  dd      }t	        j                  d||f      j                         d   j                  |      }	t	        j                  dd|z         j                  |      }
t	        j                  |ft        j                        j                  |      }t	        j                  |	d    |d    |
d    gd      j                  j                         }|j                  t        j                        }|S )Nr   re   dtype)deviceshaperandomrandintr3   sorttor4   zerosint64r[   T
contiguous)ctxboxesscoresmax_output_boxes_per_classiou_thresholdscore_thresholdrk   batchnum_detbatchesidxsrq   selected_indicess                r   r    zORT_NMS.forwardY   s     Q..C(--57*5::<Q?BB6J||Cw/226:WJekk:==fE 99gdmU4[$t*%MqQSS^^`+..u{{;r   c                 .    | j                  d|||||      S )NNonMaxSuppressionop)r
   rv   rw   rx   ry   rz   s         r   symboliczORT_NMS.symbolicj   s    tt'8RTacrssr   N)	r$   r%   r&   __doc__staticmethodr3   tensorr    r    r   r   rd   rd   W   s_    $ ,85<<+>*ellD62 ,dV 4     t tr   rd   c                   P    e Zd ZdZe	 	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 	 dd       Zy)TRT_NMSzTensorRT NMS operationc
                 ,   |j                   \  }
}}t        j                  d||
dft        j                        }t        j                  |
|d      }t        j                  |
|      }t        j                  d||
|ft        j                        }||||fS )Nr   r	   ri      )rl   r3   rn   int32randn)ru   rv   rw   background_class
box_codingry   max_output_boxesplugin_versionscore_activationrz   
batch_size	num_boxesnum_classesr|   	det_boxes
det_scoresdet_classess                    r   r    zTRT_NMS.forwardq   s     .4\\*
I{--#3j!_EKKXKK
,<a@	[[-=>
mmA{ZAQ4RZ_ZeZef	:{::r   c
                 T    | j                  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
   rv   rw   r   r   ry   r   r   r   rz   outnumsclassess                r   r   zTRT_NMS.symbolic   sW     dd*&6 *#0&6$2&6%4  
 (+$eVWUFG++r   N)r?   r	   rf   re   1r   rg   )r$   r%   r&   r   r   r    r   r   r   r   r   r   o   sY     
 ; ;&  #%#"% #"#!%, ,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.c                    t         |           |r|nt        j                  d      | _        t        j                  |g      j                  |      | _        t        j                  |g      j                  |      | _        t        j                  |g      j                  |      | _        || _	        t        j                  g dg dg dg dgt        j                  | j                        | _        || _        y )Ncpu)r	   r   r	   r   )r   r	   r   r	   )      r         ?r   )r   r   r   r   )rj   rk   )r   r   r3   rk   r   rp   max_objry   rz   max_whfloat32convert_matrix	n_classesr   r   	iou_thresscore_thresr   rk   r   r   s          r   r   zONNX_ORT.__init__   s     &fELL,?||WI.11&9"\\9+699&A$||[M:==fE#llL,HY[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  }|j                  dd      \  }}|j                         | j                  z  }||z   }|j                  dd      j                         }	t        j                  ||	| j                  | j                  | j                        }
|
d d df   |
d d df   }}|||d d f   }|||d d f   j                         }|||d d f   }|j                  d      j                         }t        j                  ||||gd      S )Nr      r	   r,   T)keepdimr   )r   r   maxfloatr   	transposert   rd   applyr   ry   rz   	unsqueezer3   r[   )r   r   rv   confrw   	max_scorecategory_iddisnmsboxmax_score_tpr   XYselected_boxesselected_categoriesselected_scoress                   r   r    zONNX_ORT.forward   sf   !Q(Aqs|1a8>>QF dNF$$$!'At!<	;!DKK/ **1a0;;="==t||TM_M_aeauauv1%'71'=1q!Qw)!Q'288:#Aq!G,KKN  "yy!^-@/RTUVVr   )re   rf   rg   i  NP   r$   r%   r&   r   r   r    r'   r(   s   @r   r   r      s    6
!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.c                     t         |           |J |r|nt        j                  d      | _        d| _        d| _        || _        || _        d| _        d| _	        || _
        || _        y )Nr   )r?   )r	   r   r   )r   r   r3   rk   r   r   ry   r   r   r   rz   r   r   s          r   r   zONNX_TRT.__init__   si    ~~ &fELL,? #&! !* 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                  | j                  	      \  }}}}||||fS )Nr   r   r	   )
r   r   r   r   r   ry   r   r   r   rz   )	r   r   rv   r   rw   r|   r   r   r   s	            r   r    zONNX_TRT.forward   s    !Q(Aqs|1a8>>QF dNF6=mmE6SWShShjnjyjyDHDVDVX\XdXdDHDWDWY]YnYnDHDXDX7Z3J 	:{::r   re   rf   rg   NNr   r   r(   s   @r   r   r      s    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.c                 t   t         |           |r|nt        j                  d      }t	        |t
              s|J |j                  |      | _        d| j                  j                  d   _        |t        nt        | _        | j                  ||||||      | _        | j                  j                          y )Nr   Tr?   )r   r   r3   rk   
isinstancer   rp   modelend2endr   r   patch_modeleval)	r   r   r   r   r   r   rk   r   r   s	           r   r   zEnd2End.__init__   s    !u||E':&#'6>99XXf%
'+

$'-~88''KQWYbcr   c                 J    | j                  |      }| j                  |      }|S r   )r   r   r   s     r   r    zEnd2End.forward   s!    JJqMLLOr   r   r   r(   s   @r   r   r      s    ;r   r   c           	      *   t               }t        | t              r| n| gD ]u  }t        |       t	        j
                  ||      }|j                  ||j                  d      rdnd   j                         j                         j                                w |j                         D ]  }t        |      t        j                  t        j                  t        j                   t        j"                  t        j$                  fv rd|_        ct        |      t        j(                  u rd |_        t        |      t,        u st/               |_         t3        |      dk(  r|d   S t5        d| z         dD ]  }t7        ||t9        |d   |              |S )	N)map_locationemar   Tr	   r?   zEnsemble created with %s
)namesstride)r]   r   listr   r3   loadr`   getr   fuser   modulestyper1   	HardswishrT   ReLUReLU6SiLUrC   Upsamplerecompute_scale_factorr   set_non_persistent_buffers_setrD   printsetattrgetattr)weightsr   r   r5   ckptrQ   r   s          r   attempt_loadr      s0   JE"7D1Wy@zz!,7T488E?%@FFHMMOTTVW A ]]_7r||R\\277BHHbggNNAI!W#'+A$!W_,/EA)  5zQRy*W45$AE1geBi34 %r   r   )numpyrH   rm   r3   torch.nnr1   models.commonr   r   utils.google_utilsr   Moduler   r*   r=   rO   r]   autogradFunctionrd   r   r   r   r   r   r   r   r   <module>r      s        & /P		 P")) *K		 K0r}} $tenn%% t0-,enn%% -,`"Wryy "WH;ryy ;>bii *r   