
    sg                         d dl Z d dlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZ  e       rd dlmZ  G d d	e      Z G d
 de	      Z	 ddZ	 ddZy)    N   )center_to_corners_format)is_scipy_available   )HungarianMatcher	ImageLoss_set_aux_lossgeneralized_box_iousigmoid_focal_loss)linear_sum_assignmentc                   :    e Zd Z ej                         d        Zy)DeformableDetrHungarianMatcherc           	         |d   j                   dd \  }}|d   j                  dd      j                         }|d   j                  dd      }t        j                  |D cg c]  }|d   	 c}      }t        j                  |D cg c]  }|d   	 c}      }	d	}
d
}d|
z
  ||z  z  d|z
  dz   j                          z  }|
d|z
  |z  z  |dz   j                          z  }|dd|f   |dd|f   z
  }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        j&                        t        j$                  |t        j&                        fQ c}}S c c}w c c}w c c}w c c}}w c c}}w )z
        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                          Y/var/www/html/venv/lib/python3.12/site-packages/transformers/loss/loss_deformable_detr.pyforwardz&DeformableDetrHungarianMatcher.forward   s3    #*("3"9"9"1"=
K 8$,,Q2::<<(00A6 YY7Ca. 1CD
iiW =7 => 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2QQwZ22;D[EVEVW\^`Ea;bc41a(1.cckrscgcdfg%++6QVQ\Q\8]^ss-  D =& 3css   !H,H1?H64H;AIN)__name__
__module____qualname__r   no_gradr=        r<   r   r      s    U]]_#t #trC   r   c                       e Zd Zd Zd Zy)DeformableDetrImageLossc                 z    t         j                  j                  |        || _        || _        || _        || _        y N)nnModule__init__matchernum_classesfocal_alphalosses)r(   rK   rL   rM   rN   s        r<   rJ   z DeformableDetrImageLoss.__init__<   s2    
		4 &&rC   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   |j                  d   |j                  d   dz   g|j                  |j                  |j                  	      }|j                  d|j                  d
      d       |dddddd
f   }t        |||| j                   d      |j                  d   z  }d|i}|S c c}	}}w )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   layoutrP   r   )r2   r3   loss_ce)KeyError_get_source_permutation_idxr   r   zipfullr   rL   r'   rP   zerosr   rQ   scatter_	unsqueezer   rM   )r(   r)   r*   r:   	num_boxessource_logitsidxt_Jtarget_classes_otarget_classestarget_classes_onehotrR   rN   s                  r<   loss_labelsz#DeformableDetrImageLoss.loss_labelsD   s   
 7"@AA)..w7 99CPWY`La%b%byq&1aa&7&:%bc#T%5%5U[[Q^QeQe
 /s %  #]%8%8%;]=P=PQR=SVW=WX%% '' ''	!
 	&&q.*B*B2*FJ 5aCRCi @}.CYVZVfVfnop!!!$% 	 W%+ &cs   E4N)r>   r?   r@   rJ   rc   rB   rC   r<   rE   rE   ;   s    rC   rE   c           
         t        |j                  |j                  |j                        }	g d}
t	        |	|j
                  |j                  |
      }|j                  |       i }| |d<   ||d<   ||d<   d }|j                  rt        ||      }||d<    |||      d|j                  d	|j                  d
<   |j                  d<   |j                  d<   |j                  rii }t        |j                  dz
        D ];  }|j!                  j#                         D ci c]  \  }}|d| z   | c}}       = j!                  |       t%        fdj'                         D              }||fS c c}}w )Nr   r   r    )labelsr   cardinalitymasksrK   rL   rM   rN   r   r   
pred_masksauxiliary_outputsr   rR   	loss_bbox	loss_giou	loss_mask	loss_dicer^   c              3   >   K   | ]  }|v s|   |   z    y wrG   rB   .0k	loss_dictweight_dicts     r<   	<genexpr>z4DeformableDetrForSegmentationLoss.<locals>.<genexpr>   %     [!{JZy|k!n,[   	)r   r   r   r    rE   
num_labelsrM   toauxiliary_lossr	   bbox_loss_coefficientgiou_loss_coefficientmask_loss_coefficientdice_loss_coefficientrangedecoder_layersupdateitemssumkeys)r   rf   rP   r   rj   configoutputs_classoutputs_coordkwargsrK   rN   	criterionoutputs_lossrk   aux_weight_dictr8   rt   r/   lossru   rv   s                      @@r<   !DeformableDetrForSegmentationLossr   f   s    &*;*;vGWGWcicscstG8F'%%&&	I LLL#L!+L!+L)-G,=(),/If.J.JKK%;;K%;;K%;;Kv,,q01 	UA""{?P?P?R#Stq!A!A3KN#ST	U?+[inn6F[[D---	 $Ts   #E9c           
         t        |j                  |j                  |j                        }g d}	t	        ||j
                  |j                  |	      }
|
j                  |       i }d }| |d<   ||d<   |j                  rt        ||      }||d<    |
||      d|j                  d|j                  d	<   |j                  rii }t        |j                  dz
        D ];  }|j                  j                         D ci c]  \  }}|d
| z   | c}}       = j                  |       t!        fdj#                         D              }||fS c c}}w )Nre   )rf   r   rg   ri   r   r   rk   r   rl   rn   r^   c              3   >   K   | ]  }|v s|   |   z    y wrG   rB   rr   s     r<   rw   z7DeformableDetrForObjectDetectionLoss.<locals>.<genexpr>   rx   ry   )r   r   r   r    rE   rz   rM   r{   r|   r	   r}   r~   r   r   r   r   r   r   )r   rf   rP   r   r   r   r   r   rK   rN   r   r   rk   r   r8   rt   r/   r   ru   rv   s                     @@r<   $DeformableDetrForObjectDetectionLossr      sg    -$$0@0@FL\L\G 0F'%%&&	I LLL#L!+L)-G,=(),/If.J.JKK%;;Kv,,q01 	UA""{?P?P?R#Stq!A!A3KN#ST	U?+[inn6F[[D--- $Ts    E)NN)r   torch.nnrH   image_transformsr   utilsr   loss_for_object_detectionr   r   r	   r
   r   scipy.optimizer   r   rE   r   r   rB   rC   r<   <module>r      s\      7 &  4%t%5 %tP(i (X _c&.T SW#.rC   