
    "f                        d dl Z d dlZd dlZd dlmZ ej
                  j                  d        ej                  e      Z	d dl
Z
d dl d dl d dlmZ d dlmZmZmZ d dlmZmZmZmZmZmZmZ d dlmZ 	 d dlZ G d	 d
ej@                        Z! G d dej@                        Z" G d dej@                        Z# G d dej@                        Z$ G d dej@                        Z% G d dej@                        Z&d Z'edk(  r e jP                         Z)e)jU                  de+dd       e)jU                  ddd       e)jU                  dd d!"       e)jY                         Z- ee-j\                        e-_.         e         ee-j^                        Z/ e&e-j\                        ja                  e/      Z1e1je                          e-jf                  r/ e
jh                  d#d$d%d%      ja                  e/      Z5 e1e5d&'      Z6yyy# e$ r dZY w xY w)(    N)deepcopyz./)*)check_anchor_order)make_divisible
check_fileset_logging)time_synchronizedfuse_conv_and_bn
model_info	scale_imginitialize_weightsselect_device	copy_attr)
SigmoidBinc                   R     e Zd ZdZdZdZdZdZd fd	Zd Z	e
dd       Zd Z xZS )	DetectNFc                 L    t         t                   | _        |dz    _        t        |       _        t        |d         dz   _        t        j                  d      g j                  z   _
        t        j                  |      j                         j                   j                  dd      } j                  d|        j                  d|j                         j                   j                  ddddd             t         j#                   fd|D               _        y )	N   r         anchorsanchor_gridc              3   z   K   | ]2  }t         j                  |j                  j                  z  d        4 ywr   NnnConv2dnona.0xselfs     /C:\work2\python\work_new2\yolov7\models\yolo.py	<genexpr>z"Detect.__init__.<locals>.<genexpr>(   ,     N2aryyDGGdgg,=qA2   8;)superr   __init__ncr   lennlr    torchzerosgridtensorfloatviewregister_buffercloner   
ModuleListmr$   r+   r   cha	__class__s   `    r%   r*   zDetect.__init__   s    fd$&q&g,gaj/Q&[[^$tww.	LL!'')..twwA>Y*]AGGINN477Ar1aQR,STN2NN    c                 6   g }| xj                   | j                  z  c_         t        | j                        D ]L  } | j                  |   ||         ||<   ||   j
                  \  }}}}||   j                  || j                  | j                  ||      j                  ddddd      j                         ||<   | j                   r| j                  |   j
                  dd ||   j
                  dd k7  r;| j                  ||      j                  ||   j                        | j                  |<   ||   j                         }t         j"                  j%                         s]|dddf   dz  dz
  | j                  |   z   | j&                  |   z  |dddf<   |dddf   dz  dz  | j(                  |   z  |dddf<   n|j+                  dd| j,                  dz   fd      \  }	}
}|	d| j&                  |   z  z  | j&                  |   | j                  |   dz
  z  z   }	|
dz  d| j(                  |   j.                  z  z  }
t!        j0                  |	|
|fd      }|j3                  |j                  |d	| j                               O | j                   r|}|S | j4                  rt!        j0                  |d      }|S | j6                  r| j9                  |      }|f}|S | j:                  rt!        j0                  |d      }|S t!        j0                  |d      |f}|S 
Nr   r         r   .       @      ?r   trainingexportranger-   r7   shaper3   r    r   permute
contiguousr0   
_make_gridtodevicesigmoidr.   onnxis_in_onnx_exportstrider   splitr+   datacatappendend2endinclude_nmsconvertconcatr$   r#   zibs_nynxyxywhconfouts                r%   forwardzDetect.forward*   s   $twwA466!9QqT?AaDaDJJMB2rQ499R$''2r:BB1aAqQ\\^AaD==99Q<%%a*adjj1o=#'??2r#:#=#=adkk#JDIIaLaDLLNzz335#$S!A#X;#3c#9DIIaL#HDKKXYN"ZAc1Q3hK#$S!A#X;?q"84;K;KA;N"NAc1Q3hK#$77Aq$''A++>#BLBDrDKKN23t{{1~STX[I[7\]BqA(8(8(;(@(@$@AB		2r4.!4AB01#  & ==C 
 \\))Aq/C 
 QA%C 
 [[))Aq/C 
 99Q?A&C
r<   c                     t        j                  t        j                  |      t        j                  |       g      \  }}t        j                  ||fd      j	                  dd|| df      j                         S Nr   r   r.   meshgridarangestackr3   r2   r_   r^   yvxvs       r%   rJ   zDetect._make_gridO   _    b!15<<3C DEB{{B8Q',,aBA->?EEGGr<   c                    t        j                  |d      }|d d d d d df   }|d d d d ddf   }|d d d d dd f   }||z  }t        j                  g dg dg dg dgt         j                  |j                        }||z  }||fS 	Nr   r@   r   )r   r   r   r   )r   r   r   r   )      r   rB   r   )r   rr   r   rB   )dtyperL   r.   rS   r1   float32rL   r$   rZ   boxrc   scoreconvert_matrixs         r%   rW   zDetect.convertT       IIaO1bqbkAqs|!Q(|\CTVg&h1623((< 	~U|r<   P    r}      r   )__name__
__module____qualname__rP   rE   rU   rV   rX   r*   re   staticmethodrJ   rW   __classcell__r;   s   @r%   r   r      sC    FFGKF
O#J H H
r<   r   c                   ^     e Zd ZdZdZdZdZdZd	 fd	Zd Z	d Z
d Zed
d       Zd Z xZS )IDetectNFc                     t         t                   | _        |dz    _        t        |       _        t        |d         dz   _        t        j                  d      g j                  z   _
        t        j                  |      j                         j                   j                  dd      } j                  d|        j                  d|j                         j                   j                  ddddd             t         j#                   fd|D               _        t         j#                  d	 |D               _        t         j#                   fd
|D               _        y )Nr   r   r   r   r   r   r   c              3   z   K   | ]2  }t         j                  |j                  j                  z  d        4 ywr   r   r!   s     r%   r&   z#IDetect.__init__.<locals>.<genexpr>r   r'   r(   c              3   2   K   | ]  }t        |        y wN	ImplicitAr"   r#   s     r%   r&   z#IDetect.__init__.<locals>.<genexpr>t        9b	!b   c              3   b   K   | ]&  }t        j                  j                  z         ( y wr   	ImplicitMr   r    r"   r]   r$   s     r%   r&   z#IDetect.__init__.<locals>.<genexpr>u   $     Ib	$''DGG*; <b   ,/)r)   r   r*   r+   r   r,   r-   r    r.   r/   r0   r1   r2   r3   r4   r5   r   r6   r7   iaimr8   s   `    r%   r*   zIDetect.__init__h   s   gt%'q&g,gaj/Q&[[^$tww.	LL!'')..twwA>Y*]AGGINN477Ar1aQR,STN2NN--9b99--IbIIr<   c                 F   g }| xj                   | j                  z  c_         t        | j                        D ]  } | j                  |    | j
                  |   ||               ||<    | j                  |   ||         ||<   ||   j                  \  }}}}||   j                  || j                  | j                  ||      j                  ddddd      j                         ||<   | j                   r| j                  |   j                  dd ||   j                  dd k7  r;| j                  ||      j                  ||   j                         | j                  |<   ||   j#                         }|dddf   dz  dz
  | j                  |   z   | j$                  |   z  |dddf<   |dddf   dz  dz  | j&                  |   z  |dddf<   |j)                  |j                  |d	| j                                | j                   r|S t+        j,                  |d      |fS r>   )rD   rE   rF   r-   r7   r   r   rG   r3   r    r   rH   rI   r0   rJ   rK   rL   rM   rP   r   rT   r.   rS   )	r$   r#   rZ   r[   r\   r]   r^   r_   r`   s	            r%   re   zIDetect.forwardw   s   $twwA466!9ZTWWQZ!-.AaD4771:ad#AaDaDJJMB2rQ499R$''2r:BB1aAqQ\\^AaD==99Q<%%a*adjj1o=#'??2r#:#=#=adkk#JDIIaLaDLLN ac{R/#5		!DTUV#qs( ac{Q14t7G7G7JJ#qs(B01   MMq;		!Q';;r<   c                 6   g }| xj                   | j                  z  c_         t        | j                        D ]L  } | j                  |   ||         ||<   ||   j
                  \  }}}}||   j                  || j                  | j                  ||      j                  ddddd      j                         ||<   | j                   r| j                  |   j
                  dd ||   j
                  dd k7  r;| j                  ||      j                  ||   j                        | j                  |<   ||   j                         }t         j"                  j%                         s]|dddf   dz  dz
  | j                  |   z   | j&                  |   z  |dddf<   |dddf   dz  dz  | j(                  |   z  |dddf<   n|j+                  dd| j,                  dz   fd      \  }	}
}|	d| j&                  |   z  z  | j&                  |   | j                  |   dz
  z  z   }	|
