Ë
    ÛÓ^j¾M  ã            
       óð  — d dl Zd dlZd dlmZ d dlmZmZ ddlm	Z	 ddl
mZ ddlmZmZmZ ddlmZ  e«       rd d	lmZ d
ej                  dej                  dedej                  fd„Zd
ej                  dej                  dej                  fd„Zd
ededefd„Z	 ddej                  dej                  dej                  fd„Zdededededef
d„Z G d„ de«      Z G d„ de«      Zd„ Z	 	 	 	 	 	 d d„Zy)!é    N)ÚTensorÚnné   )Úcenter_to_corners_format)Úis_scipy_availableé   )ÚHungarianMatcherÚ	dice_lossÚgeneralized_box_iou)ÚLwDetrImageLoss)Úlinear_sum_assignmentÚinputsÚlabelsÚ	num_masksÚreturnc                 óˆ   — t        j                  d¬«      } || |«      }|j                  d«      j                  «       |z  }|S )a|  
    Args:
        inputs (`torch.Tensor`):
            A float tensor of arbitrary shape.
        labels (`torch.Tensor`):
            A tensor with the same shape as inputs. Stores the binary classification labels for each element in inputs
            (0 for the negative class and 1 for the positive class).

    Returns:
        loss (`torch.Tensor`): The computed loss.
    Únone©Ú	reductionr   )r   ÚBCEWithLogitsLossÚmeanÚsum)r   r   r   Ú	criterionÚcross_entropy_lossÚlosss         úi/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/loss/loss_rf_detr.pyÚsigmoid_cross_entropy_lossr   #   sD   € ô ×$Ñ$¨vÔ6€IÙ" 6¨6Ó2Ðà×"Ñ" 1Ó%×)Ñ)Ó+¨iÑ7€DØ€Kó    c                 ó\  — | j                   d   }t        j                  d¬«      } || t        j                  | «      «      } || t        j
                  | «      «      }t        j                  ||z  |j                  «      }t        j                  ||z  d|z
  j                  «      }||z   }|S )aê  
    A pair wise version of the cross entropy loss, see `sigmoid_cross_entropy_loss` for usage.

    Args:
        inputs (`torch.Tensor`):
            A tensor representing a mask.
        labels (`torch.Tensor`):
            A tensor with the same shape as inputs. Stores the binary classification labels for each element in inputs
            (0 for the negative class and 1 for the positive class).

    Returns:
        loss (`torch.Tensor`): The computed loss between each pairs.
    r   r   r   )Úshaper   r   ÚtorchÚ	ones_likeÚ
