Ë
    S^(hrV  ã                   ó,  — 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	 ddl
mZmZmZmZmZ  e«       rd dlmZ  e«       rd dlmZ e j(                  j*                  d„ «       Z G d	„ d
ej.                  «      Z G d„ dej.                  «      Z	 	 	 	 	 dd„Zy)é    Né   )Úis_scipy_availableÚis_vision_availableÚrequires_backendsé   )Úbox_iouÚ	dice_lossÚgeneralized_box_iouÚnested_tensor_from_tensor_listÚsigmoid_focal_loss)Úlinear_sum_assignment)Úcenter_to_corners_formatc                 óR   — t        | |«      D ��cg c]
  \  }}||dœ‘Œ c}}S c c}}w )N)ÚlogitsÚ
pred_boxes)Úzip)Úoutputs_classÚoutputs_coordÚaÚbs       ú\/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/transformers/loss/loss_rt_detr.pyÚ_set_aux_lossr   &   s(   € ô
 8;¸=È-Ó7X×Y©t¨q°!�q¨Ó*ÓYÐYùÓYs   �#c                   óP   ‡ — e Zd ZdZˆ fd„Z ej                  «       d„ «       Zˆ xZS )ÚRTDetrHungarianMatchera›  This class computes an assignment between the targets and the predictions of the network

    For efficiency reasons, the targets don't include the no_object. Because of this, in general, there are more
    predictions than targets. In this case, we do a 1-to-1 matching of the best predictions, while the others are
    un-matched (and thus treated as non-objects).

    Args:
        config: RTDetrConfig
    c                 ó€  •— t         ‰| �  «        t        | dg«       |j                  | _        |j
                  | _        |j                  | _        |j                  | _	        |j                  | _        |j                  | _        | j                  | j                  cxk(  r| j                  cxk(  rdk(  rt        d«      ‚ y y )NÚscipyr   z#All costs of the Matcher can't be 0)ÚsuperÚ__init__r   Úmatcher_class_costÚ
class_costÚmatcher_bbox_costÚ	bbox_costÚmatcher_giou_costÚ	giou_costÚuse_focal_lossÚmatcher_alphaÚalphaÚmatcher_gammaÚgammaÚ
ValueError)ÚselfÚconfigÚ	__class__s     €r   r   zRTDetrHungarianMatcher.__init__9   s™   ø€ Ü‰ÑÔÜ˜$  	Ô*à ×3Ñ3ˆŒØ×1Ñ1ˆŒØ×1Ñ1ˆŒà$×3Ñ3ˆÔØ×)Ñ)ˆŒ
Ø×)Ñ)ˆŒ
à�?‰?˜dŸn™nÔC°·±ÔCÀ!ÒCÜÐBÓCÐCò Dó    c           	      óL  — |d   j                   dd \  }}|d   j                  dd«      }t        j                  |D �cg c]  }|d   ‘Œ	 c}«      }t        j                  |D �cg c]  }|d   ‘Œ	 c}«      }| j                  r¢t        j                  |d   j                  dd«      «      }	|	dd…|f   }	d| j                  z
  |	| j                  z  z  d|	z
  d	z   j                  «        z  }
| j                  d|	z
  | j                  z  z  |	d	z   j                  «        z  }||
z
  }n.|d   j                  dd«      j                  d
«      }	|	dd…|f    }t        j                  ||d¬«      }t        t        |«      t        |«      «       }| j                  |z  | j                  |z  z   | j                   |z  z   }|j#                  ||d
«      j%                  «       }|D �cg c]  }t'        |d   «      ‘Œ }}t)        |j+                  |d
«      «      D ��cg c]  \  }}t-        ||   «      ‘Œ }}}|D ��cg c]O  \  }}t        j.                  |t        j0                  ¬«      t        j.                  |t        j0                  ¬«      f‘ŒQ c}}S c c}w c c}w c c}w c c}}w c c}}w )a…  Performs the matching

        Params:
            outputs: This is a dict that contains at least these entries:
                 "logits": Tensor of dim [batch_size, num_queries, num_classes] with the classification logits
                 "pred_boxes": Tensor of dim [batch_size, num_queries, 4] with the predicted box coordinates

            targets: This is a list of targets (len(targets) = batch_size), where each target is a dict containing:
                 "class_labels": Tensor of dim [num_target_boxes] (where num_target_boxes is the number of ground-truth
                           objects in the target) containing the class labels
                 "boxes": Tensor of dim [num_target_boxes, 4] containing the target box coordinates

        Returns:
            A list of size batch_size, containing tuples of (index_i, index_j) where:
                - index_i is the indices of the selected predictions (in order)
                - index_j is the indices of the corresponding selected targets (in order)
            For each batch element, it holds:
                len(index_i) = len(index_j) = min(num_queries, num_target_boxes)
        r   Nr   r   r   r   Úclass_labelsÚboxesg:Œ0âŽyE>éÿÿÿÿ)Úp©Údtype)ÚshapeÚflattenÚtorchÚcatr%   ÚFÚsigmoidr'   r)   ÚlogÚsoftmaxÚcdistr
   r   r"   r    r$   ÚviewÚcpuÚlenÚ	enumerateÚsplitr   Ú	as_tensorÚint64)r+   ÚoutputsÚtargetsÚ
