
    Ӷf+                       d dl Z d dlmZ d dlmc 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Z G d dej                  Z G d d	ej                  Z G d
 dej                  Z G d dej                  Z G d de j        j                  Z G d de j        j                  Z G d de j        j                  Z G d d          Z G d d          Z G d d          Z G d d          ZdS )    N)bbox_ioubbox_alpha_ioubox_ioubox_gioubox_dioubox_ciou	xywh2xyxy)is_parallel皙?c                     dd| z  z
  d| z  fS )N      ?      ? epss    "/var/www/html/yolov7/utils/loss.py
smooth_BCEr      s    s?C#I%%    c                   &     e Zd Zd fd	Zd Z xZS )BCEBlurWithLogitsLoss皙?c                     t          t          |                                            t          j        d          | _        || _        d S )Nnone	reduction)superr   __init__nnBCEWithLogitsLossloss_fcnalpha)selfr!   	__class__s     r   r   zBCEBlurWithLogitsLoss.__init__   s@    #T**33555,v>>>


r   c                     |                      ||          }t          j        |          }||z
  }dt          j        |dz
  | j        dz   z            z
  }||z  }|                                S )N   -C6?)r    torchsigmoidexpr!   mean)r"   predtruelossdxalpha_factors         r   forwardzBCEBlurWithLogitsLoss.forward   si    }}T4((}T""D[59b1fd1B%CDDDyy{{r   )r   __name__
__module____qualname__r   r0   __classcell__r#   s   @r   r   r      sL             
      r   r   c                   :     e Zd ZdZdZd fd	Zd	 Zd
 Zd Z xZ	S )
SigmoidBinNF
           r          @Tc	                    t          t          |                                            || _        |dz   | _        || _        || _        t          ||z
            | _        | j        dz  | _	        || _
        || _        || _        || _        || j        dz  | j        z  z   }	|| j        dz  | j        z  z
  }
| j        | j        z  }|| _        t          j        |	|
dz   |                                          }|                     d|           dd|z  z
  | _        d|z  | _        t)          j        t          j        |g                    | _        t)          j                    | _        d S )Nr%   r;   r&   binsr   r   
pos_weight)r   r8   r   	bin_countlengthminmaxfloatscaleshiftuse_loss_regressionuse_fw_regression	reg_scale
BCE_weightstepr'   rangeregister_buffercpcnr   r   TensorBCEbinsMSELoss)r"   r@   rB   rC   rI   rG   rH   rJ   
smooth_epsstartendrK   r=   r#   s                r   r   zSigmoidBin.__init__%   sM   j$((***"!m39%%
Z#%
#6 !2"$tz#~77TZ^t~55zDN*	 {5#,55;;==VT*** j((
"+u|ZL7Q7QRRRz||r   c                     | j         S N)rA   )r"   s    r   
get_lengthzSigmoidBin.get_lengthD   s
    {r   c                    |j         d         | j        k    sJ d|j         d         | j        fz              |d         | j        z  | j        dz  z
  | j        z  }|ddd| j        z   f         }t          j        |d          \  }}| j        |         }| j        r||z   }n|}|	                    | j
        | j                  }|S )	N0pred.shape[-1]=%d is not equal to self.length=%d.r   r;   .r%   dimrB   rC   )shaperA   rI   rK   r@   r'   rC   r=   rH   clamprB   )r"   r+   pred_regpred_bin_bin_idxbin_biasresults           r   r0   zSigmoidBin.forwardG   s    z"~,,,.`dhdnoqdrtxt  dA  /A,,,L4>1DN34FF$)SQ$. 0112YxR000
79W%! 	(FFF$(99r   c                 z   |j         d         | j        k    sJ d|j         d         | j        fz              |j         d         |j         d         k    s%J d|j         d         |j         d         fz              |j        }|d                                         | j        z  | j        dz  z
  | j        z  }|ddd| j        z   f         }t          j        |d	         | j	        z
            }t          j
        |d
          \  }}| j	        |         }	d|	_        ||	z   }
t          j        || j        |          }|j         d         }| j        |t          |          |f<   |                     ||          }| j        r|                     |
|          }||z   }n|}|
                    | j
        | j                  }||fS )NrZ   r[   r   z1pred.shape=%d is not equal to the target.shape=%dr\   r;   .r%   ).Nr]   Fdevicer_   )r`   rA   rj   r(   rI   rK   r@   r'   absr=   rB   requires_grad	full_likerO   rN   rL   rQ   rG   rR   ra   rC   )r"   r+   targetrj   rb   rc   diff_bin_targetrd   re   rf   rg   target_binsnloss_binloss_regressionr-   
out_results                    r   training_losszSigmoidBin.training_lossY   s   z"~,,,.`dhdnoqdrtxt  dA  /A,,,z!}Q///1dhlhrsthuw}  xD  EF  xG  hH  2H///L((**T^;dnS>PPTXT]]Q$. 0112)F9$5	$ABBYB777
79W%!&H$ohGGGJqM)-E!HHg%&<<+66# 	"ll66::Oo-DDD\\dhDH\==
Zr   )r9   r:   r   r;   TTr   r:   )
r2   r3   r4   strideexportr   rX   r0   ru   r5   r6   s   @r   r8   r8   !   st        FF$ $ $ $ $ $>    $             r   r8   c                   &     e Zd Zd fd	Zd Z xZS )	FocalLoss      ?      ?c                     t          t          |                                            || _        || _        || _        |j        | _        d| j        _        d S Nr   )r   ry   r   r    gammar!   r   r"   r    r~   r!   r#   s       r   r   zFocalLoss.__init__{   sN    i''))) 

!+"(r   c                 X   |                      ||          }t          j        |          }||z  d|z
  d|z
  z  z   }|| j        z  d|z
  d| j        z
  z  z   }d|z
  | j        z  }|||z  z  }| j        dk    r|                                S | j        dk    r|                                S |S )Nr%   r   r*   sum)r    r'   r(   r!   r~   r   r*   r   )r"   r+   r,   r-   	pred_probp_tr/   modulating_factors           r   r0   zFocalLoss.forward   s    }}T4((
 M$''	Y!d(q9}!==dj(AHTZ+HH 3Y4:5000>V##99;;^u$$88::Kr   rz   r{   r1   r6   s   @r   ry   ry   y   sL        ) ) ) ) ) )      r   ry   c                   &     e Zd Zd fd	Zd Z xZS )
QFocalLossrz   r{   c                     t          t          |                                            || _        || _        || _        |j        | _        d| j        _        d S r}   )r   r   r   r    r~   r!   r   r   s       r   r   zQFocalLoss.__init__   sN    j$((*** 

!+"(r   c                 Z   |                      ||          }t          j        |          }|| j        z  d|z
  d| j        z
  z  z   }t          j        ||z
            | j        z  }|||z  z  }| j        dk    r|                                S | j        dk    r|                                S |S )Nr%   r*   r   )	r    r'   r(   r!   rk   r~   r   r*   r   )r"   r+   r,   r-   r   r/   r   s          r   r0   zQFocalLoss.forward   s    }}T4((M$''	dj(AHTZ+HH!IdY&6774:E000>V##99;;^u$$88::Kr   r   r1   r6   s   @r   r   r      sL        ) ) ) ) ) )      r   r   c                   <    e Zd Zedd            Zed             ZdS )RankSortr   绽|=c                 N   t          j        |j                                                  }|dk    }||         }||         }t	          |          }	t          j        |          |z
  }
|dk    ||
k    z  }||         }t          j        t	          |                                                    }t          j        |	                                          }t          j        |	                                          }t          j        |	                                          }t          j        |          }|D ]}|||         z
  }|||         z
  }|dk    rAt          j        |d|z  z  dz   dd          }t          j        |d|z  z  dz   dd          }n0|dk                                    }|dk                                    }t          j	        |          }t          j	        |          }||z   }||z  ||<   t          j	        |d|z
  z            |z  }|||         k    }||z  }t          j	        |          }t          j	        |d|z
  z            |z  }||z
  ||<   ||k    r'||xx         ||         z  cc<   ||||         |z  z  z  }| |z  }t          j	        |          }||k    r'||xx         ||         z  cc<   ||||         |z  z  z  }||	z  ||<   ||	z  ||<   | 
                    |           |                                |                                fS )Nr:   r      r   r%   r_   )r'   zerosr`   cudalenrB   argsortra   rD   r   save_for_backwardr*   )ctxlogitstargetsdelta_RSr   classification_grads	fg_labels	fg_logits