zeros_likeÚmatmulÚT)	r   r   Úheight_and_widthr   Úcross_entropy_loss_posÚcross_entropy_loss_negÚloss_posÚloss_negr   s	            r   Ú$pair_wise_sigmoid_cross_entropy_lossr+   7   s™   € ð —|‘| A‘Ðä×$Ñ$¨vÔ6€IÙ& v¬u¯©¸vÓ/FÓGÐÙ& v¬u×/?Ñ/?ÀÓ/GÓHÐä�|‰|Ð2Ð5EÑEÀvÇxÁxÓP€HÜ�|‰|Ð2Ð5EÑEÈÈFÉ
Ç~Á~ÓV€HØ�hÑ€DØ€Kr   c                 ó  — | j                  «       j                  d«      } dt        j                  | |j                  «      z  }| j                  d«      dd…df   |j                  d«      ddd…f   z   }d|dz   |dz   z  z
  }|S )aÈ  
    A pair wise version of the dice loss, see `dice_loss` for usage.

    Args:
        inputs (`torch.Tensor`):
            A tensor representing a mask
        labels (`torch.Tensor`):
            A tensor with the same shape as inputs. Stores the binary classification labels for each element in inputs
            (0 for the negative class and 1 for the positive class).

    Returns:
        `torch.Tensor`: The computed loss between each pairs.
    r   r   éÿÿÿÿN)ÚsigmoidÚflattenr!   r$   r%   r   )r   r   Ú	numeratorÚdenominatorr   s        r   Úpair_wise_dice_lossr2   S   s|   € ð �^‰^Ó×%Ñ% aÓ(€FØ”E—L‘L ¨¯©Ó2Ñ2€Ià—*‘*˜R“.¢ D Ñ)¨F¯J©J°r«N¸4Â¸7Ñ,CÑC€KØ�	˜A‘ +°¡/Ñ2Ñ2€DØ€Kr   Úinput_featuresÚpoint_coordinatesc                 óÚ   — |j                  «       dk(  rd}|j                  d«      }t        j                  j                  j
                  | d|z  dz
  fi |¤Ž}|r|j                  d«      }|S )a(  
    A wrapper around `torch.nn.functional.grid_sample` to support 3D point_coordinates tensors.

    Args:
        input_features (`torch.Tensor` of shape (batch_size, channels, height, width)):
            A tensor that contains features map on a height * width grid
        point_coordinates (`torch.Tensor` of shape (batch_size, num_points, 2) or (batch_size, grid_height, grid_width,:
        2)):
            A tensor that contains [0, 1] * [0, 1] normalized point coordinates
        add_dim (`bool`):
            boolean value to keep track of added dimension

    Returns:
        point_features (`torch.Tensor` of shape (batch_size, channels, num_points) or (batch_size, channels,
        height_grid, width_grid):
            A tensor that contains features for points in `point_coordinates`.
    é   Tr   ç       @g      ð?)ÚdimÚ	unsqueezer!   r   Ú
functionalÚgrid_sampleÚsqueeze)r3   r4   Úadd_dimÚkwargsÚpoint_featuress        r   Úsample_pointr@   j   st   € ð( ×ÑÓ !Ò#ØˆØ-×7Ñ7¸Ó:Ðô —X‘X×(Ñ(×4Ñ4°^ÀSÐK\ÑE\Ð_bÑEbÑmÐflÑm€NÙØ'×/Ñ/°Ó2ˆàÐr   ÚlogitsÚ
num_pointsÚoversample_ratioÚimportance_sample_ratioc           	      ó*  — | j                   d   }t        ||z  «      }t        j                  ||d| j                  ¬«      }t        | |d¬«      }t        j                  |«       }t        ||z  «      }	||	z
  }
t        j                  |dd…ddd…f   |	d¬«      d   }t        j                  |d|j                  d	«      j                  d	d	d«      «      }|
dkD  r:t        j                  |t        j                  ||
d| j                  ¬«      gd¬
«      }|S )a8  
    This function is meant for sampling points in [0, 1] * [0, 1] coordinate space based on their uncertainty. The
    uncertainty is calculated for each point using the passed `uncertainty function` that takes points logit
    prediction as input.

    Args:
        logits (`float`):
            Logit predictions for P points.
        uncertainty_function:
            A function that takes logit predictions for P points and returns their uncertainties.
        num_points (`int`):
            The number of points P to sample.
        oversample_ratio (`int`):
            Oversampling parameter.
        importance_sample_ratio (`float`):
            Ratio of points that are sampled via importance sampling.

    Returns:
        point_coordinates (`torch.Tensor`):
            Coordinates for P sampled points.
    r   r   ©ÚdeviceF©Úalign_cornersNr   )Úkr8   r-   ©r8   )r    Úintr!   ÚrandrG   r@   ÚabsÚtopkÚgatherr9   ÚexpandÚcat)rA   rB   rC   rD   Ú	num_boxesÚnum_points_sampledr4   Úpoint_logitsÚpoint_uncertaintiesÚnum_uncertain_pointsÚnum_random_pointsÚidxs               r   Úsample_points_using_uncertaintyrZ   ‹   s  € ð2 —‘˜Q‘€IÜ˜ZÐ*:Ñ:Ó;Ðô Ÿ