batch_sizeÚnum_queriesÚout_bboxÚvÚ
target_idsÚtarget_bboxÚout_probÚneg_cost_classÚpos_cost_classr    r"   r$   Úcost_matrixÚsizesÚiÚcÚindicesÚjs                        r   ÚforwardzRTDetrHungarianMatcher.forwardH   so  € ð* #*¨(Ñ"3×"9Ñ"9¸"¸1Ð"=Ñˆ
�Kð ˜<Ñ(×0Ñ0°°AÓ6ˆä—Y‘Y¸7ÖC°a  .Ó 1ÒCÓDˆ
Ü—i‘i°WÖ =°  7£Ò =Ó>ˆð ×ÒÜ—y‘y ¨Ñ!2×!:Ñ!:¸1¸aÓ!@ÓAˆHØ¢ : Ñ.ˆHØ $§*¡*™n°¸4¿:¹:Ñ1EÑFÈAÐPXÉLÐ[_ÑL_×KdÑKdÓKfÐJfÑgˆNØ!ŸZ™Z¨A°©L¸T¿Z¹ZÑ+GÑHÈhÐY]Éo×MbÑMbÓMdÐLdÑeˆNØ'¨.Ñ8‰Jà˜xÑ(×0Ñ0°°AÓ6×>Ñ>¸rÓBˆHØ"¢1 j =Ñ1Ð1ˆJô —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ˆÐ2Ü;DÀ[×EVÑEVÐW\Ð^`ÓEaÓ;b×c±4°1°aÔ(¨¨1©Õ.ÐcˆÑcàkr×sÑcgÐcdÐfg”—‘ ¬%¯+©+Ô6¼¿¹ÈÔQV×Q\ÑQ\Ô8]Ò^ÓsÐsùò5  DùÚ =ùò, 3ùÛcùãss   ¾JÁ$JÇJÈJÈ3AJ )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r8   Úno_gradrW   Ú__classcell__©r-   s   @r   r   r   .   s,   ø„ ñôDð €U‡]�]ƒ_ñ3tó ô3tr.   r   c                   ó¤   ‡ — e Zd ZdZˆ fd„Zdd„Zdd„Z ej                  «       d„ «       Z	d„ Z
d„ Zdd„Zd	„ Zd
„ Zdd„Zd„ Zed„ «       Zd„ Zˆ xZS )Ú
RTDetrLossah  
    This class computes the losses for RTDetr. 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 RTDetrConf as
            `weight_loss_vfl`, `weight_loss_bbox`, `weight_loss_giou`
        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         ‰| �  «        t        |«      | _        |j                  | _        |j                  |j                  |j                  dœ| _	        ddg| _
        |j                  | _        t        j                  |j                  dz   «      }| j                  |d<   | j                  d|«       |j                   | _        |j$                  | _        y )N)Úloss_vflÚ	loss_bboxÚ	loss_giouÚvflr1   r   r2   Úempty_weight)r   r   r   ÚmatcherÚ
num_labelsÚnum_classesÚweight_loss_vflÚweight_loss_bboxÚweight_loss_giouÚweight_dictÚlossesÚeos_coefficientÚeos_coefr8   ÚonesÚregister_bufferÚfocal_loss_alphar'   Úfocal_loss_gammar)   )r+   r,   rf   r-   s      €r   r   zRTDetrLoss.__init__—   s¹   ø€ Ü‰ÑÔä-¨fÓ5ˆŒØ!×,Ñ,ˆÔà×.Ñ.Ø×0Ñ0Ø×0Ñ0ñ
ˆÔð
 ˜gÐ&ˆŒØ×.Ñ.ˆŒÜ—z‘z &×"3Ñ"3°aÑ"7Ó8ˆØŸ=™=ˆ�RÑØ×Ñ˜^¨\Ô:Ø×,Ñ,ˆŒ
