ó
    pyüiÌ=  ã                   óD  • S SK r S SKJr  S SKJs  Jr  SSKJr  SSKJ	r	  SSK
JrJr  \" 5       (       a  S SKJr  S r SS	 jrS
\S\ R$                  S\S\ R$                  4S jrS\ R$                  S
\S\S\ R$                  4S jrSS jr " S S\5      r       SS jrg)é    Né   )Úis_vision_availableé   )Úbox_iou)ÚRTDetrHungarianMatcherÚ
RTDetrLoss)Úcenter_to_corners_formatc                 óR   • [        X5       VVs/ s H	  u  p#X#S.PM     snn$ s  snnf )N)ÚlogitsÚ
pred_boxes©Úzip)Úoutputs_classÚoutputs_coordÚaÚbs       ÚZ/home/mande/repo/quber/.venv/lib/python3.13/site-packages/transformers/loss/loss_d_fine.pyÚ_set_aux_lossr      s&   € Ü7:¸=Ô7XÔYÒ7X©t¨q�qÔ*Ñ7XÒYÐYùÓYs   �#c                 ól   • [        XX#5       VVVV	s/ s H  u  pgp‰UUUU	UUS.PM     sn	nnn$ s  sn	nnnf )N)r   r   Úpred_cornersÚ
ref_pointsÚteacher_cornersÚteacher_logitsr   )
r   r   Úoutputs_cornersÚoutputs_refr   r   r   r   ÚcÚds
             r   Ú_set_aux_loss2r   !   sN   € ô ˜m¸OÔYö
