
    "fQ                    P   d dl Z d dlmZ d dlm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c mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZ d d	lmZmZ d d
l m!Z! ddZ" G d dejF                        Z$ G d dejF                        Z% G d dejF                        Z& G d dejF                        Z' G d dejF                        Z( G d dejF                        Z) G d dejF                        Z* G d dejF                        Z+ G d dejF                        Z, G d dejF                        Z-dd Z. G d! d"ejF                        Z/ G d# d$ejF                        Z0 G d% d&ejF                        Z1 G d' d(ejF                        Z2 G d) d*ejF                        Z3 G d+ d,ejF                        Z4 G d- d.e4      Z5 G d/ d0ejF                        Z6 G d1 d2ejF                        Z7 G d3 d4e7      Z8 G d5 d6e0      Z9 G d7 d8ejF                        Z: G d9 d:ejF                        Z; G d; d<ejF                        Z< G d= d>e:      Z= G d? d@e;      Z> G dA dBe<      Z? G dC dDe=      Z@ G dE dFe>      ZA G dG dHe?      ZB G dI dJe:      ZC G dK dLe;      ZD G dM dNe<      ZE G dO dPejF                        ZF G dQ dRejF                        ZG G dS dTejF                        ZH G dU dVe3      ZI G dW dXe:      ZJ G dY dZe;      ZK G d[ d\e<      ZL G d] d^e4      ZM G d_ d`e=      ZN G da dbe>      ZO G dc dde?      ZP G de dfe5      ZQ G dg dhe@      ZR G di djeA      ZS G dk dleB      ZT G dm dnejF                        ZU G do dpejF                        ZV G dq drejF                        ZW G ds dtejF                        ZX G du dvejF                        ZY G dw dxejF                        ZZ G dy dzejF                        Z[ G d{ d|ejF                        Z\ G d} d~      Z] G d dejF                        Z^d Z_ G d dejF                        Z` G d dejF                        Za G d dejF                        Zb G d dejF                        Zc G d dejF                        Zdd Zed Zf G d dejF                        Zg G d dejF                        Zh G d dejF                        Zi G d dejF                        Zj G d dejF                        Zk G d dejF                        Zl G d dejF                        Zmd Znd Zo G d dejF                        Zp G d dejF                        Zq G d dejF                        Zr G d dejF                        Zs G d dejF                        Zty)    N)copy)Path)DeformConv2d)Image)amp)	letterbox)non_max_suppressionmake_divisiblescale_coordsincrement_path	xyxy2xywh)
color_listplot_one_box)time_synchronizedc                 d    |(t        | t              r| dz  n| D cg c]  }|dz  	 c}}|S c c}w N   )
isinstanceint)kpxs      1C:\work2\python\work_new2\yolov7\models\common.pyautopadr      s9    y C(AFq.Aq!qAvq.AH /Bs   -c                   &     e Zd Zd fd	Zd Z xZS )MPc                 b    t         t        |           t        j                  ||      | _        y )Nkernel_sizestride)superr   __init__nn	MaxPool2dm)selfr   	__class__s     r   r"   zMP.__init__   s"    b$ "!A6    c                 $    | j                  |      S Nr%   r&   r   s     r   forwardz
MP.forward#       vvayr(   r   __name__
__module____qualname__r"   r-   __classcell__r'   s   @r   r   r      s    7r(   r   c                   &     e Zd Zd fd	Zd Z xZS )SPc                 j    t         t        |           t        j                  |||dz        | _        y )Nr   r   r    padding)r!   r7   r"   r#   r$   r%   )r&   r   sr'   s      r   r"   zSP.__init__(   s(    b$ "!AqAvFr(   c                 $    | j                  |      S r*   r+   r,   s     r   r-   z
SP.forward,   r.   r(         r0   r5   s   @r   r7   r7   '   s    Gr(   r7   c                   $     e Zd Z fdZd Z xZS )ReOrgc                 *    t         t        |           y r*   )r!   rA   r"   r&   r'   s    r   r"   zReOrg.__init__1   s    eT#%r(   c                     t        j                  |dd d dd d df   |ddd dd d df   |dd d ddd df   |ddd ddd df   gd      S N.r   r?   )torchcatr,   s     r   r-   zReOrg.forward4   s|    yy!C1ccM*Ac14a41n,=qcc14a4?PRSTWYZY]\]Y]_`_cbc_cTcRdeghiir(   r0   r5   s   @r   rA   rA   0   s    &jr(   rA   c                   &     e Zd Zd fd	Zd Z xZS )Concatc                 8    t         t        |           || _        y r*   )r!   rI   r"   dr&   	dimensionr'   s     r   r"   zConcat.__init__9   s    fd$&r(   c                 B    t        j                  || j                        S r*   )rF   rG   rK   r,   s     r   r-   zConcat.forward=   s    yyDFF##r(   r?   r0   r5   s   @r   rI   rI   8   s    $r(   rI   c                   &     e Zd Zd fd	Zd Z xZS )Chuncatc                 8    t         t        |           || _        y r*   )r!   rQ   r"   rK   rL   s     r   r"   zChuncat.__init__B       gt%'r(   c                     g }g }|D ]C  }|j                  d| j                        \  }}|j                  |       |j                  |       E t        j                  ||z   | j                        S r   )chunkrK   appendrF   rG   )r&   r   x1x2xixi1xi2s          r   r-   zChuncat.forwardF   s_    Bxx466*HCIIcNIIcN  yyB''r(   rO   r0   r5   s   @r   rQ   rQ   A   s    (r(   rQ   c                   &     e Zd Zd fd	Zd Z xZS )Shortcutc                 8    t         t        |           || _        y r*   )r!   r]   r"   rK   rL   s     r   r"   zShortcut.__init__Q   s    h&(r(   c                     |d   |d   z   S )Nr   r?    r,   s     r   r-   zShortcut.forwardU   s    tAaDyr(   r   r0   r5   s   @r   r]   r]   P   s    r(   r]   c                   &     e Zd Zd fd	Zd Z xZS )Foldcutc                 8    t         t        |           || _        y r*   )r!   rc   r"   rK   rL   s     r   r"   zFoldcut.__init__Z   rS   r(   c                 J    |j                  d| j                        \  }}||z   S r   )rU   rK   )r&   r   rW   rX   s       r   r-   zFoldcut.forward^   s#    DFF#B"ur(   ra   r0   r5   s   @r   rc   rc   Y   s    r(   rc   c                   ,     e Zd Zd fd	Zd Zd Z xZS )Convc           
      f   t         t        |           t        j                  ||||t        ||      |d      | _        t        j                  |      | _        |du rt        j                         | _        y t        |t        j                        r|| _        y t        j                         | _        y )NFgroupsbiasT)r!   rg   r"   r#   Conv2dr   convBatchNorm2dbnSiLUr   ModuleIdentityact	r&   c1c2r   r;   r   grs   r'   s	           r   r"   zConv.__init__e   sx    dD"$IIb"aGAqM!%P	..$ #t2779C9S#Y[YdYdYfr(   c                 `    | j                  | j                  | j                  |                  S r*   )rs   ro   rm   r,   s     r   r-   zConv.forwardk   s"    xx		!-..r(   c                 B    | j                  | j                  |            S r*   )rs   rm   r,   s     r   fuseforwardzConv.fuseforwardn   s    xx		!%%r(   r?   r?   Nr?   T)r1   r2   r3   r"   r-   rz   r4   r5   s   @r   rg   rg   c   s    h/&r(   rg   c                   &     e Zd Zd fd	Zd Z xZS )
RobustConvc	           	         t         t        |           t        |||||||      | _        t        j                  ||ddddd      | _        |dkD  r1t        j                  |t        j                  |      z        | _        y d | _        y )Nr   r;   r   rw   rs   r?   r   Tri   )r!   r}   r"   rg   conv_dwr#   rl   conv1x1	ParameterrF   onesgamma
r&   ru   rv   r   r;   r   rw   rs   layer_scale_init_valuer'   s
            r   r"   zRobustConv.__init__t   sq    j$(*Ba1RSAyyRAqFNdghNhR\\"85::b>"IJ
nr
r(   c                     |j                  t        j                        }| j                  | j	                  |            }| j
                  -|j                  | j
                  j                  dddd            }|S )N)memory_formatr?   )torF   channels_lastr   r   r   mulreshaper,   s     r   r-   zRobustConv.forwardz   s`    DDu22D3LLa)::!djj((B156Ar(   )   r?   Nr?   Tư>r0   r5   s   @r   r}   r}   r   s    sr(   r}   c                   &     e Zd Zd fd	Zd Z xZS )RobustConv2c	           
         t         t        |           t        |||||||      | _        t        j                  ||||dddd      | _        |dkD  r1t        j                  |t        j                  |      z        | _        y d | _        y )Nr   r   Tr?   )in_channelsout_channelsr   r    r:   rk   dilationrj   )r!   r   r"   rg   conv_stridedr#   ConvTranspose2dconv_deconvr   rF   r   r   r   s
            r   r"   zRobustConv2.__init__   s    k4)+ R1Q"#F--"2[\ef67dQWX
 OeghNhR\\"85::b>"IJ
nr
r(   c                     | j                  | j                  |            }| j                  -|j                  | j                  j	                  dddd            }|S )Nr?   r   )r   r   r   r   r   r,   s     r   r-   zRobustConv2.forward   sO    T..q12::!djj((B156Ar(   )r      Nr?   Tr   r0   r5   s   @r   r   r      s    sr(   r   c           
      L    t        | |||t        j                  | |      |      S )N)rw   rs   )rg   mathgcd)ru   rv   r   r;   rs   s        r   DWConvr      s"    B1R 0c::r(   c                   &     e Zd Zd fd	Zd Z xZS )	GhostConvc           	          t         t        |           |dz  }t        ||||d ||      | _        t        ||ddd ||      | _        y )Nr      r?   )r!   r   r"   rg   cv1cv2)	r&   ru   rv   r   r;   rw   rs   c_r'   s	           r   r"   zGhostConv.__init__   sI    i')1WB1dAs3B1dB4r(   c                 r    | j                  |      }t        j                  || j                  |      gd      S Nr?   )r   rF   rG   r   )r&   r   ys      r   r-   zGhostConv.forward   s-    HHQKyy!TXXa[)1--r(   )r?   r?   r?   Tr0   r5   s   @r   r   r      s    5.r(   r   c                   &     e Zd Zd fd	Zd Z xZS )Stemc                 0   t         t        |           t        |dz        }t	        ||dd      | _        t	        ||dd      | _        t	        ||dd      | _        t        j                  j                  dd      | _        t	        d|z  |dd      | _        y )Nr   r>   r?   )r    )r!   r   r"   r   rg   r   r   cv3rF   r#   r$   poolcv4
r&   ru   rv   r   r;   r   rw   rs   r   r'   s
            r   r"   zStem.__init__   s    dD"$AYB1%B1%B1%HH&&q&3	BAq)r(   c           	          | j                  |      }| j                  t        j                  | j	                  | j                  |            | j                  |      fd            S Nr?   dim)r   r   rF   rG   r   r   r   r,   s     r   r-   zStem.forward   sG    HHQKxx		488DHHQK#8$))A,"GQOPPr(   r{   r0   r5   s   @r   r   r      s    *Qr(   r   c                   &     e Zd Zd fd	Zd Z xZS )DownCc                     t         t        |           t        |      }t	        ||dd      | _        t	        ||dz  d|      | _        t	        ||dz  dd      | _        t        j                  ||      | _
        y )Nr?   r   r>   r   )r!   r   r"   r   rg   r   r   r   r#   r$   mp)r&   ru   rv   nr   r   r'   s         r   r"   zDownC.__init__   si    eT#%WB1%BE1a(BE1a(,,1Q7r(   c                     t        j                  | j                  | j                  |            | j	                  | j                  |            fd      S r   )rF   rG   r   r   r   r   r,   s     r   r-   zDownC.forward   s:    yy$((488A;/$''!*1EFANNr(   r?   r   r0   r5   s   @r   r   r      s    8Or(   r   c                   &     e Zd Zd fd	Zd Z xZS )SPPc                 *   t         t        |           |dz  }t        ||dd      | _        t        |t        |      dz   z  |dd      | _        t        j                  |D cg c]  }t        j                  |d|dz         c}      | _
        y c c}w )Nr   r?   r9   )r!   r   r"   rg   r   lenr   r#   
ModuleListr$   r%   )r&   ru   rv   r   r   r   r'   s         r   r"   zSPP.__init__   s    c4!#1WB1%c!fqj)2q!4_`a_`Z[1aSTf U_`abas   !"Bc                     | j                  |      }| j                  t        j                  |g| j                  D cg c]
  } ||       c}z   d            S c c}w r   )r   r   rF   rG   r%   )r&   r   r%   s      r   r-   zSPP.forward   sJ    HHQKxx		1#tvv(>v!1v(>">BCC(>s   A)r   	      r0   r5   s   @r   r   r      s    cDr(   r   c                   &     e Zd Zd fd	Zd Z xZS )