fg_targetsfg_numthreshold_logitrelevant_bg_labelsrelevant_bg_logitsrelevant_bg_gradsorting_errorranking_errorfg_gradorderiifg_relationsbg_relationsrank_posFP_numrankcurrent_sorting_erroriou_relationstarget_sorted_orderrank_pos_targettarget_sorting_errormissorted_examplessorting_pmf_denoms                                  r   r0   zRankSort.forward   ss    #[66;;== r\	9%	Y'
Y  )I..x7$aZFO,CD#$67S);%<%<==BBDDk&))..00k&))..00F##((** mI&& :	V :	VB"9R=0L+IbM9L!||"[qz)B3)F1QRSSS"[qz)B3)F1QRSSS , 188:: , 188:: Y|,,H9\**F &D %TkM" %*IlAjL.I$J$J8$S! (:b>9M"/,"> $i(;<<O #(),?:,N"O"OP_"_  !68L LM" ||}R00 \=3DV3K%LM  %2/\!A !&	*< = = !3&&}R00.b0ABS0STU +2&.Y'3CF3J/02333!!##]%7%7%9%999r   c                 &    | j         \  }||z  d d d fS rW   saved_tensors)r   	out_grad1	out_grad2g1s       r   backwardzRankSort.backward  s    )|T4--r   N)r   r   r2   r3   r4   staticmethodr0   r   r   r   r   r   r      sR        Z: Z: Z: \Z:x . . \. . .r   r   c                   <    e Zd Zedd            Zed             ZdS )aLRPLossr   h㈵>c                    t          j        |j                                                  }|dk    }||         }t	          |          }	t          j        |          |z
  }
|dk    ||
k    z  }||         }t          j        t	          |                                                    }t          j        |	                                          }t          j        |	                                          }t          j        |	                                          }d}t          j        |          }|D ]}|||         z
  }t          j        |d|z  z  dz   dd          }d||<   |||         z
  }t          j        |d|z  z  dz   dd          }dt          j        |          z   }t          j        |          }||z   ||<   |||         z  ||<   ||k    r9t          j        ||z            |z    ||         z  ||<   ||||          |z  z  z  }|||<   |||<   ||	z  }d|	                                z
  }| 
                    |           |||fS Nr%   r   r   r   r_   r'   r   r`   r   r   rB   r   ra   r   r*   r   )r   r   r   regression_lossesdeltar   r   r   r   r   r   r   r   r   r   precr   max_precr   r   r   r   r   r   cls_losss                            r   r0   zaLRPLoss.forward  sr   "[66;;== \	9%	Y  )I..u4 %aZ&/*AB!"45S);%<%<==BBDD[  %%''[  %%''F##((**mI&& 	I 	IB"9R=0L\1U7%;C%?A!LLLLL ,IbM9L\1U7%;C%?A!LLLL uy...H9\**Ff_DH d2h&DH|| %	,7H*H I I& PQRVWYRZZ \GBK<3F%GH  *1Y'2B/0(499;;2333u$$r   c                 (    | j         \  }||z  d d d d fS rW   r   )r   r   r   	out_grad3r   s        r   r   zaLRPLoss.backwardS  s!    )|T4t33r   N)r   r   r   r   r   r   r   r     sN        <% <% <% \<%| 4 4 \4 4 4r   r   c                   <    e Zd Zedd            Zed             ZdS )APLossr   c                    t          j        |j                                                  }|dk    }||         }t	          |          }t          j        |          |z
  }|dk    ||k    z  }	||	         }
t          j        t	          |
                                                    }t          j        |                                          }t          j        |                                          }t          j        |                                          }d}t          j        |          }|D ]}|||         z
  }t          j        |d|z  z  dz   dd          }d||<   |
||         z
  }t          j        |d|z  z  dz   dd          }dt          j        |          z   }t          j        |          }||z   ||<   |||         z  }||k    r|}||||         z  z  }n||||         z  d|z
  d|z
  z  z  z  }d|z
   ||<   |||<   |||<   |||	<   ||z  }d|	                                z
  }| 
                    |           |S r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   current_precr   s                           r   r0   zAPLoss.forwardZ  s}   "[66;;== \	9%	Y  )I..u4 %aZ&/*AB!"45S);%<%<==BBDD[  %%''[  %%''F##((**mI&& 	 	B"9R=0L\1U7%;C%?A!LLLLL ,IbM9L\1U7%;C%?A!LLLL uy...H9\**Ff_DH "$r(*L ,&&% \$r(%:;   \$r(%:qzAlN>[$]]  H*GBKDHH *1Y'2B/0&499;;2333r   c                 $    | j         \  }||z  d d fS rW   r   )r   r   r   s      r   r   zAPLoss.backward  s    )|T4''r   N)r   r   r   r   r   r   r   Y  sR        C C C \CJ ( ( \( ( (r   r   c                   ,     e Zd Zd fd	Zd Zd Z xZS )ComputeLossFc           	         t          t          |                                            t          |                                          j        }|j        }t          j        t          j
        |d         g|                    }t          j        t          j
        |d         g|                    }t          |                    dd                    \  | _        | _        |d         }|d	k    r t          ||          t          ||          }}t!          |          r|j        j        d
         n|j        d
         }dg di                    |j        g d          | _        |r't+          |j                                      d          nd	| _        |||j        ||f\  | _        | _        | _        | _        | _        dD ]!}	t;          | |	t=          ||	                     "d S )Ncls_pwri   r>   obj_pwlabel_smoothingr:   r   fl_gammar   rZ            @r   g?r   r   r{   gQ?g{Gz?   )nancnlanchors)r   r   r   next
parametersrj   hypr   r   r'   tensorr   getrN   rO   ry   r
   modulemodelr   balancelistrv   indexssigrBCEclsBCEobjautobalancesetattrgetattrr"   r   r   rj   hr   r   gdetkr#   s             r   r   zComputeLoss.__init__  s   k4  ))+++e&&(())0I %q{mTZ1[1[1[\\\%q{mTZ1[1[1[\\\ &!%%0A3*G*GHHH jMq55&vq119VQ3G3GFF(3E(:(:Oel $$B???+//8S8S8STT 2=C4
##))"---!HNPVX]X`bcepHpET[$'48T5E, 	. 	.AD!WS!__----	. 	.r   c                     |j         }t          j        d|          t          j        d|          t          j        d|          }}}                     ||          \  }}}	}
t	          |          D ]7\  }}|	|         \  }}}}t          j        |d         |          }|j        d         }|r|||||f         }|d d d df                                         dz  dz
  }|d d ddf                                         dz  dz  |
|         z  }t          j        ||fd          }t          |j
        ||         d	d
          }|d|z
                                  z  }d j        z
   j        |                                                    d                              |j                  z  z   |||||f<    j        dk    rlt          j        |d d dd f          j        |          } j        |t+          |          ||         f<   |                     |d d dd f         |          z  }                     |d         |          }|| j        |         z  z  } j        rB j        |         dz  d|                                                                z  z    j        |<   9 j        r fd j        D              _        | j        d         z  }| j        d         z  }| j        d         z  }|j        d         }||z   |z   }||z  t          j        ||||f                                          fS )Nr%   ri   r\   r   r   r;   r      FTx1y1x2y2CIoUr      .r   H.?r&   c                 :    g | ]}|j         j                 z  S r   r   r   .0xr"   s     r   
