ó
    Eñi÷…  ã                   óˆ  • S SK Jr  S SKrS SKJs  Jr  S SKrS SKJr  S SKJ	r
Jr  SSKJr  S\R                  S\R                  S	\\R                     S
\\R                     S\\R                  \R                  4   4
S jrS\R                  S	\\R                     S\\R                     4S jrS rS rS rS r\R0                  R2                  S 5       rS rS rS rS rS r\R0                  R@                  S 5       r!S r"S r#S r$\R0                  R2                  S 5       r%S!S jr& " S S \RN                  5      r(g)"é    )ÚOptionalN)Únn)ÚboxesÚ	roi_aligné   )Ú_utilsÚclass_logitsÚbox_regressionÚlabelsÚregression_targetsÚreturnc                 óŠ  • [         R                  " USS9n[         R                  " USS9n[        R                  " X5      n[         R                  " US:„  5      S   nX%   nU R
                  u  pxUR                  XqR                  S5      S-  S5      n[        R                  " XU4   X5   SSS9n	X’R                  5       -  n	XI4$ )zÞ
Computes the loss for Faster R-CNN.

Args:
    class_logits (Tensor)
    box_regression (Tensor)
    labels (list[BoxList])
    regression_targets (Tensor)

Returns:
    classification_loss (Tensor)
    box_loss (Tensor)
r   ©Údiméÿÿÿÿé   gÇqÇq¼?Úsum)ÚbetaÚ	reduction)
ÚtorchÚcatÚFÚcross_entropyÚwhereÚshapeÚreshapeÚsizeÚsmooth_l1_lossÚnumel)
r	   r
   r   r   Úclassification_lossÚsampled_pos_inds_subsetÚ
labels_posÚNÚnum_classesÚbox_losss
             Úc/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torchvision/models/detection/roi_heads.pyÚfastrcnn_lossr'      sÆ   € ô( �YŠY�v 1Ñ%€FÜŸšÐ#5¸1Ñ=ÐäŸ/š/¨,Ó?Ðô
 $Ÿkšk¨&°1©*Ó5°aÑ8ÐØÑ0€JØ!×'Ñ'�N€AØ#×+Ñ+¨A×/BÑ/BÀ2Ó/FÈ!Ñ/KÈQÓO€Nä×ÒØ°
