
    bCi                         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:0yE>)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                          `/home/james-whalen/.local/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 YY7C7a. 17CD
iiW =W7W => e)8a(lT>Q=V=V=X<XY1x<E"9:4?T?T?V>VW#AzM2^AzM5RR
 KK;	 ))A()KMefqMrss	 nny04??Z3OORVR`R`clRll!&&zCGGI*12'QQwZ'2;D[EVEVW\^`Ea;bc;b41a(1.;bckrskrcgcdfg%++6QVQ\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                        \ rS rSrS 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           	         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  pUS   U	   PM     sn	nn5      n
[        R
                  " UR                  SS U R                  [        R                  UR                  S9nXU'   [        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   devicer   r   )r   layoutrV   r   )r3   r4   loss_ce)KeyError_get_source_permutation_idxr   r   zipfullr   rQ   r(   rV   zerosr   rW   scatter_	unsqueezer   rR   )r)   r*   r+   r;   	num_boxessource_logitsidxt_Jtarget_classes_otarget_classestarget_classes_onehotrX   rS   s                  r=   loss_labels#DeformableDetrImageLoss.loss_labelsD   sy   
 7"@AA)..w7 99CPWLa%bLayq&1a&7&:La%bc#T%5%5U[[Q^QeQe
 /s %  #]%8%8%;]=P=PQR=SVW=WX%% '' ''	!
 	&&q.*B*B2*FJ 5aCRCi @}YVfVfnop!!!$% 	 W%+ &cs   E.)rR   rS   rP   rQ   N)rA   rB   rC   rD   rO   ri   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XS'   U" X5      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   rX   	loss_bbox	loss_giou	loss_mask	loss_dicerd   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>   &     Ti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itemssum)r   rm   rV   r   rq   configoutputs_classoutputs_coordkwargsrP   rS   	criterionoutputs_lossrr   aux_weight_dictr9   r{   r0   lossr|   r}   s                      @@r=   !DeformableDetrForSegmentationLossr   f   sy    &*;*;vGWGWcicscstG8F'%%&&	I LLL#!+!+)-G,=(),/If.J.JKK%;;K%;;K%;;Kv,,q01A""{?P?P?R#S?Rtq!A!A3KN?R#ST 2?+TiTTD---	 $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XS'   U
" X5      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 )Nrl   )rm   r   rn   rp   r   r   rr   r   rs   ru   rd   c              3   H   >#    U  H  oT;   d  M
  TU   TU   -  v   M     g 7frL   r@   ry   s     r=   r~   7DeformableDetrForObjectDetectionLoss.<locals>.<genexpr>   r   r   )r   r    r   r!   rI   r   rR   r   r   r	   r   r   r   r   r   r   r   )r   rm   rV   r   r   r   r   r   rP   rS   r   r   rr   r   r9   r{   r0   r   r|   r}   s                     @@r=   $DeformableDetrForObjectDetectionLossr      sU    -$$0@0@FL\L\G 0F'%%&&	I LLL#!+)-G,=(),/If.J.JKK%;;Kv,,q01A""{?P?P?R#S?Rtq!A!A3KN?R#ST 2?+TiTTD--- $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(i (X _c&.T SW#.rG   