§
    [�’jˆ   ã                   óº   — 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dS )é    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dS )ÚDeformableDetrHungarianMatcherc                 ó®  — |d         j         dd…         \  }}|d                              dd¦  «                             ¦   «         }|d                              dd¦  «        }t          j        d„ |D ¦   «         ¦  «        }t          j        d„ |D ¦   «         ¦  «        }d	}	d
}
d|	z
  ||
z  z  d|z
  dz                        ¦   «          z  }|	d|z
  |
z  z  |dz                        ¦   «          z  }|dd…|f         |dd…|f         z
  }t          j        ||d¬¦  «        }t          t          |¦  «        t          |¦  «        ¦  «         }| j	        |z  | j
        |z  z   | j        |z  z   }|                     ||d¦  «                             ¦   «         }d„ |D ¦   «         }d„ t          |                     |d¦  «        ¦  «        D ¦   «         }d„ |D ¦   «         S )zš
        Differences:
        - out_prob = outputs["logits"].flatten(0, 1).sigmoid() instead of softmax
        - class_cost uses alpha and gamma
        ÚlogitsNr   r   r   Ú
pred_boxesc                 ó   — g | ]
}|d          ‘ŒS ©Úclass_labels© ©Ú.0Úvs     úTC:\Projects\DSCons\.venv\Lib\site-packages\transformers\loss\loss_deformable_detr.pyú
<listcomp>z:DeformableDetrHungarianMatcher.forward.<locals>.<listcomp>"   s   € ÐCÐCÐC°a  .Ô 1ÐCÐCÐCó    c                 ó   — g | ]
}|d          ‘ŒS ©Úboxesr   r   s     r   r   z:DeformableDetrHungarianMatcher.forward.<locals>.<listcomp>#   s   € Ð =Ð =Ð =°  7¤Ð =Ð =Ð =r   g      Ð?g       @g:Œ0âŽyE>)Úpéÿÿÿÿc                 ó8   — g | ]}t          |d          ¦  «        ‘ŒS r   ©Úlenr   s     r   r   z:DeformableDetrHungarianMatcher.forward.<locals>.<listcomp>6   s"   € Ð2Ð2Ð2 Q•�Q�w”Z‘”Ð2Ð2Ð2r   c                 ó>   — g | ]\  }}t          ||         ¦  «        ‘ŒS r   r   )r   ÚiÚcs      r   r   z:DeformableDetrHungarianMatcher.forward.<locals>.<listcomp>7   s)   € ÐcÐcÐc±4°1°aÕ(¨¨1¬Ñ.Ô.ÐcÐcÐcr   c                 ó”   — g | ]E\  }}t          j        |t           j        ¬ ¦  «        t          j        |t           j        ¬ ¦  «        f‘ŒFS ))Údtype)ÚtorchÚ	as_tensorÚint64)r   r&   Újs      r   r   z:DeformableDetrHungarianMatcher.forward.<locals>.<listcomp>8   sH   € ÐsÐsÐsÑcgÐcdÐfg•” ­%¬+Ð6Ñ6Ô6½¼ÈÕQVÔQ\Ð8]Ñ8]Ô8]Ð^ÐsÐsÐsr   )ÚshapeÚflattenÚsigmoidr*   ÚcatÚlogÚcdistr
   r   Ú	bbox_costÚ