Bottleneckc                     t         t        |           t        ||z        }t	        ||dd      | _        t	        ||dd|      | _        |xr ||k(  | _        y Nr?   r>   rw   )r!   r   r"   r   rg   r   r   addr&   ru   rv   shortcutrw   er   r'   s          r   r"   zBottleneck.__init__   sS    j$(*a[B1%B1*(br(   c                     | j                   r#|| j                  | j                  |            z   S | j                  | j                  |            S r*   )r   r   r   r,   s     r   r-   zBottleneck.forward   s:    ,0HHq488DHHQK((O$((488A;:OOr(   Tr?         ?r0   r5   s   @r   r   r      s    )Pr(   r   c                   &     e Zd Zd fd	Zd Z xZS )Resc                     t         t        |           t        ||z        }t	        ||dd      | _        t	        ||dd|      | _        t	        ||dd      | _        |xr ||k(  | _        y r   )	r!   r   r"   r   rg   r   r   r   r   r   s          r   r"   zRes.__init__   se    c4!#a[B1%B1*B1%(br(   c                     | j                   r2|| j                  | j                  | j                  |                  z   S | j                  | j                  | j                  |                  S r*   )r   r   r   r   r,   s     r   r-   zRes.forward   sQ    6:hhq488DHHTXXa[122cDHHTXXVZV^V^_`VaMbDccr(   r   r0   r5   s   @r   r   r      s    )dr(   r   c                         e Zd Zd fd	Z xZS )ResXc                 H    t         |   |||||       t        ||z        }y r*   )r!   r"   r   r   s          r   r"   zResX.__init__   s%    R1a0a[r(   T    r   r1   r2   r3   r"   r4   r5   s   @r   r   r      s     r(   r   c                   &     e Zd Zd fd	Zd Z xZS )Ghostc                    t         t        |           |dz  }t        j                  t        ||dd      |dk(  rt        ||||d      nt        j                         t        ||ddd            | _        |dk(  r8t        j                  t        ||||d      t        ||ddd            | _
        y t        j                         | _
        y )Nr   r?   F)rs   )r!   r   r"   r#   
Sequentialr   r   rr   rm   rg   r   )r&   ru   rv   r   r;   r   r'   s         r   r"   zGhost.__init__   s    eT#%1WMM)BAq"9EF!V&RA5"AQSQ\Q\Q^"+BAqe"DF	 IJQ fRQu&E&*2r1aU&CETVT_T_Ta 	r(   c                 H    | j                  |      | j                  |      z   S r*   )rm   r   r,   s     r   r-   zGhost.forward   s    yy|dmmA...r(   r=   r0   r5   s   @r   r   r      s    b/r(   r   c                   &     e Zd Zd fd	Zd Z xZS )SPPCSPCc                    t         t        |           t        d|z  |z        }t	        ||dd      | _        t	        ||dd      | _        t	        ||dd      | _        t	        ||dd      | _        t        j                  |D 	cg c]  }	t        j                  |	d|	dz         c}	      | _        t	        d|z  |dd      | _        t	        ||dd      | _        t	        d|z  |dd      | _        y c c}	w )Nr   r?   r>   r9   r   )r!   r   r"   r   rg   r   r   r   r   r#   r   r$   r%   cv5cv6cv7)r&   ru   rv   r   r   rw   r   r   r   r   r'   s             r   r"   zSPPCSPC.__init__  s    gt%'R!_B1%B1%B1%B1%_`a_`Z[1aSTf U_`abBAq)B1%BAq)  bs   "C2c                    | j                  | j                  | j                  |                  }| j                  | j	                  t        j                  |g| j                  D cg c]
  } ||       c}z   d                  }| j                  |      }| j                  t        j                  ||fd            S c c}w r   )
r   r   r   r   r   rF   rG   r%   r   r   )r&   r   rW   r%   y1y2s         r   r-   zSPPCSPC.forward  s    XXdhhtxx{+,XXdhhuyy"0G120G)GKLMXXa[xx		2r(233 1Hs   %B?r?   Fr?   r   r   r0   r5   s   @r   r   r     s    
*4r(   r   c                         e Zd Zd fd	Z xZS )GhostSPPCSPCc           	      h   t         	|   |||||||       t        d|z  |z        }t        ||dd      | _        t        ||dd      | _        t        ||dd      | _        t        ||dd      | _        t        d|z  |dd      | _        t        ||dd      | _	        t        d|z  |dd      | _
        y )Nr   r?   r>   r   )r!   r"   r   r   r   r   r   r   r   r   r   )
r&   ru   rv   r   r   rw   r   r   r   r'   s
            r   r"   zGhostSPPCSPC.__init__  s    RHaA6R!_RQ*RQ*RQ*RQ*QVRA.RQ*QVRA.r(   r   r   r5   s   @r   r   r     s    	/ 	/r(   r   c                         e Zd Zd fd	Z xZS )	GhostStemc           	          t         	|   |||||||       t        |dz        }t        ||dd      | _        t        ||dd      | _        t        ||dd      | _        t        d|z  |dd      | _        y )Nr   r>   r?   )r!   r"   r   r   r   r   r   r   r   s
            r   r"   zGhostStem.__init__*  su    RAq!S1AYRQ*RQ*RQ*QVRA.r(   r{   r   r5   s   @r   r   r   (  s    / /r(   r   c                   &     e Zd Zd fd	Zd Z xZS )BottleneckCSPAc                 @   t         t        |           t        ||z        }t	        ||dd      | _        t	        ||dd      | _        t	        d|z  |dd      | _        t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w Nr?   r         ?r   )r!   r   r"   r   rg   r   r   r   r#   r   ranger   r%   
r&   ru   rv   r   r   rw   r   r   _r'   s
            r   r"   zBottleneckCSPA.__init__5  s    nd,.a[B1%B1%BAq)QVWXQY ZQYABHa3!GQY Z[ Zs   :Bc                     | j                  | j                  |            }| j                  |      }| j                  t	        j
                  ||fd            S r   r%   r   r   r   rF   rG   r&   r   r   r   s       r   r-   zBottleneckCSPA.forward=  C    VVDHHQK XXa[xx		2r(233r(   r?   Tr?   r   r0   r5   s   @r   r   r   3  s    \4r(   r   c                   &     e Zd Zd fd	Zd Z xZS )BottleneckCSPBc                 :   t         t        |           t        |      }t	        ||dd      | _        t	        ||dd      | _        t	        d|z  |dd      | _        t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r   )r!   r   r"   r   rg   r   r   r   r#   r   r   r   r%   r   s
            r   r"   zBottleneckCSPB.__init__E  s    nd,.WB1%B1%BAq)QVWXQY ZQYABHa3!GQY Z[ Zs   7Bc                     | j                  |      }| j                  |      }| j                  |      }| j                  t	        j
                  ||fd            S r   r   r%   r   r   rF   rG   r&   r   rW   r   r   s        r   r-   zBottleneckCSPB.forwardM  G    XXa[VVBZXXb\xx		2r(233r(   r?   Fr?   r   r0   r5   s   @r   r   r   C  s    \4r(   r   c                   &     e Zd Zd fd	Zd Z xZS )BottleneckCSPCc                 f   t         t        |           t        ||z        }t	        ||dd      | _        t	        ||dd      | _        t	        ||dd      | _        t	        d|z  |dd      | _        t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r   )r!   r  r"   r   rg   r   r   r   r   r#   r   r   r   r%   r   s
            r   r"   zBottleneckCSPC.__init__V  s    nd,.a[B1%B1%B1%BAq)QVWXQY ZQYABHa3!GQY Z[ Zs   B.c                     | j                  | j                  | j                  |                  }| j                  |      }| j	                  t        j                  ||fd            S r   r   r%   r   r   r   rF   rG   r   s       r   r-   zBottleneckCSPC.forward_  L    XXdffTXXa[)*XXa[xx		2r(233r(   r   r0   r5   s   @r   r  r  T  s    \4r(   r  c                         e Zd Zd fd	Z xZS )ResCSPAc                     t         	|   ||||||       t        ||z        }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w Nr   r   r!   r"   r   r#   r   r   r   r%   r   s
            r   r"   zResCSPA.__init__g  [    RHa3a[%PQ( S(QRXqC!@( ST S    A!r   r   r5   s   @r   r  r  e      U Ur(   r  c                         e Zd Zd fd	Z xZS )ResCSPBc                     t         	|   ||||||       t        |      }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r  r  r   s
            r   r"   zResCSPB.__init__o  W    RHa3W%PQ( S(QRXqC!@( ST S   Ar   r   r5   s   @r   r  r  m  r  r(   r  c                         e Zd Zd fd	Z xZS )ResCSPCc                     t         	|   ||||||       t        ||z        }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r  r  r   s
            r   r"   zResCSPC.__init__w  r  r  r   r   r5   s   @r   r  r  u  r  r(   r  c                         e Zd Zd fd	Z xZS )ResXCSPAc                     t         	|   ||||||       t        ||z        }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w Nr   r   r  r   s
            r   r"   zResXCSPA.__init__  r  r  r?   Tr   r   r   r5   s   @r   r  r  }  r  r(   r  c                         e Zd Zd fd	Z xZS )ResXCSPBc                     t         	|   ||||||       t        |      }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r  r  r   s
            r   r"   zResXCSPB.__init__  r  r  r  r   r5   s   @r   r!  r!    r  r(   r!  c                         e Zd Zd fd	Z xZS )ResXCSPCc                     t         	|   ||||||       t        ||z        }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r  r  r   s
            r   r"   zResXCSPC.__init__  r  r  r  r   r5   s   @r   r$  r$    r  r(   r$  c                         e Zd Zd fd	Z xZS )	GhostCSPAc           	          t         	|   ||||||       t        ||z        }t        j                  t        |      D cg c]  }t        ||       c} | _        y c c}w r*   r!   r"   r   r#   r   r   r   r%   r   s
            r   r"   zGhostCSPA.__init__  S    RHa3a[a A1r2 AB A    Ar   r   r5   s   @r   r'  r'        C Cr(   r'  c                         e Zd Zd fd	Z xZS )	GhostCSPBc           	          t         	|   ||||||       t        |      }t        j                  t        |      D cg c]  }t        ||       c} | _        y c c}w r*   r)  r   s
            r   r"   zGhostCSPB.__init__  sO    RHa3Wa A1r2 AB As   Ar   r   r5   s   @r   r.  r.    r,  r(   r.  c                         e Zd Zd fd	Z xZS )	GhostCSPCc           	          t         	|   ||||||       t        ||z        }t        j                  t        |      D cg c]  }t        ||       c} | _        y c c}w r*   r)  r   s
            r   r"   zGhostCSPC.__init__  r*  r+  r   r   r5   s   @r   r1  r1    r,  r(   r1  c                   &     e Zd Zd fd	Zd Z xZS )	ImplicitAc                 4   t         t        |           || _        || _        || _        t        j                  t        j                  d|dd            | _
        t        j                  j                  | j                  | j                  | j
                         y Nr?   )meanstd)r!   r4  r"   channelr7  r8  r#   r   rF   zerosimplicitinitnormal_r&   r9  r7  r8  r'   s       r   r"   zImplicitA.__init__  sf    i')	U[[GQ%BC