dz  d| j(                  |   j.                  z  z  }
t!        j0                  |	|
|fd      }|j3                  |j                  |d	| j                               O | j                   r|}|S | j4                  rt!        j0                  |d      }|S | j6                  r| j9                  |      }|f}|S | j:                  rt!        j0                  |d      }|S t!        j0                  |d      |f}|S r>   rC   rY   s                r%   fuseforwardzIDetect.fuseforward   s   $twwA466!9QqT?AaDaDJJMB2rQ499R$''2r:BB1aAqQ\\^AaD==99Q<%%a*adjj1o=#'??2r#:#=#=adkk#JDIIaLaDLLNzz335#$S!A#X;#3c#9DIIaL#HDKKXYN"ZAc1Q3hK#$S!A#X;?q"84;K;KA;N"NAc1Q3hK#$77Aq$''A++>#BLBDrDKKN23t{{1~STX[I[7\]BqA(8(8(;(@(@$@AB		2r4.!4AB01%  ( ==C 
 \\))Aq/C 
 QA%C 
 [[))Aq/C 
 99Q?A&C
r<   c           
         t        d       t        t        | j                              D ]  }| j                  |   j                  j
                  \  }}}}| j                  |   j                  j
                  \  }}}}| j                  |   xj                  t        j                  | j                  |   j                  j                  ||      | j                  |   j                  j                  ||            j                  d      z  c_         t        t        | j                              D ]  }| j                  |   j                  j
                  \  }}}}| j                  |   xj                  | j                  |   j                  j                  |      z  c_        | j                  |   xj                  | j                  |   j                  j                  dd      z  c_         y )NzIDetect.fuser   r   printrF   r,   r7   weightrG   r   implicitbiasr.   matmulreshapesqueezer   	transposer$   r[   c1c2r]   c1_c2_s          r%   fusezIDetect.fuse   sf   ns466{#Aq	((..IBr!A771:..44LCQqFF1INNell466!9+;+;+C+CBr+J477ST:K^K^KfKfgjknKopxxyz{{N $ s466{#A,,22JBr1QFF1INNdggaj1199"==NFF1I
 3 3 = =a BB $r<   c                     t        j                  t        j                  |      t        j                  |       g      \  }}t        j                  ||fd      j	                  dd|| df      j                         S rg   rh   rl   s       r%   rJ   zIDetect._make_grid   ro   r<   c                    t        j                  |d      }|d d d d d df   }|d d d d ddf   }|d d d d dd f   }||z  }t        j                  g dg dg dg dgt         j                  |j                        }||z  }||fS rq   rt   rv   s         r%   rW   zIDetect.convert   rz   r<   r{   r~   r   r   r   rP   rE   rU   rV   rX   r*   re   r   r   r   rJ   rW   r   r   s   @r%   r   r   a   sN    FFGKFJ<*$LC H H
r<   r   c                   @     e Zd ZdZdZd fd	Zd Zedd       Z xZ	S )	IKeypointNFc                 <    t         t                   | _        | _        | _        |dz    _        d j                  z   _         j                   j                  z    _        t        |       _
        t        |d         dz   _        t        j                  d      g j                  z   _        d _        t        j                   |      j#                         j%                   j                  dd      } j'                  d|        j'                  d	|j)                         j%                   j                  ddddd             t*        j-                   fd