™
 9Ð.@À!ÈFÏMÉMÔZÐä Ð(9ÈÔO€Lä!ŸI™I lÓ3Ð4ÐäÐ6¸ÑCÓDÐØ"Ð%9Ñ9Ðä
�*‰*Ð(ª¨Aªq¨Ñ1Ð5IÈqÔ
QÐRSÑ
T€CÜŸ™Ð%6¸¸3¿=¹=ÈÓ;L×;SÑ;SÐTVÐXZÐ\]Ó;^Ó_Ðà˜1ÒÜ!ŸI™IØ¤§
¡
¨9Ð6GÈÐSY×S`ÑS`Ô aÐbØô
Ðð Ðr   c                   ót   ‡ — e Zd Z	 	 	 	 	 	 d	dedededededefˆ fd„Z ej                  «       d„ «       Zˆ xZ	S )
ÚRfDetrHungarianMatcherÚ
class_costÚ	bbox_costÚ	giou_costÚmask_point_sample_ratioÚcost_mask_class_costÚcost_mask_dice_costc                 óR   •— t         ‰| �  |||«       || _        || _        || _        y ©N)ÚsuperÚ__init__r`   Úcost_mask_classÚcost_mask_dice)Úselfr]   r^   r_   r`   ra   rb   Ú	__class__s          €r   rf   zRfDetrHungarianMatcher.__init__½   s.   ø€ ô 	‰Ñ˜ Y°	Ô:à'>ˆÔ$Ø3ˆÔØ1ˆÕr   c                 óô	  — |d   j                   dd \  }}|d   j                  dd«      j                  «       }|d   j                  dd«      }|d   j                  dd«      }t        j                  |D �	cg c]  }	|	d   ‘Œ	 c}	«      }
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                  |j                  t        j                  «      |j                  t        j                  «      d¬«      j                  |«      }t        t        |«      t        |«      «       }|j                   dd \  }}||z  | j                  z  }t        j                  d|d|j                  ¬«      }|j                  |j                   d   dd«      }|j!                  d«      }t#        ||d¬«      }t        j$                  |d«      }|j                  |j&                  «      }|j                  |j                   d   dd«      }|j!                  d«      }t#        ||dd¬«      }t        j$                  |d«      }t)        ||«      }t+        ||«      }| j,                  |z  | j.                  |z  z   | j0                  |z  z   | j2                  |z  z   | j4                  |z  z   }|j7                  ||d«      j9                  «       }t        j:                  |j&                  «      j<                  ||j?                  «       |jA                  «       z  <   |D �	cg c]  }	tC        |	d
   «      ‘Œ }}	g }||z  } |jE                  | d¬«      }!tG        |«      D ]¤  }"|!|"   }#tI        |#jE                  |d«      «      D �$�%cg c]  \  }$}%tK        |%|$   «      ‘Œ }&}$}%|"dk(  r|&}ŒItM        ||&«      D �'�(cg c]E  \  }'}(tO        jP                  |'d   |(d   | |"z  z   g«      tO        jP                  |'d   |(d   g«      f‘ŒG }}'}(Œ¦ |D �$�)cg c]O  \  }$})t        jR                  |$t        jT                  ¬«      t        jR                  |)t        jT                  ¬«      f‘ŒQ }*}$})|*S c c}	w c c}	w c c}	w c c}	w c c}%}$w c c}(}'w c c})}$w )a  
        Differences:
        - out_prob = outputs["logits"].flatten(0, 1).sigmoid() instead of softmax
        - class_cost uses alpha and gamma
        - Additionally, mask cost is computed using pair-wise sigmoid cross entropy loss and dice loss
        rA   Nr   r   r   Ú