<listcomp>z(ComputeLoss.__call__.<locals>.<listcomp>  '    MMM1ATX 66MMMr   boxobjcls)rj   r'   r   build_targets	enumerate
zeros_liker`   r(   catr   Tr*   r   detachra   typedtyper   rm   rO   rN   rL   r   r   r   r   itemr   )r"   pr   rj   lclslboxlobjtclstboxindicesr   ipibagjgitobjrq   pspxypwhpboxioutobjibsr-   s   `                           r   __call__zComputeLoss.__call__  sU    ;q888%+aPV:W:W:WY^YdefouYvYvYvDd'+'9'9!W'E'E$dGW q\\  	[  	[EAr"1:LAq"b#BvJv>>>D
A 61b"% BQBi''))B.4!!!QqS&z))++a/A5
By#sQ//tvtAwTJJJs((*** '*DGmtwASASTUAVAVA[A[\`\fAgAg7g%gQ2r\" 7Q;;111abb5	476JJJA+/7AeAhhQ'(DKK111abb5	1555D ;;r&z400DD4<?**D ["&,q/F":VdkkmmFXFXFZFZ=Z"ZQ 	NMMMMMMMDLZ]d{T!by%)T4t$<==DDFFFFr   c                    | j         |j        d         }}g g g g f\  }}}}t          j        d|j                                                  }	t          j        ||j                                                                      |d          	                    d|          }
t          j
        |	                    |dd          |
d d d d d f         fd          }d}t          j        ddgddgddgddgddgg|j                                                  |z  }t          | j                  D ]}| j        |         }t          j        ||         j                  g d         |	dd	<   ||	z  }|r%|d d d d d
d	f         |d d d f         z  }t          j        |d|z                                d          d         | j        d         k     }||         }|d d dd
f         }|	ddg         |z
  }|dz  |k     |dk    z  j        \  }}|dz  |k     |dk    z  j        \  }}t          j        t          j        |          ||||f          }|	                    d          |         }t          j        |          d          |d d d f         z   |         }n
|d         }d}|d d d df                                         j        \  }}|d d dd
f         }|d d d
d	f         }||z
                                  }|j        \  }}|d d d	f                                         }|                    |||                    d|	d         dz
            |                    d|	d         dz
            f           |                    t          j
        ||z
  |fd                     |                    ||                    |                    |           ||||fS Nr      ri   r%   r   r   rZ   r   r   r   r      r   r   anchor_tr   r   r%   r%   r   r`   r'   onesrj   longarangerD   viewrepeatr  r   rL   r   r   rC   r   r	  stack	ones_liker  appendclamp_)r"   r  r   r   ntr  r  r  anchgainair   offr  r   r!  rjgxygxir   lmoffsetsr  cgwhgijr  r  r  s                                  r   r  zComputeLoss.build_targets  s   '-*B$&BN!dGTz!GN33388::\"W^444::<<AA"aHHOOPQSUVV)W^^B155r!!!QQQ*~FJJlQFFQFRGaW '.n6 6 6 7<eggB
 tw %	 %	Al1oGQqTZ00>D1I $A aaaAaCiL7111d7#33Iaa((,,Q//2TXj5IIaD 1Q3iAq6lS(rA#(361rA#(361K!3!3Q1a @AAHHY''* +C006QQQWEqIAJ QQQU8==??$DAqAAAqsF)CAAAqsF)C=&&((CUFB !!!Q$ANNAq"))AtAw{";";RYYq$q'TU+=V=VWXXXKK	39c"2A66777KK
###KKNNNNT7D((r   F)r2   r3   r4   r   r$  r  r5   r6   s   @r   r   r     s_        . . . . . .40G 0G 0Gd5) 5) 5) 5) 5) 5) 5)r   r   c                   2     e Zd Zd fd	Zd Zd Zd Z xZS )ComputeLossOTAFc           	         t          t          |                                            t          |                                          j        }|j        }t          j        t          j
        |d         g|                    }t          j        t          j
        |d         g|                    }t          |                    dd                    \  | _        | _        |d         }|d	k    r t          ||          t          ||          }}t!          |          r|j        j        d
         n|j        d
         }dg di                    |j        g d          | _        |r't+          |j                                      d          nd	| _        |||j        ||f\  | _        | _        | _        | _        | _        dD ]!}	t;          | |	t=          ||	                     "d S Nr   ri   r>   r   r   r:   r   r   r   rZ   r   r   r   r   )r   r   r   r   rv   )r   rG  r   r   r   rj   r   r   r   r'   r   r   r   rN   rO   ry   r
   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   s             r   r   zComputeLossOTA.__init__.  s   nd##,,...e&&(())0I %q{mTZ1[1[1[\\\%q{mTZ1[1[1[\\\ &!%%0A3*G*GHHH jMq55&vq119VQ3G3GFF(3E(:(:Oel $$B???+//8S8S8STT1<C4
##))"---!HNPVX]X`bcepHpET[$'48T5E6 	. 	.AD!WS!__----	. 	.r   c                      |j          t          j        d           t          j        d           t          j        d           }}}                     |||          \  }}}	}
}} fd|D             }t	          |          D ]\  }}||         ||         |	|         |
|         f\  }}}}t          j        |d                    }|j        d         }|r|||||f         }t          j        ||gd          }|d d d df                                         dz  d	z
  }|d d dd
f                                         dz  dz  ||         z  }t          j	        ||fd          }||         d d ddf         ||         z  }|d d d dfxx         |z  cc<   t          |j        |dd          }|d|z
                                  z  }d j        z
   j        |                                                    d                              |j                  z  z   |||||f<   ||         d d df                                         } j        dk    rft          j        |d d dd f          j                   } j        |t/          |          |f<   |                     |d d dd f         |          z  }                     |d         |          }|| j        |         z  z  } j        rB j        |         dz  d|                                                                z  z    j        |<    j        r fd j        D              _        | j        d         z  }| j        d         z  }| j        d         z  }|j        d         }||z   |z   }||z  t          j	        ||||f                                          fS )Nr%   ri   c                 V    g | ]%}t          j        |j                   g d         &S ri   r(  r'   r   r`   r   pprj   s     r   r   z+ComputeLossOTA.__call__.<locals>.<listcomp>J  4    YYYQSbhv>>>|||LYYYr   r\   r   r]   r   r;   r   r   r)  FTr   r   r   r   r   r&   c                 :    g | ]}|j         j                 z  S r   r   r   s     r   r   z+ComputeLossOTA.__call__.<locals>.<listcomp>u  r  r   r  r  r  )rj   r'   r   r  r  r  r`   r2  r(   r  r   r	  r*   r   r
  ra   r  r  r.  r   rm   rO   rN   rL   r   r   r   r   r  r   )!r"   r  r   imgsr  r  r  r#  as_gjsgisr   pre_gen_gainsr  r  r  r  r  r  r  rq   r  gridr  r  r  selected_tboxr   selected_tclsr!  r"  r-   rj   s!   `                               @r   r$  zComputeLossOTA.__call__F  s	    ;q888%+aPV:W:W:WY^YdefouYvYvYvDd.2.@.@GT.R.R+Cc7GYYYYWXYYY q\\ $	[ $	[EAra5#a&#a&#a&8LAq"b#BvJv>>>D
A 61b"% {B8333BQBi''))B.4!!!QqS&z))++a/A5
By#sQ// '
111ac6 2]15E Eaaa!e$$$,$$$tv}u4PPPs((*** '*DGmtwASASTUAVAVA[A[\`\fAgAg7g%gQ2r\" !(
111a4 0 5 5 7 77Q;;111abb5	476JJJA15AeAhh-.DKK111abb5	1555D ;;r&z400DD4<?**D ["&,q/F":VdkkmmFXFXFZFZ=Z"ZQ 	NMMMMMMMDLZ]d{T!by%)T4t$<==DDFFFFr   c           	      l   |                      ||          \  }}t          j        |j                  }d |D             }d |D             }d |D             }	d |D             }
d |D             }d |D             }t          |          }t	          |d         j        d                   D ]}|d d df         |k    }||         }|j        d         dk    r-|d d dd	f         ||         j        d
         z  }t          |          }g }g }g }g }g }g }g }g }g }t          |          D ]\  }}||         \  }}} }!||k    }"||"         ||"         | |"         |!|"         f\  }}} }!|                    |           |                    |           |                    |            |                    |!           |                    ||         |"                    |                    t          j	        t          |          f          |z  
                    |                     |||| |!f         }#|                    |#d d ddf                    |                    |#d d dd f                    t          j        |!| gd
          }$|#d d d df                                         dz  dz
  |$z   | j        |         z  }%|#d d ddf                                         dz  dz  ||         |"         z  | j        |         z  }&t          j        |%|&gd          }'t          |'          }(|                    |(           t          j        |d          }|j        d         dk    rt          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          ||          })t          j        |)dz              }*t          j        |)t%          d|)j        d
                   d
          \  }+},t          j        |+                    d
                                          d
          }-t-          j        |d d d