|D               _        t*        j-                  d |D               _        t*        j-                   fd|D               _         j                  Z j
                  r+t*        j-                   fd|D               _        | _        y t*        j-                   fd|D               _        | _        y )Nr   r?   r   r   r   Fr   r   r   c              3   z   K   | ]2  }t         j                  |j                  j                  z  d        4 ywr   )r   r   no_detr    r!   s     r%   r&   z%IKeypoint.__init__.<locals>.<genexpr>   s,     Rr!ryyDKK$'',A1Err(   c              3   2   K   | ]  }t        |        y wr   r   r   s     r%   r&   z%IKeypoint.__init__.<locals>.<genexpr>   r   r   c              3   b   K   | ]&  }t        j                  j                  z         ( y wr   )r   r   r    r   s     r%   r&   z%IKeypoint.__init__.<locals>.<genexpr>   s$     M"Q	$++*? @"r   c              3     K   | ]  }t         j                  t        ||d       t        ||      t        ||d       t        ||      t        ||d       t        ||      t        ||d       t        ||      t        ||d       t        ||      t        ||d       t         j	                  |j
                  j                  z  d              yw)r?   )kr   N)r   
SequentialDWConvConvr   no_kptr    r!   s     r%   r&   z%IKeypoint.__init__.<locals>.<genexpr>   s      +r oqij MM&A*;T!AY*0A*;T!QZ*0A*;T!AY*0A*;T!QZ*0A*;T!QZ*0A*;RYYq$++X\X_X_J_ab=ce
 oqs   CCc              3   z   K   | ]2  }t         j                  |j                  j                  z  d        4 ywr   )r   r   r   r    r!   s     r%   r&   z%IKeypoint.__init__.<locals>.<genexpr>   s/     *^[]VW299Qdgg8Mq+Q[]r(   )r)   r   r*   r+   nkptdw_conv_kptr   r   r   r,   r-   r    r.   r/   r0   	flip_testr1   r2   r3   r4   r5   r   r6   r7   r   r   m_kptinplace)	r$   r+   r   r   r9   r   r   r:   r;   s	   `       r%   r*   zIKeypoint.__init__   s   i')	&!V		k++dkk)g,gaj/Q&[[^$tww.	LL!'')..twwA>Y*]AGGINN477Ar1aQR,STRrRR--9b99--M"MM99 ]] +r oq+r r
   ]]*^[]*^^
r<   c                 	   g }| xj                   | j                  z  c_         t        | j                        D ]d  }| j                  | j                  dk(  rB | j
                  |    | j                  |    | j                  |   ||                     ||<   nnt        j                   | j
                  |    | j                  |    | j                  |   ||                      | j                  |   ||         fd      ||<   ||   j                  \  }}}}||   j                  || j                  | j                  ||      j                  ddddd      j!                         ||<   ||   dd df   }||   ddd f   }	| j                   rY| j"                  |   j                  dd ||   j                  dd k7  r;| j%                  ||      j'                  ||   j(                        | j"                  |<   | j"                  |   dddf   }
| j"                  |   dddf   }| j                  dk(  r||   j+                         }n|j+                         }| j,                  r9|dddf   d	z  d
z
  | j"                  |   z   | j.                  |   z  }|dddf   dz  dz  | j0                  |   j                  d| j                  ddd      z  }| j                  dk7  r|	dd d df   d	z  d
z
  |
j3                  ddddd      z   | j.                  |   z  |	ddd df<   |	ddd df   d	z  d
z
  |j3                  ddddd      z   | j.                  |   z  |	ddd df<   |	ddd df   j+                         |	ddd df<   t        j                  |||ddd f   |	fd      }n|dddf   d	z  d
z
  | j"                  |   z   | j.                  |   z  }|dddf   dz  dz  | j0                  |   z  }| j                  dk7  rT|ddd f   d	z  d
z
  | j"                  |   j3                  dddd| j                  f      z   | j.                  |   z  |ddd f<   t        j                  |||ddd f   fd      }|j5                  |j                  |d| j                               g | j                   r|S t        j                  |d      |fS )Nr   r   )axisr?   r@   r   .   rA   rB      r   dim)rD   rE   rF   r-   r   r   r7   r   r.   rS   r   rG   r3   r    r   rH   rI   r0   rJ   rK   rL   rM   r   rP   r   repeatrT   )r$   r#   rZ   r[   r\   r]   r^   r_   x_detx_kpt
kpt_grid_x
kpt_grid_yr`   ra   rb   s                  r%   re   zIKeypoint.forward   s   $twwAyy DIIqL!twwqz)$&&)JDGGAJqt,<"=>!yy*$''!*YTVVAYztwwqz!A$7G-H"I=4::VW=YZ[\Y]K^!_fgh!aDJJMB2rQ499R$''2r:BB1aAqQ\\^AaDaDbqbMEaDabME==99Q<%%a*adjj1o=#'??2r#:#=#=adkk#JDIIaL!YYq\#qs(3
!YYq\#qs(3
99>!AA<<C1H+*S0499Q<?4;;q>QBC1H+/a/$2B2B12E2J2J1dggWXZ[]^2__ByyA~,1#ss(Ob,@3,FIZIZ[\]^_`abceIf,fjnjujuvwjx+xc14a4i(,1#qt!t),<r,AC,G*J[J[\]^_`abcdfJg,gkokvkvwxky+yc14a4i( ,1add+;+C+C+Ec14a4i(		2r1S!"W:u"=RHA C1H+*S0499Q<?4;;q>QBC1H+/a/$2B2B12EEByyA~&'QRj2o&;diil>Q>QSTUVWXYZ[_[d[dRe>f&fjnjujuvwjx%x#qr'
		2r1S!"W:"6;AB01c  f MMq;		!Q';;r<   c                     t        j                  t        j                  |      t        j                  |       g      \  }}t        j                  ||fd      j	                  dd|| df      j                         S rg   rh   rl   s       r%   rJ   zIKeypoint._make_grid1  ro   r<   )r|   r}   r   r}   TFr~   