DII488Dr(   c                      | j                   |z   S r*   r;  r,   s     r   r-   zImplicitA.forward      }}q  r(   )        {Gz?r0   r5   s   @r   r4  r4        E!r(   r4  c                   &     e Zd Zd fd	Zd Z xZS )	ImplicitMc                 4   t         t        |           || _        || _        || _        t        j                  t        j                  d|dd            | _
        t        j                  j                  | j                  | j                  | j
                         y r6  )r!   rF  r"   r9  r7  r8  r#   r   rF   r   r;  r<  r=  r>  s       r   r"   zImplicitM.__init__  sf    i')	UZZ7Aq%AB
DII488Dr(   c                      | j                   |z  S r*   r@  r,   s     r   r-   zImplicitM.forward  rA  r(   )r   rC  r0   r5   s   @r   rF  rF    rD  r(   rF  c                   J     e Zd Zd	 fd	Zd Zd Zd Zd Zd Zd Z	d Z
 xZS )
RepConvc	                 2   t         t        |           || _        || _        || _        || _        |dk(  sJ t        ||      dk(  sJ t        ||      |dz  z
  }	|du rt        j                         n/t        |t        j                        r|nt        j                         | _        |r,t        j                  ||||t        ||      |d      | _        y ||k(  r|dk(  rt        j                   |      nd | _        t        j$                  t        j                  ||||t        ||      |d      t        j                   |            | _        t        j$                  t        j                  ||d||	|d      t        j                   |            | _        y )Nr>   r?   r   Tri   num_featuresF)r!   rJ  r"   deployrj   r   r   r   r#   rp   r   rq   rr   rs   rl   rbr_reparamrn   rbr_identityr   	rbr_denserbr_1x1)r&   ru   rv   r   r;   r   rw   rs   rN  
padding_11r'   s             r   r"   zRepConv.__init__  sM   gt%'Avvq!}!!!Q]Q!V+
 #t2779C9S#Y[YdYdYf!yyRAwq!}QUYZD EG"HQRVWQWR!@]aD]]		"b!Q1aeLB/DN
 ==		2r1aAEJB/DLr(   c                    t        | d      r | j                  | j                  |            S | j                  d}n| j                  |      }| j                  | j	                  |      | j                  |      z   |z         S NrO  r   )hasattrrs   rO  rP  rQ  rR  )r&   inputsid_outs      r   r-   zRepConv.forward  sr    4'88D,,V455$F&&v.Fxxv.f1EENOOr(   c                     | j                  | j                        \  }}| j                  | j                        \  }}| j                  | j                        \  }}|| j	                  |      z   |z   ||z   |z   fS r*   _fuse_bn_tensorrQ  rR  rP  _pad_1x1_to_3x3_tensorr&   	kernel3x3bias3x3	kernel1x1bias1x1kernelidbiasids          r   get_equivalent_kernel_biasz"RepConv.get_equivalent_kernel_bias  s~    !11$..A	7!11$,,?	7//0A0AB&33I>>Ig&
 	
r(   c                 L    |yt         j                  j                  |g d      S Nr   r?   r?   r?   r?   )r#   
functionalpadr&   r`  s     r   r\  zRepConv._pad_1x1_to_3x3_tensor  s"    ==$$Y==r(   c                    |yt        |t        j                        r\|d   j                  }|d   j                  }|d   j
                  }|d   j                  }|d   j                  }|d   j                  }nt        |t        j                        sJ t        | d      s| j                  | j                  z  }t        j                  | j                  |ddft        j                        }	t        | j                        D ]  }
d|	|
|
|z  ddf<    t!        j"                  |	      j%                  |j                  j&                        | _        | j(                  }|j                  }|j
                  }|j                  }|j                  }|j                  }||z   j+                         }||z  j-                  dddd      }||z  |||z  |z  z
  fS )Nr   r   r   r?   	id_tensorr>   dtyper   )r   r#   r   weightrunning_meanrunning_varrk   epsrn   rV  r   rj   npr:  float32r   rF   
from_numpyr   devicerm  sqrtr   r&   branchkernelrq  rr  r   betars  	input_dimkernel_valueir8  ts                r   r[  zRepConv._fuse_bn_tensor  s   >fbmm,AY%%F!!911L )//K1I$$E!9>>D)--Cfbnn5554- ,,;	!xx%%y!Q7rzz  t//0A;<LA	M1a!78 1!&!1!1,!?!B!B6==CWCW!X^^F!..L ,,KMME;;D**CS &&(S[!!"aA.z4,"6"<<<<r(   c                     | j                         \  }}|j                         j                         j                         |j                         j                         j                         fS r*   )rd  detachcpunumpy)r&   r{  rk   s      r   repvgg_convertzRepConv.repvgg_convert*  sT    668MMO!'')KKM%%'
 	
r(   c                    |j                   |j                  z   j                         }|j                  |j                  |j
                  z  |z  z
  }|j
                  |z  j                  dddd      }|j
                  |z  }t        j                         }t        j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                   d|j"                  	      }t$        j                  j'                  |      |_        t$        j                  j'                  |      |_        |S )Nr   r?   T	r   r   r   r    r:   r   rj   rk   padding_mode)rr  rs  rx  rk   rq  rp  r   r#   rr   rl   r   r   r   r    r:   r   rj   r  rF   r   )r&   rm   ro   r8  rk   r  weightss          r   fuse_conv_bnzRepConv.fuse_conv_bn1  s    ~~&,,.ww2994s::YY_%%b!Q2++/[[]yyt'7'7-1->->,0,<,<%)[[(,)-'+{{%)-1->->@ hh((1HH&&t,	r(   c           	      |   | j                   ry t        d       | j                  | j                  d   | j                  d         | _        | j                  | j                  d   | j                  d         | _        | j                  j
                  }t        j                  j                  j                  | j                  j                  g d      }t        | j                  t        j                        s9t        | j                  t        j                  j                  j                         rt        j"                  | j$                  | j&                  ddd| j(                  d      }|j                  j*                  j-                  | j                  j                  j*                  j.                        |j                  _        |j                  j*                  j1                         j1                         |j                  _        |j                  j*                  j3                  d       |j                  j*                  j5                  d       |j                  j*                  j7                  d	      j7                  d
      |j                  _        | j                  || j                        }|j
                  }t        j                  j                  j                  |j                  g d      }ndt        j                  j9                  t        j:                  |            }t        j                  j9                  t        j:                  |            }t        j                  j9                  | j                  j                  |z   |z         | j                  _
        t        j                  j9                  | j                  j
                  |z   |z         | j                  _        | j                  | _        d| _         | j                  	| `d | _        | j                  	| `d | _        | j                  
| `d | _        y y )NzRepConv.fuse_repvgg_blockr   r?   rg  F)r   r   r   r    r:   rj   rk   rB  r   r   r>   T)rN  printr  rQ  rR  rk   rF   r#   rh  ri  rp  r   rP  rn   modules	batchnormSyncBatchNormrl   r   r   rj   datar   rw  squeezefill_fill_diagonal_	unsqueezer   
zeros_likerO  )r&   rbr_1x1_biasweight_1x1_expandedidentity_conv_1x1bias_identity_expandedweight_identity_expandeds         r   fuse_repvgg_blockzRepConv.fuse_repvgg_blockH  s$   ;;)+**4>>!+<dnnQ>OP((a$,,q/J||((#hh1155dll6I6I<X t(("..9ZHYHY[][e[e[o[o[}[}=~ "		 $ 0 0!%!2!2 !;;!  ->,D,D,I,I,L,LT\\M`M`MeMeMlMl,m$$),=,D,D,I,I,Q,Q,S,[,[,]$$)$$))//4$$))88=,=,D,D,I,I,S,STU,V,`,`ab,c$$) !% 1 12CTEVEV W%6%;%;"',xx':':'>'>?P?W?WYe'f$ &+XX%7%79I9I,9W%Y"',xx'9'95;K;KL_;`'b$ !& 2 24>>3H3HK^3^ay3y z#hh001D1D|1SVl1lm>>(! $D<<#DL>>%!DN &r(   )r>   r?   Nr?   TF)r1   r2   r3   r"   r-   rd  r\  r[  r  r  r  r4   r5   s   @r   rJ  rJ    s,    >	P
>=<
.;"r(   rJ  c                         e Zd Zd fd	Z xZS )RepBottleneckc                 t    t         |   ||ddd       t        ||z        }t        ||dd|      | _        y )NTr?   r   )r   rw   r   r>   r   r!   r"   r   rJ  r   r   s          r   r"   zRepBottleneck.__init__  s<    R$!s;a[2r1a1-r(   r   r   r5   s   @r   r  r        . .r(   r  c                         e Zd Zd fd	Z xZS )RepBottleneckCSPAc                     t         	|   ||||||       t        ||z        }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r  r!   r"   r   r#   r   r   r  r%   r   s
            r   r"   zRepBottleneckCSPA.__init__  _    RHa3a[TYZ[T\ ]T\qr2xc!JT\ ]^ ]r  r   r   r5   s   @r   r  r        _ _r(   r  c                         e Zd Zd fd	Z xZS )RepBottleneckCSPBc                     t         	|   ||||||       t        |      }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r  r  r   s
            r   r"   zRepBottleneckCSPB.__init__  s[    RHa3WTYZ[T\ ]T\qr2xc!JT\ ]^ ]r  r  r   r5   s   @r   r  r    r  r(   r  c                         e Zd Zd fd	Z xZS )RepBottleneckCSPCc                     t         	|   ||||||       t        ||z        }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r  r  r   s
            r   r"   zRepBottleneckCSPC.__init__  r  r  r   r   r5   s   @r   r  r    r  r(   r  c                         e Zd Zd fd	Z xZS )RepResc                 r    t         |   |||||       t        ||z        }t        ||dd|      | _        y Nr>   r?   r   r  r   s          r   r"   zRepRes.__init__  9    R1a0a[2r1a1-r(   r   r   r5   s   @r   r  r    r  r(   r  c                         e Zd Zd fd	Z xZS )
RepResCSPAc                     t         	|   ||||||       t        ||z        }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r  r!   r"   r   r#   r   r   r  r%   r   s
            r   r"   zRepResCSPA.__init__  [    RHa3a[USTX VXB!s!CX VW Vr  r   r   r5   s   @r   r  r        X Xr(   r  c                         e Zd Zd fd	Z xZS )
RepResCSPBc                     t         	|   ||||||       t        |      }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r  r  r   s
            r   r"   zRepResCSPB.__init__  sW    RHa3WUSTX VXB!s!CX VW Vr  r  r   r5   s   @r   r  r    r  r(   r  c                         e Zd Zd fd	Z xZS )
RepResCSPCc                     t         	|   ||||||       t        ||z        }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r  r  r   s
            r   r"   zRepResCSPC.__init__  r  r  r   r   r5   s   @r   r  r    r  r(   r  c                         e Zd Zd fd	Z xZS )RepResXc                 r    t         |   |||||       t        ||z        }t        ||dd|      | _        y r  r  r   s          r   r"   zRepResX.__init__  r  r(   r   r   r5   s   @r   r  r    r  r(   r  c                         e Zd Zd fd	Z xZS )RepResXCSPAc                     t         	|   ||||||       t        ||z        }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r  r!   r"   r   r#   r   r   r  r%   r   s
            r   r"   zRepResXCSPA.__init__  [    RHa3a[eTUh WhR1!Dh WX Wr  r  r   r5   s   @r   r  r        Y Yr(   r  c                         e Zd Zd fd	Z xZS )RepResXCSPBc                     t         	|   ||||||       t        |      }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r  r  r   s
            r   r"   zRepResXCSPB.__init__  sW    RHa3WeTUh WhR1!Dh WX Wr  )r?   Fr   r   r   r5   s   @r   r  r    r  r(   r  c                         e Zd Zd fd	Z xZS )RepResXCSPCc                     t         	|   ||||||       t        ||z        }t        j                  t        |      D cg c]  }t        ||||d       c} | _        y c c}w r  r  r   s
            r   r"   zRepResXCSPC.__init__  r  r  r  r   r5   s   @r   r  r    r  r(   r  c                   $     e Zd Z fdZd Z xZS )TransformerLayerc                 |   t         |           t        j                  ||d      | _        t        j                  ||d      | _        t        j                  ||d      | _        t        j                  ||      | _        t        j                  ||d      | _	        t        j                  ||d      | _
        y )NFrk   )	embed_dim	num_heads)r!   r"   r#   Linearqr   vMultiheadAttentionmafc1fc2)r&   cr  r'   s      r   r"   zTransformerLayer.__init__  s    1ae,1ae,1ae,''!yI99Q.99Q.r(   c                     | j                  | j                  |      | j                  |      | j                  |            d   |z   }| j	                  | j                  |            |z   }|S )Nr   )r  r  r   r  r  r  r,   s     r   r-   zTransformerLayer.forward  sV    GGDFF1Itvvay$&&)4Q7!;HHTXXa[!A%r(   r0   r5   s   @r   r  r    s    /r(   r  c                   $     e Zd Z fdZd Z xZS )TransformerBlockc           	         t         |           d | _        ||k7  rt        ||      | _        t	        j
                  ||      | _        t	        j                  t        |      D cg c]  }t        ||       c} | _
        || _        y c c}w r*   )r!   r"   rm   rg   r#   r  linearr   r   r  trrv   )r&   ru   rv   r  