f         
                    t          j                  | j                                                                      d
                              d
|j        d         d
          }.|j        d         }/|                                                    d                              |/d
d
                                          |                    d                              |/d
d
                                          z  }0|0                                }1t-          j        t          j        |1d
|1z
  z            |.d                              d          }2~0|2d|*z  z   }3t          j         |3|          }4t	          |/          D ]E}5t          j        |3|5         |-|5         !                                d          \  },}6d|4|5         |6<   F~+~-|4                    d          }7|7d
k                                    dk    rJt          j        |3d d |7d
k    f         d          \  },}8|4d d |7d
k    fxx         dz  cc<   d|4|8|7d
k    f<   |4                    d          dk    
                    |          }9|4d d |9f         "                    d          }:||9         }||9         }||9         }||9         }||9         }||9         }||:         }t	          |          D ]}||k    };||                             ||;                    ||                             ||;                    |	|                             ||;                    |
|                             ||;                    ||                             ||;                    ||                             ||;                    ϐt	          |          D ]}||         g k    rt          j        ||         d          ||<   t          j        ||         d          ||<   t          j        |	|         d          |	|<   t          j        |
|         d          |
|<   t          j        ||         d          ||<   t          j        ||         d          ||<   t          j#        g dt          j                  ||<   t          j#        g dt          j                  ||<   t          j#        g dt          j                  |	|<   t          j#        g dt          j                  |
|<   t          j#        g dt          j                  ||<   t          j#        g dt          j                  ||<   |||	|
||fS )Nc                     g | ]}g S r   r   r   rO  s     r   r   z0ComputeLossOTA.build_targets.<locals>.<listcomp>      &&&br&&&r   c                     g | ]}g S r   r   r\  s     r   r   z0ComputeLossOTA.build_targets.<locals>.<listcomp>  r]  r   c                     g | ]}g S r   r   r\  s     r   r   z0ComputeLossOTA.build_targets.<locals>.<listcomp>      '''r'''r   c                     g | ]}g S r   r   r\  s     r   r   z0ComputeLossOTA.build_targets.<locals>.<listcomp>  r`  r   c                     g | ]}g S r   r   r\  s     r   r   z0ComputeLossOTA.build_targets.<locals>.<listcomp>      +++2B+++r   c                     g | ]}g S r   r   r\  s     r   r   z0ComputeLossOTA.build_targets.<locals>.<listcomp>      )))")))r   r   r   r)  r%   sizer   r   r]   r;   r   rZ   :0yE>r9   rB   r   r         @ri   Fr   largestr   r:   cuda:0rj   r  )$find_3_positiver'   rj   r   rL   r`   r	   r  r4  r-  tor2  r(   rv   r  r   logtopkrB   ra   r   intFone_hotint64r   rD   	unsqueezer1  sigmoid_sqrt_ binary_cross_entropy_with_logitsr  r  argmaxr   )<r"   r  r   rR  r  r7  rj   matching_bsmatching_asmatching_gjsmatching_gismatching_targetsmatching_anchsr   	batch_idxb_idxthis_targettxywhtxyxypxyxysp_clsp_objfrom_which_layerall_ball_aall_gjall_giall_anchr  r  r  r  r  r  idxfg_predrW  r  r  pxywhpxyxypair_wise_ioupair_wise_iou_losstop_krd   
dynamic_ksgt_cls_per_imagenum_gt
cls_preds_ypair_wise_cls_losscostmatching_matrixgt_idxpos_idxanchor_matching_gtcost_argminfg_mask_inboxesmatched_gt_inds	layer_idxs<                                                               r   r  zComputeLossOTA.build_targets~  s0
    ,,Q88 gn--&&A&&&&&A&&&''Q'''''Q'''+++++))q)))VVqtz!}-- x	> x	>IAAAqDM9,E!%.K #q((1Q3'$y/*?*BBEe$$EFEE!EEFFH"1 % %2&qz1b"I~ vqvr#w3?1b"QQb!!!b!!!Q--- ''#a&&)C)C)Ca)G(K(KF(S(STTTQ2r\*WQQQ!V_---WQQQU^,,,{B8333qqq"1"u~--//"4s:TAT[QR^Sqqq!A#v..0014:T!WS\IDKXYNZ	3*"555!%((e$$$$Yv1---F|A!##Ie+++EIe+++E$y)9qAAAIe+++EIe+++EYv1---FYv1---Fyq111H#E622M"')MD,@"A"A!Az-R9LQ9O1P1PVWXXXHE1UYYq\\%5%5%7%7Q???J 	+aaad+..u{;;TWEE16<?A..	  !&q)F''**11&!Q??HHJJ//!$$++FAq99BBDDE 
   ""A!"!CyAaC!!$4" " "c"gg   #**+ 
 $.tFCCCO-- 7 7"ZLJv$6$;$;$=$=u  
7 47'00z!0!4!4Q!7!7"Q&++--11!&43E3I0I+JPQ!R!R!R;#5#9 9:::cA:::GJ-?!-C CD.22155;??GGO-aaa.@AHHKKO/@/*E/*EO,FO,F0H%o6K2YY > >,1	A%%eI&6777A%%eI&6777Q&&vi'8999Q&&vi'8999 #**;y+ABBBq!(())<====> r 	Y 	YA"b((!&;q>q!A!A!AA!&;q>q!A!A!AA"')LO"C"C"CQ"')LO"C"C"CQ&+i0@0C&K&K&K #$)InQ.?Q$G$G$Gq!!!&b!U!U!UA!&b!U!U!UA"',r(%+"V"V"VQ"',r(%+"V"V"VQ&+l2hek&Z&Z&Z #$)LHEK$X$X$Xq!!K|EUWeeer   c                 &   | j         |j        d         }}g g }}t          j        d|j                                                  }t          j        ||j                                                                      |d          	                    d|          }t          j
        |	                    |dd          |d d d d d f         fd          }d}	t          j        ddgddgddgddgddgg|j                                                  |	z  }
t          | j                  D ]d}| j        |         }t          j        ||         j                  g d         |dd	<   ||z  }|r%|d d d d d
d	f         |d d d f         z  }t          j        |d|z                                d          d         | j        d         k     }||         }|d d dd
f         }|ddg         |z
  }|dz  |	k     |dk    z  j        \  }}|dz  |	k     |dk    z  j        \  }}t          j        t          j        |          ||||f          }|	                    d          |         }t          j        |          d          |
d d d f         z   |         }n
|d         }d}|d d d df                                         j        \  }}|d d dd
f         }|d d d
d	f         }||z
                                  }|j        \  }}|d d d	f                                         }|                    |||                    d|d         dz
            |                    d|d         dz
            f           |                    ||                    f||fS r&  r,  r"   r  r   r   r6  r  r7  r8  r9  r   r:  r  r   r!  r;  r<  r=  r>  r   r?  r@  rA  r  rB  rC  rD  r  r  r  s                                r   ro  zComputeLossOTA.find_3_positive     '-*BBz!GN33388::\"W^444::<<AA"aHHOOPQSUVV)W^^B155r!!!QQQ*~FJJlQFFQFRGaW '.n6 6 6 7<eggB
 tw #	$ #	$Al1oGQqTZ00>D1I $A aaaAaCiL7111d7#33Iaa((,,Q//2TXj5IIaD 1Q3iAq6lS(rA#(361rA#(361K!3!3Q1a @AAHHY''* +C006QQQWEqIAJ QQQU8==??$DAqAAAqsF)CAAAqsF)C=&&((CUFB !!!Q$ANNAq"))AtAw{";";RYYq$q'TU+=V=VWXXXKK