r   r   r   rP   rE   r*   re   r   rJ   r   r   s   @r%   r   r      s/    FF D7<r H Hr<   r   c                   ^     e Zd ZdZdZdZdZdZd	 fd	Zd Z	d Z
d Zed
d       Zd Z xZS )
IAuxDetectNFc                     t         t                   | _        |dz    _        t        |       _        t        |d         dz   _        t        j                  d      g j                  z   _
        t        j                  |      j                         j                   j                  dd      } j                  d|        j                  d|j                         j                   j                  ddddd             t         j#                   fd|d  j                   D               _        t         j#                   fd	| j                  d  D               _        t         j#                  d
 |d  j                   D               _        t         j#                   fd|d  j                   D               _        y )Nr   r   r   r   r   r   r   c              3   z   K   | ]2  }t         j                  |j                  j                  z  d        4 ywr   r   r!   s     r%   r&   z&IAuxDetect.__init__.<locals>.<genexpr>H  s,     X<aryyDGGdgg,=qA<r(   c              3   z   K   | ]2  }t         j                  |j                  j                  z  d        4 ywr   r   r!   s     r%   r&   z&IAuxDetect.__init__.<locals>.<genexpr>I  s,     YLq		!TWWtww-> BLr(   c              3   2   K   | ]  }t        |        y wr   r   r   s     r%   r&   z&IAuxDetect.__init__.<locals>.<genexpr>K  s     Cl	!lr   c              3   b   K   | ]&  }t        j                  j                  z         ( y wr   r   r   s     r%   r&   z&IAuxDetect.__init__.<locals>.<genexpr>L  s$     Sl	$''DGG*; <lr   )r)   r   r*   r+   r   r,   r-   r    r.   r/   r0   r1   r2   r3   r4   r5   r   r6   r7   m2r   r   r8   s   `    r%   r*   zIAuxDetect.__init__>  sD   j$(*q&g,gaj/Q&[[^$tww.	LL!'')..twwA>Y*]AGGINN477Ar1aQR,STX2htww<XX--YBtwwxLYY--Cb$''lCC--Sb$''lSSr<   c                    g }| xj                   | j                  z  c_         t        | j                        D ]  } | j                  |    | j
                  |   ||               ||<    | j                  |   ||         ||<   ||   j                  \  }}}}||   j                  || j                  | j                  ||      j                  ddddd      j                         ||<    | j                  |   ||| j                  z            ||| j                  z   <   ||| j                  z      j                  || j                  | j                  ||      j                  ddddd      j                         ||| j                  z   <   | j                   r^| j                  |   j                  dd ||   j                  dd k7  r;| j                  ||      j!                  ||   j"                        | j                  |<   ||   j%                         }t&        j(                  j+                         s]|dddf   dz  dz
  | j                  |   z   | j,                  |   z  |dddf<   |dddf   dz  dz  | j.                  |   z  |dddf<   n|j1                  dd| j2                  dz   fd      \  }	}
}|	d| j,                  |   z  z  | j,                  |   | j                  |   dz
  z  z   }	|
dz  d| j.                  |   j4                  z  z  }
t'        j6                  |	|
|fd      }|j9                  |j                  |d	| j                                | j                   r|S t'        j6                  |d      |d | j                   fS r>   )rD   rE   rF   r-   r7   r   r   rG   r3   r    r   rH   rI   r   r0   rJ   rK   rL   rM   r.   rN   rO   rP   r   rQ   r+   rR   rS   rT   )r$   r#   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   s               r%   re   zIAuxDetect.forwardN  s"   $twwA466!9ZTWWQZ!-.AaD4771:ad#AaDaDJJMB2rQ499R$''2r:BB1aAqQ\\^AaD%4771:a$''	l3AaiLQtwwY<,,R$''2rJRRSTVWYZ\]_`allnAaiL==99Q<%%a*adjj1o=#'??2r#:#=#=adkk#JDIIaLaDLLNzz335#$S!A#X;#3c#9DIIaL#HDKKXYN"ZAc1Q3hK#$S!A#X;?q"84;K;KA;N"NAc1Q3hK#$77Aq$''A++>#BLBDrDKKN23t{{1~STX[I[7\]BqA(8(8(;(@(@$@AB		2r4.!4AB01-  0 MMqE		!Q8DGG'EEr<   c           	         g }| xj                   | j                  z  c_         t        | j                        D ]+  } | j                  |   ||         ||<   ||   j
                  \  }}}}||   j                  || j                  | j                  ||      j                  ddddd      j                         ||<   | j                   r| j                  |   j
                  dd ||   j
                  dd k7  r;| j                  ||      j                  ||   j                        | j                  |<   ||   j                         }t         j"                  j%                         s]|dddf   dz  dz
  | j                  |   z   | j&                  |   z  |dddf<   |dddf   dz  dz  | j(                  |   z  |dddf<   nx|dddf   dz  dz
  | j                  |   z   | j&                  |   z  }	|dddf   dz  dz  | j(                  |   j*                  z  }
t!        j,                  |	|
|ddd f   fd	      }|j/                  |j                  |d	| j                               . | j                   r|}|S | j0                  rt!        j,                  |d      }|S | j2                  r| j5                  |      }|f}|S | j6                  rt!        j,                  |d      }|S t!        j,                  |d      |f}|S r>   )rD   rE   rF   r-   r7   rG   r3   r    r   rH   rI   r0   rJ   rK   rL   rM   r.   rN   rO   rP   r   rR   rS   rT   rU   rV   rW   rX   )r$   r#   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rd   s               r%   r   zIAuxDetect.fuseforwardl  s   $twwA466!9QqT?AaDaDJJMB2rQ499R$''2r:BB1aAqQ\\^AaD==99Q<%%a*adjj1o=#'??2r#:#=#=adkk#JDIIaLaDLLNzz335#$S!A#X;#3c#9DIIaL#HDKKXYN"ZAc1Q3hK#$S!A#X;?q"84;K;KA;N"NAc1Q3hKC1H+*S0499Q<?4;;q>QBC1H+/a/$2B2B12E2J2JJB		2r1S!"W:"6;AB01#  & ==C 
 \\))Aq/C 
 QA%C 
 [[))Aq/C 
 99Q?A&C