num_layersr   r'   s         r   r"   zTransformerBlock.__init__  sw    	8RDIiiB'--5Q[K\!]K\a"22y"AK\!]^ "^s   $Bc                    | j                   | j                  |      }|j                  \  }}}}|j                  d      }|j                  d      }|j	                  dd      }|j                  d      }| j                  |      }||z   }| j                  |      }|j                  d      }|j	                  dd      }|j                  || j                  ||      }|S )Nr   r   r>   )
rm   shapeflattenr  	transposer  r  r  r   rv   )r&   r   br   whr   r   s           r   r-   zTransformerBlock.forward  s    99 		!AWW
1aIIaLKKNKK1IIaLKKNEGGAJKKNKK1IIa!Q'r(   r0   r5   s   @r   r  r    s    r(   r  c                   &     e Zd Zd fd	Zd Z xZS )Focusc           	      \    t         t        |           t        |dz  ||||||      | _        y )Nr   )r!   r  r"   rg   rm   rt   s	           r   r"   zFocus.__init__  s,    eT#%aQ1a5	r(   c                     | j                  t        j                  |dd d dd d df   |ddd dd d df   |dd d ddd df   |ddd ddd df   gd            S rE   )rm   rF   rG   r,   s     r   r-   zFocus.forward#  s    yyAc3Q3!m$4aQTT3Q36G3PSRSPSUVUYXYUY>IZ\]^acdcgfgcgijimlmim^m\n#oqrsttr(   r{   r0   r5   s   @r   r  r    s    6
ur(   r  c                   &     e Zd Zd fd	Zd Z xZS )SPPFc                     t         |           |dz  }t        ||dd      | _        t        |dz  |dd      | _        t        j                  |d|dz        | _        y )Nr   r?   r   r9   )r!   r"   rg   r   r   r#   r$   r%   )r&   ru   rv   r   r   r'   s        r   r"   zSPPF.__init__*  sW    1WB1%QAq)!AqAvFr(   c           
          | j                  |      }| j                  |      }| j                  |      }| j                  t        j                  |||| j                  |      gd            S r   )r   r%   r   rF   rG   r   s       r   r-   zSPPF.forward1  sT    HHQKVVAYVVBZxx		1b"dffRj"91=>>r(   )r   r0   r5   s   @r   r  r  (  s    G?r(   r  c                   &     e Zd Zd fd	Zd Z xZS )Contractc                 0    t         |           || _        y r*   r!   r"   gainr&   r  r'   s     r   r"   zContract.__init__:      	r(   c                    |j                         \  }}}}| j                  }|j                  ||||z  |||z  |      }|j                  dddddd      j	                         }|j                  |||z  |z  ||z  ||z        S )Nr   r>   r   r?   r   r   sizer  viewpermute
contiguousr&   r   NCHWr;   s          r   r-   zContract.forward>  s    VVX
1aIIFF1aaAFA.IIaAq!Q'224vvaQAFAF33r(   r/   r0   r5   s   @r   r  r  8      4r(   r  c                   &     e Zd Zd fd	Zd Z xZS )Expandc                 0    t         |           || _        y r*   r  r  s     r   r"   zExpand.__init__H  r  r(   c                    |j                         \  }}}}| j                  }|j                  |||||dz  z  ||      }|j                  dddddd      j	                         }|j                  |||dz  z  ||z  ||z        S )Nr   r   r>   r   r?   r   r  r  s          r   r-   zExpand.forwardL  s    VVX
1aIIFF1aAaKA.IIaAq!Q'224vvaa1fa!eQU33r(   r/   r0   r5   s   @r   r  r  F  r  r(   r  c                   0     e Zd ZdZdZdZ fdZd Z xZS )NMS      ??Nc                 *    t         t        |           y r*   )r!   r	  r"   rC   s    r   r"   zNMS.__init__Z  s    c4!#r(   c                 b    t        |d   | j                  | j                  | j                        S )Nr   
conf_thres	iou_thresclasses)r	   confiour  r,   s     r   r-   zNMS.forward]  s&    "1Q4DII[_[g[ghhr(   )	r1   r2   r3   r  r  r  r"   r-   r4   r5   s   @r   r	  r	  T  s    D
CG$ir(   r	  c                   `     e Zd ZdZdZdZ fdZd Z ej                         dd       Z
 xZS )	autoShaper
  r  Nc                 T    t         t        |           |j                         | _        y r*   )r!   r  r"   evalmodel)r&   r  r'   s     r   r"   zautoShape.__init__g  s    i')ZZ\
r(   c                     t        d       | S )Nz'autoShape already enabled, skipping... )r  r&   s    r   	autoshapezautoShape.autoshapek  s    78r(   c           
      	   t               g}t        | j                  j                               }t	        |t
        j                        rrt        j                  |j                  j                  dk7        5  | j                  |j                  |j                        j                  |      ||      cd d d        S t	        |t              rt        |      |fnd|gf\  }}g g g }
}	}t        |      D ]  \  }}d| }t	        |t               r]t#        j$                  t'        j(                  |j+                  d      r!t-        j.                  |d      j0                  n|            |}}n@t	        |t&        j&                        r&t#        j$                  |      t3        |d|      xs |}}|
j5                  t7        |      j9                  d	      j:                         |j<                  d
   dk  r|j?                  d      }|j@                  dk(  r|d d d d d df   nt#        jB                  |d d d d d f   d      }|j<                  d d }|j5                  |       |tE        |      z  }|	j5                  |D cg c]  }||z  	 c}       |||<    t#        jF                  |	d
      jE                  d
      D cg c]/  }tI        |tK        | jL                  jE                                     1 }	}|D cg c]  }tO        ||	d      d
    }}|dkD  rt#        jF                  |d
      n|d
   d    }t#        jP                  |j?                  d            }t        jR                  |      j                  |j                        j                  |      dz  }|j5                  t                      t        j                  |j                  j                  dk7        5  | j                  |||      d
   }|j5                  t                      tU        || jV                  | jX                  | jZ                        }t]        |      D ]  }t_        |	||   d d d df   ||            |j5                  t                      ta        |||
|| jb                  |j<                        cd d d        S # 1 sw Y   xY wc c}w c c}w c c}w # 1 sw Y   y xY w)Nr  )enabledr?   imagehttpT)streamfilenamez.jpgr   r   )r?   r   r   r>   r   F)	new_shapeauto)r   r>   r?   r   g     o@r  r   )2r   nextr  
parametersr   rF   Tensorr   autocastrw  typer   type_aslistr   	enumeratestrrt  asarrayr   open
startswithrequestsgetrawgetattrrV   r   with_suffixnamer  r  ndimtilemaxstackr
   r   r    r   ascontiguousarrayrv  r	   r  r  r  r   r   
Detectionsnames)r&   imgsr  augmentprofiler  r   r   shape0shape1filesr  imfr;   rw   r   r   s                     r   r-   zautoShape.forwardo  s     !&&()dELL)ahhmmu&<=zz$''!(("3";";A">QR R (2$'=3t9d#Av;4 "Bt_EArsA"c"

5::SUS`S`agShhll2d.K.O.Onp#qrtvAB,

2J(B(GaALLa,,V499:xx{Q\\),!#AAq"1"H2772aDj>13MB!AMM!AAMM!,!Q1q5!,-DG % FHXXfVWEXE\E\]^E_`E_.C(9$:;E_`FJKdYrV%8;dK!eBHHQN1d  \!:;Q""188,44Q7$>	"$%\\!((--5"89

1gw/2AHH&() $A$))txxY]YeYefA1XVQqT!RaR%[&)<  HH&()dAuaQWWE	F 	F9 >=& -`K :9s+   6;R,:R9
<4R>6SCS,R6S)i  FF)r1   r2   r3   r  r  r  r"   r  rF   no_gradr-   r4   r5   s   @r   r  r  a  s:    D
CG" U]]_4F 4Fr(   r  c                   T     e Zd Zd
 fd	ZddZd Zd ZddZd Zd Z	d Z
d	 Z xZS )r;  c                     t         t                   |d   j                  }|D 	cg c]:  }t	        j
                  g dD 	cg c]  }	|j                  |	    c}	dd|      < }
}}	| _        | _        | _	        | _
        | _        |D cg c]  }t        |       c} _        t         j                  |
      D cg c]
  \  }}||z   c}} _        t         j                  |
      D cg c]
  \  }}||z   c}} _        t#         j                         _        t'         fdt)        d      D               _        | _        y c c}	w c c}	}w c c}w c c}}w c c}}w )Nr   )r?   r   r?   r   r   )rw  c              3   Z   K   | ]"  }|d z      |   z
  dz  j                   z   $ yw)r?   i  Nr   ).0r  r&   timess     r   	<genexpr>z&Detections.__init__.<locals>.<genexpr>  s1     S(Qa!euQx/47$&&@(s   (+r>   )r!   r;  r"   rw  rF   tensorr  r=  predr<  rB  xyxyr   xywhzipxyxynxywhnr   r   tupler   r  r;   )r&   r=  rN  rB  rK  r<  r  rK   rC  r  gnr   rw   r'   s   `   `        r   r"   zDetections.__init__  s;   j$(*GNN_cd_cY[ellI<@<abhhqk<@I"IbIRST_cd		

	+/04aYq\40	(+DIIr(:;(:1a!e(:;
(+DIIr(:;(:1a!e(:;
TYYS%PQ(SS Ad 1;;s)   EEEEE$7E*Ec                 z   t               }t        t        | j                  | j                              D ]  \  }\  }}	d|dz    dt        | j                         d|j                  d    d|j                  d    d	}
|	|	d d df   j                         D ]E  }|	d d df   |k(  j                         }|
| d| j                  t        |          d	|dkD  z   d
z  }
G |s|s|rG|	D ]B  ^ }}}| j                  t        |          d|d}t        ||||t        |      dz            D t        |t        j                        r2t        j                   |j#                  t        j$                              n|}|rt'        |
j)                  d
             |r|j+                  | j,                  |          |r\| j,                  |   }|j/                  t1        |      |z         t'        d|dk(  z   d| || j2                  dz
  k  rdnd| d       |st        j4                  |      | j                  |<    y )Nzimage r?   /z: r   r    r   r;   z, z.2f
   )labelcolorSaved,z to 
)end)r   r+  rQ  r=  rN  r   r  uniquesumr<  r   r   r   rt  ndarrayr   	fromarrayastypeuint8r  rstripshowrB  saver   r   r-  )r&   pprintrg  rh  rendersave_dircolorsr  imgrN  r,  r  r   boxr  clsrZ  rD  s                     r   displayzDetections.display  s   'DIItyy(ABNA{T1q5'3tyy>"2"SYYq\N!CIIaL>QRSCae++-Aae)..0AaS$**SV"4!5cQUm_BGGC . 46+/dC#'::c#h#7"8$s D$S#U&STVBWX ,0 <Fc2::;V%//#**RXX"67\_Ccjj&'A'JJqMh!+,AF+,AaS1a$&&1*nsTXYaXbbdRef!zz#		!) Cr(   c                     | j                  d       t        dt        | j                         | j                  z         y )NT)ri  zKSpeed: %.1fms pre-process, %.1fms inference, %.1fms NMS per image at shape )rp  r  rT  r;   r  r  s    r   r  zDetections.print  s:    D![\abfbhbh\i[jknrntnttur(   c                 (    | j                  d       y )NT)rg  )rp  r  s    r   rg  zDetections.show  s    $r(   c                     t        ||dk7        }t        |      j                  dd       | j                  d|       y )Nruns/hub/exp)exist_okT)parentsru  )rh  rk  )r   r   mkdirrp  )r&   rk  s     r   rh  zDetections.save  s:    !(X5OPXTD9$2r(   c                 >    | j                  d       | j                  S )NT)rj  )rp  r=  r  s    r   rj  zDetections.render  s    D!yyr(   c                    t        |       }d}d}t        g d||||g      D ]  \  }}t        | |      D cg c]M  }|j                         D cg c]1  }|d d t	        |d         | j
                  t	        |d            gz   3 c}O }}t        |||D cg c]  }t        j                  ||       c}        |S c c}w c c}w c c}w )N)xminyminxmaxymax