####}r   rE  r2   r3   r4   r   r$  r  ro  r5   r6   s   @r   rG  rG  ,  su        . . . . . .06G 6G 6Gp[f [f [fz3 3 3 3 3 3 3r   rG  c                   2     e Zd Zd fd	Zd Zd Zd Z xZS )ComputeLossBinOTAFc           	      8   t          t          |                                            t          |                                          j        }|j        }t          j        t          j
        |d         g|                    }t          j        t          j
        |d         g|                    }t          |                    dd                    \  | _        | _        |d         }|d	k    r t          ||          t          ||          }}t!          |          r|j        j        d
         n|j        d
         }dg di                    |j        g d          | _        |r't+          |j                                      d          nd	| _        |||j        ||f\  | _        | _        | _        | _        | _        dD ]!}	t;          | |	t=          ||	                     "t?          | j         ddd          !                    |          }
|
| _"        d S )Nr   ri   r>   r   r   r:   r   r   r   rZ   r   r   r   r   )r   r   r   r   rv   r@   r   F)r@   rB   rC   rG   )#r   r  r   r   r   rj   r   r   r   r'   r   r   r   rN   rO   ry   r
   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r8   r@   rp  wh_bin_sigmoid)r"   r   r   rj   r   r   r   r   r   r   r  r#   s              r   r   zComputeLossBinOTA.__init__S  s   &&//111e&&(())0I %q{mTZ1[1[1[\\\%q{mTZ1[1[1[\\\ &!%%0A3*G*GHHH jMq55&vq119VQ3G3GFF(3E(:(:Oel $$B???+//8S8S8STT1<C4
##))"---!HNPVX]X`bcepHpET[$'48T5EC 	. 	.AD!WS!__---- $dn#3dijjjmmntuu,r   c           	      	   % |j         %t          j        d%          t          j        d%          t          j        d%          }}}                     |||          \  }}}	}
}}%fd|D             }t	          |          D ]\  }}||         ||         |	|         |
|         f\  }}}}t          j        |d         %          } j                                        dz  dz   }|j        d         }|r|||||f         }t          j	        ||gd          }||         d d ddf         ||         z  }|d d d dfxx         |z  cc<    j        
                    |d	dd
 j        z   f         |d         ||         d         z            \  }} j        
                    |d	d
 j        z   |f         |d         ||         d         z            \  }}|||         d         z  }|||         d         z  }|d d df                                         dz  dz
  }|d d df                                         dz  dz
  }|||z   z  }t          j        |                    d          |                    d          |                    d          |                    d          fd                              %          }t!          |j        |dd          } |d| z
                                  z  }d j        z
   j        |                                                     d                              |j                  z  z   |||||f<   ||         d d df                                         }! j        dk    rlt          j        |d d d|z   d f          j        %          }" j        |"t;          |          |!f<   |                     |d d d|z   d f         |"          z  }                     |d	|f         |          }#||# j         |         z  z  } j!        rB j         |         dz  d|#                                "                                z  z    j         |<    j!        r fd j         D              _         | j#        d         z  }| j#        d         z  }| j#        d         z  }|j        d         }||z   |z   }$|$|z  t          j        ||||$f                                          fS )Nr%   ri   c                 V    g | ]%}t          j        |j                   g d         &S rL  rM  rN  s     r   r   z.ComputeLossBinOTA.__call__.<locals>.<listcomp>u  rP  r   r\   r   r   r]   r)  .r   ).r   ).r   ).r%   r;   r   FTr   r   r   r&   c                 :    g | ]}|j         j                 z  S r   r   r   s     r   r   z.ComputeLossBinOTA.__call__.<locals>.<listcomp>  r  r   r  r  r  )$rj   r'   r   r  r  r  r  rX   r`   r2  ru   r@   r(   r  rw  rp  r   r	  r*   r   r
  ra   r  r  r.  r   rm   rO   rN   rL   r   r   r   r   r  r   )&r"   r  r   rR  r  r  r  r#  rS  rT  rU  r   rV  r  r  r  r  r  r  r  obj_idxrq   r  rW  rX  w_losspwh_lossphpxpyr  r   rY  r!  r"  r-   rj   s&   `                                    @r   r$  zComputeLossBinOTA.__call__q  so    ;q888%+aPV:W:W:WY^YdefouYvYvYvDd.2.@.@GT.R.R+Cc7GYYYYWXYYY q\\ <	[ <	[EAra5#a&#a&#a&8LAq"b#BvJv>>>D)4466q81<G
A ,@1b"% {B8333 '
111ac6 2]15E Eaaa!e$$$,$$$ "0>>r#q!DNJZG[B[?\^klr^sv}~  wA  BH  wI  _I  J  J
!0>>r#$.HXZaGaBa?bdqrxdy  }D  EF  }G  HN  }O  eO  P  P
gaj((gaj((1X%%''",s21X%%''",s2' y",,q//2<<??BLLQROOUWUaUabcUdUd!eghiillmstt
 tv}u4PPPs((*** '*DGmtwASASTUAVAVA[A[\`\fAgAg7g%gQ2r\" !(
111a4 0 5 5 7 77Q;;111qyll?(;TWVTTTA15AeAhh-.DKK111qyll?(;Q???D ;;r#w,/66DD4<?**D ["&,q/F":VdkkmmFXFXFZFZ=Z"ZQ 	NMMMMMMMDLZ]d{T!by%)T4t$<==DDFFFFr   c           	         |                      ||          \  }}d |D             }d |D             }d |D             }d |D             }	d |D             }
d |D             }t          |          }t          |d         j        d                   D ]z}|d d df         |k    }||         }|j        d         dk    r-|d d dd	f         ||         j        d
         z  }t	          |          }g }g }g }g }g }g }g }g }g }t          |          D ]\  }}| j                                        dz  dz   }||         \  }}} }!||k    }"||"         ||"         | |"         |!|"         f\  }}} }!|                    |           |                    |           |                    |            |                    |!           |                    ||         |"                    |                    t          j
        t          |          f          |z             |||| |!f         }#|                    |#d d ||d
z   f                    |                    |#d d |d
z   d f                    t          j        |!| gd
          }$|#d d d df                                         dz  dz
  |$z   | j        |         z  }%| j                            |#ddd| j        z   f                                                   ||         |"         d d df         z  | j        |         z  }&| j                            |#dd| j        z   |f                                                   ||         |"         d d d
f         z  | j        |         z  }'t          j        |%|&                    d
          |'                    d
          gd          }(t	          |(          })|                    |)           t          j        |d          }|j        d         dk    rt          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t%          ||          }*t          j        |*dz              }+t          j        |*t+          d|*j        d
                   d
          \  },}-t          j        |,                    d
                                          d
          }.t3          j        |d d d
f                             t          j                  | j                                                                      d
                              d
|j        d         d
          }/|j        d         }0|                                                    d                              |0d
d
                                           |                    d                              |0d
d
                                           z  }1|1!                                }2t3          j"        t          j        |2d
|2z
  z            |/d                              d          }3~1|3d|+z  z   }4t          j#        |4          }5t          |0          D ]E}6t          j        |4|6         |.|6         $                                d          \  }-}7d|5|6         |7<   F~,~.|5                    d          }8|8d
k                                    dk    rJt          j        |4d d |8d
k    f         d          \  }-}9|5d d |8d
k    fxx         dz  cc<   d|5|9|8d
k    f<   |5                    d          dk    }:|5d d |:f         %                    d          };||:         }||:         }||:         }||:         }||:         }||:         }||;         }t          |          D ]}||k    }<||                             ||<                    ||                             ||<                    ||                             ||<                    |	|                             ||<                    |
|                             ||<                    ||                             ||<                    ϐ|t          |          D ]}|
|         g k    rt          j        ||         d          ||<   t          j        ||         d          ||<   t          j        ||         d          ||<   t          j        |	|         d          |	|<   t          j        |
|         d          |
|<   t          j        ||         d          ||<   t          j&        g dt          j                  ||<   t          j&        g dt          j                  ||<   t          j&        g dt          j                  ||<   t          j&        g dt          j                  |	|<   t          j&        g dt          j                  |
|<   t          j&        g dt          j                  ||<   ||||	|
|fS )Nc                     g | ]}g S r   r   r\  s     r   r   z3ComputeLossBinOTA.build_targets.<locals>.<listcomp>  r]  r   c                     g | ]}g S r   r   r\  s     r   r   z3ComputeLossBinOTA.build_targets.<locals>.<listcomp>  r]  r   c                     g | ]}g S r   r   r\  s     r   r   z3ComputeLossBinOTA.build_targets.<locals>.<listcomp>  r`  r   c                     g | ]}g S r   r   r\  s     r   r   z3ComputeLossBinOTA.build_targets.<locals>.<listcomp>  r`  r   c                     g | ]}g S r   r   r\  s     r   r   z3ComputeLossBinOTA.build_targets.<locals>.<listcomp>  rc  r   c                     g | ]}g S r   r   r\  s     r   r   z3ComputeLossBinOTA.build_targets.<locals>.<listcomp>  re  r   r   r   r)  r%   rf  r]   r;   r   .r   rZ   rh  r9   ri  r   r   rj  Frk  r   r:   rm  rn  )'ro  r   rL   r`   r	   r  r  rX   r4  r'   r-  r2  r(   rv   r0   r@   r  rw  r   rq  rr  rB   ra   r   rs  rt  ru  rp  rv  r   rD   r1  rx  ry  rz  r  r  r{  r   )=r"   r  r   rR  r  r7  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  rW  r  r  r  r  r  r  r  r  rd   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  s=                                                                r   r  zComputeLossBinOTA.build_targets  s
    ,,Q88
 '&A&&&&&A&&&''Q'''''Q'''+++++))q)))VVqtz!}-- |	> |	>IAAAqDM9,E!%.K #q((1Q3'$y/*?*BBEe$$EFEE!EEFFH"1 % %2-88::1<q@&qz1b"I~ vqvr#w3?1b"QQb!!!b!!!Q--- ''