Ð:Ñ;ØÑ3ØØñ	€Hð Ÿ,™,›.Ñ(€HàÐ(Ð(ó    Úxc                 ó,  • U R                  5       nU R                  S   nU Vs/ s H  oDR                  S   PM     nn[        R                  " U5      n[        R                  " X1R
                  S9nX&U4   SS2S4   nUR                  USS9nU$ s  snf )aÜ  
From the results of the CNN, post process the masks
by taking the mask corresponding to the class with max
probability (which are of fixed size and directly output
by the CNN) and return the masks in the mask field of the BoxList.

Args:
    x (Tensor): the mask logits
    labels (list[BoxList]): bounding boxes that are used as
        reference, one for each image

Returns:
    results (list[BoxList]): one BoxList for each image, containing
        the extra field mask
r   ©ÚdeviceNr   )Úsigmoidr   r   r   Úaranger,   Úsplit)r)   r   Ú	mask_probÚ	num_masksÚlabelÚboxes_per_imageÚindexs          r&   Úmaskrcnn_inferencer5   8   sŠ   € ð  —	‘	“€Ið —‘˜‘
€IÙ39Ó:²6¨%—{‘{ 1”~±6€OÐ:Ü�YŠY�vÓ€FÜ�LŠL˜¯=©=Ñ9€EØ ˜-Ñ(ª¨D¨Ñ1€IØ—‘ °Q�Ð7€IàÐùò ;s   ¤Bc                 óº   • UR                  U5      n[        R                  " USS2S4   U/SS9nU SS2S4   R                  U5      n [        XX34S5      SS2S4   $ )a  
Given segmentation masks and the bounding boxes corresponding
to the location of the masks in the image, this function
crops and resizes the masks in the position defined by the
boxes. This prepares the masks for them to be fed to the
loss computation as the targets.
Nr   r   g      ð?r   )Útor   r   r   )Úgt_masksr   Úmatched_idxsÚMÚroiss        r&   Úproject_masks_on_boxesr<   U   sc   € ð  —?‘? 5Ó)€LÜ�9Š9�l¢1 d 7Ñ+¨UÐ3¸Ñ;€DØš˜4˜Ñ ×#Ñ# DÓ)€HÜ�X a V¨SÓ1²!°Q°$Ñ7Ð7r(   c                 ó  • U R                   S   n[        X45       VVs/ s H	  u  pgXg   PM     nnn[        X!U5       V	V
Vs/ s H  u  pšn[        XšXµ5      PM     nn
n	n[        R                  " USS9n[        R                  " USS9nUR                  5       S:X  a  U R                  5       S-  $ [        R                  " U [        R                  " UR                   S   UR                  S9U4   U5      nU$ s  snnf s  snn
n	f )z�
Args:
    proposals (list[BoxList])
    mask_logits (Tensor)
    targets (list[BoxList])

Return:
    mask_loss (Tensor): scalar tensor containing the loss
r   r   r   r+   )r   Úzipr<   r   r   r   r   r   Ú binary_cross_entropy_with_logitsr.   r,   )Úmask_logitsÚ	proposalsr8   Ú	gt_labelsÚmask_matched_idxsÚdiscretization_sizeÚgt_labelÚidxsr   ÚmÚpÚiÚmask_targetsÚ	mask_losss                 r&   Úmaskrcnn_lossrL   d   s÷   € ð &×+Ñ+¨BÑ/ÐÜ36°yÔ3TÔUÒ3T¡ ˆhŒnÑ3T€FÑUäLOÐPXÐevÔLwõÚLwÁÀÀqÔ˜q QÖ<ÑLwð ò ô �YŠY�v 1Ñ%€FÜ—9’9˜\¨qÑ1€Lð ×ÑÓ˜qÓ Ø�‰Ó  1Ñ$Ð$ä×2Ò2Ø”E—L’L §¡¨a¡¸¿¹ÑGÈÐOÑPÐR^ó€Ið Ðùó! Vùôs   žC7ÁC=c                 óH  • US S 2S4   nUS S 2S4   nX!S S 2S4   US S 2S4   -
  -  nX!S S 2S4   US S 2S4   -
  -  nUS S 2S 4   nUS S 2S 4   nUS S 2S 4   nUS S 2S 4   nU S   nU S   nXqS S 2S4   S S 2S 4   :H  n	X�S S 2S4   S S 2S 4   :H  n
Xs-
  U-  nUR                  5       R                  5       nX„-
  U-  nUR                  5       R                  5       nUS-
  Xy'   US-
  XŠ'   US:¬  US:¬  -  Xr:  -  X‚:  -  nU S   S:„  nX¼-  R                  5       nX‚-  U-   nXí-  nXý4$ )Nr   r   é   é   ).r   ).r   ).rN   )ÚfloorÚlong)Ú	keypointsr;   Úheatmap_sizeÚoffset_xÚoffset_yÚscale_xÚscale_yr)   ÚyÚx_boundary_indsÚy_boundary_indsÚ	valid_locÚvisÚvalidÚlin_indÚheatmapss                   r&   Úkeypoints_to_heatmapr`   „   s‡  € à’A�q�D‰z€HØ’A�q�D‰z€HØ¢1 a 4™j¨4²°1°©:Ñ5Ñ6€GØ¢1 a 4™j¨4²°1°©:Ñ5Ñ6€Gàš˜4˜Ñ €HØš˜4˜Ñ €HØ’a˜�gÑ€GØ’a˜�gÑ€Gà�&Ñ€AØ�&Ñ€Aà¢ 1 ™:¢a¨ gÑ.Ñ.€OØ¢ 1 ™:¢a¨ gÑ.Ñ.€Oà	
‰˜Ñ €AØ	�‰‹	�‰Ó€AØ	
‰˜Ñ €AØ	�‰‹	�‰Ó€Aà%¨Ñ)€AÑØ%¨Ñ)€AÑà�a‘˜A ™FÑ# qÑ'7Ñ8¸AÑ<LÑM€IØ
�FÑ
˜aÑ
€CØ‰_×"Ñ"Ó$€EàÑ Ñ"€GØ‰€Hàˆ?Ðr(   c                 óx  • [         R                  " U R                  S5      [         R                  S9nXB-  n	XS-  n
[        R
                  " US S 2S 4   [        U5      [        U5      4SSS9S S 2S4   n[         R                  " UR                  S5      [         R                  S9nUR                  US5      R                  SS	9nXÜ-  nXÞ-
  U-  n[         R                  " S
[         R                  S9UR                  [         R                  S9-   U	R                  [         R                  S9-  n[         R                  " S
[         R                  S9UR                  [         R                  S9-   U
R                  [         R                  S9-  nUUR                  [         R                  S9-   nUUR                  [         R                  S9-   n[         R                  " UR                  [         R                  S9n[         R                  " UR                  [         R                  S9UR                  [         R                  S9UR                  [         R                  S9/S5      nXˆ-  U-   S-   n[         R                  " U5      nUR                  [         R                  S9U-  nUR!                  SUR                  [         R                  S95      R!                  SUR                  [         R                  S95      R#                  S5      R!                  SUR                  [         R                  S95      nUU4$ )Nr   ©ÚdtypeÚbicubicF©r   ÚmodeÚalign_cornersr   rN   r   r   ç      à?)r   Úscalar_tensorr   Úint64r   ÚinterpolateÚintr   ÚargmaxÚtensorÚfloat32r7   Úonesr   Ústackr.   Úindex_selectÚview)ÚmapsÚmaps_iÚroi_map_widthÚroi_map_heightÚwidths_iÚ	heights_iÚ
offset_x_iÚ
offset_y_iÚnum_keypointsÚwidth_correctionÚheight_correctionÚroi_mapÚwÚposÚx_intÚy_intr)   rX   Úxy_preds_i_0Úxy_preds_i_1Úxy_preds_i_2Ú
xy_preds_iÚbaseÚindÚend_scores_is                            r&   Ú_onnx_heatmaps_to_keypointsr‹   ¨   s�  € ô ×'Ò'¨¯	©	°!«¼E¿K¹KÑH€MàÑ/ÐØ!Ñ2Ðä�mŠmØŠq�$ˆw‰œs >Ó2´C¸Ó4FÐGÈiÐglñâˆ€dñ€Gô 	×Ò˜GŸL™L¨›O´5·;±;Ñ?€AØ
�/‰/˜-¨Ó
,×
3Ñ
3¸Ð
3Ð
:€Cà‰G€EØ‰[˜QÑ€Eä	�Š�c¤§¡Ñ	/°%·(±(ÄÇÁ°(Ð2OÑ	OÐSc×SfÑSfÜ�m‰mð Tgð Tñ 	€Aô 
�Š�c¤§¡Ñ	/°%·(±(ÄÇÁ°(Ð2OÑ	OÐSd×SgÑSgÜ�m‰mð Thð Tñ 	€Að �z—}‘}¬5¯=©=�}Ð9Ñ9€LØ�z—}‘}¬5¯=©=�}Ð9Ñ9€LÜ—:’:˜l×0Ñ0¼¿¹ÑF€LÜ—’à�O‰O¤%§-¡-ˆOÐ0Ø�O‰O¤%§-¡-ˆOÐ0Ø�O‰O¤%§-¡-ˆOÐ0ð	
ð
 	
ó€Jð Ñ(¨=Ñ8¸1Ñ<€DÜ
�,Š,�}Ó
%€CØ
�&‰&”u—{‘{ˆ&Ð
# dÑ
*€Cà×Ñ˜Q §¡¬u¯{©{ Ð ;Ó<ß	‰�a˜Ÿ™¬¯©˜Ð4Ó	5ß	‰ˆb‹ß	‰�a˜Ÿ™¤e§k¡k˜Ð2Ó	3ð	 ð �|Ð#Ð#r(   c	                 óþ  • [         R                  " SS[        U5      4[         R                  U R                  S9n	[         R                  " S[        U5      4[         R                  U R                  S9n
[        [        UR                  S5      5      5       Há  n[        X U   X+   X;   XK   X[   Xk   X{   5      u  pÍ[         R                  " U	R                  [         R                  S9UR                  S5      R                  [         R                  S94S5      n	[         R                  " U
R                  [         R                  S9UR                  [         R                  S9R                  S5      4S5      n
Mã     Xš4$ )Nr   rO   ©rc   r,   rb   )r   Úzerosrl   ro   r,   Úranger   r‹   r   r7   Ú	unsqueeze)rt   r;   Úwidths_ceilÚheights_ceilÚwidthsÚheightsrT   rU   r|   Úxy_predsÚ
end_scoresrI   r‡   rŠ   s                 r&   Ú _onnx_heatmaps_to_keypoints_loopr—   Û   s6  € ô �{Š{˜A˜q¤# mÓ"4Ð5¼U¿]¹]ÐSW×S^ÑS^Ñ_€HÜ—’˜a¤ ]Ó!3Ð4¼E¿M¹MÐRV×R]ÑR]Ñ^€Jä”3�t—y‘y “|Ó$Ö%ˆÜ#>Ø�q‘'˜;™>¨<©?¸F¹IÀwÁzÐS[ÑS^Ð`hÑ`kó$
Ñ ˆ
ô —9’9˜hŸk™k´·±˜kÐ>À
×@TÑ@TÐUVÓ@W×@ZÑ@ZÔaf×anÑanÐ@ZÐ@oÐpÐrsÓtˆÜ—Y’YØ�]‰]¤§¡ˆ]Ð/°·±ÄuÇ}Á}°Ð1U×1_Ñ1_Ð`aÓ1bÐcÐefó
Š
ñ &ð ÐÐr(   c                 óˆ  • USS2S4   nUSS2S4   nUSS2S4   USS2S4   -
  nUSS2S4   USS2S4   -
  nUR                  SS9nUR                  SS9nUR                  5       nUR                  5       nU R                  S   n[        R                  " 5       (       aK  [        U UUUUUUU[        R                  " U[        R                  S95	      u  pšU	R                  SSS5      U
4$ [        R                  " [        U5      SU4[        R                  U R                  S9n	[        R                  " [        U5      U4[        R                  U R                  S9n
[        [        U5      5       GH8  n[        Xk   R!                  5       5      n[        X{   R!                  5       5      nXK   U-  nX[   U-  n["        R$                  " X   SS2S4   XÜ4S	S
S9SS2S4   nUR                  S   nUR'                  US5      R)                  SS9nUU-  n[        R*                  " UU-
  USS9nUR-                  5       S-   U-  nUR-                  5       S-   U-  nUX+   -   X›SSS24'   UX;   -   X›SSS24'   SX›SSS24'   U[        R.                  " UUR                  S9UU4   X«SS24'   GM;     U	R                  SSS5      U
4$ )ab  Extract predicted keypoint locations from heatmaps.

Args:
    maps (Tensor[K, N, H, W]): The predicted heatmaps, where K is the number of RoIs,
        N is the number of keypoints, and H, W are the heatmap spatial dimensions.
    rois (Tensor[K, 4]): The RoI boxes in ``(x1, y1, x2, y2)`` format.

Returns:
    tuple:
        - **xy_preds** (Tensor[K, N, 3]): The predicted keypoint locations, where the last
          dimension contains ``(x, y, v)`` with x, y being coordinates and v being visibility (always 1).
        - **scores** (Tensor[K, N]): The heatmap scores at the predicted keypoint locations.
Nr   r   rN   rO   ©Úminrb   r�   rd   Fre   r   r   rP   )Úrounding_moderh   r+   )ÚclampÚceilr   ÚtorchvisionÚ_is_tracingr—   r   ri   rj   ÚpermuterŽ   Úlenro   r,   r�   rl   Úitemr   rk   r   rm   ÚdivÚfloatr.   )rt   r;   rT   rU   r“   r”   r‘   r’   r|   r•   r–   rI   rv   rw   r}   r~   r   r€   r�   r‚   rƒ   r)   rX   s                          r&   Úheatmaps_to_keypointsr¥   í   sÆ  € ð& ’A�q�D‰z€HØ’A�q�D‰z€Hà’!�Q�$‰Z˜$šq !˜t™*Ñ$€FØ’1�a�4‰j˜4¢ 1 ™:Ñ%€GØ�\‰\˜aˆ\Ð €FØ�m‰m ˆmÐ"€GØ—+‘+“-€KØ—<‘<“>€Là—J‘J˜q‘M€Mä×Ò× Ñ Ü?ØØØØØØØØÜ×Ò ´U·[±[ÑAó
 
Ñˆð ×Ñ  1 aÓ(¨*Ð4Ð4ä�{Š{œC ›I q¨-Ð8ÄÇÁÐVZ×VaÑVaÑb€HÜ—’œc $›i¨Ð7¼u¿}¹}ÐUY×U`ÑU`Ña€JÜ”3�t“9×ˆÜ˜K™N×/Ñ/Ó1Ó2ˆÜ˜\™_×1Ñ1Ó3Ó4ˆØ!™9 }Ñ4ÐØ#™J¨Ñ7ÐÜ—-’-Ø‰G’A�t�GÑ NÐ#BÈÐbgñ
â
ˆQˆ$ñˆð �M‰M˜!ÑˆØ�o‰o˜m¨RÓ0×7Ñ7¸AÐ7Ð>ˆà�a‘ˆÜ—	’	˜# ™+ q¸Ñ@ˆð �[‰[‹]˜SÑ Ð$4Ñ4ˆØ�[‰[‹]˜SÑ Ð$5Ñ5ˆØ ¡™Oˆ�A’q�ÑØ ¡™Oˆ�A’q�ÑØˆ�A’q�ÑØ"¤5§<¢<°ÀgÇnÁnÑ#UÐW\Ð^cÐ#cÑdˆ
’a�4Ôñ+ ð. ×Ñ˜A˜q !Ó$ jÐ0Ð0r(   c                 óº  • U R                   u  pEpgXg:w  a  [        SU SU 35      eUn/ n	/ n
[        XU5       HY  u  p¼nXÍ   n[        XëU5      u  nnU	R	                  UR                  S5      5        U
R	                  UR                  S5      5        M[     [        R                  " U	SS9n[        R                  " U
SS9R                  [        R                  S9n
[        R                  " U
5      S   n
UR                  5       S:X  d  [        U
5      S:X  a  U R                  5       S-  $ U R                  XE-  Xg-  5      n [        R                  " X
   UU
   5      nU$ )Nz_keypoint_logits height and width (last two elements of shape) should be equal. Instead got H = z	 and W = r   r   r   rb   )r   Ú
ValueErrorr>   r`   Úappendrs   r   r   r7   Úuint8r   r   r¡   r   r   r   )Úkeypoint_logitsrA   Úgt_keypointsÚkeypoint_matched_idxsr#   ÚKÚHÚWrD   r_   r]   Úproposals_per_imageÚgt_kp_in_imageÚmidxÚkpÚheatmaps_per_imageÚvalid_per_imageÚkeypoint_targetsÚkeypoint_losss                      r&   Úkeypointrcnn_lossr¸   6  s[  € à ×&Ñ&�J€Aˆ!ØƒvÜØmÐnoÐmpÐpyÐz{Ðy|Ð}ó
ð 	
ð ÐØ€HØ€EÜ58¸ÐRgÖ5hÑ1Ð¨TØÑ!ˆÜ.BÀ2Ð\oÓ.pÑ+Ð˜OØ�‰Ð*×/Ñ/°Ó3Ô4Ø�‰�_×)Ñ)¨"Ó-Ö.ñ	 6iô —y’y ¨qÑ1ÐÜ�IŠI�e Ñ#×&Ñ&¬U¯[©[Ð&Ð9€EÜ�KŠK˜Ó˜qÑ!€Eð ×ÑÓ 1Ó$¬¨E«
°a«Ø×"Ñ"Ó$ qÑ(Ð(à%×*Ñ*¨1©5°!±%Ó8€Oä—O’O OÑ$:Ð<LÈUÑ<SÓT€MØÐr(   c                 ó   • / n/ nU Vs/ s H  oDR                  S5      PM     nnU R                  USS9n[        Xa5       H4  u  px[        Xx5      u  pšUR	                  U	5        UR	                  U
5        M6     X#4$ s  snf )Nr   r   )r   r/   r>   r¥   r¨   )r)   r   Úkp_probsÚ	kp_scoresÚboxr3   Úx2ÚxxÚbbÚkp_probÚscoress              r&   Úkeypointrcnn_inferencerÂ   U  s~   € à€HØ€Iá.3Ó4ªe s—x‘x –{©e€OÐ4Ø	
�‰� aˆÐ	(€Bä�b–.‰ˆÜ/°Ó7‰ˆØ�‰˜Ô Ø×Ñ˜Ö ñ !ð
 ÐÐùò 5s   ‰A;c                 óˆ  • U S S 2S4   U S S 2S4   -
  S-  nU S S 2S4   U S S 2S4   -
  S-  nU S S 2S4   U S S 2S4   -   S-  nU S S 2S4   U S S 2S4   -   S-  nUR                  [        R                  S9U-  nUR                  [        R                  S9U-  nXB-
  nXS-
  nXB-   nXS-   n	[        R                  " XgX‰4S5      n
U
$ )NrN   r   rh   rO   r   rb   )r7   r   ro   rq   )r   ÚscaleÚw_halfÚh_halfÚx_cÚy_cÚ
boxes_exp0Ú
boxes_exp1Ú
boxes_exp2Ú
boxes_exp3Ú	boxes_exps              r&   Ú_onnx_expand_boxesrÎ   e  sç   € à’A�q�D‰k˜E¢! Q $™KÑ'¨3Ñ.€FØ’A�q�D‰k˜E¢! Q $™KÑ'¨3Ñ.€FØ’�A�‰;˜šq !˜t™Ñ$¨Ñ
+€CØ’�A�‰;˜šq !˜t™Ñ$¨Ñ
+€Cà�Y‰YœUŸ]™]ˆYÐ+¨eÑ3€FØ�Y‰YœUŸ]™]ˆYÐ+¨eÑ3€Fà‘€JØ‘€JØ‘€JØ‘€JÜ—’˜Z°ZÐLÈaÓP€IØÐr(   c                 ó”  • [         R                  " 5       (       a  [        X5      $ U S S 2S4   U S S 2S4   -
  S-  nU S S 2S4   U S S 2S4   -
  S-  nU S S 2S4   U S S 2S4   -   S-  nU S S 2S4   U S S 2S4   -   S-  nX!-  nX1-  n[        R                  " U 5      nXB-
  US S 2S4'   XB-   US S 2S4'   XS-
  US S 2S4'   XS-   US S 2S4'   U$ )NrN   r   rh   rO   r   )rž   rŸ   rÎ   r   Ú
zeros_like)r   rÄ   rÅ   rÆ   rÇ   rÈ   rÍ   s          r&   Úexpand_boxesrÑ   z  sø   € ä×Ò× Ñ Ü! %Ó/Ð/Ø’A�q�D‰k˜E¢! Q $™KÑ'¨3Ñ.€FØ’A�q�D‰k˜E¢! Q $™KÑ'¨3Ñ.€FØ’�A�‰;˜šq !˜t™Ñ$¨Ñ
+€CØ’�A�‰;˜šq !˜t™Ñ$¨Ñ
+€Cà
�O€FØ
�O€Fä× Ò  Ó'€IØ‘l€IŠa�ˆd�OØ‘l€IŠa�ˆd�OØ‘l€IŠa�ˆd�OØ‘l€IŠa�ˆd�OØÐr(   c                 óÜ   • [         R                  " U SU-  -   5      R                  [         R                  5      [         R                  " U 5      R                  [         R                  5      -  $ )NrN   )r   rn   r7   ro   )r:   Úpaddings     r&   Úexpand_masks_tracing_scalerÔ   Ž  sI   € ô �<Š<˜˜A ™K™Ó(×+Ñ+¬E¯M©MÓ:¼U¿\º\È!»_×=OÑ=OÔPU×P]ÑP]Ó=^Ñ^Ð^r(   c                 óà   • U R                   S   n[        R                  R                  5       (       a  [	        X!5      nO[        USU-  -   5      U-  n[        R                  " X4S-  5      nXC4$ )Nr   rN   r   )r   r   Ú_CÚ_get_tracing_staterÔ   r¤   r   Úpad)ÚmaskrÓ   r:   rÄ   Úpadded_masks        r&   Úexpand_masksrÛ   ”  s`   € à�
‰
�2‰€AÜ‡x�x×"Ñ"×$Ñ$Ü*¨1Ó6‰ä�a˜!˜g™+‘oÓ&¨Ñ*ˆÜ—%’%˜˜j¨1™nÓ-€KØÐÐr(   c                 ó  • Sn[        US   US   -
  U-   5      n[        US   US   -
  U-   5      n[        US5      n[        US5      nU R                  S5      n [        R                  " XU4SSS9n U S   S   n [
        R                  " X#4U R                  U R                  S	9n[        US   S5      n[        US   S-   U5      n	[        US   S5      n
[        US   S-   U5      nX
US   -
  X±S   -
  2X�S   -
  X‘S   -
  24   XzU2X‰24'   U$ )
Nr   rN   r   rO   )r   r   r   r   ÚbilinearFre   r�   )
rl   ÚmaxÚexpandr   rk   r   rŽ   rc   r,   rš   )rÙ   r¼   Úim_hÚim_wÚ	TO_REMOVEr€   ÚhÚim_maskÚx_0Úx_1Úy_0Úy_1s               r&   Úpaste_mask_in_imageré   Ÿ  s3  € à€IÜˆC�‰F�S˜‘V‰O˜iÑ'Ó(€AÜˆC�‰F�S˜‘V‰O˜iÑ'Ó(€AÜˆAˆq‹	€AÜˆAˆq‹	€Að �;‰;�~Ó&€Dô �=Š=˜¨ F°È5ÑQ€DØ�‰7�1‰:€Dä�kŠk˜4˜,¨d¯j©jÀÇÁÑM€GÜ
ˆc�!‰f�a‹.€CÜ
ˆc�!‰f�q‰j˜$Ó
€CÜ
ˆc�!‰f�a‹.€CÜ
ˆc�!‰f�q‰j˜$Ó
€Cà $¨C°©F¡l°sÀ¹V±|Ð%DÀsÐQRÉVÁ|ÐX[ÐbcÑ^dÑXdÐFeÐ%eÑ f€G�ˆG�S�WÐÑØ€Nr(   c                 ó®  • [         R                  " S[         R                  S9n[         R                  " S[         R                  S9nUS   US   -
  U-   nUS   US   -
  U-   n[         R                  " [         R
                  " Xd45      5      n[         R                  " [         R
                  " Xt45      5      nU R                  SSU R                  S5      U R                  S5      45      n [        R                  " U [        U5      [        U5      4SSS9n U S   S   n [         R                  " [         R
                  " US   R                  S5      U45      5      n[         R                  " [         R
                  " US   R                  S5      U-   UR                  S5      45      5      n	[         R                  " [         R
                  " US   R                  S5      U45      5      n
[         R                  " [         R
                  " US   R                  S5      U-   UR                  S5      45      5      nX
US   -
  X±S   -
  2X�S   -
  X‘S   -
  24   n[         R                  " X¬R                  S5      5      n[         R                  " X+-
  UR                  S5      5      n[         R
                  " XÜR                  [         R                  S9U4S5      SU2S S 24   n[         R                  " UR                  S5      U5      n[         R                  " UR                  S5      X9-
  5      n[         R
                  " UUU4S5      S S 2S U24   nU$ )	Nr   rb   rN   r   rO   rÝ   Fre   )r   rp   rj   rŽ   rÞ   r   rß   r   r   rk   rl   r�   rš   r7   ro   )rÙ   r¼   rà   rá   ÚoneÚzeror€   rã   rå   ræ   rç   rè   Úunpaded_im_maskÚzeros_y0Úzeros_y1Úconcat_0Úzeros_x0Úzeros_x1rä   s                      r&   Ú_onnx_paste_mask_in_imageró   ¸  s¬  € Ü
�*Š*�QœeŸk™kÑ
*€CÜ�;Š;�q¤§¡Ñ,€DàˆA‰��Q‘‰˜#Ñ€AØˆA‰��Q‘‰˜#Ñ€AÜ�	Š	”%—)’)˜Q˜HÓ%Ó&€AÜ�	Š	”%—)’)˜Q˜HÓ%Ó&€Að �;‰;˜˜1˜dŸi™i¨›l¨D¯I©I°a«LÐ9Ó:€Dô �=Š=˜¤S¨£V¬S°«VÐ$4¸:ÐUZÑ[€DØ�‰7�1‰:€Dä
�)Š)”E—I’I˜s 1™v×/Ñ/°Ó2°DÐ9Ó:Ó
;€CÜ
�)Š)”E—I’I˜s 1™v×/Ñ/°Ó2°SÑ8¸$¿.¹.ÈÓ:KÐLÓMÓ
N€CÜ
�)Š)”E—I’I˜s 1™v×/Ñ/°Ó2°DÐ9Ó:Ó
;€CÜ
�)Š)”E—I’I˜s 1™v×/Ñ/°Ó2°SÑ8¸$¿.¹.ÈÓ:KÐLÓMÓ
N€Cà # a¡&™L¨S°q±6©\Ð:¸SÀqÁ6¹\ÈcÐXYÑTZÉlÐ<[Ð[Ñ\€Oô
 �{Š{˜3× 4Ñ 4°QÓ 7Ó8€HÜ�{Š{˜4™: ×';Ñ';¸AÓ'>Ó?€HÜ�yŠy˜(×$6Ñ$6¼U¿]¹]Ð$6Ð$KÈXÐVÐXYÓZÐ[\Ð]aÐ[aÒcdÐ[dÑe€Hä�{Š{˜8Ÿ=™=¨Ó+¨SÓ1€HÜ�{Š{˜8Ÿ=™=¨Ó+¨T©ZÓ8€HÜ�iŠi˜ 8¨XÐ6¸Ó:º1¸e¸t¸e¸8ÑD€GØ€Nr(   c                 óî   • [         R                  " SX#5      n[        U R                  S5      5       H?  n[	        X   S   X   X#5      nUR                  S5      n[         R                  " XF45      nMA     U$ ©Nr   )r   rŽ   r�   r   ró   r�   r   )Úmasksr   rà   rá   Ú
res_appendrI   Úmask_ress          r&   Ú_onnx_paste_masks_in_image_looprù   Ü  sh   € ä—’˜Q Ó+€JÜ�5—:‘:˜a“=Ö!ˆÜ,¨U©X°a©[¸%¹(ÀDÓOˆØ×%Ñ% aÓ(ˆÜ—Y’Y 
Ð5Ó6Š
ñ "ð Ðr(   c           
      ó8  • [        XS9u  p[        X5      R                  [        R                  S9nUu  pV[
        R                  " 5       (       aV  [        X[        R                  " U[        R                  S9[        R                  " U[        R                  S95      S S 2S 4   $ [        X5       VVs/ s H  u  px[        US   X…U5      PM     n	nn[        U	5      S:”  a  [        R                  " U	SS9S S 2S 4   n
U
$ U R                  SSXV45      n
U
$ s  snnf )N)rÓ   rb   r   r   r   )rÛ   rÑ   r7   r   rj   rž   rŸ   rù   ri   r>   ré   r¡   rq   Ú	new_empty)rö   r   Ú	img_shaperÓ   rÄ   rà   rá   rG   ÚbÚresÚrets              r&   Úpaste_masks_in_imager   æ  s  € ä Ñ7�L€EÜ˜Ó&×)Ñ)´·±Ð)Ð<€EØ�J€Dä×Ò× Ñ Ü.Øœ%×-Ò-¨d¼%¿+¹+ÑFÌ×H[ÒH[Ð\`Ôhm×hsÑhsÑHtó
â
ˆTˆ'ñð 	ô ADÀEÔ@QÔ
RÒ@Q¹¸Ô˜q ™t Q¨dÖ3Ñ@Q€CÑ
RÜ
ˆ3ƒx�!ƒ|Ü�kŠk˜# 1Ñ%¢a¨ gÑ.ˆð €Jð �o‰o˜q ! TÐ0Ó1ˆØ€Jùó Ss   Â4Dc                   ó’  ^ • \ rS rSr\R
                  \R                  \R                  S.r      SU 4S jjr	S r
S rS rS rS rS	 rS
 rS r SS\\\R*                  4   S\\R*                     S\\\\4      S\\\\\R*                  4         S\\\\\R*                  4      \\\R*                  4   4   4
S jjrSrU =r$ )ÚRoIHeadsiø  )Ú	box_coderÚproposal_matcherÚfg_bg_samplerc                 óŠ  >• [         TU ]  5         [        R                  U l        [
        R                  " XESS9U l        [
        R                  " Xg5      U l	        Uc  Sn[
        R                  " U5      U l        Xl        X l        X0l        X�l        X l        X°l        XÀl        XÐl        Xàl        Xðl        UU l        UU l        g )NF)Úallow_low_quality_matches)ç      $@r  ç      @r	  )ÚsuperÚ__init__Úbox_opsÚbox_iouÚbox_similarityÚ	det_utilsÚMatcherr  ÚBalancedPositiveNegativeSamplerr  ÚBoxCoderr  Úbox_roi_poolÚbox_headÚbox_predictorÚscore_threshÚ
nms_threshÚdetections_per_imgÚmask_roi_poolÚ	mask_headÚmask_predictorÚkeypoint_roi_poolÚkeypoint_headÚkeypoint_predictor)Úselfr  r  r  Úfg_iou_threshÚbg_iou_threshÚbatch_size_per_imageÚpositive_fractionÚbbox_reg_weightsr  r  r  r  r  r  r  r  r  Ú	__class__s                     €r&   r  ÚRoIHeads.__init__ÿ  s®   ø€ ô. 	‰ÑÔä%Ÿo™oˆÔä )× 1Ò 1°-ÐjoÑ pˆÔä&×FÒFÐG[ÓoˆÔàÑ#Ø5ÐÜ"×+Ò+Ð,<Ó=ˆŒà(ÔØ ŒØ*Ôà(ÔØ$ŒØ"4Ôà*ÔØ"ŒØ,Ôà!2ÔØ*ˆÔØ"4ˆÕr(   c                 óX   • U R                   c  gU R                  c  gU R                  c  gg©NFT)r  r  r  ©r  s    r&   Úhas_maskÚRoIHeads.has_mask2  s0   € Ø×ÑÑ%ØØ�>‰>Ñ!ØØ×ÑÑ&ØØr(   c                 óX   • U R                   c  gU R                  c  gU R                  c  ggr(  )r  r  r  r)  s    r&   Úhas_keypointÚRoIHeads.has_keypoint;  s2   € Ø×!Ñ!Ñ)ØØ×ÑÑ%ØØ×"Ñ"Ñ*ØØr(   c                 ó¬  • / n/ n[        XU5       GH=  u  pgnUR                  5       S:X  aq  UR                  n	[        R                  " UR
                  S   4[        R                  U	S9n
[        R                  " UR
                  S   4[        R                  U	S9nO�[        R                  " Xv5      nU R                  U5      nUR                  SS9n
XŠ   nUR                  [        R                  S9nXÐR                  R                  :H  nSX¾'   XÐR                  R                  :H  nSX¿'   UR                  U
5        UR                  U5        GM@     XE4$ )Nr   r�   r™   rb   r   )r>   r   r,   r   rŽ   r   rj   r  r  r  rœ   r7   ÚBELOW_LOW_THRESHOLDÚBETWEEN_THRESHOLDSr¨   )r  rA   Úgt_boxesrB   r9   r   Úproposals_in_imageÚgt_boxes_in_imageÚgt_labels_in_imager,   Úclamped_matched_idxs_in_imageÚlabels_in_imageÚmatch_quality_matrixÚmatched_idxs_in_imageÚbg_indsÚignore_indss                   r&   Úassign_targets_to_proposalsÚ$RoIHeads.assign_targets_to_proposalsD  sP  € àˆØˆÜILÈYÐbk×IlÑEÐÐ3Eà ×&Ñ&Ó(¨AÓ-à+×2Ñ2�Ü05·²Ø'×-Ñ-¨aÑ0Ð2¼%¿+¹+Èfñ1Ð-ô #(§+¢+Ð/A×/GÑ/GÈÑ/JÐ.LÔTY×T_ÑT_ÐhnÑ"o‘ô (/§¢Ð7HÓ']Ð$Ø(,×(=Ñ(=Ð>RÓ(SÐ%à0E×0KÑ0KÐPQÐ0KÐ0RÐ-à"4Ñ"S�Ø"1×"4Ñ"4¼5¿;¹;Ð"4Ð"G�ð 0×3HÑ3H×3\Ñ3\Ñ\�Ø+,�Ñ(ð 4×7LÑ7L×7_Ñ7_Ñ_�Ø/1�Ñ,à×ÑÐ =Ô>Ø�M‰M˜/×*ñ9 Jmð: Ð#Ð#r(   c                 óÈ   • U R                  U5      u  p#/ n[        [        X#5      5       H4  u  nu  pg[        R                  " Xg-  5      S   nUR                  U5        M6     U$ rõ   )r  Ú	enumerater>   r   r   r¨   )	r  r   Úsampled_pos_indsÚsampled_neg_indsÚsampled_indsÚimg_idxÚpos_inds_imgÚneg_inds_imgÚimg_sampled_indss	            r&   Ú	subsampleÚRoIHeads.subsampleg  sg   € à-1×-?Ñ-?ÀÓ-GÑ*ÐØˆÜ5>¼sÐCSÓ?fÖ5gÑ1ˆGÑ1�lÜ$Ÿ{š{¨<Ñ+FÓGÈÑJÐØ×ÑÐ 0Ö1ñ 6hð Ðr(   c                 óz   • [        X5       VVs/ s H  u  p4[        R                  " X445      PM     nnnU$ s  snnf ©N)r>   r   r   )r  rA   r2  ÚproposalÚgt_boxs        r&   Úadd_gt_proposalsÚRoIHeads.add_gt_proposalsp  s8   € äKNÈyÔKcÔdÒKcÑ7G°x”U—Y’Y Ð1Ö2ÑKcˆ	ÑdàÐùó es   �#7c                 ó„  • Uc  [        S5      e[        U Vs/ s H  nSU;   PM
     sn5      (       d  [        S5      e[        U Vs/ s H  nSU;   PM
     sn5      (       d  [        S5      eU R                  5       (       a0  [        U Vs/ s H  nSU;   PM
     sn5      (       d  [        S5      eg g s  snf s  snf s  snf )Nútargets should not be Noner   z0Every element of targets should have a boxes keyr   z1Every element of targets should have a labels keyrö   z0Every element of targets should have a masks key)r§   Úallr*  )r  ÚtargetsÚts      r&   Úcheck_targetsÚRoIHeads.check_targetsv  s³   € à‰?ÜÐ9Ó:Ð:Ü©'Ó2ª' Q�G˜q”L©'Ñ2×3Ñ3ÜÐOÓPÐPÜ©7Ó3ª7 a�H ”M©7Ñ3×4Ñ4ÜÐPÓQÐQØ�=‰=�?‰?Ü©gÓ6ªg¨˜ 1œ©gÑ6×7Ñ7Ü Ð!SÓTÐTð 8ð ùò	 3ùâ3ùò 7s   ˜B3ÁB8ÂB=c                 ó¬  • U R                  U5        Uc  [        S5      eUS   R                  nUS   R                  nU Vs/ s H  oUS   R	                  U5      PM     nnU Vs/ s H  oUS   PM	     nnU R                  X5      nU R                  XU5      u  p‰U R                  U	5      n
/ n[        U5      n[        U5       He  nX­   nX   U   X'   X�   U   X�'   X�   U   X�'   Xm   nUR                  5       S:X  a  [        R                  " SX4S9nUR                  XøU      5        Mg     U R                  R                  X±5      nXU	U4$ s  snf s  snf )NrP  r   r   r   )r   r   r�   )rT  r§   rc   r,   r7   rM  r<  rG  r¡   r�   r   r   rŽ   r¨   r  Úencode)r  rA   rR  rc   r,   rS  r2  rB   r9   r   rB  Úmatched_gt_boxesÚ
num_imagesÚimg_idrF  r4  r   s                    r&   Úselect_training_samplesÚ RoIHeads.select_training_samples‚  sv  € ð 	×Ñ˜7Ô#Ø‰?ÜÐ9Ó:Ð:Ø˜!‘×"Ñ"ˆØ˜1‘×$Ñ$ˆá29Ó:²'¨Q�g‘J—M‘M %Ö(±'ˆÐ:Ù*1Ó2ª' Q�x”[©'ˆ	Ð2ð ×)Ñ)¨)Ó>ˆ	ð  $×?Ñ?À	ÐU^Ó_Ñˆà—~‘~ fÓ-ˆØÐÜ˜“^ˆ
Ü˜JÖ'ˆFØ+Ñ3ÐØ )Ñ 1Ð2BÑ CˆIÑØ#™^Ð,<Ñ=ˆF‰NØ#/Ñ#7Ð8HÑ#IˆLÑ à (Ñ 0ÐØ ×&Ñ&Ó(¨AÓ-Ü$)§K¢K°¸eÑ$SÐ!Ø×#Ñ#Ð$5À6Ñ6JÑ$KÖLñ (ð "Ÿ^™^×2Ñ2Ð3CÓOÐØ¨Ð0BÐBÐBùò1 ;ùÚ2s   ÁEÁ%Ec                 óL  • UR                   nUR                  S   nU Vs/ s H  owR                  S   PM     nnU R                  R                  X#5      n	[        R
                  " US5      n
U	R                  US5      nU
R                  US5      n/ n/ n/ n[        X¼U5       GHv  u  nnn[        R                  " UU5      n[        R                  " XeS9nUR                  SS5      R                  U5      nUS S 2SS 24   nUS S 2SS 24   nUS S 2SS 24   nUR                  SS5      nUR                  S5      nUR                  S5      n[        R                  " UU R                   :„  5      S   nUU   UU   UU   nnn[        R"                  " USS9nUU   UU   UU   nnn[        R$                  " UUUU R&                  5      nUS U R(                   nUU   UU   UU   nnnUR+                  U5        UR+                  U5        UR+                  U5        GMy     XÞU4$ s  snf )Nr   r   r+   r   r   g{®Gáz„?)Úmin_size)r,   r   r  Údecoder   Úsoftmaxr/   r>   r  Úclip_boxes_to_imager   r.   rs   Ú	expand_asr   r   r  Úremove_small_boxesÚbatched_nmsr  r  r¨   )r  r	   r
   rA   Úimage_shapesr,   r$   Úboxes_in_imager3   Ú
pred_boxesÚpred_scoresÚpred_boxes_listÚpred_scores_listÚ	all_boxesÚ
all_scoresÚ
all_labelsr   rÁ   Úimage_shaper   ÚindsÚkeeps                         r&   Úpostprocess_detectionsÚRoIHeads.postprocess_detections¨  s6  € ð ×$Ñ$ˆØ"×(Ñ(¨Ñ,ˆáIRÓSÊ°~×/Ñ/°Ô2ÉˆÐSØ—^‘^×*Ñ*¨>ÓEˆ
ä—i’i ¨bÓ1ˆà$×*Ñ*¨?¸AÓ>ˆØ&×,Ñ,¨_¸aÓ@Ðàˆ	Øˆ
Øˆ
Ü*-¨oÐQ]×*^Ñ&ˆE�6˜;Ü×/Ò/°°{ÓCˆEô —\’\ +Ñ=ˆFØ—[‘[  BÓ'×1Ñ1°&Ó9ˆFð š!˜Q™R˜%‘LˆEØšA˜q™r˜E‘]ˆFØšA˜q™r˜E‘]ˆFð —M‘M " aÓ(ˆEØ—^‘^ BÓ'ˆFØ—^‘^ BÓ'ˆFô —;’;˜v¨×(9Ñ(9Ñ9Ó:¸1Ñ=ˆDØ$)¨$¡K°¸±¸vÀd¹|˜6�6ˆEô ×-Ò-¨e¸dÑCˆDØ$)¨$¡K°¸±¸vÀd¹|˜6�6ˆEô ×&Ò& u¨f°f¸d¿o¹oÓNˆDàÐ1˜$×1Ñ1Ð2ˆDØ$)¨$¡K°¸±¸vÀd¹|˜6�6ˆEà×Ñ˜UÔ#Ø×Ñ˜fÔ%Ø×Ñ˜f×%ñC +_ðF  jÐ0Ð0ùò] Ts    H!ÚfeaturesrA   re  rR  r   c                 óÜ
  • Ubõ  U Hï  n[         R                  [         R                  [         R                  4nUS   R                  U;  a  [        SUS   R                   35      eUS   R                  [         R                  :X  d  [        SUS   R                   35      eU R                  5       (       d  M³  US   R                  [         R                  :X  a  MÖ  [        SUS   R                   35      e   U R                  (       a  U R                  X$5      u  p'p‰OSnSn	SnU R                  XU5      n
U R                  U
5      n
U R                  U
5      u  p¼/ n0 nU R                  (       a1  Uc  [        S5      eU	c  [        S	5      e[        X¼X‰5      u  nnUUS
.nOQU R!                  X¼X#5      u  nnn[#        U5      n[%        U5       H!  nUR'                  UU   UU   UU   S.5        M#     U R)                  5       (       Ga£  U Vs/ s H  nUS   PM
     nnU R                  (       a}  Uc  [        S5      e[#        U5      n/ n/ n[%        U5       HP  n[         R*                  " UU   S:„  5      S   nUR'                  UU   U   5        UR'                  UU   U   5        MR     OSnU R,                  b6  U R-                  UUU5      nU R/                  U5      nU R1                  U5      nO[3        S5      e0 nU R                  (       aP  Ub  Ub  Uc  [        S5      eU Vs/ s H  oUS   PM	     nnU Vs/ s H  oUS   PM	     nn[5        UUUUU5      nSU0nO<U V s/ s H  n U S   PM
     nn [7        UU5      n![9        U!U5       H  u  n"n U"U S'   M     UR;                  U5        U R<                  Gb”  U R>                  Gb†  U R@                  Gbx  U Vs/ s H  nUS   PM
     n#nU R                  (       a}  [#        U5      n/ n#/ nUc  [        S5      e[%        U5       HP  n[         R*                  " UU   S:„  5      S   nU#R'                  UU   U   5        UR'                  UU   U   5        MR     OSnU R=                  UU#U5      n$U R?                  U$5      n$U RA                  U$5      n%0 n&U R                  (       a8  Ub  Uc  [        S5      eU Vs/ s H  oUS   PM	     n'n[C        U%U#U'U5      n(SU(0n&OBU%b  U#c  [        S5      e[E        U%U#5      u  n)n*[9        U)U*U5       H  u  n+n,n U+U S'   U,U S'   M     UR;                  U&5        XÞ4$ s  snf s  snf s  snf s  sn f s  snf s  snf )z„
Args:
    features (List[Tensor])
    proposals (List[Tensor[N, 4]])
    image_shapes (List[Tuple[H, W]])
    targets (List[Dict])
Nr   z-target boxes must of float type, instead got r   z.target labels must of int64 type, instead got rR   z1target keypoints must of float type, instead got zlabels cannot be Nonez!regression_targets cannot be None)Úloss_classifierÚloss_box_reg)r   r   rÁ   z/if in training, matched_idxs should not be Noner   z%Expected mask_roi_pool to be not NonezCtargets, pos_matched_idxs, mask_logits cannot be None when trainingrö   Ú	loss_maskz0if in trainning, matched_idxs should not be NonezJboth targets and pos_matched_idxs should not be None when in training modeÚloss_keypointzXboth keypoint_logits and keypoint_proposals should not be None when not in training modeÚkeypoints_scores)#r   r¤   ÚdoubleÚhalfrc   Ú	TypeErrorrj   r-  ro   Útrainingr[  r  r  r  r§   r'   rq  r¡   r�   r¨   r*  r   r  r  r  Ú	ExceptionrL   r5   r>   Úupdater  r  r  r¸   rÂ   )-r  rs  rA   re  rR  rS  Úfloating_point_typesr9   r   r   Úbox_featuresr	   r
   ÚresultÚlossesru  rv  r   rÁ   rY  rI   rH   Úmask_proposalsÚpos_matched_idxsrZ  r�   Úmask_featuresr@   rw  r8   rB   Úrcnn_loss_maskÚrÚmasks_probsr0   Úkeypoint_proposalsÚkeypoint_featuresrª   rx  r«   Úrcnn_loss_keypointÚkeypoints_probsr»   Úkeypoint_probÚkpss-                                                r&   ÚforwardÚRoIHeads.forwardã  s¨  € ð ÑÛ�ä(-¯©´U·\±\Ä5Ç:Á:Ð'NÐ$Ø�W‘:×#Ñ#Ð+?Ó?Ü#Ð&SÐTUÐV]ÑT^×TdÑTdÐSeÐ$fÓgÐgØ˜‘{×(Ñ(¬E¯K©KÓ7Ü#Ð&TÐUVÐW_ÑU`×UfÑUfÐTgÐ$hÓiÐiØ×$Ñ$×&Ó&Ø˜[™>×/Ñ/´5·=±=Õ@Ü'Ð*[Ð\]Ð^iÑ\j×\pÑ\pÐ[qÐ(rÓsÐsñ ð �=�=ØBF×B^ÑB^Ð_hÓBrÑ?ˆI VÐ-?àˆFØ!%ÐØˆLà×(Ñ(¨¸lÓKˆØ—}‘} \Ó2ˆØ'+×'9Ñ'9¸,Ó'GÑ$ˆà02ˆØˆØ�=�=Ø‰~Ü Ð!8Ó9Ð9Ø!Ñ)Ü Ð!DÓEÐEÜ,9¸,ÐX^Ó,sÑ)ˆO˜\Ø)8È,ÑW‰Fà$(×$?Ñ$?ÀÐ^gÓ$vÑ!ˆE�6˜6Ü˜U›ˆJÜ˜:Ö&�Ø—‘à!& q¡Ø"(¨¡)Ø"(¨¡)ñöñ 'ð �=‰=�?Š?Ù28Ó9²&¨Q˜a œj±&ˆNÐ9Ø�}�}ØÑ'Ü$Ð%VÓWÐWô ! ›^�
Ø!#�Ø#%Ð Ü# JÖ/�FÜŸ+š+ f¨V¡n°qÑ&8Ó9¸!Ñ<�CØ"×)Ñ)¨)°FÑ*;¸CÑ*@ÔAØ$×+Ñ+¨L¸Ñ,@ÀÑ,EÖFò 0ð
 $(Ð à×!Ñ!Ñ-Ø $× 2Ñ 2°8¸^È\Ó Z�Ø $§¡¨}Ó =�Ø"×1Ñ1°-Ó@‘äÐ GÓHÐHàˆIØ�}�}Ø‘?Ð&6Ñ&>À+ÑBUÜ$Ð%jÓkÐká07Ó8²¨1˜gœJ±�Ð8Ù29Ó:²'¨Q˜xœ[±'�	Ð:Ü!.¨{¸NÈHÐV_ÐaqÓ!r�Ø(¨.Ð9‘	á/5Ó6ªv¨!˜!˜Hœ+©v�Ð6Ü0°¸fÓE�Ü$'¨°VÖ$<‘L�I˜qØ!*�A�g“Jñ %=ð �M‰M˜)Ô$ð
 ×"Ñ"Ò.Ø×"Ñ"Ò.Ø×'Ñ'Ò3á6<Ó!=²f° ! G¤*±fÐÐ!=Ø�}�}ä  ›^�
Ø%'Ð"Ø#%Ð ØÑ'Ü$Ð%WÓXÐXä# JÖ/�FÜŸ+š+ f¨V¡n°qÑ&8Ó9¸!Ñ<�CØ&×-Ñ-¨i¸Ñ.?ÀÑ.DÔEØ$×+Ñ+¨L¸Ñ,@ÀÑ,EÖFò 0ð
 $(Ð à $× 6Ñ 6°xÐASÐUaÓ bÐØ $× 2Ñ 2Ð3DÓ EÐØ"×5Ñ5Ð6GÓHˆOàˆMØ�}�}Ø‘?Ð&6Ñ&>Ü$Ð%qÓrÐrá8?Ó@º°1 +¤¹�Ð@Ü%6Ø#Ð%7¸ÐGWó&Ð"ð "1Ð2DÐ E‘à"Ñ*Ð.@Ñ.HÜ$Øróð ô .DÀOÐUgÓ-hÑ*� Ü-0°À)ÈVÖ-TÑ)�M 3¨Ø%2�A�k‘NØ,/�AÐ(Ó)ñ .Uð �M‰M˜-Ô(àˆ~Ðùòs :ùò8 9ùÚ:ùò 7ùò ">ùò2  As$   ÈUÌ&UÌ:UÍ"UÏU$ÓU))r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )NNNNNNrJ  )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r  r  r  r  Ú__annotations__r  r*  r-  r<  rG  rM  rT  r[  rq  ÚdictÚstrr   ÚTensorÚlistÚtuplerl   r   r�  Ú__static_attributes__Ú__classcell__)r%  s   @r&   r  r  ø  s  ø† à×'Ñ'Ø%×-Ñ-Ø"×BÑBñ€Oð, ØØØØØ÷+15òfòò!$òFòò
Uò$CòL91ð@ <@ñTà�s˜EŸL™LÐ(Ñ)ðTð ˜Ÿ™Ñ%ðTð ˜5  c ™?Ñ+ð	Tð
 ˜$˜t C¨¯©Ð$5Ñ6Ñ7Ñ8ðTð 
ˆt�D˜˜eŸl™lÐ*Ñ+Ñ,¨d°3¸¿¹Ð3DÑ.EÐEÑ	F÷Tó Tr(   r  )r   ))Útypingr   r   Útorch.nn.functionalr   Ú
functionalr   rž   Útorchvision.opsr   r  r   Ú r   r  r™  rš  r›  r'   r5   r<   rL   r`   r‹   ÚjitÚ_script_if_tracingr—   r¥   r¸   rÂ   rÎ   rÑ   ÚunusedrÔ   rÛ   ré   ró   rù   r   ÚModuler  © r(   r&   Ú<module>r¨     sb  ðÝ ã ß Ð Û Ý ß 7å !ð))Ø—,‘,ð))à—L‘Lð))ð �—‘Ñð))ð ˜UŸ\™\Ñ*ð	))ð
 ˆ5�<‰<˜Ÿ™Ð%Ñ&ô))ðX˜%Ÿ,™,ð °°U·\±\Ñ0Bð ÀtÈEÏLÉLÑGYô ò:8òò@!òH0$ðf ‡�×Ññ ó ð ò"F1òRò>ò ò*ð( ‡�×Ññ_ó ð_ò
òò2!ðH ‡�×Ññó ðôô$ˆr�y‰yõ r(   