confidenceclassr5  )xcenterycenterwidthheightr~  r  r5  )rO  rR  rP  rS  r   )columns)	r   rQ  r3  tolistr   r<  setattrpd	DataFrame)r&   newcacbr   r  r   as           r   pandaszDetections.pandas  s    4jJS:RR<LMDAq[bcgij[kl[kVWahhjQj!BQ%3qt9djjQqT&;<<jQ[kAlCCAR\\!Q7CD N 
 RlCs   C6B>CC>Cc           
         t        | j                        D cg c]@  }t        | j                  |   g| j                  |   g| j
                  | j                        B }}|D ]#  }dD ]  }t        ||t        ||      d           % |S c c}w )N)r=  rN  rO  rR  rP  rS  r   )	r   r   r;  r=  rN  r<  r;   r  r3  )r&   r  r   rK   r   s        r   r  zDetections.tolist  s    UZ[_[a[aUbcUbPQZ11

DFFKUbcAG1gamA./ H  	 ds   AB	c                     | j                   S r*   rI  r  s    r   __len__zDetections.__len__  s    vvr(   )NNN)FFFF )rt  )r1   r2   r3   r"   rp  r  rg  rh  rj  r  r  r  r4   r5   s   @r   r;  r;    s1     /0v 3
r(   r;  c                   &     e Zd Zd fd	Zd Z xZS )Classifyc           
          t         t        |           t        j                  d      | _        t        j                  ||||t        ||      |      | _        t        j                         | _
        y )Nr?   )rj   )r!   r  r"   r#   AdaptiveAvgPool2daaprl   r   rm   Flattenflat)r&   ru   rv   r   r;   r   rw   r'   s          r   r"   zClassify.__init__  sO    h&(''*IIb"aGAqM!D	JJL	r(   c                     t        j                  t        |t              r|n|gD cg c]  }| j	                  |       c}d      }| j                  | j                  |            S c c}w r   )rF   rG   r   r*  r  r  rm   )r&   r   r   zs       r   r-   zClassify.forward  sY    II*Q2EQA3-NP-Nqtxx{-NPRSTyy1&& Qs   A')r?   r?   Nr?   r0   r5   s   @r   r  r    s    !'r(   r  c                     |j                   }|j                  |j                  z   j                         }| ||z  j	                  dddd      z  |j
                  |j                  |z  |z  z
  fS )Nr   r?   )rp  rr  rs  rx  r   rk   rq  )r{  ro   r   r8  s       r   transI_fusebnr    sd    IIE>>BFF"
(
(
*Ceck**2q!Q78"''BOOV[D[^aDa:aaar(   c                   .     e Zd Z	 d fd	Zd Zd Z xZS )ConvBNc
           
      ,   t         
|           |	t        j                         | _        n|	| _        |r#t        j
                  |||||||d      | _        y t        j
                  |||||||d      | _        t        j                  |      | _        y )NTr   r   r   r    r:   r   rj   rk   FrL  )	r!   r"   r#   rr   	nonlinearrl   rm   rn   ro   )r&   r   r   r   r    r:   r   rj   rN  r  r'   s             r   r"   zConvBN.__init__  s    [[]DN&DN		kbm-3Wx`fmqsDI 		kbm397U]flsxzDInn,?DGr(   c                     t        | d      r/| j                  | j                  | j                  |                  S | j                  | j                  |            S )Nro   )rV  r  ro   rm   r,   s     r   r-   zConvBN.forward  sC    4>>$''$))A,"788>>$))A,//r(   c           
         t        | j                  j                  | j                        \  }}t	        j
                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  d      }||j                  _        ||j                  _        | j                         D ]  }|j!                           | j#                  d       | j#                  d       || _        y )NTr  rm   ro   )r  rm   rp  ro   r#   rl   r   r   r   r    r:   r   rj   r  rk   r%  detach___delattr__)r&   r{  rk   rm   paras        r   switch_to_deployzConvBN.switch_to_deploy$  s   $TYY%5%5tww?yyTYY%:%:I_I_mqmvmv  nC  nC-1YY-=-=tyyGXGXcgclclcucu  C  H  H  O  O  VZ[!		OO%DLLN & 	r(   )r?   r   r?   r?   FN)r1   r2   r3   r"   r-   r  r4   r5   s   @r   r  r    s    `d@0
r(   r  c                   >     e Zd Z	 	 	 d fd	Zd Zd Zd Zd Z xZS )OREPA_3x3_RepConvc           	      V   t         t        |           |	| _        |
t	        j
                         | _        n|
| _        || _        || _        || _	        || _
        ||dz  k(  sJ || _        || _        || _        d| _        t	        j                  t!        j"                  |t%        || j                  z        ||            | _        t        j(                  j+                  | j&                  t-        j.                  d             | xj                  dz  c_        ||k  r_t	        j                  t!        j"                  |t%        || j                  z        dd            | _        t	        j                  t!        j"                  |t%        || j                  z        dd            | _        t        j(                  j+                  | j0                  d       t        j(                  j+                  | j2                  d       | j0                  j4                   | j2                  j4                   | j7                  dt!        j8                  ||      j;                  d|z  |z               | xj                  dz  c_        nt<        | xj                  dz  c_        |||k  r|nd|z  }||k(  rt	        j                  t!        j>                  |t%        || j                  z        dd            | _         tC        j>                  |t%        || j                  z        ddf      }tE        |      D ]$  }d|||t%        || j                  z        z  ddf<   & t!        jF                  |      jI                  | j@                        }| j7                  d|       nt	        j                  t!        j"                  |t%        || j                  z        dd            | _%        t        j(                  j+                  | jJ                  t-        j.                  d             t	        j                  t!        j"                  |t%        || j                  z        ||            | _&        t        j(                  j+                  | jL                  t-        j.                  d             | xj                  dz  c_        d}t	        j                  t!        j"                  ||z  d||            | _'        t	        j                  t!        j"                  |||z  dd            | _(        t        j(                  j+                  | jN                  t-        j.                  d             t        j(                  j+                  | jP                  t-        j.                  d             | xj                  dz  c_        ||k(  r|dk(  r| xj                  dz  c_        t	        j                  t!        j"                  | j                  | j                              | _)        t	        jT                  |      | _+        | jY                          t        j(                  j[                  | jR                  dd d f   d	       t        j(                  j[                  | jR                  dd d f   d	       t        j(                  j[                  | jR                  dd d f   d
       t        j(                  j[                  | jR                  dd d f   d       t        j(                  j[                  | jR                  dd d f   d       y )Nr   r   r   )r  r?   weight_rbr_avg_avgrm     r
  rB  r>   r   r   ).r!   r  r"   rN  r#   rr   r  r   r   r   rj   r    r:   r   branch_counterr   rF   r&  r   weight_rbr_originr<  kaiming_uniform_r   rx  weight_rbr_avg_convweight_rbr_pfir_convr  register_bufferr   r   NotImplementedErrorr:  weight_rbr_1x1_kxk_idconv1rt  r   rv  r)  weight_rbr_1x1_kxk_conv1weight_rbr_1x1_kxk_conv2weight_rbr_gconv_dwweight_rbr_gconv_pwvectorrn   ro   fre_init	constant_)r&   r   r   r   r    r:   r   rj   internal_channels_1x1_3x3rN  r  single_initid_valuer  rm  expand_ratior'   s                   r   r"   zOREPA_3x3_RepConv.__init__2  s    	/1[[]DN&DN&&(+**** !#ell<[Y]YdYdMdIegrt  /A  "B
  !7!7499S> Jq  L ')||ELLsS^_c_j_jSjOkmnpq4r'sD$(*U\\,PST_`d`k`kTkPlnoqr5s(tD%GG$$T%=%=$EGG$$T%>%>#$F$$))%%**  !5uzz+{7[7_7_`cdo`op{`{7|}1$ &%q $,7=7LRSVaRa%$3.0ll5;;{TWXcdhdodoXoTprsuv;w.xD+xxc+dkk2I.JAq QRH;'FGAK$; <<aBC (((2::4;Z;Z[I  i8 -/LLF_adepquq|q|e|a}  @A  CD  :E  -FD)GG$$T%B%BdiiPSn$U(*U\\,PSTmnrnynyTyPz  }H  JU  6V  )W%
  !>!>$))C. Qq #%<<[=UWXZegr0s#t #%<<\;WcKcefhi0j#k 
  !9!9TYYs^ L
  !9!9TYYs^ Lq ;&6Q;1$ll5<<0C0CTEVEV#WX...
$++ad+T2
$++ad+T2
$++ad+S1
$++ad+S1
$++ad+S1r(   c                    t        j                  | j                  | j                  | j                        }| j                  dz  }t	        | j                        D ]  }t	        d      D ]  }t	        d      D ]{  }||k  r9t        j                  t
        j                  |dz   z  |dz   z  dz        ||||f<   At        j                  t
        j                  |dz   z  |dz   |z
  z  dz        ||||f<   }   | j                  d|       y )Nr   r>   r   r?   weight_rbr_prior)	rF   r&  r   r   r   r   cospir  )r&   prior_tensorhalf_fgr  r  r  s         r   r  zOREPA_3x3_RepConv.fre_init  s    ||D$5$5t7G7GIYIYZ##A%t(()A1XqA7{04!C%!A#9Nq9P0QQ1W-04!C%!A#g+9VWX9X0YQ1W-	 "  * 	/>r(   c                 2   t        j                  d| j                  | j                  dd d f         }t        j                  dt        j                  d| j                  | j
                        | j                  dd d f         }t        j                  dt        j                  d| j                  | j                        | j                  dd d f         }d }t        | d      r(| j                  | j                  z   j                         }n-t        | d      r| j                  j                         }nt        | j                  }| j                  dkD  r| j                  }|j!                         \  }}|j!                         \  }	}
}}|j#                  |t%        ||z        |      }|j#                  |t%        |	|z        |
||      }t        j                  d	||      j#                  |	|||      }nt        j                  d
||      }t        j                  d|| j                  dd d f         }| j'                  | j(                  | j*                  | j,                        }t        j                  d|| j                  dd d f         }||z   |z   |z   |z   }|S )Nzoihw,o->oihwr   zoihw,hw->oihwr?   zoihw,ohw->oihwr   r  r  zgti,gothw->goihwzti,othw->oihwr>   r   )rF   einsumr  r  r  r  r  r  rV  r  rm  r  r  r  r  rj   r  r  r   	dwsc2fullr  r  r   )r&   r  weight_rbr_avgweight_rbr_pfirr  r  rw   r  igotgr  r  weight_rbr_1x1_kxkweight_rbr_gconvrp  s                   r   
weight_genzOREPA_3x3_RepConv.weight_gen  s   !LL9O9OQUQ\Q\]^`a]aQbcnell?TXTlTlnr  oF  oF  7G  IM  IT  IT  UV  XY  UY  IZ  [,,~u||DTVZVoVoqu  rG  rG  8H  JN  JU  JU  VW  YZ  VZ  J[  \#' 456(,(G(G$..(X'a'a'c$T56'+'D'D'L'L'N$%%#'#@#@ ;;?A,113EAr2779KAr1a'?'D'DQAaCRT'U$'?'D'DQAaCRTVWYZ'[$!&.@BZ\t!u!z!z{|  A  CD  FG  "H!&o?WYq!r"\\.:LdkkZ[]^Z^N_`>>$*B*BDD\D\^b^n^no <<8H$++VWYZVZJ[\"^36HH?Z]mmr(   c                 P   |j                         \  }}}}|j                         \  }}	}	}	t        ||z        }
t        ||z        }|j                  ||
|||      }|j                         j                  |||
      }t	        j
                  d||      }|j                  ||||      S )Nzgtihw,ogt->ogihw)r  r   r  r  rF   r  )r&   	weight_dw	weight_pwrj   r  r  r  r  r  r   r  r  