Q	(B(B(BQ(FGGGQ2r\*WQQQ(;%;<===WQQQ_5666{B8333qqq"1"u~--//"4s:TAT[QR^S(00a4>AQ>R9R1S1[1[1]1]^^aefgahilamnononoqrnrassvz  wB  CD  wE  E(00q?OQX>X9X1Y1a1a1c1cddgklmgnorgstututuwxtxgyy  }A  }H  IJ  }K  K	3Qa"IrRRR!%((e$$$$Yv1---F|A!##Ie+++EIe+++E$y)9qAAAIe+++EIe+++EYv1---FYv1---Fyq111H#E622M"')MD,@"A"A!Az-R9LQ9O1P1PVWXXXHE1UYYq\\%5%5%7%7Q???J 	+aaad+..u{;;TWEE16<?A..	  !&q)F''**11&!Q??HHJJ//!$$++FAq99BBDDE 
   ""A!"!CyAaC!!$4" " "c"gg   #**+ 
 $.t44O-- 7 7"ZLJv$6$;$;$=$=u  
7 47'00z!0!4!4Q!7!7"Q&++--11!&43E3I0I+JPQ!R!R!R;#5#9 9:::cA:::GJ-?!-C CD-11!44s:O-aaa.@AHHKKO/@/*E/*EO,FO,F0H%o6K2YY > >,1	A%%eI&6777A%%eI&6777Q&&vi'8999Q&&vi'8999 #**;y+ABBBq!(())<====> r 	Y 	YA"b((!&;q>q!A!A!AA!&;q>q!A!A!AA"')LO"C"C"CQ"')LO"C"C"CQ&+i0@0C&K&K&K #$)InQ.?Q$G$G$Gq!!!&b!U!U!UA!&b!U!U!UA"',r(%+"V"V"VQ"',r(%+"V"V"VQ&+l2hek&Z&Z&Z #$)LHEK$X$X$Xq!!K|EUWeeer   c                 &   | j         |j        d         }}g g }}t          j        d|j                                                  }t          j        ||j                                                                      |d          	                    d|          }t          j
        |	                    |dd          |d d d d d f         fd          }d}	t          j        ddgddgddgddgddgg|j                                                  |	z  }
t          | j                  D ]d}| j        |         }t          j        ||         j                  g d         |dd	<   ||z  }|r%|d d d d d
d	f         |d d d f         z  }t          j        |d|z                                d          d         | j        d         k     }||         }|d d dd
f         }|ddg         |z
  }|dz  |	k     |dk    z  j        \  }}|dz  |	k     |dk    z  j        \  }}t          j        t          j        |          ||||f          }|	                    d          |         }t          j        |          d          |
d d d f         z   |         }n
|d         }d}|d d d df                                         j        \  }}|d d dd
f         }|d d d
d	f         }||z
                                  }|j        \  }}|d d d	f                                         }|                    |||                    d|d         dz
            |                    d|d         dz
            f           |                    ||                    f||fS r&  r,  r  s                                r   ro  z!ComputeLossBinOTA.find_3_positiveb  r  r   rE  r  r6   s   @r   r  r  Q  sx        - - - - - -<NG NG NG`_f _f _fB3 3 3 3 3 3 3r   r  c                   >     e Zd Zd fd	Zd Zd Zd Zd Zd Z xZ	S )	ComputeLossAuxOTAFc           	         t          t          |                                            t          |                                          j        }|j        }t          j        t          j
        |d         g|                    }t          j        t          j
        |d         g|                    }t          |                    dd                    \  | _        | _        |d         }|d	k    r t          ||          t          ||          }}t!          |          r|j        j        d
         n|j        d
         }dg di                    |j        g d          | _        |r't+          |j                                      d          nd	| _        |||j        ||f\  | _        | _        | _        | _        | _        dD ]!}	t;          | |	t=          ||	                     "d S rI  )r   r  r   r   r   rj   r   r   r   r'   r   r   r   rN   rO   ry   r
   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   s             r   r   zComputeLossAuxOTA.__init__  s   &&//111e&&(())0I %q{mTZ1[1[1[\\\%q{mTZ1[1[1[\\\ &!%%0A3*G*GHHH jMq55&vq119VQ3G3GFF(3E(:(:Oel $$B???+//8S8S8STT1<C4
##))"---!HNPVX]X`bcepHpET[$'48T5E6 	. 	.AD!WS!__----	. 	.r   c           	      \   8 |j         8t          j        d8          t          j        d8          t          j        d8          }}}                     |d  j                 ||          \  }}}	}
}}                     |d  j                 ||          \  }}}}}}8fd|d  j                 D             }8fd|d  j                 D             }t           j                  D ]-}||         }|| j        z            }||         ||         ||         ||         f\  }}}}||         ||         |	|         |
|         f\  }}}}t          j        |d         8          }t          j        |d         8          } |j        d         }!|!r|||||f         }"t          j	        ||gd          }#|"d d d df         
                                d	z  d
z
  }$|"d d ddf         
                                dz  dz  ||         z  }%t          j        |$|%fd          }&||         d d ddf         ||         z  }'|'d d d dfxx         |#z  cc<   t          |&j        |'dd          }(|d|(z
                                  z  }d j        z
   j        |(                                                    d                              |j                  z  z   |||||f<   ||         d d df                                         }) j        dk    rft          j        |"d d dd f          j        8          }* j        |*t          |!          |)f<   |                     |"d d dd f         |*          z  }|j        d         }+|+r|||||f         },t          j	        ||gd          }-|,d d d df         
                                d	z  d