class_costÚ	giou_costÚviewÚcpuÚ	enumerateÚsplit)ÚselfÚoutputsÚtargetsÚ
batch_sizeÚnum_queriesÚout_probÚout_bboxÚ
target_idsÚtarget_bboxÚalphaÚgammaÚneg_cost_classÚpos_cost_classr5   r4   r6   Úcost_matrixÚsizesÚindicess                      r   Úforwardz&DeformableDetrHungarianMatcher.forward   s	  € ð #*¨(Ô"3Ô"9¸"¸1¸"Ô"=Ñˆ
�Kð ˜8Ô$×,Ò,¨Q°Ñ2Ô2×:Ò:Ñ<Ô<ˆØ˜<Ô(×0Ò0°°AÑ6Ô6ˆõ ”YÐCÐC¸7ÐCÑCÔCÑDÔDˆ
Ý”iÐ =Ð =°WÐ =Ñ =Ô =Ñ>Ô>ˆð ˆØˆØ˜e™)¨°%©Ñ8¸aÀ(¹lÈTÑ>Q×=VÒ=VÑ=XÔ=XÐ<XÑYˆØ 1 x¡<°EÑ"9Ñ:ÀÈ4Á×?TÒ?TÑ?VÔ?VÐ>VÑWˆØ# A A A z MÔ2°^ÀAÀAÀAÀzÀMÔ5RÑRˆ
õ ”K ¨+¸Ð;Ñ;Ô;ˆ	õ )Õ)AÀ(Ñ)KÔ)KÕMeÐfqÑMrÔMrÑsÔsÐsˆ	ð ”n yÑ0°4´?ÀZÑ3OÑOÐRVÔR`ÐclÑRlÑlˆØ!×&Ò& z°;ÀÑCÔC×GÒGÑIÔIˆà2Ð2¨'Ð2Ñ2Ô2ˆØcÐc½9À[×EVÒEVÐW\Ð^`ÑEaÔEaÑ;bÔ;bÐcÑcÔcˆØsÐsÐkrÐsÑsÔsÐsr   N)Ú__name__Ú
__module__Ú__qualname__r*   Úno_gradrK   r   r   r   r   r      s:   € € € € € Ø€U„]�_„_ð#tð #tñ „_ð#tð #tð #tr   r   c                   óJ   — e Zd Zd„ Z ej        ¦   «         d„ ¦   «         Zd„ ZdS )ÚDeformableDetrImageLossc                 ó|   — t           j                             | ¦  «         || _        || _        || _        || _        d S ©N)ÚnnÚModuleÚ__init__ÚmatcherÚnum_classesÚfocal_alphaÚlosses)r;   rW   rX   rY   rZ   s        r   rV   z DeformableDetrImageLoss.__init__<   s:   € Ý
Œ	×Ò˜4Ñ Ô Ð ØˆŒØ&ˆÔØ&ˆÔØˆŒˆˆr   c                 óz  — |d         }|j         }t          j        d„ |D ¦   «         |¬¦  «        }|                     ¦   «                              d¦  «        j        dk                         d¦  «        }t          j         	                    | 
                    ¦   «         | 
                    ¦   «         ¦  «        }	d|	i}
|
S )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   c                 ó8   — g | ]}t          |d          ¦  «        ‘ŒS r   r#   r   s     r   r   z<DeformableDetrImageLoss.loss_cardinality.<locals>.<listcomp>L   s%   € Ð)RÐ)RÐ)RÀQ­#¨a°Ô.?Ñ*@Ô*@Ð)RÐ)RÐ)Rr   )Údevicer!   g      à?r   Úcardinality_error)r]   r*   r+   r0   ÚmaxÚvaluesÚsumrT   Ú
functionalÚl1_lossÚfloat)r;   r<   r=   rJ   Ú	num_boxesr   r]   Útarget_lengthsÚ	card_predÚcard_errrZ   s              r   Úloss_cardinalityz(DeformableDetrImageLoss.loss_cardinalityC   s¨   € ð ˜Ô"ˆØ”ˆÝœÐ)RÐ)RÈ'Ð)RÑ)RÔ)RÐ[aÐbÑbÔbˆà—^’^Ñ%Ô%×)Ò)¨"Ñ-Ô-Ô4°sÒ:×?Ò?ÀÑBÔBˆ	Ý”=×(Ò(¨¯ªÑ):Ô):¸N×<PÒ<PÑ<RÔ<RÑSÔSˆØ% xÐ0ˆØˆr   c                 ó¢  — d|vrt          d¦  «        ‚|d         }|                      |¦  «        }t          j        d„ t	          ||¦  «        D ¦   «         ¦  «        }t          j        |j        dd…         | j        t          j        |j	        ¬¦  «        }|||<   t          j
        |j        d         |j        d         |j        d         dz   g|j        |j        |j	        ¬	¦  «        }	|	                     d|                     d