weight_dscs                r   r  zOREPA_3x3_RepConv.dwsc2full  s    nn&2q!^^%
1a6]6	NNN62r1a8	%%',,Q;	\\"4iK
q!Q**r(   c           	          | j                         }t        j                  ||d | j                  | j                  | j
                  | j                        }| j                  | j                  |            S )N)rk   r    r:   r   rj   )	r  Fconv2dr    r:   r   rj   r  ro   )r&   rW  rp  outs       r   r-   zOREPA_3x3_RepConv.forward  s`    "hhvvDdlleierer{  |G  |G  H~~dggcl++r(   )r?   r   r?   r?   NFNF)	r1   r2   r3   r"   r  r  r  r-   r4   r5   s   @r   r  r  0  s*     :;+/;@P2f?"H
+,r(   r  c            
       t     e Zd Zdddddddd ej                         f	 fd	Zd Zd Zd Zd	 Z	d
 Z
d Z xZS )RepConv_OREPAr>   r?   r:  Fc                 ^   t         t        |           |	| _        || _        || _        || _        || _        || _        || _        |dk(  sJ |dk(  sJ ||dz  z
  }|t        j                         | _        n|| _        |
r*t        | j                  | j                  dz        | _        nt        j                         | _        |	r8t        j                  | j
                  | j                  |||||d|	      | _        y | j                  | j
                  k(  r%|dk(  r t        j                   | j
                        nd | _        t%        | j
                  | j                  ||||d	      | _        t)        | j
                  | j                  d|||d	      | _        t-        d
| j"                         y )Nr>   r?   r      )internal_neuronsTr  rL  )r   r   r   r    r:   rj   r   zRepVGG Block, identity = )r!   r  r"   rN  rj   r   r   r:   r   r#   rr   nonlinearitySEBlockserl   rO  rn   rP  r  rQ  r  rR  r  )r&   ru   rv   r   r;   r:   r   rj   r  rN  use_ser  rS  r'   s                r   r"   zRepConv_OREPA.__init__  s   mT+- Avv!||qAv%
 "D )Dd//$BSBSWYBYZDGkkmDG!yyT5E5ETXTeTest}~.5QW^bq} D RVQbQbfjfvfvQv{|  AB  |BD<L<L M  HLD.4;K;KZ^ZkZkyz  DE  OV  _e  pq  rDN!d.>.>TM^M^lmvw  BL  U[  fg  hDL-t/@/@Ar(   c                 P   t        | d      r/| j                  | j                  | j                  |                  S | j                  d}n| j	                  |      }| j                  |      }| j                  |      }|}||z   |z   }| j                  | j                  |            S rU  )rV  r  r  rO  rP  rQ  rR  )r&   rW  rX  out1out2out3r  s          r   r-   zRepConv_OREPA.forward  s    4'$$TWWT-=-=f-E%FGG$F&&v.F~~f%||F#TkD   ..r(   c                    | j                   j                         }| j                  j                  j                  }| j                   j
                  j                  | j                   j
                  j                  | j                   j
                  j                  z   j                         z  j                  dddd      j                         }| j                  j
                  j                  | j                  j
                  j                  | j                  j
                  j                  z   j                         z  j                  dddd      j                         }|dz  j                         |d d d d ddddf   dz  j                         z
  }|d d d d ddddf   |z  ||z  z   }|dz  |dz  |dz  z   z  j                         }||z   S )Nr   r?   r   )rQ  r  rR  rm   rp  ro   rr  rs  rx  r   r  ra  )r&   K3K1t3t1l2_loss_circle	eq_kernell2_loss_eq_kernels           r   get_custom_L2zRepConv_OREPA.get_custom_L2
  s   ^^&&(\\%%nn&&4>>+<+<+H+H4>>K\K\K`K`+`*f*f*hirrsuwxz{}~  G  G  Illoo$$)D)Dt||GZGZ)Z(`(`(bcllmoqrtuwxy  A  A  C'Bq!QqS!A#~,>!,C+H+H+JJq!QqS!A#~&+b2g5	&!^rQwq/@AFFH >11r(   c                     | j                  | j                        \  }}| j                  | j                        \  }}| j                  | j                        \  }}|| j	                  |      z   |z   ||z   |z   fS r*   rZ  r]  s          r   rd  z(RepConv_OREPA.get_equivalent_kernel_bias  s{    !11$..A	7!11$,,?	7//0A0AB&466yAAHLgX_N_bhNhhhr(   c                 `    |yt         j                  j                  j                  |g d      S rf  )rF   r#   rh  ri  rj  s     r   r\  z$RepConv_OREPA._pad_1x1_to_3x3_tensor  s(    88&&**9i@@r(   c                 2   |yt        |t        j                        st        |t              r|j	                         }n-t        |t
              r|j                  j                  }nt        |j                  j                  }|j                  j                  }|j                  j                  }|j                  j                  }|j                  j                  }nt        | d      s| j                  | j                   z  }t#        j$                  | j                  |ddft"        j&                        }	t)        | j                        D ]  }
d|	|
|
|z  ddf<    t+        j,                  |	      j/                  |j                  j0                        | _        | j2                  }|j                  }|j                  }|j                  }|j                  }|j                  }||z   j5                         }||z  j7                  dddd      }||z  |||z  |z  z
  fS )Nrl  rm  r>   rn  r?   r   )r   r#   rn   r  r  r  rm   rp  r  ro   rq  rr  rk   rs  rV  r   rj   rt  r:  ru  r   rF   rv  r   rw  rm  rx  r   ry  s                r   r[  zRepConv_OREPA._fuse_bn_tensor!  s   >&"..1&"34**,FF+++))!9911L ))//KII$$E99>>D))--C4- ,,;	!xx)9)99a(KSUS]S]^t//0A;<LA	M1a!78 1!&!1!1,!?!B!B6==CWCW!X^^F!..L ,,KMME;;D**CS &&(S[!!"aA.z4,"6"<<<<r(   c           
         t        | d      ry t        d       | j                         \  }}t        j                  | j
                  j                  | j
                  j                  | j
                  j                  | j
                  j                  | j
                  j                  | j
                  j                  | j
                  j                  d      | _        || j                  j                  _        || j                  j                   _        | j#                         D ]  }|j%                           | j'                  d       | j'                  d       t        | d      r| j'                  d       y y )NrO  zRepConv_OREPA.switch_to_deployTr  rQ  rR  rP  )rV  r  rd  r#   rl   rQ  r   r   r   r    r:   r   rj   rO  rp  r  rk   r%  r  r  )r&   r{  rk   r  s       r   r  zRepConv_OREPA.switch_to_deployA  s'   4'.0668991K1KZ^ZhZhZuZu151K1KTXTbTbTiTi-1^^-C-CdnnNeNenrn|n|  oD  oD  KOP (.$%)"OO%DLLN &%#4(^, )r(   )r1   r2   r3   r#   rp   r"   r-   r  rd  r\  r[  r  r4   r5   s   @r   r  r    sb    !"aQqW^gluz  GN  GI  GN  GN  GP "BJ/6	2iA=@-r(   r  c                   (     e Zd Zd fd	ZddZ xZS )WindowAttentionc                    t         |           || _        || _        || _        ||z  }|xs |dz  | _        t        j                  t        j                  d|d   z  dz
  d|d   z  dz
  z  |            | _
        t        j                  | j                  d         }	t        j                  | j                  d         }
t        j                  t        j                  |	|
g            }t        j                  |d      }|d d d d d f   |d d d d d f   z
  }|j                  ddd      j!                         }|d d d d dfxx   | j                  d   dz
  z  cc<   |d d d d dfxx   | j                  d   dz
  z  cc<   |d d d d dfxx   d| j                  d   z  dz
  z  cc<   |j#                  d      }| j%                  d|       t        j&                  ||dz  |      | _        t        j*                  |      | _        t        j&                  ||      | _        t        j*                  |      | _        t        j2                  j5                  | j                  d	
       t        j6                  d      | _        y )Ng      r   r   r?   r   relative_position_indexr>   r  rC  )r8  r   )r!   r"   r   window_sizer  scaler#   r   rF   r:  relative_position_bias_tablearanger9  meshgridr  r  r  ra  r  r  qkvDropout	attn_dropproj	proj_dropr<  r=  Softmaxsoftmax)r&   r   r  r  qkv_biasqk_scaler  r   head_dimcoords_hcoords_wcoordscoords_flattenrelative_coordsr  r'   s                  r   r"   zWindowAttention.__init__Y  s-   &")#1T!1
 -/LLKK[^+a/AA4F4JKYW-Y) << 0 0 34<< 0 0 34U^^Xx,@ABvq1(At4~aqj7QQ)11!Q:EEG1a D$4$4Q$7!$;; 1a D$4$4Q$7!$;; 1a A(8(8(;$;a$?? "1"5"5b"968OP99S#'9I.IIc3'	I.
99sCzzb)r(   c                    |j                   \  }}}| j                  |      j                  ||d| j                  || j                  z        j	                  ddddd      }|d   |d   |d   }	}}|| j
                  z  }||j                  dd      z  }
| j                  | j                  j                  d         j                  | j                  d   | j                  d   z  | j                  d   | j                  d   z  d      }|j	                  ddd      j                         }|
|j                  d      z   }
||j                   d   }|
j                  ||z  || j                  ||      |j                  d      j                  d      z   }
|
j                  d| j                  ||      }
| j                  |
      }
n| j                  |
      }
| j                  |
      }
	 |