z
  }.|,d d ddf         
                                dz  dz  ||         z  }/t          j        |.|/fd          }0||         d d ddf         ||         z  }1|1d d d dfxx         |-z  cc<   t          |0j        |1dd          }2|dd|2z
                                  z  z  }d j        z
   j        |2                                                    d                              | j                  z  z   | ||||f<   ||         d d df                                         }3 j        dk    rit          j        |,d d dd f          j        8          }4 j        |4t          |+          |3f<   |d                     |,d d dd f         |4          z  z  }                     |d         |          }5                     |d         |           }6||5 j        |         z  d|6z   j        |         z  z   z  } j        rB j        |         dz  d|5                                                                z  z    j        |<   / j        r fd j        D              _        | j        d         z  }| j        d         z  }| j        d         z  }|j        d         }||z   |z   }7|7|z  t          j        ||||7f                                          fS )Nr%   ri   c                 V    g | ]%}t          j        |j                   g d         &S rL  rM  rN  s     r   r   z.ComputeLossAuxOTA.__call__.<locals>.<listcomp>  s4    gggUWU\"(6BBB<<<Pgggr   c                 V    g | ]%}t          j        |j                   g d         &S rL  rM  rN  s     r   r   z.ComputeLossAuxOTA.__call__.<locals>.<listcomp>  s4    cccQSbhv>>>|||Lcccr   r\   r   r]   r   r;   r   r   r)  FTr   r   r   r{   r   r   r&   c                 :    g | ]}|j         j                 z  S r   r   r   s     r   r   z.ComputeLossAuxOTA.__call__.<locals>.<listcomp>  r  r   r  r  r  )rj   r'   r   build_targets2r   r  rL   r  r`   r2  r(   r  r   r	  r*   r   r
  ra   r  r  r.  r   rm   rO   rN   r   r   r   r   r  r   )9r"   r  r   rR  r  r  r  bs_auxas_aux_gjs_auxgis_auxtargets_auxanchors_auxr#  rS  rT  rU  r   pre_gen_gains_auxrV  r  r  pi_auxr  r  r  r  b_auxa_auxgj_auxgi_auxr  tobj_auxrq   r  rW  r  r  r  rX  r   rY  r!  n_auxps_auxgrid_auxpxy_auxpwh_auxpbox_auxselected_tbox_auxiou_auxselected_tcls_auxt_auxr"  obji_auxr-   rj   s9   `                                                       @r   r$  zComputeLossAuxOTA.__call__  sF    ;q888%+aPV:W:W:WY^YdefouYvYvYvDdFJFYFYZ[\d]a]d\dZegnptFuFuC';.2.@.@8DG8gW[.\.\+Cc7Ggggg[\]e^b^e]e[fgggccccWXYaZ^ZaYaWbccc tw ?	[ ?	[A1Bqy\Fa5#a&#a&#a&8LAq"b+1!9gaj'!*gVWj+X(E5&&#BvJv>>>D'vvFFFH
A 61b"% {B8333BQBi''))B.4!!!QqS&z))++a/A5
By#sQ// '
111ac6 2]15E Eaaa!e$$$,$$$tv}u4PPPs((*** '*DGmtwASASTUAVAVA[A[\`\fAgAg7g%gQ2r\" !(
111a4 0 5 5 7 77Q;;111abb5	476JJJA15AeAhh-.DKK111abb5	1555D KNE Euff <= ;'7Q??? BQB-//11B6<!!!!QqS&>1133a7A=AN 9gw%7;;$/N111ac6$:=Nq=Q$Q!!!!!RaR%(((H4((("8:/@5W[\\\g335555 ;>-47U\UcUcUeUeUkUklmUnUnUsUst|  uC  VD  VD  LD  :Dvv56 %0N111a4$8$=$=$?$?!7Q;;!OF111abb5M476RRRE=AWE%,,(99:D4;;vaaae}e#D#DDDD;;r&z400D{{6&>8<<HD4<?*TH_t|A-NNND ["&,q/F":VdkkmmFXFXFZFZ=Z"ZQ 	NMMMMMMMDLZ]d{T!by%)T4t$<==DDFFFFr   c           	         |                      ||          \  }}d |D             }d |D             }d |D             }d |D             }	d |D             }
d |D             }t          |          }t          |d         j        d                   D ]}|d d df         |k    }||         }|j        d         dk    r-|d d dd	f         ||         j        d
         z  }t	          |          }g }g }g }g }g }g }g }g }g }t          |          D ]\  }}||         \  }}}} ||k    }!||!         ||!         ||!         | |!         f\  }}}} |                    |           |                    |           |                    |           |                    |            |                    ||         |!                    |                    t          j        t          |          f          |z             ||||| f         }"|                    |"d d ddf                    |                    |"d d dd f                    t          j	        | |gd
          }#|"d d d df         
                                dz  dz
  |#z   | j        |         z  }$|"d d ddf         
                                dz  dz  ||         |!         z  | j        |         z  }%t          j        |$|%gd          }&t	          |&          }'|                    |'           t          j        |d          }|j        d         dk    rt          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          ||          }(t          j        |(dz              })t          j        |(t!          d|(j        d
                   d
          \  }*}+t          j        |*                    d
                                          d
          },t)          j        |d d d
f                             t          j                  | j                                                                      d
                              d
|j        d         d
          }-|j        d         }.|                                                    d                              |.d
d
                                          |                    d                              |.d
d
                                          z  }/|/                                }0t)          j        t          j        |0d
|0z
  z            |-d                              d          }1~/|1d|)z  z   }2t          j        |2          }3t          |.          D ]E}4t          j        |2|4         |,|4                                          d          \  }+}5d|3|4         |5<   F~*~,|3                    d          }6|6d
k                                    dk    rJt          j        |2d d |6d
k    f         d          \  }+}7|3d d |6d
k    fxx         dz  cc<   d|3|7|6d
k    f<   |3                    d          dk    }8|3d d |8f         !                    d          }9||8         }||8         }||8         }||8         }||8         }||8         }||9         }t          |          D ]}||k    }:||                             ||:                    ||                             ||:                    ||                             ||:                    |	|                             ||:                    |
|                             ||:                    ||                             ||:                    ϐt          |          D ]}|
|         g k    rt          j        ||         d          ||<   t          j        ||         d          ||<   t          j        ||         d          ||<   t          j        |	|         d          |	|<   t          j        |
|         d          |
|<   t          j        ||         d          ||<   t          j"        g dt          j                  ||<   t          j"        g dt          j                  ||<   t          j"        g dt          j                  ||<   t          j"        g dt          j                  |	|<   t          j"        g dt          j                  |
|<   t          j"        g dt          j                  ||<   ||||	|
|fS )Nc                     g | ]}g S r   r   r\  s     r   r   z3ComputeLossAuxOTA.build_targets.<locals>.<listcomp>  r]  r   c                     g | ]}g S r   r   r\  s     r   r   z3ComputeLossAuxOTA.build_targets.<locals>.<listcomp>  r]  r   c                     g | ]}g S r   r   r\  s     r   r   z3ComputeLossAuxOTA.build_targets.<locals>.<listcomp>  r`  r   c                     g | ]}g S r   r   r\  s     r   r   z3ComputeLossAuxOTA.build_targets.<locals>.<listcomp>  r`  r   c                     g | ]}g S r   r   r\  s     r   r   z3ComputeLossAuxOTA.build_targets.<locals>.<listcomp>  rc  r   c                     g | ]}g S r   r   r\  s     r   r   z3ComputeLossAuxOTA.build_targets.<locals>.<listcomp>  re  r   r   r   r)  r%   rf  r   r   r]   r;   r   rZ   rh     ri  r   r   rj  Frk  r   r:   rm  rn  )#ro  r   rL   r`   r	   r  r4  r'   r-  r2  r(   rv   r  r   rq  rr  rB   ra   r   rs  rt  ru  rp  rv  r   rD   rw  r1  rx  ry  rz  r  r  r{  r   ;r"   r  r   rR  r  r7  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  rW  r  r  r  r  r  r  r  rd   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  s;                                                              r   r  zComputeLossAuxOTA.build_targets  	   ,,Q88&&A&&&&&A&&&''Q'''''Q'''+++++))q)))VVqtz!}-- x	> x	>IAAAqDM9,E!%.K #q((1Q3'$y/*?*BBEe$$EFEE!EEFFH"1 % %2&qz1b"I~ vqvr#w3?1b"QQb!!!b!!!Q--- ''
Q	(B(B(BQ(FGGGQ2r\*WQQQ!V_---WQQQU^,,,{B8333qqq"1"u~--//"4s:TAT[QR^Sqqq!A#v..0014:T!WS\IDKXYNZ	3*"555!%((e$$$$Yv1---F|A!##Ie+++EIe+++E$y)9qAAAIe+++EIe+++EYv1---FYv1---Fyq111H#E622M"')MD,@"A"A!Az-R9LQ9O1P1PVWXXXHE1UYYq\\%5%5%7%7Q???J 	+aaad+..u{;;TWEE16<?A..	  !&q)F''**11&!Q??HHJJ//!$$++FAq99BBDDE 
   ""A!"!CyAaC!!$4" " "c"gg   #**+ 
 $.t44O-- 7 7"ZLJv$6$;$;$=$=u  
7 47'00z!0!4!4Q!7!7"Q&++--11!&43E3I0I+JPQ!R!R!R;#5#9 9:::cA:::GJ-?!-C CD-11!44s:O-aaa.@AHHKKO/@/*E/*EO,FO,F0H%o6K2YY > >,1	A%%eI&6777A%%eI&6777Q&&vi'8999Q&&vi'8999 #**;y+ABBBq!(())<====> r 	Y 	YA"b((!&;q>q!A!A!AA!&;q>q!A!A!AA"')LO"C"C"CQ"')LO"C"C"CQ&+i0@0C&K&K&K #$)InQ.?Q$G$G$Gq!!!&b!U!U!UA!&b!U!U!UA"',r(%+"V"V"VQ"',r(%+"V"V"VQ&+l2hek&Z&Z&Z #$)LHEK$X$X$Xq!!K|EUWeeer   c           	         |                      ||          \  }}d |D             }d |D             }d |D             }d |D             }	d |D             }
d |D             }t          |          }t          |d         j        d                   D ]}|d d df         |k    }||         }|j        d         dk    r-|d d dd	f         ||         j        d
         z  }t	          |          }g }g }g }g }g }g }g }g }g }t          |          D ]\  }}||         \  }}}} ||k    }!||!         ||!         ||!         | |!         f\  }}}} |                    |           |                    |           |                    |           |                    |            |                    ||         |!                    |                    t          j        t          |          f          |z             ||||| f         }"|                    |"d d ddf                    |                    |"d d dd f                    t          j	        | |gd
          }#|"d d d df         
                                dz  dz
  |#z   | j        |         z  }$|"d d ddf         
                                dz  dz  ||         |!         z  | j        |         z  }%t          j        |$|%gd          }&t	          |&          }'|                    |'           t          j        |d          }|j        d         dk    rt          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          j        |d          }t          ||          }(t          j        |(dz              })t          j        |(t!          d|(j        d
                   d
          \  }*}+t          j        |*                    d
                                          d
          },t)          j        |d d d