pred_boxesÚ
pred_masksÚclass_labelsÚboxesÚmasksg      Ð?r7   g:Œ0âŽyE>)ÚprF   FrH   )r-   r   Únearest©rI   Úmoder-   rK   )Údtype)+r    r/   r.   r!   rR   ÚlogÚcdistÚtoÚfloat32Útype_asr   r   r`   rM   rG   Úrepeatr9   r@   r<   ru   r+   r2   r^   r]   r_   rg   rh   ÚviewÚcpuÚfinfoÚmaxÚisinfÚisnanÚlenÚsplitÚrangeÚ	enumerater   ÚzipÚnpÚconcatenateÚ	as_tensorÚint64)+ri   ÚoutputsÚtargetsÚ
group_detrÚ
batch_sizeÚnum_queriesÚout_probÚout_bboxÚ	out_masksÚvÚ
target_idsÚtarget_bboxÚtarget_masksÚalphaÚgammaÚneg_cost_classÚpos_cost_classr]   r^   r_   ÚheightÚwidthrB   Úpoint_coordsÚpred_point_coordsÚpred_masks_logitsÚtarget_point_coordsrg   rh   Úcost_matrixÚsizesÚindicesÚgroup_num_queriesÚcost_matrix_listÚgroup_idÚgroup_cost_matrixÚiÚcÚgroup_indicesÚindice1Úindice2ÚjÚmatched_indicess+                                              r   ÚforwardzRfDetrHungarianMatcher.forwardÌ   sï  € ð #*¨(Ñ"3×"9Ñ"9¸"¸1Ð"=Ñˆ
�Kð ˜8Ñ$×,Ñ,¨Q°Ó2×:Ñ:Ó<ˆØ˜<Ñ(×0Ñ0°°AÓ6ˆØ˜LÑ)×1Ñ1°!°QÓ7ˆ	ô —Y‘Y¸7ÖC°a  .Ó 1ÒCÓDˆ
Ü—i‘i°WÖ =°  7£Ò =Ó>ˆÜ—y‘y°gÖ!>° ! G£*Ò!>Ó?ˆð ˆØˆØ˜e™)¨°%©Ñ8¸aÀ(¹lÈTÑ>Q×=VÑ=VÓ=XÐ<XÑYˆØ 1 x¡<°EÑ"9Ñ:ÀÈ4Á×?TÑ?TÓ?VÐ>VÑWˆØ#¢A z MÑ2°^ÂAÀzÀMÑ5RÑRˆ
ô —K‘K §¡¬E¯M©MÓ :¸K¿N¹NÌ5Ï=É=Ó<YÐ]^Ô_×gÑgÐhpÓqˆ	ô )Ô)AÀ(Ó)KÔMeÐfqÓMrÓsÐsˆ	ð !Ÿ™ r¨Ð*‰ˆ�Ø˜e‘^ t×'CÑ'CÑCˆ
Ü—z‘z ! Z°¸9×;KÑ;KÔLˆà(×/Ñ/°	·±ÀÑ0BÀAÀqÓIÐØ×'Ñ'¨Ó*ˆ	Ü(¨Ð4EÐUZÔ[ÐÜ!ŸM™MÐ*;¸WÓEÐà#—‘ y§¡Ó7ˆØ*×1Ñ1°,×2DÑ2DÀQÑ2GÈÈAÓNÐØ#×-Ñ-¨aÓ0ˆÜ# LÐ2EÐUZÐajÔkˆÜ—}‘} \°7Ó;ˆä>Ð?PÐR^Ó_ˆÜ,Ð->ÀÓMˆð �N‰N˜YÑ&Ø�o‰o 
Ñ*ñ+à�n‰n˜yÑ(ñ)ð ×"Ñ" _Ñ4ñ5ð ×!Ñ! NÑ2ñ	3ð 	ð "×&Ñ& z°;ÀÓC×GÑGÓIˆô BGÇÁÈ[×M^ÑM^ÓA_×AcÑAcˆ�K×%Ñ%Ó'¨+×*;Ñ*;Ó*=Ñ=Ñ>ð +2Ö2 Q”�Q�w‘Z•Ð2ˆÐ2ØˆØ'¨:Ñ5ÐØ&×,Ñ,Ð->ÀAÐ,ÓFÐÜ˜jÓ)ò 	ˆHØ 0°Ñ :ÐÜENÐO`×OfÑOfÐglÐnpÓOqÓEr×s¹T¸QÀÔ2°1°Q±4Õ8ÐsˆMÑsØ˜1Š}Ø'‘ô -0°¸Ó,G÷ñ
 )˜ ô Ÿ™¨°©
