ó
    pyüiÆ  ã                   ó´   • S SK r S SKJr  SSKJr  SSKJr  SSKJrJ	r	J
r
JrJr  \" 5       (       a  S SKJr   " S S	\5      r " S
 S\	5      r SS jr SS jrg)é    Né   )Úcenter_to_corners_format)Úis_scipy_availableé   )ÚHungarianMatcherÚ	ImageLossÚ_set_aux_lossÚgeneralized_box_iouÚsigmoid_focal_loss)Úlinear_sum_assignmentc                   óB   • \ rS rSr\R
                  " 5       S 5       rSrg)ÚDeformableDetrHungarianMatcheré   c           
      ó˜  • US   R                   SS u  p4US   R                  SS5      R                  5       nUS   R                  SS5      n[        R                  " U Vs/ s H  owS   PM	     sn5      n[        R                  " U Vs/ s H  owS   PM	     sn5      n	S	n
S
nSU
-
  X[-  -  SU-
  S-   R                  5       * -  nU
SU-
  U-  -  US-   R                  5       * -  nUSS2U4   USS2U4   -
  n[        R                  " XiSS9n[        [        U5      [        U	5      5      * nU R                  U-  U R                  U-  -   U R                  U-  -   nUR                  X4S5      R                  5       nU Vs/ s H  n[        US   5      PM     nn[        UR!                  US5      5       VVs/ s H  u  nn[#        UU   5      PM     nnnU VVs/ s HL  u  nn[        R$                  " U[        R&                  S9[        R$                  " U[        R&                  S94PMN     snn$ s  snf s  snf s  snf s  snnf s  snnf )zz
Differences:
- out_prob = outputs["logits"].flatten(0, 1).sigmoid() instead of softmax
- class_cost uses alpha and gamma
ÚlogitsNr   r   r   Ú
pred_boxesÚclass_labelsÚboxesg      Ð?g       @g:Œ0âŽyE>)Úpéÿÿÿÿ)Údtype)ÚshapeÚflattenÚsigmoidÚtorchÚcatÚlogÚcdistr
   r   Ú	bbox_costÚ
class_costÚ	giou_costÚviewÚcpuÚlenÚ	enumerateÚsplitr   Ú	as_tensorÚint64)ÚselfÚoutputsÚtargetsÚ
batch_sizeÚnum_queriesÚout_probÚout_bboxÚvÚ
target_idsÚtarget_bboxÚalphaÚgammaÚneg_cost_classÚpos_cost_classr    r   r!   Úcost_matrixÚsizesÚiÚcÚindicesÚjs                          Úc/home/mande/repo/quber/.venv/lib/python3.13/site-packages/transformers/loss/loss_deformable_detr.pyÚforwardÚ&DeformableDetrHungarianMatcher.forward   s9  € ð #*¨(Ñ"3×"9Ñ"9¸"¸1Ð"=Ñˆ
ð ˜8Ñ$×,Ñ,¨Q°Ó2×:Ñ:Ó<ˆØ˜<Ñ(×0Ñ0°°AÓ6ˆô —Y’Y¹7ÓCº7°a .Ô 1¹7ÑCÓDˆ
Ü—i’i±WÓ =²W° 7¤±WÑ =Ó>ˆð ˆØˆØ˜e™)¨©Ñ8¸aÀ(¹lÈTÑ>Q×=VÑ=VÓ=XÐ<XÑYˆØ 1 x¡<°EÑ"9Ñ:ÀÈ4Á×?TÑ?TÓ?VÐ>VÑWˆØ#¢A z MÑ2°^ÂAÀzÀMÑ5RÑRˆ
ô —K’K ¸Ñ;ˆ	ô )Ô)AÀ(Ó)KÔMeÐfqÓMrÓsÐsˆ	ð —n‘n yÑ0°4·?±?ÀZÑ3OÑOÐRV×R`ÑR`ÐclÑRlÑlˆØ!×&Ñ& zÀÓC×GÑGÓIˆá*1Ó2ª' Q”�Q�w‘Z–©'ˆÐ2Ü;DÀ[×EVÑEVÐW\Ð^`ÓEaÔ;bÔcÒ;b±4°1°aÔ(¨¨1©Ö.Ñ;bˆÑcÙkrÔsÒkrÑcgÐcdÐfg”—’ ¬%¯+©+Ñ6¼¿ºÈÔQV×Q\ÑQ\Ñ8]Ó^ÑkrÒsÐsùò-  DùÚ =ùò& 3ùÛcùÛss   Á!H1Â
H6Å?H;Æ7I ÇAI© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   Úno_gradr>   Ú__static_attributes__r@   ó    r=   r   r      s   † Ø
‡]‚]ƒ_ñ#tó ó#trG   r   c                   óN   • \ rS rSrS r\R                  " 5       S 5       rS rSr	g)ÚDeformableDetrImageLossé;   c                 ór   • [         R                  R                  U 5        Xl        X l        X0l        X@l        g ©N)ÚnnÚModuleÚ__init__ÚmatcherÚnum_classesÚfocal_alphaÚlosses)r)   rP   rQ   rR   rS   s        r=   rO   Ú DeformableDetrImageLoss.__init__<   s*   € Ü
�	‰	×Ñ˜4Ô ØŒØ&ÔØ&ÔØ�rG   c           	      óŒ  • US   nUR                   n[        R                  " U Vs/ s H  n[        US   5      PM     snUS9nUR	                  5       R                  S5      R                  S:„  R                  S5      n	[        R                  R                  U	R                  5       UR                  5       5      n
SU
0nU$ s  snf )zÊ
Compute the cardinality error, i.e. the absolute error in the number of predicted non-empty boxes.

This is not really a loss, it is intended for logging purposes only. It doesn't propagate gradients.
r   r   )Údevicer   g      à?r   Úcardinality_error)rV   r   r'   r$   r   ÚmaxÚvaluesÚsumrM   Ú
functionalÚl1_lossÚfloat)r)   r*   r+   r;   Ú	num_boxesr   rV   r0   Útarget_lengthsÚ	card_predÚcard_errrS   s               r=   Úloss_cardinalityÚ(DeformableDetrImageLoss.loss_cardinalityC   s©   € ð ˜Ñ"ˆØ—‘ˆÜŸšÉ'Ó)RÊ'ÀQ¬#¨a°Ñ.?Ö*@É'Ñ)RÐ[aÑbˆà—^‘^Ó%×)Ñ)¨"Ó-×4Ñ4°sÑ:×?Ñ?ÀÓBˆ	Ü—=‘=×(Ñ(¨¯©Ó):¸N×<PÑ<PÓ<RÓSˆØ% xÐ0ˆØˆùò *Ss   ¦Cc           	      óê  • SU;  a  [        S5      eUS   nU R                  U5      n[        R                  " [	        X#5       VVV	s/ s H  u  nu  p‰US   U	   PM     sn	nn5      n
[        R
                  " UR                  SS U R                  [        R                  UR                  S9nX«U'   [        R                  " UR                  S   UR                  S   UR                  S   S-   /UR                  UR                  UR                  S	9nUR                  SUR                  S
5      S5        USS2SS2SS
24   n[        X\X@R                   SS9UR                  S   -  nSU0nU$ s  sn	nnf )zˆ
Classification loss (Binary focal loss) targets dicts must contain the key "class_labels" containing a tensor
of dim [nb_target_boxes]
r   z#No logits were found in the outputsr   Nr   )r   rV   r   r   )r   ÚlayoutrV   r   )r3   r4   Úloss_ce)ÚKeyErrorÚ_get_source_permutation_idxr   r   ÚzipÚfullr   rQ   r(   rV   Úzerosr   re   Úscatter_Ú	unsqueezer   rR   )r)   r*   r+   r;   r^   Úsource_logitsÚidxÚtÚ_ÚJÚtarget_classes_oÚtarget_classesÚtarget_classes_onehotrf   rS   s                  r=   Úloss_labelsÚ#DeformableDetrImageLoss.loss_labelsT   sy  € ð
 ˜7Ó"ÜÐ@ÓAÐAØ Ñ)ˆà×.Ñ.¨wÓ7ˆÜ Ÿ9š9ÌCÐPWÔLaÕ%bÒLa¹y¸qÁ&À1 a¨Ñ&7¸Ô&:ÑLaÓ%bÓcÐÜŸšØ×Ñ  Ð# T×%5Ñ%5¼U¿[¹[ÐQ^×QeÑQeñ
ˆð /�sÑä %§¢Ø× Ñ  Ñ# ]×%8Ñ%8¸Ñ%;¸]×=PÑ=PÐQRÑ=SÐVWÑ=WÐXØ×%Ñ%Ø ×'Ñ'Ø ×'Ñ'ñ	!
Ðð 	×&Ñ& q¨.×*BÑ*BÀ2Ó*FÈÔJà 5²aº¸C¸R¸C°iÑ @Ðä˜}ÀY×VfÑVfÐnoÑpØ×!Ñ! !Ñ$ñ%ð 	ð ˜WÐ%ˆàˆùô+ &cs   ÁE.)rR   rS   rP   rQ   N)
rA   rB   rC   rD   rO   r   rE   rb   rv   rF   r@   rG   r=   rI   rI   ;   s&   † òð ‡]‚]ƒ_ñó ðõ rG   rI   c           
      óê  ^^• [        UR                  UR                  UR                  S9n	/ SQn
[	        U	UR
                  UR                  U
S9nUR                  U5        0 nXS'   X<S'   XLS'   S nUR                  (       a  [        Xg5      nXÜS'   U" XÁ5      mSUR                  S	.mUR                  TS
'   UR                  TS'   UR                  TS'   UR                  (       an  0 n[        UR                  S-
  5       H?  nUR!                  TR#                  5        VVs0 s H  u  nnUSU 3-   U_M     snn5        MA     TR!                  U5        [%        UU4S jT 5       5      nUTU4$ s  snnf )N©r    r   r!   )Úlabelsr   ÚcardinalityÚmasks©rP   rQ   rR   rS   r   r   Ú
pred_masksÚauxiliary_outputsr   ©rf   Ú	loss_bboxÚ	loss_giouÚ	loss_maskÚ	loss_dicerq   c              3   óH   >#   • U  H  oT;   d  M
  TU   TU   -  v •  M     g 7frL   r@   ©Ú.0ÚkÚ	loss_dictÚweight_dicts     €€r=   Ú	<genexpr>Ú4DeformableDetrForSegmentationLoss.<locals>.<genexpr>›   ó&   øé € ÐT²i°ÈÑCSÓ,ˆy˜‰|˜k¨!™nÖ,²iùó   ƒ	"�")r   r    r   r!   rI   Ú
num_labelsrR   ÚtoÚauxiliary_lossr	   Úbbox_loss_coefficientÚgiou_loss_coefficientÚmask_loss_coefficientÚdice_loss_coefficientÚrangeÚdecoder_layersÚupdateÚitemsrZ   )r   rz   rV   r   r~   ÚconfigÚoutputs_classÚoutputs_coordÚkwargsrP   rS   Ú	criterionÚoutputs_lossr   Úaux_weight_dictr9   rˆ   r0   Úlossr‰   rŠ   s                      @@r=   Ú!DeformableDetrForSegmentationLossr¢   v   sy  ù€ ô ¨&×*;Ñ*;Àv×GWÑGWÐci×csÑcsÑt€Gâ8€FÜ'ØØ×%Ñ%Ø×&Ñ&Øñ	€Ið ‡L�L�Ôà€LØ#�ÑØ!+�ÑØ!+�ÑàÐØ××Ü)¨-ÓGÐØ,=Ð(Ñ)á˜,Ó/€Ià¨f×.JÑ.JÑK€KØ%×;Ñ;€K�ÑØ%×;Ñ;€K�ÑØ%×;Ñ;€K�ÑØ××ØˆÜ�v×,Ñ,¨qÑ0Ö1ˆAØ×"Ñ"¸{×?PÑ?PÔ?RÔ#SÒ?R±t°q¸! A¨!¨A¨3¨¡K°¢NÑ?RÒ#SÖTñ 2à×Ñ˜?Ô+äÕT±iÓTÓT€DØ�Ð-Ð-Ð-ùó	 $Ts   Ä!E/c           
      ó¦  ^^• [        UR                  UR                  UR                  S9n/ SQn	[	        UUR
                  UR                  U	S9n
U
R                  U5        0 nS nXS'   X;S'   UR                  (       a  [        XV5      nXËS'   U
" X±5      mSUR                  S.mUR                  TS	'   UR                  (       an  0 n[        UR                  S-
  5       H?  nUR                  TR                  5        VVs0 s H  u  nnUS
U 3-   U_M     snn5        MA     TR                  U5        [!        UU4S jT 5       5      nUTU4$ s  snnf )Nry   )rz   r   r{   r}   r   r   r   r   r€   r‚   rq   c              3   óH   >#   • U  H  oT;   d  M
  TU   TU   -  v •  M     g 7frL   r@   r†   s     €€r=   r‹   Ú7DeformableDetrForObjectDetectionLoss.<locals>.<genexpr>Á   r�   rŽ   )r   r    r   r!   rI   r�   rR   r�   r‘   r	   r’   r“   r–   r—   r˜   r™   rZ   )r   rz   rV   r   rš   r›   rœ   r�   rP   rS   rž   rŸ   r   r    r9   rˆ   r0   r¡   r‰   rŠ   s                     @@r=   Ú$DeformableDetrForObjectDetectionLossr¦   Ÿ   sU  ù€ ô -Ø×$Ñ$°×0@Ñ0@ÈF×L\ÑL\ñ€Gò 0€FÜ'ØØ×%Ñ%Ø×&Ñ&Øñ	€Ið ‡L�L�Ôà€LØÐØ#�ÑØ!+�ÑØ××Ü)¨-ÓGÐØ,=Ð(Ñ)á˜,Ó/€Ià¨f×.JÑ.JÑK€KØ%×;Ñ;€K�ÑØ××ØˆÜ�v×,Ñ,¨qÑ0Ö1ˆAØ×"Ñ"¸{×?PÑ?PÔ?RÔ#SÒ?R±t°q¸! A¨!¨A¨3¨¡K°¢NÑ?RÒ#SÖTñ 2à×Ñ˜?Ô+ÜÕT±iÓTÓT€DØ�Ð-Ð-Ð-ùó $Ts   Ã?E)NN)r   Útorch.nnrM   Úimage_transformsr   Úutilsr   Úloss_for_object_detectionr   r   r	   r
   r   Úscipy.optimizer   r   rI   r¢   r¦   r@   rG   r=   Ú<module>r¬      s_   ðÛ Ý å 7Ý &÷õ ñ ×ÑÝ4ô%tÐ%5ô %tôP8˜iô 8ðx _cô&.ðT SWõ#.rG   