Ø×,Ñ,ˆ�
r.   c           	      óò  — d|vrt        d«      ‚d|vrt        d«      ‚| j                  |«      }|d   |   }t        j                  t	        ||«      D ��	�
cg c]  \  }\  }	}
|d   |
   ‘Œ c}
}	}d¬«      }t        t        |j                  «       «      t        |«      «      \  }}	t        j                  |«      }|d   }t        j                  t	        ||«      D ��	�
cg c]  \  }\  }	}
|d   |
   ‘Œ c}
}	}«      }t        j                  |j                  d d	 | j                  t        j                  |j                  ¬
«      }|||<   t        j                  || j                  dz   ¬«      dd d…f   }t        j                   ||j"                  ¬«      }|j%                  |j"                  «      ||<   |j'                  d«      |z  }t        j(                  |j                  «       «      }| j*                  |j-                  | j.                  «      z  d|z
  z  |z   }t        j0                  |||d¬«      }|j3                  d«      j5                  «       |j                  d   z  |z  }d|iS c c}
}	}w c c}
}	}w )Nr   ú#No predicted boxes found in outputsr   z$No predicted logits found in outputsr1   r   ©Údimr0   r   ©r5   Údevicer   ©ri   .r2   r4   Únone)ÚweightÚ	reductionrb   )ÚKeyErrorÚ_get_source_permutation_idxr8   r9   r   r   r   ÚdetachÚdiagÚfullr6   ri   rE   rz   r:   Úone_hotÚ
zeros_liker5   ÚtoÚ	unsqueezer;   r'   Úpowr)   Ú binary_cross_entropy_with_logitsÚmeanÚsum)r+   rF   rG   rU   Ú	num_boxesr<   ÚidxÚ	src_boxesÚ_targetÚ_rS   Útarget_boxesÚiousÚ
src_logitsÚtarget_classes_originalÚtarget_classesÚtargetÚtarget_score_originalÚtarget_scoreÚ
pred_scorer}   Úlosss                         r   Úloss_labels_vflzRTDetrLoss.loss_labels_vfl©   sK  € Ø˜wÑ&ÜÐ@ÓAÐAØ˜7Ñ"ÜÐAÓBÐBØ×.Ñ.¨wÓ7ˆà˜LÑ)¨#Ñ.ˆ	Ü—y‘yÌSÐQXÐZaÓMb×!cÐ!c¹/¸'Á6ÀAÀq '¨'Ñ"2°1Ó"5Ô!cÐijÔkˆÜÔ2°9×3CÑ3CÓ3EÓFÔH`ÐamÓHnÓo‰ˆˆaÜ�z‰z˜$Óˆà˜XÑ&ˆ
Ü"'§)¡)Ô_bÐcjÐlsÓ_t×,uÐ,uÉOÈGÑU[ÐVWÐYZ¨W°^Ñ-DÀQÓ-GÔ,uÓ"vÐÜŸ™Ø×Ñ˜R˜aÐ  $×"2Ñ"2¼%¿+¹+Èj×N_ÑN_ô
ˆð 6ˆ�sÑÜ—‘˜>°t×7GÑ7GÈ!Ñ7KÔLÈSÐRUÐSUÐRUÈXÑVˆä %× 0Ñ 0°Àz×GWÑGWÔ XÐØ%)§W¡WÐ-B×-HÑ-HÓ%IÐ˜cÑ"Ø,×6Ñ6°rÓ:¸VÑCˆä—Y‘Y˜z×0Ñ0Ó2Ó3ˆ
Ø—‘˜jŸn™n¨T¯Z©ZÓ8Ñ8¸AÀ¹JÑGÈ,ÑVˆä×1Ñ1°*¸lÐSYÐekÔlˆØ�y‰y˜‹|×ÑÓ! J×$4Ñ$4°QÑ$7Ñ7¸)ÑCˆØ˜DÐ!Ð!ùô+ "dùô
 -vs   ÁI+ÃI2c           	      óÜ  — d|vrt        d«      ‚|d   }| j                  |«      }t        j                  t	        ||«      D ��	�
cg c]  \  }\  }	}
|d   |
   ‘Œ c}
}	}«      }t        j
                  |j                  dd | j                  t        j                  |j                  ¬«      }|||<   t        j                  |j                  dd«      || j                  «      }d|i}|S c c}
}	}w )	z‰Classification loss (NLL)
        targets dicts must contain the key "class_labels" containing a tensor of dim [nb_target_boxes]
        r   z#No logits were found in the outputsr0   Nr   ry   r   Úloss_ce)r   r€   r8   r9   r   rƒ   r6   ri   rE   rz   r:   Úcross_entropyÚ	transposeÚclass_weight)r+   rF   rG   rU   rŒ   r<   r“   r�   r�   r�   rS   r”   r•   r�   rn   s                  r   Úloss_labelszRTDetrLoss.loss_labelsÈ   sè   € ð ˜7Ñ"ÜÐ@ÓAÐAà˜XÑ&ˆ
à×.Ñ.¨wÓ7ˆÜ"'§)¡)Ô_bÐcjÐlsÓ_t×,uÐ,uÉOÈGÑU[ÐVWÐYZ¨W°^Ñ-DÀQÓ-GÔ,uÓ"vÐÜŸ™Ø×Ñ˜R˜aÐ  $×"2Ñ"2¼%¿+¹+Èj×N_ÑN_ô
ˆð 6ˆ�sÑä—/‘/ *×"6Ñ"6°q¸!Ó"<¸nÈd×N_ÑN_Ó`ˆØ˜WÐ%ˆØˆùô -vs   ÁC'c           	      óz  — |d   }|j                   }t        j                  |D �cg c]  }t        |d   «      ‘Œ c}|¬«      }|j	                  d«      |j
                  d   dz
  k7  j                  d«      }	t        j                  j                  |	j                  «       |j                  «       «      }
d|
i}|S c c}w )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   r0   )rz   r2   r   Úcardinality_error)rz   r8   rD   rA   Úargmaxr6   r‹   ÚnnÚ
functionalÚl1_lossÚfloat)r+   rF   rG   rU   rŒ   r   rz   rK   Útarget_lengthsÚ	card_predÚcard_errrn   s               r   Úloss_cardinalityzRTDetrLoss.loss_cardinalityÜ   s¤   € ð ˜Ñ"ˆØ—‘ˆÜŸ™È'Ö)RÀQ¬#¨a°Ñ.?Õ*@Ò)RÐ[aÔbˆà—]‘] 2Ó&¨&¯,©,°rÑ*:¸QÑ*>Ñ>×CÑCÀAÓFˆ	Ü—=‘=×(Ñ(¨¯©Ó):¸N×<PÑ<PÓ<RÓSˆØ% xÐ0ˆØˆùò *Ss   ¥B8c           	      óÖ  — d|vrt        d«      ‚| j                  |«      }|d   |   }t        j                  t	        ||«      D ���	cg c]  \  }\  }}	|d   |	   ‘Œ c}	}}d¬«      }
i }t        j                  ||
d¬«      }|j                  «       |z  |d<   d	t        j                  t        t        |«      t        |
«      «      «      z
  }|j                  «       |z  |d
<   |S c c}	}}w )a;  
        Compute the losses related to the bounding boxes, the L1 regression loss and the GIoU loss. Targets dicts must
        contain the key "boxes" containing a tensor of dim [nb_target_boxes, 4]. The target boxes are expected in
        format (center_x, center_y, w, h), normalized by the image size.
        r   rv   r1   r   rw   r|   ©r~   rc   r   rd   )r   r€   r8   r9   r   r:   r§   r‹   r‚   r
   r   )r+   rF   rG   rU   rŒ   r�   rŽ   Útr�   rS   r‘   rn   rc   rd   s                 r   Ú
loss_boxeszRTDetrLoss.loss_boxesë   sç   € ð ˜wÑ&ÜÐ@ÓAÐAØ×.Ñ.¨wÓ7ˆØ˜LÑ)¨#Ñ.ˆ	Ü—y‘yÄÀWÈgÓAV×!WÐ!W±I°A±v¸¸1 ! G¡*¨Q£-Ô!WÐ]^Ô_ˆàˆä—I‘I˜i¨ÀÔHˆ	Ø'Ÿm™m›o°	Ñ9ˆˆ{ÑàœŸ
™
ÜÔ 8¸Ó CÔE]Ð^jÓEkÓló
ñ 
ˆ	ð (Ÿm™m›o°	Ñ9ˆˆ{ÑØˆùô "Xs   ÁC$c                 ó:  — d|vrt        d«      ‚| j                  |«      }| j                  |«      }|d   }||   }|D �cg c]  }|d   ‘Œ	 }	}t        |	«      j	                  «       \  }
}|
j                  |«      }
|
|   }
t        j                  j                  |dd…df   |
j                  dd dd¬«      }|dd…d	f   j                  d
«      }|
j                  d
«      }
|
j                  |j                  «      }
t        ||
|«      t        ||
|«      dœ}|S c c}w )zÃ
        Compute the losses related to the masks: the focal loss and the dice loss. Targets dicts must contain the key
        "masks" containing a tensor of dim [nb_target_boxes, h, w].
        Ú