ò Z‰JˆA�!ð ØØØØ.Ø,ô	
ñ Zô
ð 
ùõ 
s   ’.
Úmax_num_binsÚupÚ	reg_scaleÚreturnc                 ó:  • [        US   5      [        U5      -  n[        US   5      [        U5      -  S-  nUS-   SU S-
  -  -  n[        U S-  S-
  SS5       Vs/ s H  oeU-  * S-   PM     nn[        SU S-  5       Vs/ s H
  oeU-  S-
  PM     nnU* /U-   [        R                  " US   S   5      /-   U-   U/-   n	U	 V
s/ s H)  oªR	                  5       S:”  a  U
OU
R                  S5      PM+     n	n
[        R                  " U	S5      n	U	$ s  snf s  snf s  sn
f )u  
Generates the non-uniform Weighting Function W(n) for bounding box regression.

Args:
    max_num_bins (int): Max number of the discrete bins.
    up (Tensor): Controls upper bounds of the sequence,
                 where maximum offset is Â±up * H / W.
    reg_scale (float): Controls the curvature of the Weighting Function.
                       Larger values result in flatter weights near the central axis W(max_num_bins/2)=0
                       and steeper weights at both ends.
Returns:
    Tensor: Sequence of Weighting Function.
r   r   r   éÿÿÿÿN)ÚabsÚrangeÚtorchÚ
zeros_likeÚdimÚ	unsqueezeÚcat)r   r    r!   Úupper_bound1Úupper_bound2ÚstepÚiÚleft_valuesÚright_valuesÚvaluesÚvs              r   Úweighting_functionr4   1   s+  € ô �r˜!‘u“:¤ I£Ñ.€LÜ�r˜!‘u“:¤ I£Ñ.°Ñ2€LØ˜1Ñ ! |°aÑ'7Ñ"8Ñ9€DÜ/4°\ÀQÑ5FÈÑ5JÈAÈrÔ/RÓSÒ/R¨!˜q‘[�> AÔ%Ñ/R€KÐSÜ-2°1°lÀaÑ6GÔ-HÓIÒ-H¨˜a‘K !”OÑ-H€LÐIØˆmˆ_˜{Ñ*¬e×.>Ò.>¸rÀ!¹uÀT¹{Ó.KÐ-LÑLÈ|Ñ[Ð_kÐ^lÑl€FÙ<BÓCºF°q—5‘5“7˜Q“;‰a A§K¡K°£NÒ2¹F€FÐCÜ�YŠY�v˜qÓ!€FØ€Mùò TùÚIùâCs   ÁDÂ DÃ0DÚgtc                 ón  • U R                  S5      n [        XU5      nUR                  S5      U R                  S5      -
  nUS:*  n[        R                  " USS9S-
  nUR                  5       n[        R                  " U5      n	[        R                  " U5      n
US:¬  X�:  -  nX‹   R                  5       nXL   nXLS-      n[        R                  " X   U-
  5      n[        R                  " XàU   -
  5      nXÿU-   -  X›'   SX›   -
  X«'   US:  nSU	U'   SU
U'   SUU'   X�:¬  nSU	U'   SU
U'   US-
  UU'   X‰U
4$ )aÉ  
Decodes bounding box ground truth (GT) values into distribution-based GT representations.

This function maps continuous GT values into discrete distribution bins, which can be used
for regression tasks in object detection models. It calculates the indices of the closest
bins to each GT value and assigns interpolation weights to these bins based on their proximity
to the GT value.

Args:
    gt (Tensor): Ground truth bounding box values, shape (N, ).
    max_num_bins (int): Maximum number of discrete bins for the distribution.
    reg_scale (float): Controls the curvature of the Weighting Function.
    up (Tensor): Controls the upper bounds of the Weighting Function.

Returns:
    tuple[Tensor, Tensor, Tensor]:
        - indices (Tensor): Index of the left bin closest to each GT value, shape (N, ).
        - weight_right (Tensor): Weight assigned to the right bin, shape (N, ).
        - weight_left (Tensor): Weight assigned to the left bin, shape (N, ).
r$   r   r   ©r)   g      ð?g        çš™™™™™¹?)	Úreshaper4   r*   r'   ÚsumÚfloatr(   Úlongr%   )r5   r   r!   r    Úfunction_valuesÚdiffsÚmaskÚclosest_left_indicesÚindicesÚweight_rightÚweight_leftÚvalid_idx_maskÚvalid_indicesr0   r1   Ú
left_diffsÚright_diffsÚinvalid_idx_mask_negÚinvalid_idx_mask_poss                      r   Útranslate_gtrJ   J   sy  € ð* 
�‰�B‹€BÜ(¨¸9ÓE€Oð ×%Ñ% aÓ(¨2¯<©<¸«?Ñ:€EØ�A‰:€DÜ Ÿ9š9 T¨qÑ1°AÑ5Ðð #×(Ñ(Ó*€Gä×#Ò# GÓ,€LÜ×"Ò" 7Ó+€Kà ‘l wÑ'=Ñ>€NØÑ+×0Ñ0Ó2€Mð "Ñ0€KØ"°1Ñ#4Ñ5€Lä—’˜2Ñ-°Ñ;Ó<€JÜ—)’)˜L¨nÑ+=Ñ=Ó>€Kð $.¸kÑ1IÑ#J€LÑ Ø"%¨Ñ(DÑ"D€KÑð # Q™;ÐØ),€LÐ%Ñ&Ø(+€KÐ$Ñ%Ø$'€GÐ Ñ!à"Ñ2ÐØ),€LÐ%Ñ&Ø(+€KÐ$Ñ%Ø$0°3Ñ$6€GÐ Ñ!à +Ð-Ð-ó    c                 ó6  • [        U5      nU SS2S4   USS2S4   -
  U S   U-  S-   -  SU-  -
  nU SS2S4   USS2S4   -
  U S   U-  S-   -  SU-  -
  nUSS2S4   U SS2S4   -
  U S   U-  S-   -  SU-  -
  nUSS2S	4   U SS2S4   -
  U S   U-  S-   -  SU-  -
  n	[        R                  " XgX‰/S
5      n
[        X¢X45      u  p«nUb  U
R	                  SX%-
  S9n
U
R                  S
5      R                  5       UR                  5       UR                  5       4$ )aÎ  
Converts bounding box coordinates to distances from a reference point.

Args:
    points (Tensor): (n, 4) [x, y, w, h], where (x, y) is the center.
    bbox (Tensor): (n, 4) bounding boxes in "xyxy" format.
    max_num_bins (float): Maximum bin value.
    reg_scale (float): Controlling curvarture of W(n).
    up (Tensor): Controlling upper bounds of W(n).
    eps (float): Small value to ensure target < max_num_bins.

Returns:
    Tensor: Decoded distances.
Nr   ).r   g¼‰Ø—²Òœ<ç      à?r   ).é   r   rN   r$   ©ÚminÚmax)r%   r'   ÚstackrJ   Úclampr9   Údetach)ÚpointsÚbboxr   r!   r    ÚepsÚleftÚtopÚrightÚbottomÚ	four_lensrB   rC   s                r   Úbbox2distancer]   ‰   sd  € ô  �I“€IØ’1�a�4‰L˜4¢ 1 ™:Ñ%¨&°©.¸9Ñ*DÀuÑ*LÑMÐPSÐV_ÑP_Ñ_€DØ’!�Q�$‰<˜$šq !˜t™*Ñ$¨°©¸)Ñ)CÀeÑ)KÑ
LÈsÐU^ÉÑ
^€CØ’!�Q�$‰Z˜&¢ A ™,Ñ&¨6°&©>¸IÑ+EÈÑ+MÑNÐQTÐW`ÑQ`Ñ`€EØ’1�a�4‰j˜6¢! Q $™<Ñ'¨F°6©N¸YÑ,FÈÑ,NÑOÐRUÐXaÑRaÑa€FÜ—’˜T¨Ð6¸Ó;€IÜ+7¸	ÐQZÓ+_Ñ(€I˜[ØÑØ—O‘O¨¨|Ñ/A�OÐBˆ	Ø×Ñ˜RÓ ×'Ñ'Ó)¨<×+>Ñ+>Ó+@À+×BTÑBTÓBVÐVÐVrK   c                   óH   ^ • \ rS rSrSrU 4S jr SS jrS	S jrS rSr	U =r
$ )
Ú	DFineLossé¥   a=  
This class computes the losses for D-FINE. The process happens in two steps: 1) we compute hungarian assignment
between ground truth boxes and the outputs of the model 2) we supervise each pair of matched ground-truth /
prediction (supervise class and box).

Args:
    matcher (`DetrHungarianMatcher`):
        Module able to compute a matching between targets and proposals.
    weight_dict (`Dict`):
        Dictionary relating each loss with its weights. These losses are configured in DFineConf as
        `weight_loss_vfl`, `weight_loss_bbox`, `weight_loss_giou`, `weight_loss_fgl`, `weight_loss_ddf`
    losses (`list[str]`):
        List of all the losses to be applied. See `get_loss` for a list of all available losses.
    alpha (`float`):
        Parameter alpha used to compute the focal loss.
    gamma (`float`):
        Parameter gamma used to compute the focal loss.
    eos_coef (`float`):
        Relative classification weight applied to the no-object category.
    num_classes (`int`):
        Number of object categories, omitting the special no-object category.
c                 óŠ  >• [         TU ]  U5        [        U5      U l        UR                  U l        UR
                  UR                  UR                  UR                  UR                  S.U l
        / SQU l        UR                  U l        [        R                  " [        R                   " UR"                  /5      SS9U l        g )N)Úloss_vflÚ	loss_bboxÚ	loss_giouÚloss_fglÚloss_ddf)ÚvflÚboxesÚlocalF)Úrequires_grad)ÚsuperÚ__init__r   Úmatcherr   Úweight_loss_vflÚweight_loss_bboxÚweight_loss_giouÚweight_loss_fglÚweight_loss_ddfÚweight_dictÚlossesr!   ÚnnÚ	Parameterr'   Útensorr    )ÚselfÚconfigÚ	__class__s     €r   rl   ÚDFineLoss.__init__½   s˜   ø€ Ü‰Ñ˜Ô ä-¨fÓ5ˆŒØ"×/Ñ/ˆÔà×.Ñ.Ø×0Ñ0Ø×0Ñ0Ø×.Ñ.Ø×.Ñ.ñ
ˆÔò 0ˆŒØ×)Ñ)ˆŒÜ—,’,œuŸ|š|¨V¯Y©Y¨KÓ8ÈÑNˆ�rK   c                 óˆ  • UR                  5       nUS-   n	[        R                  " XSS9UR                  S5      -  [        R                  " XSS9UR                  S5      -  -   n
Ub  UR	                  5       nX¥-  n
Ub  U
R                  5       U-  n
U
$ US:X  a  U
R                  5       n
U
$ US:X  a  U
R                  5       n
U
$ )Nr   Únone©Ú	reductionr$   Úmeanr:   )r<   ÚFÚcross_entropyr9   r;   r:   r€   )rx   ÚpredÚlabelrB   rC   Úweightr   Ú
avg_factorÚdis_leftÚ	dis_rightÚlosss              r   Ú unimodal_distribution_focal_lossÚ*DFineLoss.unimodal_distribution_focal_lossÍ   sÓ   € ð —:‘:“<ˆØ˜q‘Lˆ	ä�Š˜t¸Ñ@À;×CVÑCVÐWYÓCZÑZÔ]^×]lÒ]lØ vñ^
à× Ñ  Ó$ñ^%ñ %ˆð ÑØ—\‘\“^ˆFØ‘=ˆDàÑ!Ø—8‘8“: 
Ñ*ˆDð ˆð ˜&Ó Ø—9‘9“;ˆDð ˆð ˜%ÓØ—8‘8“:ˆDàˆrK   c           	      óª  • 0 nSU;   Ga0  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SS9nUS   U   R	                  SU R
                  S-   5      nUS   U   R                  5       n[        R                  " 5          [        U[        U5      U R
                  U R                  U R                  5      U l        SSS5        U R                  u  pïn[        R                  " [        [        US	   U   5      [        U5      5      S   5      nUR                  S5      R!                  SSS
5      R	                  S5      R                  5       nU R#                  UUUUUUS9US'   US   R	                  SU R
                  S-   5      nUS   R	                  SU R
                  S-   5      n[        R$                  " XÎ5      (       a  UR'                  5       S-  US'   U$ US   R)                  5       R+                  SS9S   n[        R,                  " U[        R.                  S9nSUU'   UR                  S5      R!                  SSS
5      R	                  S5      nUR1                  UU   5      R3                  UR4                  5      UU'   UR                  S5      R!                  SSS
5      R	                  S5      R                  5       nUUS-  -  [6        R8                  " SS9" [:        R<                  " XÅ-  SS9[:        R>                  " UR                  5       U-  SS95      R'                  S5      -  nSUS	   R@                  S   -  nUR'                  5       U-  S-  U) R'                  5       U-  S-  sU l!        U l"        URG                  5       (       a  UU   RI                  5       OSnU) RG                  5       (       a  UU)    RI                  5       OSnUU RB                  -  UU RD                  -  -   U RB                  U RD                  -   -  US'   U$ s  sn
n	nf ! , (       d  f       GNe= f)zYCompute Fine-Grained Localization (FGL) Loss
and Decoupled Distillation Focal (DDF) Loss.r   rh   r   r7   r$   r   r   Nr   é   )r†   re   r   rf   r   )ÚdtypeTr   r}   r~   rM   )%Ú_get_source_permutation_idxr'   r+   r   r9   r   rT   Úno_gradr]   r	   r!   r    Úfgl_targetsÚdiagr   r*   ÚrepeatrŠ   Úequalr:   ÚsigmoidrQ   r(   ÚboolÚ
reshape_asÚtorŽ   ru   Ú	KLDivLossr�   Úlog_softmaxÚsoftmaxÚshapeÚnum_posÚnum_negÚanyr€   )rx   ÚoutputsÚtargetsrA   Ú	num_boxesÚTrt   ÚidxÚtÚ_r/   Útarget_boxesr   r   Útarget_cornersrB   rC   ÚiousÚweight_targetsÚweight_targets_localr?   Úloss_match_localÚbatch_scaleÚloss_match_local1Úloss_match_local2s                            r   Ú
loss_localÚDFineLoss.loss_localä   s   € ð ˆØ˜WÔ$Ø×2Ñ2°7Ó;ˆCÜ Ÿ9š9ÄSÈÔEZÕ%[ÒEZ¹	¸¹6¸A a¨¡j°¤mÑEZÓ%[ÐabÑcˆLà" >Ñ2°3Ñ7×?Ñ?ÀÀT×EVÑEVÐYZÑEZÓ\ˆLØ  Ñ.¨sÑ3×:Ñ:Ó<ˆJÜ—’•Ü#0ØÜ,¨\Ó:Ø×%Ñ%Ø—N‘NØ—G‘Gó$�Ô ÷ !ð 9=×8HÑ8HÑ5ˆN¨+ä—:’:ÜÔ0°¸Ñ1FÀsÑ1KÓLÔNfÐgsÓNtÓuØñóˆDð
 "Ÿ^™^¨BÓ/×6Ñ6°q¸!¸QÓ?×GÑGÈÓK×RÑRÓTˆNà!%×!FÑ!FØØØØØØ$ð "Gð "ˆF�:Ñð # >Ñ2×:Ñ:¸2À×@QÑ@QÐTUÑ@UÓWˆLØ$Ð%6Ñ7×?Ñ?ÀÀT×EVÑEVÐYZÑEZÓ\ˆNÜ�{Š{˜<×8Ñ8Ø%1×%5Ñ%5Ó%7¸!Ñ%;��zÑ"ð@ ˆð= (/Ð/?Ñ'@×'HÑ'HÓ'J×'NÑ'NÐSUÐ'NÐ'VÐWXÑ'YÐ$Ü×'Ò'Ð(<ÄEÇJÁJÑO�Ø ��S‘	Ø—~‘~ bÓ)×0Ñ0°°A°qÓ9×AÑAÀ"ÓE�à,0¯O©OÐ<PÐQTÑ<UÓ,V×,YÑ,YÐZn×ZtÑZtÓ,uÐ$ SÑ)Ø';×'EÑ'EÀbÓ'I×'PÑ'PÐQRÐTUÐWXÓ'Y×'aÑ'aÐbdÓ'e×'lÑ'lÓ'nÐ$ð )Ø˜!‘tñô Ÿš¨vÒ6ÜŸMšM¨,Ñ*:ÀÑBÜŸIšI n×&;Ñ&;Ó&=ÀÑ&AÀqÑIó÷ ‘c˜"“gñð !ð   '¨,Ñ"7×"=Ñ"=¸aÑ"@Ñ@�à—X‘X“Z +Ñ-°#Ñ5Ø�e—[‘[“] [Ñ0°SÑ8ð +�”˜dœlð FJÇXÁXÇZÁZÐ$4°TÑ$:×$?Ñ$?Ô$AÐUVÐ!ØHLÀuÇkÁkÇmÁmÐ$4°d°UÑ$;×$@Ñ$@Ô$BÐYZÐ!Ø&7¸$¿,¹,Ñ&FÐIZÐ]a×]iÑ]iÑIiÑ&iØ—L‘L 4§<¡<Ñ/ñ&��zÑ"ð ˆùôE &\÷ !–ús   ºP<Â)<QÑ
Qc                 ó´   • U R                   U R                  U R                  U R                  U R                  S.nX;  a  [        SU S35      eXa   " X#XE5      $ )N)Úcardinalityri   rh   Úfocalrg   zLoss z not supported)Úloss_cardinalityr°   Ú
loss_boxesÚloss_labels_focalÚloss_labels_vflÚ
ValueError)rx   r‰   r    r¡   rA   r¢   Úloss_maps          r   Úget_lossÚDFineLoss.get_loss/  s]   € à×0Ñ0Ø—_‘_Ø—_‘_Ø×+Ñ+Ø×'Ñ'ñ
ˆð ÓÜ˜u T F¨.Ð9Ó:Ð:ØŠ~˜g°ÓCÐCrK   )	r‘   rt   rm   r   rž   r�   r!   r    rs   )Nr:   N)é   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rl   rŠ   r°   r»   Ú__static_attributes__Ú__classcell__)rz   s   @r   r_   r_   ¥   s-   ø† ñõ.Oð" `dôô.I÷V
Dð 
DrK   r_   c           
      ój  • [        U5      nUR                  U5        0 nXS'   UR                  SSS9US'   S nUR                  (       GaÅ  U	b|  [        R
                  " UR                  SSS9U	S   SS9u  nn[        R
                  " XYS   SS9u  nn[        R
                  " X©S   SS9u  nn[        R
                  " X¹S   SS9u  nnOUR                  SSS9nUnU
nUnUR                  (       Ga  [        US S 2S S	24   R                  SS5      US S 2S S	24   R                  SS5      US S 2S S	24   R                  SS5      US S 2S S	24   R                  SS5      US S 2S	4   US S 2S	4   5      nXþS
'   US
   R                  [        U/UR                  SSS9/5      5        U	bg  [        WR                  SS5      WR                  SS5      WR                  SS5      WR                  SS5      US S 2S	4   US S 2S	4   5      nUUS'   XžS'   U" Xá5      n[        UR                  5       5      nUUU4$ )Nr   r   r   rO   r   Údn_num_splitr   r7   r$   Úauxiliary_outputsÚdn_auxiliary_outputsÚdenoising_meta_values)r_   r˜   rS   Úauxiliary_lossr'   Úsplitr   Ú	transposeÚextendr   r:   r2   )r   ÚlabelsÚdevicer   ry   r   r   Úenc_topk_logitsÚenc_topk_bboxesrÉ   Úpredicted_cornersÚinitial_reference_pointsÚkwargsÚ	criterionÚoutputs_lossrÇ   Údn_out_coordÚnormal_out_coordÚdn_out_classÚnormal_out_classÚdn_out_cornersÚout_cornersÚdn_out_refsÚout_refsrÈ   Ú	loss_dictr‰   s                              r   ÚDFineForObjectDetectionLossrà   <  s›  € ô ˜&Ó!€IØ‡L�L�Ôà€LØ#�ÑØ!+×!1Ñ!1°a¸QÐ!1Ð!?€L�ÑØÐØ××ÐØ Ñ,Ü-2¯[ª[Ø×#Ñ#¨¨qÐ#Ð1Ð3HÈÑ3XÐ^_ñ.Ñ*ˆLÐ*ô .3¯[ª[¸Ð^lÑHmÐstÑ-uÑ*ˆLÐ*Ü*/¯+ª+Ð6GÐ_mÑInÐtuÑ*vÑ'ˆN˜KÜ$)§K¢KÐ0HÐ`nÑJoÐuvÑ$wÑ!ˆK™à,×2Ñ2°q¸aÐ2Ð@ÐØ,ÐØ+ˆKØ/ˆHà× × Ð Ü .Ø ¢ C R C Ñ(×2Ñ2°1°aÓ8Ø ¢ C R C Ñ(×2Ñ2°1°aÓ8ØšA˜s ˜s˜FÑ#×-Ñ-¨a°Ó3Øš˜C˜R˜C˜Ñ ×*Ñ*¨1¨aÓ0ØšA˜r˜EÑ"Ø ¢ B Ñ'ó!Ðð 1BÐ,Ñ-ØÐ,Ñ-×4Ñ4Ü˜Ð/°/×2GÑ2GÈAÐSTÐ2GÐ2UÐ1VÓWôð %Ñ0Ü'5Ø ×*Ñ*¨1¨aÓ0Ø ×*Ñ*¨1¨aÓ0Ø"×,Ñ,¨Q°Ó2Ø×)Ñ)¨!¨QÓ/Ø"¢1 b 5Ñ)Ø ¢ B Ñ'ó(Ð$ð 8L�Ð3Ñ4Ø8MÐ4Ñ5á˜,Ó/€Iäˆy×ÑÓ!Ó"€DØ�Ð-Ð-Ð-rK   )NN)r8   )NNNNNNN)r'   Útorch.nnru   Útorch.nn.functionalÚ
functionalr�   Úutilsr   Úloss_for_object_detectionr   Úloss_rt_detrr   r   Útransformers.image_transformsr	   r   r   ÚintÚTensorr4   rJ   r]   r_   rà   © rK   r   Ú<module>rë      sÃ   ðó  Ý ß Ð å 'Ý .ß <ñ ×ÑÝFòZð
 fjôð  Sð ¨e¯l©lð Àsð ÈuÏ|É|ô ð2<.�U—\‘\ð <.°ð <.Àð <.È%Ï,É,ô <.ô~Wô8TD�
ô TDðz ØØØØØØ!õA.rK   