|	z  j                  dd      j                  |||      }| j!                  |      }| j#                  |      }|S #  |
j                         |	z  j                  dd      j                  |||      }Y \xY w)Nr>   r   r   r?   r   r   )r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  halfr  r   )r&   r   maskB_r  r   r  r  r   r  attnrelative_position_biasnWs                r   r-   zWindowAttention.forward{  sA   77Aqhhqk!!"aDNNA<OPXXYZ\]_`bcefga&#a&#a&a1

NAKKB''!%!B!B4C_C_CdCdegCh!i!n!nQ$"2"21"55t7G7G7JTM]M]^_M`7`bd"f!7!?!?1a!H!S!S!U,66q99AB99R2Xr4>>1a@4>>RSCTC^C^_`CaaD99RA6D<<%D<<%D~~d#	D$$Q*222q!<A IIaLNN1	Dq++Aq199"aCAs   !&H+ +6I#)TNrB  rB  r*   r0   r5   s   @r   r  r  W  s     *D r(   r  c                   B     e Zd Zddej                  df fd	Zd Z xZS )MlpNrB  c                     t         |           |xs |}|xs |}t        j                  ||      | _         |       | _        t        j                  ||      | _        t        j                  |      | _        y r*   	r!   r"   r#   r  r  rs   r  r  dropr&   in_featureshidden_featuresout_features	act_layerr  r'   s         r   r"   zMlp.__init__  _    #2{)8[99[/:;99_l;JJt$	r(   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }|S r*   r  rs   r  r  r,   s     r   r-   zMlp.forward  H    HHQKHHQKIIaLHHQKIIaLr(   r1   r2   r3   r#   rp   r"   r-   r4   r5   s   @r   r  r    s    48tWYW^W^eg %r(   r  c                     | j                   \  }}}}||z  dk(  sJ d       | j                  |||z  |||z  ||      } | j                  dddddd      j                         j                  d|||      }|S )	Nr   z1feature map h and w can not divide by window sizer?   r>   r   r   r   r   r  r  r  r  r   r  Br  r  r   windowss          r   window_partitionr'    s    JAq!Q{?aT!TT	q!{"Kk1A;PQRAii1aAq)446;;B[Z[\GNr(   c                     t        | j                  d   ||z  |z  |z  z        }| j                  |||z  ||z  ||d      }|j                  dddddd      j	                         j                  |||d      }|S Nr   r   r?   r>   r   r   r   r   r  r  r  r  r&  r  r  r  r%  r   s         r   window_reverser,        GMM!A 3k ABCAQ[(!{*:KVXYA			!Q1a#..055aArBAHr(   c            
       h     e Zd Zddddddddej                  ej
                  f
 fd	Zd Zd	 Z xZ	S )
SwinTransformerLayerr  r         @TNrB  c           	         t         |           || _        || _        || _        || _        || _        d| j
                  cxk  r| j                  k  sJ d        J d        ||      | _        t        || j                  | j                  f||||	|      | _	        |
dkD  rt        |
      nt        j                         | _         ||      | _        t        ||z        }t!        ||||      | _        y )Nr    shift_size must in 0-window_size)r  r  r  r  r  r   rB  r  r  r  r  )r!   r"   r   r  r  
shift_size	mlp_rationorm1r  r  DropPathr#   rr   	drop_pathnorm2r   r  mlp)r&   r   r  r  r4  r5  r  r  r  r  r8  r  
norm_layermlp_hidden_dimr'   s                 r   r"   zSwinTransformerLayer.__init__  s     	"&$"
 DOO6d&6&66Z8ZZ6Z8ZZ6_
#d..0@0@AYIQUW	 1:B),BKKM_
S9_-3R[bfgr(   c           	         t        j                  d||df      }t        d| j                         t        | j                   | j                         t        | j                   d       f}t        d| j                         t        | j                   | j                         t        | j                   d       f}d}|D ]  }|D ]  }||d d ||d d f<   |dz  }  t        || j                        }	|	j                  d| j                  | j                  z        }	|	j                  d      |	j                  d      z
  }
|
j                  |
dk7  t        d            j                  |
dk(  t        d            }
|
S Nr?   r   r   r   g      YrB  
rF   r:  slicer  r4  r'  r  r  masked_fillfloatr&   r  r  img_maskh_slicesw_slicescntr  r  mask_windows	attn_masks              r   create_maskz SwinTransformerLayer.create_mask  l   ;;1a|,!d.../4+++doo-=>4??*D13 !d.../4+++doo-=>4??*D13 A'*Aq!$q  
 ($2B2BC#((T-=-=@P@P-PQ **1-0F0Fq0II	)))q.%-HTTU^bcUcejkneop	r(   c                 J   |j                   \  }}}}d}t        ||      | j                  k  s$|| j                  z  dk7  s|| j                  z  dk7  rnd}| j                  || j                  z  z
  | j                  z  }| j                  || j                  z  z
  | j                  z  }t        j                  |d|d|f      }|j                   \  }}	}
}|
|z  }|j                  dddd      j                         j                  |||	      }| j                  dkD  r,| j                  |
|      j                  |j                        }nd }|}| j                  |      }|j                  ||
||	      }| j                  dkD  r1t        j                  || j                   | j                   fd      }n|}t        || j                        }|j                  d	| j                  | j                  z  |	      }| j!                  ||
      }|j                  d	| j                  | j                  |	      }t#        || j                  |
|      }| j                  dkD  r/t        j                  || j                  | j                  fd      }n|}|j                  ||
|z  |	      }|| j%                  |      z   }|| j%                  | j'                  | j)                  |                  z   }|j                  ddd      j                         j                  d	|	|
|      }|r|d d d d d |d |f   }|S NFr   Tr   r>   r?   r   )shiftsdimsr   )r  )r  minr  r  ri  r  r  r  r4  rJ  r   rw  r6  rF   rollr'  r  r,  r8  r:  r9  r&   r   r   H_W_Paddingpad_rpad_br%  r   r  r  LrI  r   	shifted_x	x_windowsattn_windowss                     r   r-   zSwinTransformerLayer.forward  s   ww1b"r2;)))R$2B2B-BA-EdN^N^I^`aIaG%%T-=-=(==AQAQQE%%T-=-=(==AQAQQEa!UAu-.A WW
1aEIIaAq!,,.33Aq!< ??Q((A.11!((;IIJJqMFF1aA ??Q

1t.>@P-QX^_II %Y0@0@A	NN2t'7'7$:J:J'JAN	 yyy; $((T-=-=t?O?OQRS"<1A1A1aH	 ??Q

9doot-OV\]AAFF1a!eQ t~~a((txx

1677IIaA))+00Q1=!QSbS.!Ar(   )
r1   r2   r3   r#   rp   	LayerNormr"   rJ  r-   r4   r5   s   @r   r/  r/    s4    34t"PR^`77r||h2,<r(   r/  c                   &     e Zd Zd fd	Zd Z xZS )SwinTransformerBlockc                     t         |           d | _        ||k7  rt        ||      | _        t	        j
                  t        |      D cg c]  }t        ||||dz  dk(  rdn|dz          c} | _        y c c}w Nr   r   )r   r  r  r4  )	r!   r"   rm   rg   r#   r   r   r/  blocksr&   ru   rv   r  r  r  r  r'   s          r   r"   zSwinTransformerBlock.__init__1  s    	8RDI mm^cdn^o&q^oYZ ';rYdo23a%1*A;RSCS'U^o&q r &q   	#A6c                 b    | j                   | j                  |      }| j                  |      }|S r*   rm   ra  r,   s     r   r-   zSwinTransformerBlock.forward;  +    99 		!AKKNr(   )r  r0   r5   s   @r   r^  r^  0      rr(   r^  c                   &     e Zd Zd fd	Zd Z xZS )STCSPAc                     t         t        |           t        ||z        }t	        ||dd      | _        t	        ||dd      | _        t	        d|z  |dd      | _        |dz  }t        ||||      | _	        y Nr?   r   r   )
r!   ri  r"   r   rg   r   r   r   r^  r%   
r&   ru   rv   r   r   rw   r   r   r  r'   s
            r   r"   zSTCSPA.__init__D  sr    fd$&a[B1%B1%BAq)"H	%b"i;r(   c                     | j                  | j                  |            }| j                  |      }| j                  t	        j
                  ||fd            S r   r   r   s       r   r-   zSTCSPA.forwardN  r   r(   r   r0   r5   s   @r   ri  ri  B  s    <4r(   ri  c                   &     e Zd Zd fd	Zd Z xZS )STCSPBc                     t         t        |           t        |      }t	        ||dd      | _        t	        ||dd      | _        t	        d|z  |dd      | _        |dz  }t        ||||      | _	        y rk  )
r!   ro  r"   r   rg   r   r   r   r^  r%   rl  s
            r   r"   zSTCSPB.__init__V  sn    fd$&WB1%B1%BAq)"H	%b"i;r(   c                     | j                  |      }| j                  |      }| j                  |      }| j                  t	        j
                  ||fd            S r   r  r  s        r   r-   zSTCSPB.forward`  r  r(   r  r0   r5   s   @r   ro  ro  T  s    <4r(   ro  c                   &     e Zd Zd fd	Zd Z xZS )STCSPCc                    t         t        |           t        ||z        }t	        ||dd      | _        t	        ||dd      | _        t	        ||dd      | _        t	        d|z  |dd      | _        |dz  }t        ||||      | _
        y rk  )r!   rs  r"   r   rg   r   r   r   r   r^  r%   rl  s
            r   r"   zSTCSPC.__init__i  s    fd$&a[B1%B1%B1%BAq)"H	%b"i;r(   c                     | j                  | j                  | j                  |                  }| j                  |      }| j	                  t        j                  ||fd            S r   r	  r   s       r   r-   zSTCSPC.forwardt  r
  r(   r   r0   r5   s   @r   rs  rs  g  s    <4r(   rs  c                   F     e Zd Zdddddgf fd	Zd	dZdefdZd Z xZS )
WindowAttention_v2TrB  r   c           
      	   t         |           || _        || _        || _        || _        t        j                  t        j                  dt        j                  |ddf      z        d      | _        t        j                  t        j                  ddd      t        j                  d      t        j                  d|d	            | _        t        j                   | j                  d
   dz
   | j                  d
   t        j"                        }t        j                   | j                  d   dz
   | j                  d   t        j"                        }	t        j$                  t        j&                  ||	g            j)                  ddd
      j+                         j-                  d
      }
|d
   d
kD  r;|
d d d d d d d
fxx   |d
   dz
  z  cc<   |
d d d d d d dfxx   |d   dz
  z  cc<   nN|
d d d d d d d
fxx   | j                  d
   dz
  z  cc<   |
d d d d d d dfxx   | j                  d   dz
  z  cc<   |
dz  }
t        j.                  |
      t        j0                  t        j2                  |
      dz         z  t5        j0                  d      z  }
| j7                  d|
       t        j                   | j                  d
         }t        j                   | j                  d         }t        j$                  t        j&                  ||g            }t        j8                  |d      }|d d d d d f   |d d d d d f   z
  }|j)                  ddd
      j+                         }|d d d d d
fxx   | j                  d
   dz
  z  cc<   |d d d d dfxx   | j                  d   dz
  z  cc<   |d d d d d
fxx   d| j                  d   z  dz
  z  cc<   |j;                  d      }| j7                  d|       t        j                  ||dz  d	      | _        |r[t        j                  t        j>                  |            | _         t        j                  t        j>                  |            | _!        nd | _         d | _!        t        jD                  |      | _#        t        j                  ||      | _$        t        jD                  |      | _%        t        jL                  d      | _'        y )NrY  r?   Trequires_gradr   i   r  )inplaceFr   rn  r  r   relative_coords_tabler   r  r>   r   )(r!   r"   r   r  pretrained_window_sizer  r#   r   rF   logr   logit_scaler   r  ReLUcpb_mlpr  ru  r9  r  r  r  r  signlog2absrt  r  r  ra  r  r:  q_biasv_biasr  r  r  r   r  r  )r&   r   r  r  r  r  r   r}  relative_coords_hrelative_coords_wr|  r  r  r  r	  r
  r  r'   s                    r   r"   zWindowAttention_v2.__init__  s4    	&&<#"<<		"uzz9aQRBS7T2T(Ueij }}RYYq#D%A%'WWT%:%'YYsIE%JL
 "LL4+;+;A+>+B)CTEUEUVWEX`e`m`mn!LL4+;+;A+>+B)CTEUEUVWEX`e`m`mn %NN--/ 0!118Aq1A**,yyYZ| 	 "!$q(!!Q1*-2H2Ka2OP-!!Q1*-2H2Ka2OP-!!Q1*-$2B2B12E2IJ-!!Q1*-$2B2B12E2IJ-" %

+@ AEJJII+,s2E4 !468ggaj!A 	46KL << 0 0 34<< 0 0 34U^^Xx,@ABvq1(At4~aqj7QQ)11!Q:EEG1a D$4$4Q$7!$;; 1a D$4$4Q$7!$;; 1a A(8(8(;$;a$?? "1"5"5b"968OP99S#'6,,u{{3'78DK,,u{{3'78DKDKDKI.IIc3'	I.zzb)r(   c                    |j                   \  }}}d }| j                  Kt        j                  | j                  t        j                  | j
                  d      | j
                  f      }t        j                  || j                  j                  |      }|j                  ||d| j                  d      j                  ddddd	      }|d   |d   |d   }
}	}t        j                  |d
      t        j                  |	d
      j                  dd      z  }t        j                  | j                   t        j"                  t        j$                  d                  j'                         }||z  }| j)                  | j*                        j-                  d| j                        }|| j.                  j-                  d         j-                  | j0                  d   | j0                  d   z  | j0                  d   | j0                  d   z  d      }|j                  ddd      j3                         }dt        j4                  |      z  }||j7                  d      z   }||j                   d   }|j-                  ||z  || j                  ||      |j7                  d      j7                  d      z   }|j-                  d| j                  ||      }| j9                  |      }n| j9                  |      }| j;                  |      }	 ||
z  j                  dd      j                  |||      }| j?                  |      }| jA                  |      }|S #  |j=                         |
z  j                  dd      j                  |||      }Y \xY w)NFry  )inputrp  rk   r>   r   r   r   r?   r   r   r  g      Y@)r8  r  )!r  r  rF   rG   r  r  r  r  r  rp  r   r  r  	normalizer  clampr  r~  rM  expr  r|  r  r  r  r  sigmoidr  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WindowAttention_v2.forward  s   77Aq;;"yy$++u/?/?[`/acgcncn!opHhhQtxxXFkk"aDNNB7??1aANa&#a&#a&a1 A2&QB)?)I)I"b)QQkk$"2"2		%,,yBY8Z[__ak!'+||D4N4N'O'T'TUWY]YgYg'h$!=d>Z>Z>_>_`b>c!d!i!iQ$"2"21"55t7G7G7JTM]M]^_M`7`bd"f!7!?!?1a!H!S!S!U!#emm4J&K!K,66q99AB99R2Xr4>>1a@4>>RSCTC^C^_`CaaD99RA6D<<%D<<%D~~d#	D$$Q*222q!<A IIaLNN1	Dq++Aq199"aCAs   &M 6Nreturnc                 n    d| j                    d| j                   d| j                   d| j                   S )Ndim=, window_size=z, pretrained_window_size=, num_heads=)r   r  r}  r  r  s    r   
extra_reprzWindowAttention_v2.extra_repr  sF    dhhZ~d.>.>-? @))-)D)D(E\RVR`R`Qac 	cr(   c                 H   d}||| j                   z  dz  | j                   z  z  }|| j                  |z  | j                   | j                  z  z  |z  z  }|| j                  |z  |z  | j                   | j                  z  z  z  }||| j                   z  | j                   z  z  }|S )Nr   r>   )r   r  )r&   r  flopss      r   r  zWindowAttention_v2.flops  s    TXX!DHH,,!#txx4>>'ABQFF!#a'488t~~+EFFTXX((r(   r*   )	r1   r2   r3   r"   r-   r,  r  r  r4   r5   s   @r   rw  rw  ~  s1    =AR[])*A9*v'RcC cr(   rw  c                   B     e Zd Zddej                  df fd	Zd Z xZS )Mlp_v2NrB  c                     t         |           |xs |}|xs |}t        j                  ||      | _         |       | _        t        j                  ||      | _        t        j                  |      | _        y r*   r  r  s         r   r"   zMlp_v2.__init__  r  r(   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }|S r*   r  r,   s     r   r-   zMlp_v2.forward  r   r(   r!  r5   s   @r   r  r    s    48tWYW^W^eg %r(   r  c                     | j                   \  }}}}| j                  |||z  |||z  ||      } | j                  dddddd      j                         j                  d|||      }|S )Nr   r?   r>   r   r   r   r   r#  r$  s          r   window_partition_v2r    sn    JAq!Q	q!{"Kk1A;PQRAii1aAq)446;;B[Z[\GNr(   c                     t        | j                  d   ||z  |z  |z  z        }| j                  |||z  ||z  ||d      }|j                  dddddd      j	                         j                  |||d      }|S r)  r*  r+  s         r   window_reverse_v2r    r-  r(   c            
       z     e Zd Zdddddddej                  ej
                  df
 fd	Zd Zd Zd	e	fd