pred_masksz#No predicted masks found in outputsÚmasksNéþÿÿÿÚbilinearF)ÚsizeÚmodeÚalign_cornersr   r   )Ú	loss_maskÚ	loss_dice)r   r€   Ú_get_target_permutation_idxr   Ú	decomposer†   r¥   r¦   Úinterpolater6   r7   r?   r   r	   )r+   rF   rG   rU   rŒ   Ú
source_idxÚ
target_idxÚsource_masksr¯   r³   Útarget_masksÚvalidrn   s                r   Ú
loss_maskszRTDetrLoss.loss_masks  s:  € ð
 ˜wÑ&ÜÐ@ÓAÐAà×5Ñ5°gÓ>ˆ
Ø×5Ñ5°gÓ>ˆ
Ø˜|Ñ,ˆØ# JÑ/ˆØ%,Ö- ��7“Ð-ˆÐ-Ü<¸UÓC×MÑMÓOÑˆ�eØ#—‘ |Ó4ˆØ# JÑ/ˆô —}‘}×0Ñ0Øš˜D˜Ñ!¨×(:Ñ(:¸2¸3Ð(?ÀjÐ`eð 1ó 
ˆð $¢A q DÑ)×1Ñ1°!Ó4ˆà#×+Ñ+¨AÓ.ˆØ#×(Ñ(¨×);Ñ);Ó<ˆä+¨L¸,È	ÓRÜ" <°¸yÓIñ
ˆð ˆùò# .s   Á Dc           	      óH  — |d   }| j                  |«      }t        j                  t        ||«      D ��	�
cg c]  \  }\  }	}
|d   |
   ‘Œ c}
}	}«      }t        j                  |j
                  d d | j                  t        j                  |j                  ¬«      }|||<   t        j                  || j                  dz   ¬«      dd d…f   }t        j                  ||d	z  d
¬«      }|j                  d«      j                  «       |j
                  d   z  |z  }d|iS c c}
}	}w )Nr   r0   r   ry   r   r{   .r2   g      ð?r|   r®   Úloss_bce)r€   r8   r9   r   rƒ   r6   ri   rE   rz   r:   r„   r‰   rŠ   r‹   ©r+   rF   rG   rU   rŒ   r<   r“   r�   r�   r�   rS   r”   r•   r–   rš   s                  r   Úloss_labels_bcezRTDetrLoss.loss_labels_bce!  s  € Ø˜XÑ&ˆ
Ø×.Ñ.¨wÓ7ˆÜ"'§)¡)Ô_bÐcjÐlsÓ_t×,uÐ,uÉOÈGÑU[ÐVWÐYZ¨W°^Ñ-DÀQÓ-GÔ,uÓ"vÐÜŸ™Ø×Ñ˜R˜aÐ  $×"2Ñ"2¼%¿+¹+Èj×N_ÑN_ô
ˆð 6ˆ�sÑä—‘˜>°t×7GÑ7GÈ!Ñ7KÔLÈSÐRUÐSUÐRUÈXÑVˆÜ×1Ñ1°*¸fÀs¹lÐV\Ô]ˆØ�y‰y˜‹|×ÑÓ! J×$4Ñ$4°QÑ$7Ñ7¸)ÑCˆØ˜DÐ!Ð!ùô -vs   ¶Dc                 ó  — t        j                  t        |«      D ���cg c]  \  }\  }}t        j                  ||«      ‘Œ  c}}}«      }t        j                  |D ��cg c]  \  }}|‘Œ	 c}}«      }||fS c c}}}w c c}}w ©N©r8   r9   rB   Ú	full_like)r+   rU   rS   Úsourcer�   Ú	batch_idxr¾   s          r   r€   z&RTDetrLoss._get_source_permutation_idx/  si   € ä—I‘IÔPYÐZaÓPb×cÐc¹n¸aÁÀ&È!œuŸ™¨v°qÕ9ÔcÓdˆ	Ü—Y‘Y¸'×B©;¨F°A¢ÓBÓCˆ
Ø˜*Ð$Ð$ùô dùÛBó   Ÿ#A7ÁA>
c                 ó  — t        j                  t        |«      D ���cg c]  \  }\  }}t        j                  ||«      ‘Œ  c}}}«      }t        j                  |D ��cg c]  \  }}|‘Œ	 c}}«      }||fS c c}}}w c c}}w rÉ   rÊ   )r+   rU   rS   r�   r–   rÍ   r¿   s          r   r»   z&RTDetrLoss._get_target_permutation_idx5  si   € ä—I‘IÔPYÐZaÓPb×cÐc¹n¸aÁÀ!ÀVœuŸ™¨v°qÕ9ÔcÓdˆ	Ü—Y‘Y¸'×B©;¨A¨v¢ÓBÓCˆ
Ø˜*Ð$Ð$ùô dùÛBrÎ   c           	      ót  — d|vrt        d«      ‚|d   }| j                  |«      }t        j                  t	        ||«      D ��	�
cg c]  \  }\  }	}
|d   |
   ‘Œ c}
}	}«      }t        j
                  |j                  d d | j                  t        j                  |j                  ¬«      }|||<   t        j                  || j                  dz   ¬«      dd d	…f   }t        ||| j                  | j                  «      }|j                  d«      j!                  «       |j                  d   z  |z  }d