r<   c           
         t        d       t        t        | j                              D ]  }| j                  |   j                  j
                  \  }}}}| j                  |   j                  j
                  \  }}}}| j                  |   xj                  t        j                  | j                  |   j                  j                  ||      | j                  |   j                  j                  ||            j                  d      z  c_         t        t        | j                              D ]  }| j                  |   j                  j
                  \  }}}}| j                  |   xj                  | j                  |   j                  j                  |      z  c_        | j                  |   xj                  | j                  |   j                  j                  dd      z  c_         y )NzIAuxDetect.fuser   r   r   r   s          r%   r   zIAuxDetect.fuse  sg    s466{#Aq	((..IBr!A771:..44LCQqFF1INNell466!9+;+;+C+CBr+J477ST:K^K^KfKfgjknKopxxyz{{N $ s466{#A,,22JBr1QFF1INNdggaj1199"==NFF1I
 3 3 = =a BB $r<   c                     t        j                  t        j                  |      t        j                  |       g      \  }}t        j                  ||fd      j	                  dd|| df      j                         S rg   rh   rl   s       r%   rJ   zIAuxDetect._make_grid  ro   r<   c                    t        j                  |d      }|d d d d d df   }|d d d d ddf   }|d d d d dd f   }||z  }t        j                  g dg dg dg dgt         j                  |j                        }||z  }||fS rq   rt   rv   s         r%   rW   zIAuxDetect.convert  rz   r<   r{   r~   r   r   s   @r%   r   r   7  sO    FFGKFT F<#JC H H
r<   r   c                   @     e Zd ZdZdZd fd	Zd Zedd       Z xZ	S )IBinNFc                     t         t                   | _        | _        t         j                  dd       _        t         j                  dd       _        |dz    j                  j                         z    j                  j                         z    _	        t        |       _        t        |d         dz   _        t        j                  d      g j                  z   _        t        j                   |      j#                         j%                   j                  dd      } j'                  d	|        j'                  d
|j)                         j%                   j                  ddddd             t*        j-                   fd|D               _        t*        j-                  d |D               _        t*        j-                   fd|D               _        y )Ng        g      @)	bin_countminmaxr?   r   r   r   r   r   r   c              3   z   K   | ]2  }t         j                  |j                  j                  z  d        4 ywr   r   r!   s     r%   r&   z IBin.__init__.<locals>.<genexpr>  r'   r(   c              3   2   K   | ]  }t        |        y wr   r   r   s     r%   r&   z IBin.__init__.<locals>.<genexpr>  r   r   c              3   b   K   | ]&  }t        j                  j                  z         ( y wr   r   r   s     r%   r&   z IBin.__init__.<locals>.<genexpr>  r   r   )r)   r   r*   r+   r   r   w_bin_sigmoidh_bin_sigmoid
get_lengthr   r,   r-   r    r.   r/   r0   r1   r2   r3   r4   r5   r   r6   r7   r   r   )r$   r+   r   r9   r   r:   r;   s   `     r%   r*   zIBin.__init__  sh   dD"$"'$..csS'$..csSq&))+,.2.@.@.K.K.MN g,gaj/Q&[[^$tww.	LL!'')..twwA>Y*]AGGINN477Ar1aQR,STN2NN--9b99--IbIIr<   c           	      z   d| j                   _        d| j                  _        g }| xj                  | j                  z  c_        t        | j                        D ]:  } | j                  |    | j                  |   ||               ||<    | j                  |   ||         ||<   ||   j                  \  }}}}||   j                  || j                  | j                  ||      j                  ddddd      j                         ||<   | j                  r| j                   |   j                  dd ||   j                  dd k7  r;| j#                  ||      j%                  ||   j&                        | j                   |<   ||   j)                         }|dddf   dz  d	z
  | j                   |   z   | j*                  |   z  |dddf<   | j                   j-                  |ddd
f         | j.                  |   d   z  }	| j                  j-                  |dd
df         | j.                  |   d   z  }
|	|d<   |
|d<   t1        j2                  |dddf   |ddd f   fd      }|j5                  |j                  |d|j                  d                = | j                  r|S t1        j2                  |d      |fS )NTr   r   r?   r@   r   .rA   rB      .r   .   .r   ).r   ).r?   r   r   )r   use_fw_regressionr   rD   rE   rF   r-   r7   r   r   rG   r3   r    r   rH   rI   r0   rJ   rK   rL   rM   rP   re   r   r.   rS   rT   )r$   r#   rZ   r[   r\   r]   r^   r_   r`   pwphs              r%   re   zIBin.forward  s    04,/3, $twwA466!9ZTWWQZ!-.AaD4771:ad#AaDaDJJMB2rQ499R$''2r:BB1aAqQ\\^AaD==99Q<%%a*adjj1o=#'??2r#:#=#=adkk#JDIIaLaDLLN ac{R/#5		!DTUV#qs( ''//#qt)=@P@PQR@STZ@[[''//#r"u*>AQAQRSATU[A\\ &	&	IIqac{Ac23hK8bAB459  < MMq;		!Q';;r<   c                     t        j                  t        j                  |      t        j                  |       g      \  }}t        j                  ||fd      j	                  dd|| df      j                         S rg   rh   rl   s       r%   rJ   zIBin._make_grid  ro   r<   )r|   r}   r}      r~   r   r   s   @r%   r   r     s/    FFJ.(<T H Hr<   r   c                   r     e Zd Zd fd	ZddZddZddZddZddZddZ	d Z
d	 Zdd
Zd ZddZ xZS )Modelc           
         t         t        |           d| _        t	        |t
              r|| _        nTdd l}t        |      j                  | _	        t        |      5 }|j                  ||j                        | _        d d d        | j                  j                  d|      x}| j                  d<   |rI|| j                  d   k7  r7t        j                  d| j                  d    d|        || j                  d<   |r0t        j                  d|        t!        |      | j                  d	<   t#        t%        | j                        |g
      \  | _        | _        t+        | j                  d         D cg c]  }t-        |       c}| _        | j&                  d   }t	        |t0              rd}	t3        j4                  | j7                  t3        j8                  d||	|	            D 