°G¸A±JÐARÐU]ÑA]Ñ4]Ð'^Ó_ÜŸ™¨°©
°G¸A±JÐ'?Ó@òð�ò ð	ð ho÷
Ù_cÐ_`ÐbcŒU�_‰_˜Q¤e§k¡kÔ2´E·O±OÀAÌUÏ[É[Ô4YÒZð
ˆñ 
ð ÐùòM  DùÚ =ùÚ!>ùò` 3ùó tùóùó
s,   Á6SÂSÃSÎS#Ï5S(Ð'A
S.Ñ;AS4)r   r   r   é   r   r   )
Ú__name__Ú
__module__Ú__qualname__ÚfloatrL   rf   r!   Úno_gradr¯   Ú__classcell__©rj   s   @r   r\   r\   ¼   st   ø„ ð ØØØ')Ø&'Ø%&ñ2àð2ð ð2ð ð	2ð
 "%ð2ð $ð2ð #õ2ð €U‡]�]ƒ_ñUó ôUr   r\   c                   ó*   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zˆ xZS )ÚRfDetrImageLossc                 ó:   •— t         ‰| �  |||||«       || _        y rd   )re   rf   r`   )ri   ÚmatcherÚnum_classesÚfocal_alphaÚlossesr�   r`   rj   s          €r   rf   zRfDetrImageLoss.__init__&  s    ø€ Ü‰Ñ˜ +¨{¸FÀJÔOØ'>ˆÕ$r   c           	      ó^  — d|vrt        d«      ‚| j                  |«      }|d   |   }|j                  «       dk(  r+t        j                  |«      t        j                  |«      dœS t        j
                  t        ||«      D ���	cg c]  \  }\  }}	|d   |	   ‘Œ c}	}}d¬«      }
|j                  d«      }|
j                  d«      j                  «       }
t        |j                  d   |j                  d   |j                  d	   z  | j                  z  «      }t        j                  «       5  t        ||d
d«      }t        |
|dd¬«      j                  d«      }ddd«       t        |d¬«      j                  d«      }t!        ||«      t#        |||«      dœ}|S c c}	}}w # 1 sw Y   ŒJxY 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].
        rm   z#No predicted masks found in outputsr   )Úloss_mask_ceÚloss_mask_dicerp   rK   r   éþÿÿÿr-   r6   g      è?Frr   rs   NrH   )ÚKeyErrorÚ_get_source_permutation_idxÚnumelr!   r#   rR   r†   r9   r´   r   r    r`   rµ   rZ   r@   r<   r   r
   )ri   r‹   rŒ   r£   rS   Ú
source_idxÚsource_masksÚtÚ_r­   r–   rB   r�   Úpoint_labelsrU   r¾   s                   r   Ú
loss_maskszRfDetrImageLoss.loss_masks*  s²  € ð ˜wÑ&ÜÐ@ÓAÐAà×5Ñ5°gÓ>ˆ
Ø˜|Ñ,¨ZÑ8ˆØ×ÑÓ 1Ò$ä %× 0Ñ 0°Ó >Ü"'×"2Ñ"2°<Ó"@ñð ô —y‘yÄÀWÈgÓAV×!WÐ!W±I°A±v¸¸1 ! G¡*¨Q£-Ô!WÐ]^Ô_ˆà#×-Ñ-¨aÓ0ˆØ#×-Ñ-¨aÓ0×6Ñ6Ó8ˆô Ø×Ñ˜rÑ" L×$6Ñ$6°rÑ$:¸\×=OÑ=OÐPRÑ=SÑ$SÐW[×WsÑWsÑ$só
ˆ
ô �]‰]‹_ñ 	tä:¸<ÈÐUVÐX\Ó]ˆLä'¨°lÐRWÐ^gÔh×pÑpÐqrÓsˆL÷		tô $ L°,ÈeÔT×\Ñ\Ð]^Ó_ˆô 7°|À\ÐS\Ó]Ü'¨°lÀIÓNñ
ˆð ˆùô- "X÷	tð 	tús   ÂFÄ--F#Æ#F,c           
      óX  — | j                   r| j                  nd}|j                  «       D ��ci c]  \  }}|dk7  sŒ|dk7  sŒ||“Œ }}}| j                  |||«      }t	        d„ |D «       «      }||z  }t        j                  |gt
        j                  t        t        |j                  «       «      «      j                  ¬«      }d}	t        j                  «       rWt        j                  «       rCt        j                  |t        j                   j"                  ¬«       t        j$                  «       }	t        j&                  ||	z  d¬«      j)                  «       }i }