f                             t          j                  | j                                                                      d
                              d
|j        d         d
          }-|j        d         }.|                                                    d                              |.d
d
                                          |                    d                              |.d
d
                                          z  }/|/                                }0t)          j        t          j        |0d
|0z
  z            |-d                              d          }1~/|1d|)z  z   }2t          j        |2          }3t          |.          D ]E}4t          j        |2|4         |,|4                                          d          \  }+}5d|3|4         |5<   F~*~,|3                    d          }6|6d
k                                    dk    rJt          j        |2d d |6d
k    f         d          \  }+}7|3d d |6d
k    fxx         dz  cc<   d|3|7|6d
k    f<   |3                    d          dk    }8|3d d |8f         !                    d          }9||8         }||8         }||8         }||8         }||8         }||8         }||9         }t          |          D ]}||k    }:||                             ||:                    ||                             ||:                    ||                             ||:                    |	|                             ||:                    |
|                             ||:                    ||                             ||:                    ϐt          |          D ]}|
|         g k    rt          j        ||         d          ||<   t          j        ||         d          ||<   t          j        ||         d          ||<   t          j        |	|         d          |	|<   t          j        |
|         d          |
|<   t          j        ||         d          ||<   t          j"        g dt          j                  ||<   t          j"        g dt          j                  ||<   t          j"        g dt          j                  ||<   t          j"        g dt          j                  |	|<   t          j"        g dt          j                  |
|<   t          j"        g dt          j                  ||<   ||||	|
|fS )Nc                     g | ]}g S r   r   r\  s     r   r   z4ComputeLossAuxOTA.build_targets2.<locals>.<listcomp>  r]  r   c                     g | ]}g S r   r   r\  s     r   r   z4ComputeLossAuxOTA.build_targets2.<locals>.<listcomp>  r]  r   c                     g | ]}g S r   r   r\  s     r   r   z4ComputeLossAuxOTA.build_targets2.<locals>.<listcomp>  r`  r   c                     g | ]}g S r   r   r\  s     r   r   z4ComputeLossAuxOTA.build_targets2.<locals>.<listcomp>  r`  r   c                     g | ]}g S r   r   r\  s     r   r   z4ComputeLossAuxOTA.build_targets2.<locals>.<listcomp>  rc  r   c                     g | ]}g S r   r   r\  s     r   r   z4ComputeLossAuxOTA.build_targets2.<locals>.<listcomp>  re  r   r   r   r)  r%   rf  r   r   r]   r;   r   rZ   rh  r  ri  r   r   rj  Frk  r   r:   rm  rn  )#find_5_positiver   rL   r`   r	   r  r4  r'   r-  r2  r(   rv   r  r   rq  rr  rB   ra   r   rs  rt  ru  rp  rv  r   rD   rw  r1  rx  ry  rz  r  r  r{  r   r  s;                                                              r   r  z ComputeLossAuxOTA.build_targets2  r  r   c                 &   | j         |j        d         }}g g }}t          j        d|j                                                  }t          j        ||j                                                                      |d          	                    d|          }t          j
        |	                    |dd          |d d d d d f         fd          }d}	t          j        ddgddgddgddgddgg|j                                                  |	z  }
t          | j                  D ]d}| j        |         }t          j        ||         j                  g d         |dd	<   ||z  }|r%|d d d d d
d	f         |d d d f         z  }t          j        |d|z                                d          d         | j        d         k     }||         }|d d dd
f         }|ddg         |z
  }|dz  |	k     |dk    z  j        \  }}|dz  |	k     |dk    z  j        \  }}t          j        t          j        |          ||||f          }|	                    d          |         }t          j        |          d          |
d d d f         z   |         }n
|d         }d}|d d d df                                         j        \  }}|d d dd
f         }|d d d
d	f         }||z
                                  }|j        \  }}|d d d	f                                         }|                    |||                    d|d         dz
            |                    d|d         dz
            f           |                    ||                    f||fS )Nr   r'  ri   r%   r   r   rZ   r(  r)  r   r*  r   r+  r,  r  s                                r   r  z!ComputeLossAuxOTA.find_5_positive9  r  r   c                 &   | j         |j        d         }}g g }}t          j        d|j                                                  }t          j        ||j                                                                      |d          	                    d|          }t          j
        |	                    |dd          |d d d d d f         fd          }d}	t          j        ddgddgddgddgddgg|j                                                  |	z  }
t          | j                  D ]d}| j        |         }t          j        ||         j                  g d         |dd	<   ||z  }|r%|d d d d d
d	f         |d d d f         z  }t          j        |d|z                                d          d         | j        d         k     }||         }|d d dd
f         }|ddg         |z
  }|dz  |	k     |dk    z  j        \  }}|dz  |	k     |dk    z  j        \  }}t          j        t          j        |          ||||f          }|	                    d          |         }t          j        |          d          |
d d d f         z   |         }n
|d         }d}|d d d df                                         j        \  }}|d d dd
f         }|d d d
d	f         }||z
                                  }|j        \  }}|d d d	f                                         }|                    |||                    d|d         dz
            |                    d|d         dz
            f           |                    ||                    f||fS r&  r,  r  s                                r   ro  z!ComputeLossAuxOTA.find_3_positiven  r  r   rE  )
r2   r3   r4   r   r$  r  r  r  ro  r5   r6   s   @r   r  r    s        . . . . . .0SG SG SGjWf Wf WfrWf Wf Wfr3 3 3j3 3 3 3 3 3 3r   r  )r   )r'   torch.nnr   torch.nn.functional
functionalrt  utils.generalr   r   r   r   r   r   r	   utils.torch_utilsr
   r   Moduler   r8   ry   r   autogradFunctionr   r   r   r   rG  r  r  r   r   r   <module>r     s                   d d d d d d d d d d d d d d d d d d ) ) ) ) ) )& & & &
    BI   "U  U  U  U  U  U  U  U p    	   <       2a. a. a. a. a.u~& a. a. a.FC4 C4 C4 C4 C4u~& C4 C4 C4LJ( J( J( J( J(U^$ J( J( J(ZC) C) C) C) C) C) C) C)Lb b b b b b b bJ	D D D D D D D DN
I I I I I I I I I Ir   