|iS c c}
}	}w )Nr   zNo logits found in outputsr0   r   ry   r   r{   .r2   Ú
loss_focal)r   r€   r8   r9   r   rƒ   r6   ri   rE   rz   r:   r„   r   r'   r)   rŠ   r‹   rÆ   s                  r   Úloss_labels_focalzRTDetrLoss.loss_labels_focal;  s+  € Ø˜7Ñ"ÜÐ7Ó8Ð8à˜XÑ&ˆ
à×.Ñ.¨wÓ7ˆÜ"'§)¡)Ô_bÐcjÐlsÓ_t×,uÐ,uÉOÈGÑU[ÐVWÐYZ¨W°^Ñ-DÀQÓ-GÔ,uÓ"vÐÜŸ™Ø×Ñ˜R˜aÐ  $×"2Ñ"2¼%¿+¹+Èj×N_ÑN_ô
ˆð 6ˆ�sÑä—‘˜>°t×7GÑ7GÈ!Ñ7KÔLÈSÐRUÐSUÐRUÈXÑVˆÜ! *¨f°d·j±jÀ$Ç*Á*ÓMˆØ�y‰y˜‹|×ÑÓ! J×$4Ñ$4°QÑ$7Ñ7¸)ÑCˆØ˜dÐ#Ð#ùô -vs   ÁD3c                 óä   — | j                   | j                  | j                  | j                  | j                  | j
                  | j                  dœ}||vrt        d|› d�«      ‚ ||   ||||«      S )N)ÚlabelsÚcardinalityr1   r³   ÚbceÚfocalre   zLoss z not supported)r¡   r¬   r°   rÃ   rÇ   rÒ   r›   r*   )r+   rš   rF   rG   rU   rŒ   Úloss_maps          r   Úget_losszRTDetrLoss.get_lossM  sy   € à×&Ñ&Ø×0Ñ0Ø—_‘_Ø—_‘_Ø×'Ñ'Ø×+Ñ+Ø×'Ñ'ñ
ˆð �xÑÜ˜u T F¨.Ð9Ó:Ð:Øˆx˜‰~˜g w°¸ÓCÐCr.   c           	      ó<  — | d   | d   }}|D �cg c]  }t        |d   «      ‘Œ }}|d   d   j                  }g }t        |«      D ]Ï  \  }}	|	dkD  rjt        j                  |	t        j
                  |¬«      }
|
j                  |«      }
t        ||   «      t        |
«      k(  sJ ‚|j                  ||   |
f«       Œu|j                  t        j                  dt        j
                  |¬«      t        j                  dt        j
                  |¬«      f«       ŒÑ |S c c}w )NÚdn_positive_idxÚdn_num_groupr0   r   ry   )	rA   rz   rB   r8   ÚarangerE   ÚtileÚappendÚzeros)Údn_metarG   rÛ   rÜ   r¯   Únum_gtsrz   Údn_match_indicesrS   Únum_gtÚgt_idxs              r   Úget_cdn_matched_indicesz"RTDetrLoss.get_cdn_matched_indices[  s  € à(/Ð0AÑ(BÀGÈNÑD[˜ˆØ3:Ö;¨a”3�q˜Ñ(Õ)Ð;ˆÐ;Ø˜‘˜NÑ+×2Ñ2ˆàÐÜ" 7Ó+ò 	‰IˆAˆvØ˜ŠzÜŸ™ f´E·K±KÈÔO�ØŸ™ \Ó2�Ü˜?¨1Ñ-Ó.´#°f³+Ò=Ð=Ð=Ø ×'Ñ'¨¸Ñ);¸VÐ(DÕEà ×'Ñ'äŸ™ A¬U¯[©[ÀÔHÜŸ™ A¬U¯[©[ÀÔHðõð	ð  Ðùò% <s   �Dc           
      óô  — |j                  «       D ��ci c]  \  }}d|vsŒ||“Œ }}}| j                  ||«      }t        d„ |D «       «      }t        j                  |gt        j
                  t        t        |j                  «       «      «      j                  ¬«      }t        j                  |d¬«      j                  «       }i }| j                  D ]Z  }	| j                  |	||||«      }