cg c]  }
|	|
j:                  d   z   c}
      |_        t?        |       |xj@                  |j<                  jC                  ddd      z  c_         |j<                  | _        | jE                          t	        |tF              rd}	t3        j4                  | j7                  t3        j8                  d||	|	            D 
cg c]  }
|	|
j:                  d   z   c}
      |_        t?        |       |xj@                  |j<                  jC                  ddd      z  c_         |j<                  | _        | jE                          t	        |tH              rd}	t3        j4                  | j7                  t3        j8                  d||	|	            d d D 
cg c]  }
|	|
j:                  d   z   c}
      |_        t?        |       |xj@                  |j<                  jC                  ddd      z  c_         |j<                  | _        | jK                          t	        |tL              rd}	t3        j4                  | j7                  t3        j8                  d||	|	            D 
cg c]  }
|	|
j:                  d   z   c}
      |_        t?        |       |xj@                  |j<                  jC                  ddd      z  c_         |j<                  | _        | jO                          t	        |tP              rd}	t3        j4                  | j7                  t3        j8                  d||	|	            D 
cg c]  }
|	|
j:                  d   z   c}
      |_        t?        |       |xj@                  |j<                  jC                  ddd      z  c_         |j<                  | _        | jS                          tU        |        | j                          t        j                  d       y # 1 sw Y   NxY wc c}w c c}
w c c}
w c c}
w c c}
w c c}
w )NFr   )Loaderr9   r+   zOverriding model.yaml nc=z	 with nc=z+Overriding model.yaml anchors with anchors=r   )r9   r      r   r@    )+r)   r   r*   traced
isinstancedictyamlPathname	yaml_fileopenload
SafeLoadergetloggerinforoundparse_modelr   modelsaverF   strnamesr   r.   r1   re   r/   rG   rP   r   r   r3   _initialize_biasesr   r   _initialize_aux_biasesr   _initialize_biases_binr   _initialize_biases_kptr   )r$   cfgr9   r+   r   r   fr[   r7   sr#   r;   s              r%   r*   zModel.__init__  s   eT#%c4 DI!#Y^^DNca IIaI@	   $yy}}T266TYYt_"		$'KK3DIIdO3DIbTRS DIIdOKKEgYOP#(>DIIi  +HTYY,?RD I
DI&+DIIdO&<=&<c!f&<=
 JJrNa A||dll5;;WXZ\^_abKc>d$e>dQ_>d$efAHq!IIr1a00I((DK##%a!A||dll5;;WXZ\^_abKc>d$e>dQ_>d$efAHq!IIr1a00I((DK##%a$A||dll5;;WXZ\^_abKc>degfg>h$i>hQ_>h$ijAHq!IIr1a00I((DK'')aA||dll5;;WXZ\^_abKc>d$e>dQ_>d$efAHq!IIr1a00I((DK'')a#A||dll5;;WXZ\^_abKc>d$e>dQ_>d$efAHq!IIr1a00I((DK'') 	4 		B}  > %f %f %j %f %fs0   #W7W*W5W"W'W,W1Wc           	         |r|j                   dd  }g d}g d}g }t        ||      D ]  \  }}	t        |	r|j                  |	      n||t	        | j
                  j                                     }
| j                  |
      d   }|dd dfxx   |z  cc<   |	dk(  r|d   |d	   z
  |d	<   n|	d
k(  r|d   |d   z
  |d<   |j                  |        t        j                  |d      d fS | j                  ||      S )Nr   )r   g(\?gq=
ףp?)Nr?   N)gsr   .r@   r   r   r?   r   r   )rG   zipr   flipintrP   r   forward_oncerT   r.   rS   )r$   r#   augmentprofileimg_sizer  r  r`   sifixiyis               r%   re   zModel.forwardE  s    wwrs|HAAAa)BRqvvbzQs4;;??CT?UV&&r*1-37r!7!)!r&z!9BvJ1W!)!r&z!9BvJ $ 99Q?D(($$Q00r<   c                 \   g g }}| j                   D ]  }|j                  dk7  rMt        |j                  t              r||j                     n#|j                  D cg c]  }|dk(  r|n||    c}}t	        | d      sd| _        | j
                  rCt        |t              s0t        |t              s t        |t              st        |t              r n;|rt        |t        t        t        t        f      }t        r4t        j                  ||r|j                         n|fd      d   dz  dz  nd}t        d      D ]  }	 ||r|j                         n|        t               }
t        d      D ]  }	 ||r|j                         n|        |j!                  t               |
z
  d	z         t#        d