| j*                  D ]&  }|
j-                  | j/                  |||||«      «       Œ( d|v r‰t1        |d   «      D ]x  \  }}| j                  |||«      }| j*                  D ]Q  }| j/                  |||||«      }|j                  «       D ��ci c]  \  }}|d|› �z   |“Œ }}}|
j-                  |«       ŒS Œz d|v rv|d   }| j                  |||¬	«      }| j*                  D ]N  }| j/                  |||||«      }|j                  «       D ��ci c]  \  }}|d
z   |“Œ }}}|
j-                  |«       ŒP |
S 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.
        r   Úenc_outputsÚauxiliary_outputsc              3   ó8   K  — | ]  }t        |d    «      –— Œ y­w)rn   N)r‚   )Ú.0rÈ   s     r   ú	<genexpr>z*RfDetrImageLoss.forward.<locals>.<genexpr>h  s   è ø€ Ò@°1œ˜A˜nÑ-×.Ñ@ùs   ‚)ru   rG   )Úop)ÚminrÉ   )r�   Ú_enc)Útrainingr�   Úitemsr»   r   r!   r‰   r´   ÚnextÚiterÚvaluesrG   ÚdistÚis_availableÚis_initializedÚ
all_reduceÚReduceOpÚSUMÚget_world_sizeÚclampÚitemr¾   ÚupdateÚget_lossr…   )ri   r‹   rŒ   r�   rJ   r“   Úoutputs_without_aux_and_encr£   rS   Ú
world_sizer¾   r   r¨   rÎ   Úl_dictrÍ   s                   r   r¯   zRfDetrImageLoss.forwardT  s„  € ð )-¯ª�T—_’_¸1ˆ
à$Ÿ]™]›_÷'
Ù�Q˜°°]Ó0BÀqÐL_ÓG_ˆAˆq‰Dð'
Ð#ñ '
ð
 —,‘,Ð:¸GÀZÓPˆô Ñ@¸Ô@Ó@ˆ	Ø 
Ñ*ˆ	Ü—O‘O Y K´u·{±{Ì4ÔPTÐU\×UcÑUcÓUeÓPfÓKg×KnÑKnÔoˆ	Øˆ
Ü×ÑÔ¤4×#6Ñ#6Ô#8Ü�O‰O˜I¬$¯-©-×*;Ñ*;Õ<Ü×,Ñ,Ó.ˆJÜ—K‘K 	¨JÑ 6¸AÔ>×CÑCÓEˆ	ð ˆØ—K‘Kò 	UˆDØ�M‰M˜$Ÿ-™-¨¨g°wÀÈÓSÕTð	Uð
  'Ñ)Ü(1°'Ð:MÑ2NÓ(Oò *Ñ$�Ð$ØŸ,™,Ð'8¸'À:ÓN�Ø ŸK™Kò *�DØ!Ÿ]™]¨4Ð1BÀGÈWÐV_Ó`�FØ9?¿¹»×H±°°A˜a A a S '™k¨1™nÐH�FÑHØ—M‘M &Õ)ñ*ð*ð ˜GÑ#Ø! -Ñ0ˆKØ—l‘l ;°ÀJ�lÓOˆGØŸ™ò &�ØŸ™ t¨[¸'À7ÈIÓV�Ø4:·L±L³N×C©D¨A¨q˜!˜f™* a™-ÐC�ÑCØ—‘˜fÕ%ð&ð
 ˆùóQ'
ùó: Iùó Ds   ®J¼JÁJÇ3J 
É2J&)r±   r²   r³   rf   rË   r¯   r¶   r·   s   @r   r¹   r¹   %  s   ø„ ô?ò(öT4r   r¹   c           	      óp   — t        | d d |d d |d d «      D ���cg c]  \  }}}|||dœ‘Œ c}}}S c c}}}w )Nr-   ©rA   rl   rm   )r†   )Úoutputs_classÚoutputs_coordÚoutputs_masksÚaÚbr©   s         r   Ú_set_aux_lossrï   ‹  sV   € ô ˜=¨¨"Ð-¨}¸S¸bÐ/AÀ=ÐQTÐRTÐCUÓV÷ð áˆAˆq�!ð  A°QÓ7ôð ùô s   ›1c           
      óð  ‡‡— t        |j                  |j                  |j                  |j                  |j
                  |j                  ¬«      }g d¢}t        ||j                  |j                  ||j                  |j                  ¬«      }|j                  |«       i }d }| |d<   ||d<   ||d<   |	|
|dœ|d<   |j                  rt        |||«      }||d	<    |||«      Š|j                  |j                  d
œŠ|j                   ‰d<   |j
                  ‰d<   |j                  ‰d<   |j                  rŸi }t#        |j$                  dz
  «      D ];  }|j'                  ‰j)                  «       D ��ci c]  \  }}|d|› �z   |“Œ c}}«       Œ= |j'                  ‰j)                  «       D ��ci c]  \  }}|dz   |“Œ c}}«       ‰j'                  |«       t+        ˆˆfd„‰D «       «      }|‰|fS c c}}w c c}}w )N)r]   r^   r_   r`   ra   rb   )r   ro   Úcardinalityrp   )r»   r¼   r½   r¾   r�   r`   rA   rl   rm   ré   rÍ   rÎ   )Úloss_ceÚ	loss_bboxÚ	loss_giourÀ   rÁ   r   rÉ   rÔ   c              3   ó>   •K  — | ]  }|‰v sŒ‰|   ‰|   z  –— Œ y ­wrd   © )rÐ   rJ   Ú	loss_dictÚweight_dicts     €€r   rÑ   z,RfDetrForSegmentationLoss.<locals>.<genexpr>Ñ  s%   øè ø€ ÒT°À1ÈÒCSˆy˜‰|˜k¨!™nÕ,ÑTùs   ƒ	�)r\   r]   r^   r_   r`   Úmask_class_loss_coefficientÚmask_dice_loss_coefficientr¹   Ú