|
D �ci c]'  }|| j                  v sŒ||
|   | j                  |   z  “Œ) }
}|j                  |
«       Œ\ d|v rÀt!        |d   «      D ]¯  \  }}| j                  ||«      }| j                  D ]‰  }	|	dk(  rŒ	| j                  |	||||«      }
|
D �ci c]'  }|| j                  v sŒ||
|   | j                  |   z  “Œ) }
}|
j                  «       D ��ci c]  \  }}|d|› �z   |“Œ }
}}|j                  |
«       Œ‹ Œ± d|v rád	|vrt#        d
«      ‚| j%                  |d	   |«      }||d	   d   z  }t!        |d   «      D ]¡  \  }}| j                  D ]�  }	|	dk(  rŒ	i } | j                  |	||||fi |¤Ž}
|
D �ci c]'  }|| j                  v sŒ||
|   | j                  |   z  “Œ) }
}|
j                  «       D ��ci c]  \  }}|d|› �z   |“Œ }
}}|j                  |
«       Œ� Œ£ |S c c}}w c c}w c c}w c c}}w c c}w c c}}w )aª  
        This performs the loss computation.

        Args:
             outputs (`dict`, *optional*):
                Dictionary of tensors, see the output specification of the model for the format.
             targets (`List[dict]`, *optional*):
                List of dicts, such that `len(targets) == batch_size`. The expected keys in each dict depends on the
                losses applied, see each loss' doc.
        Úauxiliary_outputsc              3   ó8   K  — | ]  }t        |d    «      –— Œ y­w)r0   N)rA   )Ú.0r¯   s     r   ú	<genexpr>z%RTDetrLoss.forward.<locals>.<genexpr>ƒ  s   è ø€ Ò@°1œ˜A˜nÑ-×.Ñ@ùs   ‚ry   r   )Úminr³   Ú_aux_Údn_auxiliary_outputsÚdenoising_meta_valuesz}The output must have the 'denoising_meta_values` key. Please, ensure that 'outputs' includes a 'denoising_meta_values' entry.rÜ   Ú_dn_)Úitemsrg   r‹   r8   rD   r¨   ÚnextÚiterÚvaluesrz   ÚclampÚitemrn   rÙ   rm   ÚupdaterB   r*   ræ   )r+   rF   rG   ÚkrK   Úoutputs_without_auxrU   rŒ   rn   rš   Úl_dictrS   rè   Úkwargss                 r   rW   zRTDetrLoss.forwardr  sI  € ð 18·±³×`©¨¨1ÐCVÐ^_ÒC_˜q !™tÐ`ÐÑ`ð —,‘,Ð2°GÓ<ˆô Ñ@¸Ô@Ó@ˆ	Ü—O‘O Y K´u·{±{Ì4ÔPTÐU\×UcÑUcÓUeÓPfÓKg×KnÑKnÔoˆ	Ü—K‘K 	¨qÔ1×6Ñ6Ó8ˆ	ð ˆØ—K‘Kò 	"ˆDØ—]‘] 4¨°'¸7ÀIÓNˆFØBHÖb¸QÈAÐQU×QaÑQaÒLa�a˜ ™ T×%5Ñ%5°aÑ%8Ñ8Ñ8ÐbˆFÐbØ�M‰M˜&Õ!ð	"ð  'Ñ)Ü(1°'Ð:MÑ2NÓ(Oò 	*Ñ$�Ð$ØŸ,™,Ð'8¸'ÓB�Ø ŸK™Kò *�DØ˜w’à Ø!Ÿ]™]¨4Ð1BÀGÈWÐV_Ó`�FØJPÖjÀQÐTUÐY]×YiÑYiÒTi˜a ¨¡¨T×-=Ñ-=¸aÑ-@Ñ!@Ñ@Ðj�FÐjØ=C¿\¹\»^×L±T°Q¸˜a E¨!¨ +™o¨qÑ0ÐL�FÑLØ—M‘M &Õ)ñ*ð	*ð " WÑ,Ø&¨gÑ5Ü ð Tóð ð ×2Ñ2°7Ð;RÑ3SÐU\Ó]ˆGØ! GÐ,CÑ$DÀ^Ñ$TÑTˆIä(1°'Ð:PÑ2QÓ(Rò 
*Ñ$�Ð$à ŸK™Kò *�DØ˜w’à Ø�FØ*˜TŸ]™]¨4Ð1BÀGÈWÐV_ÑjÐciÑj�FØJPÖjÀQÐTUÐY]×YiÑYiÒTi˜a ¨¡¨T×-=Ñ-=¸aÑ-@Ñ!@Ñ@Ðj�FÐjØ<B¿L¹L»N×K±D°A°q˜a D¨¨ *™n¨aÑ/ÐK�FÑKØ—M‘M &Õ)ñ*ð
*ð ˆùóg aùò cùò kùÛLùò( kùÛKs:   ”K¡KÃ-KÄKÆK$ÆK$ÇK)
É+K/É?K/Ê,K4
)T)rX   rY   rZ   r[   r   r›   r¡   r8   r\   r¬   r°   rÃ   rÇ   r€   r»   rÒ   rÙ   Ústaticmethodræ   rW   r]   r^   s   @r   r`   r`      sp   ø„ ñô.-ó$"ó>ð( €U‡]�]ƒ_ñó ðòò.ó>"ò%ò%ó$ò$Dð ñ ó ð ö,>r.   r`   c
                 óf  — t        |«      }|j                  |«       i }| |d<   ||d<   |j                  r×|	�<t        j                  ||	d   d¬«      \  }}t        j                  ||	d   d¬«      \  }}t        |d d …d d…f   j                  dd«      |d d …d d…f   j                  dd«      «      }||d	<   |d	   j                  t        |g|g«      «       |	�4t        j                  dd«      j                  dd«      «      |d
<   |	|d<    |||«      }t        |j                  «       «      }||fS )Nr   r   Údn_num_splitr   rw   r2   r   r   rè   rî   rï   )
r`   r†   Úauxiliary_lossr8   rC   r   rŸ   Úextendr‹   rô   )r   rÔ   rz   r   r,   r   r   Úenc_topk_logitsÚenc_topk_bboxesrï   rû   Ú	criterionÚoutputs_lossÚdn_out_coordÚdn_out_classrè   Ú	loss_dictrš   s                     r   ÚRTDetrForObjectDetectionLossr  ³  sf  € ô ˜6Ó"€IØ‡L�L�Ôà€LØ#€L�ÑØ!+€L�ÑØ×ÒØ Ð,Ü*/¯+©+°mÐEZÐ[iÑEjÐpqÔ*rÑ'ˆL˜-Ü*/¯+©+°mÐEZÐ[iÑEjÐpqÔ*rÑ'ˆL˜-ä)¨-º¸3¸B¸3¸Ñ*?×*IÑ*IÈ!ÈQÓ*OÐQ^Ò_`ÐbeÐceÐbeÐ_eÑQf×QpÑQpÐqrÐtuÓQvÓwÐØ,=ˆÐ(Ñ)ØÐ(Ñ)×0Ñ0´ÀÐ?PÐSbÐRcÓ1dÔeØ Ð,Ü3@Ø×&Ñ& q¨!Ó,¨l×.DÑ.DÀQÈÓ.Jó4ˆLÐ/Ñ0ð 5JˆLÐ0Ñ1á˜,¨Ó/€Iäˆy×ÑÓ!Ó"€DØ�Ð-Ð-Ð-r.   )NNNNN)r8   Útorch.nnr¥   Útorch.nn.functionalr¦   r:   Úutilsr   r   r   Úloss_for_object_detectionr   r	   r
   r   r   Úscipy.optimizer   Útransformers.image_transformsr   ÚjitÚunusedr   ÚModuler   r`   r  © r.   r   ú<module>r     s—   ðó Ý ß Ð ç NÑ N÷õ ñ ÔÝ4ñ ÔÝFð ‡�×ÑñZó ðZôNt˜RŸY™Yô Ntôbq�—‘ô qðt	 ØØØØô$.r.   