||j$                  |d   |j&                  fz          ||      }|j!                  |j(                  | j*                  v r|nd         |rt#        dt-        |      z         |S c c}w )Nr   r   F)inputsverboser   g    eAr   
   d   z%10.1f%10.0f%10.1fms %-40sz%.1fms total)r  r  r   r  hasattrr   r   r   r   r   r   thopr  copyrF   r	   rT   r   nptyper[   r	  sum)r$   r#   r  r`   dtr7   jcor]   ts              r%   r  zModel.forward_onceY  s   B2Assby(c2AaccFYZY\Y\8]Y\TUa2g1Q49OY\8]4*!{{a(Jq',BjQRT^F_cmnoqzc{q67J"EFcgDLLAFFHq+BERSTUX[[^__mnrA!affh+ #%'rA!affh+ #		,.2c9:2ar"vqvv5NNO!AHH!##*Q51 4 .3r7*+5 9^s   H)c           	      j   | j                   d   }t        |j                  |j                        D ]   \  }}|j                  j                  |j                  d      }|j                  d d dfxx   t        j                  dd|z  dz  z        z  cc<   |j                  d d dd fxx   |%t        j                  d|j                  dz
  z        n%t        j                  ||j                         z        z  cc<   t        j                  j                  |j                  d      d	
      |_         y Nr   r@        r   r   333333?Gz?Trequires_gradr  r  r7   rP   r   r3   r    rR   mathlogr+   r.   r*  r   	Parameterr$   cfr7   mir  bs         r%   r  zModel._initialize_biasesy       JJrNahh'EBQTT2&AFF1a4LDHHQ#'a%788LFF1ab5MbjTXXcQTTD[&9:eiiXZ]_]c]c]eXeNffMhh((4(HBG	 (r<   c           	      v   | j                   d   }t        |j                  |j                  |j                        D ]  \  }}}|j
                  j                  |j                  d      }|j                  d d dfxx   t        j                  dd|z  dz  z        z  cc<   |j                  d d dd fxx   |%t        j                  d|j                  dz
  z        n%t        j                  ||j                         z        z  cc<   t        j                  j                  |j                  d      d	
      |_        |j
                  j                  |j                  d      }|j                  d d dfxx   t        j                  dd|z  dz  z        z  cc<   |j                  d d dd fxx   |%t        j                  d|j                  dz
  z        n%t        j                  ||j                         z        z  cc<   t        j                  j                  |j                  d      d	
      |_         y r1  )r  r  r7   r   rP   r   r3   r    rR   r9  r:  r+   r.   r*  r   r;  )r$   r=  r7   r>  mi2r  r?  b2s           r%   r  zModel._initialize_aux_biases  s    JJrNacc1442JBQQTT2&AFF1a4LDHHQ#'a%788LFF1ab5MbjTXXcQTTD[&9:eiiXZ]_]c]c]eXeNffMhh((4(HBGqttR(BGGAqDMTXXa37q.&899MGGAqrENrzdhhsaddTk':;uyyY[^`^d^d^fYfOggNxx))"''"+T)JCH 3r<   c           	      n   | j                   d   }|j                  }t        |j                  |j                        D ]v  \  }}|j
                  j                  |j                  d      }|d d ddd|dz   ff   j                  }d|z  dz   }|d d d |f   xj                  t        j                  d|dz   dz
  z        z  c_        |d d |f   xj                  t        j                  d	d
|z  dz  z        z  c_        |d d |dz   d f   xj                  |%t        j                  d|j                  dz
  z        n%t        j                  ||j                         z        z  c_        ||d d ddd|dz   ff   _        t        j                  j                  |j                  d      d      |_        y y )Nr   r   r   r   r?   r@   r4  r5  r2  r3  Tr6  )r  r   r  r7   rP   r   r3   r    rR   r9  r:  r+   r.   r*  r   r;  )	r$   r=  r7   bcr>  r  r?  oldobj_idxs	            r%   r  zModel._initialize_biases_bin  sv    JJrN[[ahh'EBQTT2&AA!Abd|O$))Cd1fGa'kN488C26D=,A#BBajM$((1aA~+=">>a'!)o##
txxqttd{0C'DX]XaXabdgigmgmgoboXpp#&)Aa!Aa1o#hh((4(HBG (r<   c           	      j   | j                   d   }t        |j                  |j                        D ]   \  }}|j                  j                  |j                  d      }|j                  d d dfxx   t        j                  dd|z  dz  z        z  cc<   |j                  d d dd fxx   |%t        j                  d|j                  dz
  z        n%t        j                  ||j                         z        z  cc<   t        j                  j                  |j                  d      d	
      |_         y r1  r8  r<  s         r%   r  zModel._initialize_biases_kpt  r@  r<   c                 x   | j                   d   }|j                  D ]  }|j                  j                         j	                  |j
                  d      j                  }t        d|j                  j                  d   g|d d j                  d      j                         |dd  j                         z          y )Nr   z4%6g Conv2d.bias:%10.3g%10.3g%10.3g%10.3g%10.3g%10.3gr   r   )r  r7   r   detachr3   r    Tr   r   rG   meantolist)r$   r7   r>  r?  s       r%   _print_biaseszModel._print_biases  s    JJrN##B %%addB/11A49K8saPRQRejjYZmNbNbNd8sfghihjfkfpfpfr8sst r<   c                 .   t        d       | j                  j                         D ]  }t        |t              r|j                          $t        |t              r|j                          Et        |      t        u rOt        |d      rCt        |j                  |j                        |_        t        |d       |j                  |_        t        |t"        t$        f      s|j'                          |j                  |_         | j)                          | S )NzFusing layers... bn)r   r  modulesr   RepConvfuse_repvgg_blockRepConv_OREPAswitch_to_deployr)  r   r%  r
   convrP  delattrr   re   r   r   r   r  r$   r7   s     r%   r   z