¦  «        d¦  «         |	dd…dd…dd
…f         }	t          ||	|| j        d¬¦  «        |j        d         z  }
d|
i}|S )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 outputsc                 ó6   — g | ]\  }\  }}|d          |         ‘ŒS r   r   )r   ÚtÚ_ÚJs       r   r   z7DeformableDetrImageLoss.loss_labels.<locals>.<listcomp>^   s*   € Ð%bÐ%bÐ%b¹y¸qÁ&À1Àa a¨Ô&7¸Ô&:Ð%bÐ%bÐ%br   Nr   )r)   r]   r   r   )r)   Úlayoutr]   r!   )rD   rE   Úloss_ce)ÚKeyErrorÚ_get_source_permutation_idxr*   r1   ÚzipÚfullr.   rX   r,   r]   Úzerosr)   ro   Úscatter_Ú	unsqueezer   rY   )r;   r<   r=   rJ   re   Úsource_logitsÚidxÚtarget_classes_oÚtarget_classesÚtarget_classes_onehotrp   rZ   s               r   Úloss_labelsz#DeformableDetrImageLoss.loss_labelsT   s  € ð
 ˜7Ð"Ð"ÝÐ@ÑAÔAÐAØ Ô)ˆà×.Ò.¨wÑ7Ô7ˆÝ œ9Ð%bÐ%bÍCÐPWÐY`ÑLaÔLaÐ%bÑ%bÔ%bÑcÔcÐÝœØÔ   Ô# TÔ%5½U¼[ÐQ^ÔQeð
ñ 
ô 
ˆð /ˆ�sÑå %¤ØÔ  Ô# ]Ô%8¸Ô%;¸]Ô=PÐQRÔ=SÐVWÑ=WÐXØÔ%Ø Ô'Ø Ô'ð	!
ñ !
ô !
Ðð 	×&Ò& q¨.×*BÒ*BÀ2Ñ*FÔ*FÈÑJÔJÐJà 5°a°a°a¸¸¸¸C¸R¸C°iÔ @Ðå˜}Ð.CÀYÐVZÔVfÐnoÐpÑpÔpØÔ! !Ô$ñ%ð 	ð ˜WÐ%ˆàˆr   N)rL   rM   rN   rV   r*   rO   ri   r}   r   r   r   rQ   rQ   ;   sU   € € € € € ðð ð ð €U„]�_„_ðð ñ „_ðð ð ð ð ð r   rQ   c                 ó”  ‡‡‡— t          |j        |j        |j        ¬¦  «        }	g d¢}
t	          |	|j        |j        |
¬¦  «        }|                     |¦  «         i }| |d<   ||d<   ||d<   d }|j        rt          ||¦  «        }||d<    |||¦  «        Šd|j
        d	œŠ|j        ‰d
<   |j        ‰d<   |j        ‰d<   |j        rdi }t          |j        dz
  ¦  «        D ]5Š|                     ˆfd„‰                     ¦   «         D ¦   «         ¦  «         Œ6‰                     |¦  «         t%          ˆˆfd„‰D ¦   «         ¦  «        }|‰|fS )N©r5   r4   r6   )Úlabelsr   ÚcardinalityÚmasks©rW   rX   rY   rZ   r   r   Ú
pred_masksÚauxiliary_outputsr   ©rp   Ú	loss_bboxÚ	loss_giouÚ	loss_maskÚ	loss_dicec                 ó(   •— i | ]\  }}|d ‰› �z   |“ŒS ©rm   r   ©r   Úkr   r&   s      €r   ú
<dictcomp>z5DeformableDetrForSegmentationLoss.<locals>.<dictcomp>˜   ó)   ø€ Ð#SÐ#SÐ#S±t°q¸! A¨¨A¨¨¡K°Ð#SÐ#SÐ#Sr   c              3   óB   •K  — | ]}|‰v ¯‰|         ‰|         z  V — Œd S rS   r   ©r   rŽ   Ú	loss_dictÚweight_dicts     €€r   ú	<genexpr>z4DeformableDetrForSegmentationLoss.<locals>.<genexpr>›   ó:   øè è € ÐTÐT°À1ÈÐCSÐCSˆy˜Œ|˜k¨!œnÑ,ÐCSÐCSÐCSÐCSÐTÐTr   )r   r5   r4   r6   rQ   Ú
num_labelsrY   ÚtoÚauxiliary_lossr	   Úbbox_loss_coefficientÚgiou_loss_coefficientÚmask_loss_coefficientÚdice_loss_coefficientÚrangeÚdecoder_layersÚupdateÚitemsra   )r   r€   r]   r   r„   ÚconfigÚoutputs_classÚoutputs_coordÚkwargsrW   rZ   Ú	criterionÚoutputs_lossr…   Úaux_weight_dictÚlossr&   r“   r”   s                   @@@r   Ú!DeformableDetrForSegmentationLossrª   v   s±  øøø€ õ ¨&Ô*;ÀvÔGWÐciÔcsÐtÑtÔt€Gà8Ð8Ð8€FÝ'ØØÔ%ØÔ&Øð	ñ ô €Ið ‡L‚L�ÑÔÐà€LØ#€L�ÑØ!+€L�ÑØ!+€L�ÑàÐØÔð >Ý)¨-¸ÑGÔGÐØ,=ˆÐ(Ñ)à�	˜,¨Ñ/Ô/€Ià¨fÔ.JÐKÐK€KØ%Ô;€K�ÑØ%Ô;€K�ÑØ%Ô;€K�ÑØÔð ,ØˆÝ�vÔ,¨qÑ0Ñ1Ô1ð 	Uð 	UˆAØ×"Ò"Ð#SÐ#SÐ#SÐ#S¸{×?PÒ?PÑ?RÔ?RÐ#SÑ#SÔ#SÑTÔTÐTÐTØ×Ò˜?Ñ+Ô+Ð+åÐTÐTÐTÐTÐT°iÐTÑTÔTÑTÔT€DØ�Ð-Ð-Ð-r   c                 ób  ‡‡‡— t          |j        |j        |j        ¬¦  «        }g d¢}	t	          ||j        |j        |	¬¦  «        }
|
                     |¦  «         i }d }| |d<   ||d<   |j        rt          ||¦  «        }||d<    |
||¦  «        Šd|j
        dœŠ|j        ‰d	<   |j        rdi }t          |j        dz
  ¦  «        D ]5Š|                     ˆfd
„‰                     ¦   «         D ¦   «         ¦  «         Œ6‰                     |¦  «         t!          ˆˆfd„‰D ¦   «         ¦  «        }|‰|fS )Nr   )r€   r   r�   rƒ   r   r   r…   r   r†   rˆ   c                 ó(   •— i | ]\  }}|d ‰› �z   |“ŒS rŒ   r   r�   s      €r   r�   z8DeformableDetrForObjectDetectionLoss.<locals>.<dictcomp>¿   r�   r   c              3   óB   •K  — | ]}|‰v ¯‰|         ‰|         z  V — Œd S rS   r   r’   s     €€r   r•   z7DeformableDetrForObjectDetectionLoss.<locals>.<genexpr>Á   r–   r   )r   r5   r4   r6   rQ   r—   rY   r˜   r™   r	   rš   r›   rž   rŸ   r    r¡   ra   )r   r€   r]   r   r¢   r£   r¤   r¥   rW   rZ   r¦   r§   r…   r¨   r©   r&   r“   r”   s                  @@@r   Ú$DeformableDetrForObjectDetectionLossr®   Ÿ   s•  øøø€ õ -ØÔ$°Ô0@ÈFÔL\ðñ ô €Gð 0Ð/Ð/€FÝ'ØØÔ%ØÔ&Øð	ñ ô €Ið ‡L‚L�ÑÔÐà€LØÐØ#€L�ÑØ!+€L�ÑØÔð >Ý)¨-¸ÑGÔGÐØ,=ˆÐ(Ñ)à�	˜,¨Ñ/Ô/€Ià¨fÔ.JÐKÐK€KØ%Ô;€K�ÑØÔð ,ØˆÝ�vÔ,¨qÑ0Ñ1Ô1ð 	Uð 	UˆAØ×"Ò"Ð#SÐ#SÐ#SÐ#S¸{×?PÒ?PÑ?RÔ?RÐ#SÑ#SÔ#SÑTÔTÐTÐTØ×Ò˜?Ñ+Ô+Ð+ÝÐTÐTÐTÐTÐT°iÐTÑTÔTÑTÔT€DØ�Ð-Ð-Ð-r   )NN)r*   Útorch.nnrT   Úimage_transformsr   Úutilsr   Úloss_for_object_detectionr   r   r	   r
   r   Úscipy.optimizer   r   rQ   rª   r®   r   r   r   ú<module>r´      sO  ðØ €€€Ø Ð Ð Ð Ð Ð à 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø &Ð &Ð &Ð &Ð &Ð &ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ÐÑÔð 5Ø4Ð4Ð4Ð4Ð4Ð4ð%tð %tð %tð %tð %tÐ%5ñ %tô %tð %tðP8ð 8ð 8ð 8ð 8˜iñ 8ô 8ð 8ðx _cð&.ð &.ð &.ð &.ðT SWð#.ð #.ð #.ð #.ð #.ð #.r   