Z
d Z xZS )SwinTransformerLayer_v2r   r   r0  TrB  c           
         t         |           || _        || _        || _        || _        || _        d| j
                  cxk  r| j                  k  sJ d        J d        ||      | _        t        || j                  | j                  f||||||f      | _	        |	dkD  rt        |	      nt        j                         | _         ||      | _        t        ||z        }t!        |||
|      | _        y )Nr   r2  )r  r  r  r  r   r}  rB  r3  )r!   r"   r   r  r  r4  r5  r6  rw  r  r7  r#   rr   r8  r9  r   r  r:  )r&   r   r  r  r4  r5  r  r  r  r8  r  r;  r}  r<  r'   s                 r   r"   z SwinTransformerLayer_v2.__init__  s     	"&$"
 DOO6d&6&66Z8ZZ6Z8ZZ6_
&d..0@0@AYd$:<R#SU	
 1:B),BKKM_
S9_-c>U^eijr(   c           	         t        j                  d||df      }t        d| j                         t        | j                   | j                         t        | j                   d       f}t        d| j                         t        | j                   | j                         t        | j                   d       f}d}|D ]  }|D ]  }||d d ||d d f<   |dz  }  t        || j                        }	|	j                  d| j                  | j                  z        }	|	j                  d      |	j                  d      z
  }
|
j                  |
dk7  t        d            j                  |
dk(  t        d            }
|
S r>  r?  rC  s              r   rJ  z#SwinTransformerLayer_v2.create_mask5  rK  r(   c                 F   |j                   \  }}}}d}t        ||      | j                  k  s$|| j                  z  dk7  s|| j                  z  dk7  rnd}| j                  || j                  z  z
  | j                  z  }| j                  || j                  z  z
  | j                  z  }t        j                  |d|d|f      }|j                   \  }}	}
}|
|z  }|j                  dddd      j                         j                  |||	      }| j                  dkD  r,| j                  |
|      j                  |j                        }nd }|}|j                  ||
||	      }| j                  dkD  r1t        j                  || j                   | j                   fd      }n|}t        || j                        }|j                  d	| j                  | j                  z  |	      }| j                  ||
      }|j                  d	| j                  | j                  |	      }t!        || j                  |
|      }| j                  dkD  r/t        j                  || j                  | j                  fd      }n|}|j                  ||
|z  |	      }|| j#                  | j%                  |            z   }|| j#                  | j'                  | j)                  |                  z   }|j                  ddd      j                         j                  d	|	|
|      }|r|d d d d d |d |f   }|S rM  )r  rP  r  r  ri  r  r  r  r4  rJ  r   rw  rF   rQ  r  r  r  r8  r6  r9  r:  rR  s                     r   r-   zSwinTransformerLayer_v2.forwardK  s   ww1b"r2;)))R$2B2B-BA-EdN^N^I^`aIaG%%T-=-=(==AQAQQE%%T-=-=(==AQAQQEa!UAu-.A WW
1aEIIaAq!,,.33Aq!< ??Q((A.11!((;IIFF1aA ??Q

1t.>@P-QX^_II (	43C3CD	NN2t'7'7$:J:J'JAN	 yyy; $((T-=-=t?O?OQRS%lD4D4DaK	 ??Q

9doot-OV\]AAFF1a!eQt~~djjm44 tzz$((1+677IIaA))+00Q1=!QSbS.!Ar(   r  c                     d| j                    d| j                   d| j                   d| j                   d| j                   d| j
                   S )Nr  z, input_resolution=r  r  z, shift_size=z, mlp_ratio=)r   input_resolutionr  r  r4  r5  r  s    r   r  z"SwinTransformerLayer_v2.extra_repr  s`    dhhZ243H3H2IVZVdVdUe f"../}T__<M\Z^ZhZhYik 	kr(   c                    d}| j                   \  }}|| j                  |z  |z  z  }||z  | j                  z  | j                  z  }||| j                  j	                  | j                  | j                  z        z  z  }|d|z  |z  | j                  z  | j                  z  | j
                  z  z  }|| j                  |z  |z  z  }|S )Nr   r   )r  r   r  r  r  r5  )r&   r  r  r  r  s        r   r  zSwinTransformerLayer_v2.flops  s    $$1A!!UT%%%(8(88diiood&6&69I9I&IJJJQTXX%04>>AAA!!r(   )r1   r2   r3   r#   rp   r\  r"   rJ  r-   r,  r  r  r4   r5   s   @r   r  r    sG    342r77r||TUk6,:xkC kr(   r  c                   &     e Zd Zd fd	Zd Z xZS )SwinTransformer2Blockc                     t         |           d | _        ||k7  rt        ||      | _        t	        j
                  t        |      D cg c]  }t        ||||dz  dk(  rdn|dz          c} | _        y c c}w r`  )	r!   r"   rm   rg   r#   r   r   r  ra  rb  s          r   r"   zSwinTransformer2Block.__init__  s    	8RDI mm^cdn^o&q^oYZ '>"PYgr23a%1*A;RSCS'U^o&q r &qrc  c                 b    | j                   | j                  |      }| j                  |      }|S r*   re  r,   s     r   r-   zSwinTransformer2Block.forward  rf  r(   )r   r0   r5   s   @r   r  r    rg  r(   r  c                   &     e Zd Zd fd	Zd Z xZS )ST2CSPAc                     t         t        |           t        ||z        }t	        ||dd      | _        t	        ||dd      | _        t	        d|z  |dd      | _        |dz  }t        ||||      | _	        y rk  )
r!   r  r"   r   rg   r   r   r   r  r%   rl  s
            r   r"   zST2CSPA.__init__  sr    gt%'a[B1%B1%BAq)"H	&r2y!<r(   c                     | j                  | j                  |            }| j                  |      }| j                  t	        j
                  ||fd            S r   r   r   s       r   r-   zST2CSPA.forward  r   r(   r   r0   r5   s   @r   r  r    s    =4r(   r  c                   &     e Zd Zd fd	Zd Z xZS )ST2CSPBc                     t         t        |           t        |      }t	        ||dd      | _        t	        ||dd      | _        t	        d|z  |dd      | _        |dz  }t        ||||      | _	        y rk  )
r!   r  r"   r   rg   r   r   r   r  r%   rl  s
            r   r"   zST2CSPB.__init__  sn    gt%'WB1%B1%BAq)"H	&r2y!<r(   c                     | j                  |      }| j                  |      }| j                  |      }| j                  t	        j
                  ||fd            S r   r  r  s        r   r-   zST2CSPB.forward  r  r(   r  r0   r5   s   @r   r  r    s    =4r(   r  c                   &     e Zd Zd fd	Zd Z xZS )ST2CSPCc                    t         t        |           t        ||z        }t	        ||dd      | _        t	        ||dd      | _        t	        ||dd      | _        t	        d|z  |dd      | _        |dz  }t        ||||      | _
        y rk  )r!   r  r"   r   rg   r   r   r   r   r  r%   rl  s
            r   r"   zST2CSPC.__init__  s    gt%'a[B1%B1%B1%BAq)"H	&r2y!<r(   c                     | j                  | j                  | j                  |                  }| j                  |      }| j	                  t        j                  ||fd            S r   r	  r   s       r   r-   zST2CSPC.forward  r
  r(   r   r0   r5   s   @r   r  r    s    =4r(   r  r*   )r?   r?   T)ur   r   pathlibr   r  rt  r  r  r0  rF   torch.nnr#   torch.nn.functionalrh  r  torchvision.opsr   PILr   
torch.cudar   utils.datasetsr   utils.generalr	   r
   r   r   r   utils.plotsr   r   utils.torch_utilsr   r   rq   r   r7   rA   rI   rQ   r]   rc   rg   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r!  r$  r'  r.  r1  r4  rF  rJ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r;  r  r  r  r  r  r  r  r'  r,  r/  r^  ri  ro  rs  rw  r  r  r  r  r  r  r  r  r`   r(   r   <module>r     s             (   $ f f 0 /
  jBII j$RYY $(bii (ryy bii &299 &  ")) ";

.		 
.Q299 Q OBII OD")) D
P 
Pd")) d3 /BII /&4bii 4(/7 // /4RYY 4 4RYY 4"4RYY 4"Un UUn UUn UUw UUw UUw UC CC CC C
!		 
!
!		 
!"t"bii t"n.J ._ __ __ _.S .X XX XX X.d .Y( YY( YY( Yryy "ryy BuBII u?299 ? 4ryy 44RYY 4
i")) 
iCF		 CFLM M`
'ryy 
'"b RYY  DV,		 V,pH-BII H-^Dbii DL")) &m299 m`299 $4RYY 4$4RYY 4&4RYY 4.u unRYY &bii DBII $4bii 4$4bii 4&4bii 4r(   