num_labelsr½   r�   rx   Úauxiliary_lossrï   Úclass_loss_coefficientÚbbox_loss_coefficientÚgiou_loss_coefficientr„   Údecoder_layersrã   rÖ   r   )rA   r   rG   rl   rm   Úconfigrê   rë   rì   Úenc_outputs_classÚenc_outputs_coordÚenc_outputs_masksr>   r»   r¾   r   Úoutputs_lossrÎ   Úaux_weight_dictr¨   rJ   r“   r   r÷   rø   s                          @@r   ÚRfDetrForSegmentationLossr  “  s
  ù€ ô  %Ø×$Ñ$Ø×"Ñ"Ø×"Ñ"Ø &× >Ñ >Ø#×?Ñ?Ø"×=Ñ=ô€Gò 9€FÜØØ×%Ñ%Ø×&Ñ&ØØ×$Ñ$Ø &× >Ñ >ô€Ið ‡L�L�Ôà€LØÐØ#€L�ÑØ!+€L�ÑØ!+€L�Ñà#Ø'Ø'ñ#€L�Ñð
 ×ÒÜ)¨-¸ÈÓVÐØ,=ˆÐ(Ñ)á˜,¨Ó/€Ià$×;Ñ;È&×JfÑJfÑg€KØ%×;Ñ;€K�ÑØ"(×"DÑ"D€K�ÑØ$*×$EÑ$E€KÐ Ñ!Ø×ÒØˆÜ�v×,Ñ,¨qÑ0Ó1ò 	UˆAØ×"Ñ"¸{×?PÑ?PÓ?R×#S±t°q¸! A¨!¨A¨3¨¡K°¡NÓ#SÕTð	Uà×Ñ¸+×:KÑ:KÓ:M×N±$°!°Q  F¡
¨A¡ÓNÔOØ×Ñ˜?Ô+ÜÔT°iÔTÓT€DØ�Ð-Ð-Ð-ùó	 $TùÛNs   Å.G,Æ)G2
)F)NNNNNN)Únumpyr‡   r!   Útorch.distributedÚdistributedrÚ   r   r   Úimage_transformsr   Úutilsr   Úloss_for_object_detectionr	   r
   r   Úloss_lw_detrr   Úscipy.optimizer   rL   r   r+   r2   r@   r´   rZ   r\   r¹   rï   r  rö   r   r   ú<module>r     sC  ðó Û Ý  ß å 7Ý &÷ñ õ
 *ñ ÔÝ4ð u§|¡|ð ¸U¿\¹\ð ÐVYð Ð^c×^jÑ^jó ð(°·±ð ÀuÇ|Á|ð ÐX]×XdÑXdó ð8 ð °ð ¸6ó ð0 LQñØ—L‘LðØ5:·\±\ðà
‡\�\óðB.Øð.Ø #ð.Ø7:ð.ØUZð.àó.ôbfÐ-ô fôRc�oô còLð ØØØØØô?.r   