Model.fuse  s    !"##%A!W%##%A}-""$aDWQ%5)!&&!$$74 MM	A45MM	 & 			r<   c                    t        | j                  d         t        u }|r{|syt        d       t               }d|_        | j                  d   j
                  dz   |_        | j                  j                  d|j
                  z  |       | j                          | S |s!|rt        d       | j                  d d | _        | S )Nr   zAdding NMS... r   z%s)r   modulezRemoving NMS... )r)  r  NMSr   r  r[   
add_moduleeval)r$   modepresentr7   s       r%   nmsz	Model.nms  s    tzz"~&#-"#AAC**R.""Q&ACJJ!!taccz!!<IIK  '$%CRDJr<   c                 P    t        d       t        |       }t        || dd       |S )NzAdding autoShape... )r   r+   hypr  rP   r}   )includeexclude)r   	autoShaper   rX  s     r%   	autoshapezModel.autoshape  s)    $%dO!T#KUWXr<   c                     t        | ||       y r   )r   )r$   r"  r  s      r%   r  z
Model.info  s    4(+r<   )yolor-csp-c.yamlr?   NN)FF)Fr   )T)Fr3  )r   r   r   r*   re   r  r  r  r  r  rN  r   r`  rf  r  r   r   s   @r%   r   r     sG    FP1(@IKIIu&,r<   r   c                     t         j                  ddz         | d   | d   | d   | d   f\  }}}}t        |t              rt	        |d         dz  n|}||d	z   z  }g g |d
   }
}	}t        | d   | d   z         D ]
  \  \  }}}}t        |t              rt        |      n|}t        |      D ]&  \  }}	 t        |t              rt        |      n|||<   ( |dkD  rt        t        ||z        d      n|}|g t        j                  t        t        t        t        t         t"        t$        t&        t(        t*        t,        t.        t0        t2        t4        t6        t8        t:        t<        t>        t@        tB        tD        tF        tH        tJ        tL        tN        tP        tR        tT        tV        tX        tZ        t\        t^        t`        tb        td        tf        th        tj        tl        tn        tp        tr        tt        tv        tx        tz        t|        t~        t        v r||   |d   }
}|
|k7  rt        |
|z  d      }
||
g|dd  }|t&        t,        t.        t<        t>        t@        tD        tF        tH        tL        tN        tP        tT        tV        tX        t\        t^        t`        td        tf        th        tl        tn        tp        tt        tv        tx        t|        t~        t        fv r^|j                  d|       d}nH|t        j                  u r||   g}n.|t        u rt        |D cg c]  }||   	 c}      }
n|t        u rt        |D cg c]  }||   	 c}      }
n|t        u r	||d      }
n|t        u r	||   dz  }
n|t        t        t        t        t        fv r`|j                  |D cg c]  }||   	 c}       t        |d   t              rot        t        |d   dz              gt	        |      z  |d<   nD|t        u r	||   dz  }
n3|t        u r||   |d   dz  z  }
n|t        u r||   |d   dz  z  }
n||   }
|dkD  r,t        j                  t        |      D cg c]  } || 	 c} n || }t        |      dd j                  dd      }t        |j                         D cg c]  }|j                          c}      }|||f\  |_X        |_Y        |_Z        |_[        t         j                  d|||||fz         |	j                  fdt        |t              r|gn|D               |j                  |       dk(  rg }|j                  |
        t        j                  | t        |	      fS #  Y xY wc c}w c c}w c c}w c c}w c c}w )Nz
%3s%18s%3s%10s  %-40s%-30s)r   fromnparamsrZ  	argumentsr   r+   depth_multiplewidth_multipler   r   r   r   backboneheadr   r2  r@   r   z	__main__.r   z%3s%18s%3s%10.0f  %-40s%-30sc              3   4   K   | ]  }|d k7  s	|z    yw)r   Nr}   )r"   r#   r[   s     r%   r&   zparse_model.<locals>.<genexpr>(  s     Q$DabAE$Ds   

)^r  r  r   listr,   	enumerater
  r]  r   r  r   r   r   
RobustConvRobustConv2r   	GhostConvrR  rT  DownCSPPSPPFSPPCSPCGhostSPPCSPC	MixConv2dFocusStem	GhostStem	CrossConv
BottleneckBottleneckCSPABottleneckCSPBBottleneckCSPCRepBottleneckRepBottleneckCSPARepBottleneckCSPBRepBottleneckCSPCResResCSPAResCSPBResCSPCRepRes
RepResCSPA
RepResCSPB
RepResCSPCResXResXCSPAResXCSPBResXCSPCRepResXRepResXCSPARepResXCSPBRepResXCSPCGhost	GhostCSPA	GhostCSPB	GhostCSPCSwinTransformerBlockSTCSPASTCSPBSTCSPCSwinTransformer2BlockST2CSPAST2CSPBST2CSPCr   insertBatchNorm2dConcatr*  ChuncatShortcutFoldcutr   r   r   r   r   rT   r  rF   ReOrgContractExpandr   replace
parametersnumelr[   r  r)  r(  extendsorted)dr9   r   r+   gdgwr    r   layersr	  r   r  rk  r7   argsr,  r:   r   r#   r]   m_r/  r(  r[   s                          @r%   r  r    s[   
KK.1ccdI,$3C1DaHXFYYGRR#-gt#<#gaj/Q
'B	rAvB2r"v"DF'*&	(AB?Aq!T!!S)DGqdODAq%/3%7$q'QQ $ &'UCa"fq! 
C 
CD 
C* 
Ck 
C6 
C9 
Cg 
CWd 
Cfk 
C
C
C#
C%1
C3<
C>C
CEI
CKT
CV_
C
C+
C-;
C=K
C 
C !2
C 4E
C GX
C 	
C 	
C  '	
C )0	
C
 
C
 $
C
 &0
C
 2<
C 
C  
C "*
C ,4
C 
C &
C (3
C 5@
C 
C "
C $-
C /8
C &
C (.
C 06
C 8>
C '
C )0
C 29
C ;B
C 
C UDGBRx#BGQ/&T!"X&DUG\#^^&(9;LgwZx +{	9VVgw	0 	0 Aq!".. qE7D&[Q'QbeQ'(B'\Q'QbeQ'(B(]AaDB'\A!B67Ji@@KK*1A*+$q'3'd1gk 234s1v=Q%ZAB(]AaA%B&[A$q'Q,&BAB=>UR]]uQx8x!QXx894F1RL  b1R]]_5_!'')_56%&1b["bdBGRU2aAr1d5KKLQ:a+=QC1$DQQb6B
		"K CL ==&!6$<//CD (' + 95s*   4 V$V,
1V1
V6
	V;
W 
$V)__main__z--cfgrh  z
model.yaml)r)  defaulthelpz--devicer   z%cuda device, i.e. 0 or 0,1,2,3 or cpu)r  r  z	--profile
store_truezprofile model speed)actionr  r   r?   r3  T)r  )7argparseloggingsysr'  r   pathrT   	getLoggerr   r  r.   models.commonmodels.experimentalutils.autoanchorr   utils.generalr   r   r   utils.torch_utilsr	   r
   r   r   r   r   r   
utils.lossr   r&  ImportErrorr   Moduler   r   r   r   r   r   r  ArgumentParserparseradd_argumentr
  
parse_argsoptr  rL   rK   r  trainr  randimgr`   r}   r<   r%   <module>r     s     
   			8	$   ! / A A   !
GRYY GTnbii nbbH		 bHJw wtHH299 HHVa,BII a,HM0` z$X$$&F
c3ELY

B5\]
L?TU



C!CGM3::&F #''Nf%E	KKM
{{ejjAsC(++F3#t$  {  Ds   7G= =HH