§
    ù²ÅjŠ‡  ã                   ól  — d dl mZmZmZmZ d dlZd dlmc mZ	 d dl
Z
d dlmZmZ d dlmZmZ ddlmZ d„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zej        j        d„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ Z ej        j!        d„ ¦   «         Z"d„ Z#d„ Z$d„ Z%ej        j        d„ ¦   «         Z&dd„Z' G d„ dej(        ¦  «        Z)dS )é    )ÚDictÚListÚOptionalÚTupleN)ÚnnÚTensor)ÚboxesÚ	roi_aligné   )Ú_utilsc                 óÀ  — t          j        |d¬¦  «        }t          j        |d¬¦  «        }t          j        | |¦  «        }t          j        |dk    ¦  «        d         }||         }| j        \  }}|                     ||                     d¦  «        dz  d¦  «        }t          j        |||f         ||         dd¬¦  «        }	|	| 	                    ¦   «         z  }	||	fS )a  
    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)
Úclass_logitsÚbox_regressionÚlabelsÚregression_targetsÚclassification_lossÚsampled_pos_inds_subsetÚ
labels_posÚNÚnum_classesÚbox_losss
             úWC:\Projects\Historical\venv\Lib\site-packages\torchvision/models/detection/roi_heads.pyÚfastrcnn_lossr*      sï   € õ  ŒY�v 1Ð%Ñ%Ô%€FÝœÐ#5¸1Ð=Ñ=Ô=Ðåœ/¨,¸Ñ?Ô?Ðõ
 $œk¨&°1ª*Ñ5Ô5°aÔ8ÐØÐ/Ô0€JØ!Ô'�N€A€{Ø#×+Ò+¨A¨~×/BÒ/BÀ2Ñ/FÔ/FÈ!Ñ/KÈQÑOÔO€NåÔØÐ.°
Ð:Ô;ØÐ2Ô3ØØð	ñ ô €Hð ˜&Ÿ,š,™.œ.Ñ(€Hà Ð(Ð(ó    c                 ó  — |                       ¦   «         }| j        d         }d„ |D ¦   «         }t          j        |¦  «        }t          j        ||j        ¬¦  «        }|||f         dd…df         }|                     |d¬¦  «        }|S )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 ech image

    Returns:
        results (list[BoxList]): one BoxList for each image, containing
            the extra field mask
    r   c                 ó(   — g | ]}|j         d          ‘ŒS ©r   ©r   )Ú.0Úlabels     r)   ú
<listcomp>z&maskrcnn_inference.<locals>.<listcomp>I   s   € Ð:Ð:Ð:¨%�u”{ 1”~Ð:Ð:Ð:r+   ©ÚdeviceNr   )Úsigmoidr   r   r   Úaranger4   Úsplit)Úxr!   Ú	mask_probÚ	num_masksÚboxes_per_imageÚindexs         r)   Úmaskrcnn_inferencer=   4   sŒ   € ð" —	’	‘”€Ið ”˜”
€IØ:Ð:°6Ð:Ñ:Ô:€OÝŒY�vÑÔ€FÝŒL˜¨6¬=Ð9Ñ9Ô9€EØ˜% ˜-Ô(¨¨¨¨D¨Ô1€IØ—’ °Q�Ñ7Ô7€IàÐr+   c                 óê   — |                      |¦  «        }t          j        |dd…df         |gd¬¦  «        }| dd…df                               |¦  «        } t          | |||fd¦  «        dd…df         S )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_boxesrD   R   s€   € ð  —?’? 5Ñ)Ô)€LÝŒ9�l 1 1 1 d 7Ô+¨UÐ3¸Ð;Ñ;Ô;€DØ˜˜˜˜4˜Ô ×#Ò# DÑ)Ô)€HÝ�X˜t a¨ V¨SÑ1Ô1°!°!°!°Q°$Ô7Ð7r+   c                 óÈ  ‡— | j         d         Šd„ t          ||¦  «        D ¦   «         }ˆfd„t          |||¦  «        D ¦   «         }t          j        |d¬¦  «        }t          j        |d¬¦  «        }|                     ¦   «         dk    r|                      ¦   «         dz  S t          j        | t          j        |j         d         |j	        ¬¦  «        |f         |¦  «        }|S )z¹
    Args:
        proposals (list[BoxList])
        mask_logits (Tensor)
        targets (list[BoxList])

    Return:
        mask_loss (Tensor): scalar tensor containing the loss
    r   c                 ó$   — g | ]\  }}||         ‘ŒS © rG   )r0   Úgt_labelÚidxss      r)   r2   z!maskrcnn_loss.<locals>.<listcomp>n   s    € ÐUÐUÐU¡ ¨4ˆh�tŒnÐUÐUÐUr+   c                 ó<   •— g | ]\  }}}t          |||‰¦  «        ‘ŒS rG   )rD   )r0   ÚmÚpÚiÚdiscretization_sizes       €r)   r2   z!maskrcnn_loss.<locals>.<listcomp>o   s<   ø€ ð ð ð ÙAHÀÀAÀqÕ˜q ! QÐ(;Ñ<Ô<ðð ð r+   r   r   r3   )
r   Úzipr   r   r   r   r   Ú binary_cross_entropy_with_logitsr6   r4   )	Úmask_logitsÚ	proposalsr@   Ú	gt_labelsÚmask_matched_idxsr!   Úmask_targetsÚ	mask_lossrN   s	           @r)   Úmaskrcnn_lossrW   a   s  ø€ ð &Ô+¨BÔ/ÐØUÐUµ3°yÐBSÑ3TÔ3TÐUÑUÔU€Fðð ð ð ÝLOÐPXÐZcÐevÑLwÔLwðñ ô €Lõ ŒY�v 1Ð%Ñ%Ô%€FÝ”9˜\¨qÐ1Ñ1Ô1€Lð ×ÒÑÔ˜qÒ Ð Ø�ŠÑ Ô  1Ñ$Ð$åÔ2Ø•E”L ¤¨a¤¸¼ÐGÑGÔGÈÐOÔPÐR^ñô €Ið Ðr+   c                 ó   — |d d …df         }|d d …df         }||d d …df         |d d …df         z
  z  }||d d …df         |d d …df         z
  z  }|d d …d f         }|d d …d f         }|d d …d f         }|d d …d f         }| d         }| d         }||d d …df         d d …d f         k    }	||d d …df         d d …d f         k    }
||z
  |z  }|                      ¦   «                              ¦   «         }||z
  |z  }|                      ¦   «                              ¦   «         }|dz
  ||	<   |dz
  ||
<   |dk    |dk    z  ||k     z  ||k     z  }| d         dk    }||z                       ¦   «         }||z  |z   }||z  }||fS )Nr   r   é   é   ).r   ).r   ).rY   )ÚfloorÚlong)Ú	keypointsrC   Úheatmap_sizeÚoffset_xÚoffset_yÚscale_xÚscale_yr8   ÚyÚx_boundary_indsÚy_boundary_indsÚ	valid_locÚvisÚvalidÚlin_indÚheatmapss                   r)   Úkeypoints_to_heatmaprk   �   sè  € à�A�A�A�q�DŒz€HØ�A�A�A�q�DŒz€HØ˜d 1 1 1 a 4œj¨4°°°°1°¬:Ñ5Ñ6€GØ˜d 1 1 1 a 4œj¨4°°°°1°¬:Ñ5Ñ6€Gà˜˜˜˜4˜Ô €HØ˜˜˜˜4˜Ô €HØ�a�a�a˜�gÔ€GØ�a�a�a˜�gÔ€Gà�&Ô€AØ�&Ô€Aà˜4    1 œ: a a a¨ gÔ.Ò.€OØ˜4    1 œ: a a a¨ gÔ.Ò.€Oà	
ˆX‰˜Ñ €AØ	�Š‰	Œ	�ŠÑÔ€AØ	
ˆX‰˜Ñ €AØ	�Š‰	Œ	�ŠÑÔ€Aà%¨Ñ)€A€oÑØ%¨Ñ)€A€oÑà�a’˜A šFÑ# q¨<Ò'7Ñ8¸AÀÒ<LÑM€IØ
�FÔ
˜aÒ
€CØ˜‰_×"Ò"Ñ$Ô$€Eà�,Ñ Ñ"€GØ˜‰€Hà�Uˆ?Ðr+   c                 ó  — t          j        |                      d¦  «        t           j        ¬¦  «        }||z  }	||z  }
t	          j        |d d …d f         t          |¦  «        t          |¦  «        fdd¬¦  «        d d …df         }t          j        |                     d¦  «        t           j        ¬¦  «        }|                     |d¦  «                             d¬	¦  «        }||z  }||z
  |z  }t          j	        d
t           j
        ¬¦  «        |                     t           j
        ¬¦  «        z   |	                     t           j
        ¬¦  «        z  }t          j	        d
t           j
        ¬¦  «        |                     t           j
        ¬¦  «        z   |
                     t           j
        ¬¦  «        z  }||                     t           j
        ¬¦  «        z   }||                     t           j
        ¬¦  «        z   }t          j        |j        t           j
        ¬¦  «        }t          j        |                     t           j
        ¬¦  «        |                     t           j
        ¬¦  «        |                     t           j
        ¬¦  «        gd¦  «        }||z  |z   dz   }t          j        |¦  «        }|                     t           j        ¬¦  «        |z  }|                     d|                     t           j        ¬¦  «        ¦  «                             d|                     t           j        ¬¦  «        ¦  «                             d¦  «                             d|                     t           j        ¬¦  «        ¦  «        }||fS )Nr   ©ÚdtypeÚbicubicF©r   ÚmodeÚalign_cornersr   rY   r   r   ç      à?)r   Úscalar_tensorr   Úint64r   ÚinterpolateÚintr   ÚargmaxÚtensorÚfloat32r?   Úonesr   Ústackr6   Ú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_intr8   rc   Ú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ÐHÑHÔH€Mà -Ñ/ÐØ! NÑ2ÐåŒmØˆqˆqˆq�$ˆwŒ�s >Ñ2Ô2µC¸Ñ4FÔ4FÐGÈiÐglðñ ô à€a€aˆ€dô€Gõ 	Ô˜GŸLšL¨™OœOµ5´;Ð?Ñ?Ô?€AØ
�/Š/˜-¨Ñ
,Ô
,×
3Ò
3¸Ð
3Ñ
:Ô
:€Cà�!‰G€EØ�5‰[˜QÑ€Eå	Œ�c¥¤Ð	/Ñ	/Ô	/°%·(²(ÅÄ°(Ñ2OÔ2OÑ	OÐSc×SfÒSfÝŒmð Tgñ Tô Tñ 	€Aõ 
Œ�c¥¤Ð	/Ñ	/Ô	/°%·(²(ÅÄ°(Ñ2OÔ2OÑ	OÐSd×SgÒSgÝŒmð Thñ Tô Tñ 	€Að �z—}’}­5¬=�}Ñ9Ô9Ñ9€LØ�z—}’}­5¬=�}Ñ9Ô9Ñ9€LÝ”:˜lÔ0½¼ÐFÑFÔF€LÝ”à�OŠO¥%¤-ˆOÑ0Ô0Ø�OŠO¥%¤-ˆOÑ0Ô0Ø�OŠO¥%¤-ˆOÑ0Ô0ð	
ð
 	
ñô €Jð ˜=Ñ(¨=Ñ8¸1Ñ<€DÝ
Œ,�}Ñ
%Ô
%€CØ
�&Š&•u”{ˆ&Ñ
#Ô
# dÑ
*€Cà×Ò˜Q §¢­u¬{ Ñ ;Ô ;Ñ<Ô<ß	Š�a˜Ÿš­¬˜Ñ4Ô4Ñ	5Ô	5ß	Šˆb‰Œß	Š�a˜Ÿš¥e¤k˜Ñ2Ô2Ñ	3Ô	3ð	 ð �|Ð#Ð#r+   c	                 óf  — t          j        ddt          |¦  «        ft           j        | j        ¬¦  «        }	t          j        dt          |¦  «        ft           j        | j        ¬¦  «        }
t          t          |                     d¦  «        ¦  «        ¦  «        D �]}t          | | |         ||         ||         ||         ||         ||         ||         ¦  «        \  }}t          j        |	 	                    t           j        ¬¦  «        | 
                    d¦  «         	                    t           j        ¬¦  «        fd¦  «        }	t          j        |
 	                    t           j        ¬¦  «        | 	                    t           j        ¬¦  «         
                    d¦  «        fd¦  «        }
�Œ|	|
fS )Nr   rZ   ©rn   r4   rm   )r   Úzerosrw   rz   r4   Úranger   r–   r   r?   Ú	unsqueeze)r   rC   Úwidths_ceilÚheights_ceilÚwidthsÚheightsr_   r`   r‡   Úxy_predsÚ
end_scoresrM   r’   r•   s                 r)   Ú _onnx_heatmaps_to_keypoints_loopr¢   Ø   so  € õ Œ{˜A˜q¥# mÑ"4Ô"4Ð5½U¼]ÐSWÔS^Ð_Ñ_Ô_€HÝ”˜a¥ ]Ñ!3Ô!3Ð4½E¼MÐRVÔR]Ð^Ñ^Ô^€Jå•3�t—y’y ‘|”|Ñ$Ô$Ñ%Ô%ð 
ñ 
ˆÝ#>Ø�$�q”'˜; qœ>¨<¸¬?¸FÀ1¼IÀwÈqÄzÐS[Ð\]ÔS^Ð`hÐijÔ`kñ$
ô $
Ñ ˆ
�Lõ ”9˜hŸkškµ´˜kÑ>Ô>À
×@TÒ@TÐUVÑ@WÔ@W×@ZÒ@ZÕafÔanÐ@ZÑ@oÔ@oÐpÐrsÑtÔtˆÝ”YØ�]Š]¥¤ˆ]Ñ/Ô/°·²ÅuÄ}°Ñ1UÔ1U×1_Ò1_Ð`aÑ1bÔ1bÐcÐefñ
ô 
ˆ
‰
ð �ZÐÐr+   c                 ód  — |dd…df         }|dd…df         }|dd…df         |dd…df         z
  }|dd…df         |dd…df         z
  }|                      d¬¦  «        }|                      d¬¦  «        }|                     ¦   «         }|                     ¦   «         }| j        d         }t          j        ¦   «         rQt          | |||||||t          j        |t          j        ¬¦  «        ¦	  «	        \  }	}
|	 	                    ddd¦  «        |
fS t          j
        t          |¦  «        d|ft          j        | j        ¬¦  «        }	t          j
        t          |¦  «        |ft          j        | j        ¬¦  «        }
t          t          |¦  «        ¦  «        D �]€}t          ||                              ¦   «         ¦  «        }t          ||                              ¦   «         ¦  «        }||         |z  }||         |z  }t#          j        | |         dd…df         ||fd	d
¬¦  «        dd…df         }|j        d         }|                     |d¦  «                             d¬¦  «        }||z  }t          j        ||z
  |d¬¦  «        }|                     ¦   «         dz   |z  }|                     ¦   «         dz   |z  }|||         z   |	|ddd…f<   |||         z   |	|ddd…f<   d|	|ddd…f<   |t          j        ||j        ¬¦  «        ||f         |
|dd…f<   �Œ‚|	 	                    ddd¦  «        |
fS )z°Extract predicted keypoint locations from heatmaps. Output has shape
    (#rois, 4, #keypoints) with the 4 rows corresponding to (x, y, logit, prob)
    for each keypoint.
    Nr   r   rY   rZ   ©Úminrm   r˜   ro   Frp   r   r   r[   )Úrounding_moders   r3   )ÚclampÚceilr   ÚtorchvisionÚ_is_tracingr¢   r   rt   ru   Úpermuter™   Úlenrz   r4   rš   rw   Úitemr   rv   r   rx   ÚdivÚfloatr6   )r   rC   r_   r`   rž   rŸ   rœ   r�   r‡   r    r¡   rM   r�   r‚   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r8   rc   s                          r)   Úheatmaps_to_keypointsr°   ê   sW  € ð �A�A�A�q�DŒz€HØ�A�A�A�q�DŒz€Hà�!�!�!�Q�$ŒZ˜$˜q˜q˜q !˜tœ*Ñ$€FØ�1�1�1�a�4Œj˜4    1 œ:Ñ%€GØ�\Š\˜aˆ\Ñ Ô €FØ�mŠm ˆmÑ"Ô"€GØ—+’+‘-”-€KØ—<’<‘>”>€Là”J˜q”M€MåÔÑ Ô ð 5Ý?ØØØØØØØØÝÔ µU´[ÐAÑAÔAñ
 
ô 
 
Ñˆ�*ð ×Ò  1 aÑ(Ô(¨*Ð4Ð4åŒ{�C ™IœI q¨-Ð8ÅÄÐVZÔVaÐbÑbÔb€HÝ”�c $™iœi¨Ð7½u¼}ÐUYÔU`ÐaÑaÔa€JÝ•3�t‘9”9ÑÔð eñ eˆÝ˜K¨œN×/Ò/Ñ1Ô1Ñ2Ô2ˆÝ˜\¨!œ_×1Ò1Ñ3Ô3Ñ4Ô4ˆØ! !œ9 }Ñ4ÐØ# AœJ¨Ñ7ÐÝ”-Ø�ŒG�A�A�A�t�GÔ N°MÐ#BÈÐbgð
ñ 
ô 
à
ˆ!ˆ!ˆQˆ$ôˆð ŒM˜!ÔˆØ�oŠo˜m¨RÑ0Ô0×7Ò7¸AÐ7Ñ>Ô>ˆà�a‘ˆÝ”	˜# ™+ q¸Ð@Ñ@Ô@ˆð �[Š[‰]Œ]˜SÑ Ð$4Ñ4ˆØ�[Š[‰]Œ]˜SÑ Ð$5Ñ5ˆØ ¨¤™Oˆ��A�q�q�q�ÑØ ¨¤™Oˆ��A�q�q�q�ÑØˆ��A�q�q�q�ÑØ"¥5¤<°ÀgÄnÐ#UÑ#UÔ#UÐW\Ð^cÐ#cÔdˆ
�1�a�a�a�4ÑÑà×Ò˜A˜q !Ñ$Ô$ jÐ0Ð0r+   c                 ó.  — | j         \  }}}}||k    rt          d|› d|› �¦  «        ‚|}g }	g }
t          |||¦  «        D ]r\  }}}||         }t          |||¦  «        \  }}|	                     |                     d¦  «        ¦  «         |
                     |                     d¦  «        ¦  «         Œst          j        |	d¬¦  «        }t          j        |
d¬¦  «                             t          j	        ¬¦  «        }
t          j
        |
¦  «        d         }
|                     ¦   «         dk    st          |
¦  «        dk    r|                      ¦   «         dz  S |                      ||z  ||z  ¦  «        } t          j        | |
         ||
         ¦  «        }|S )Nz_keypoint_logits height and width (last two elements of shape) should be equal. Instead got H = z	 and W = r   r   r   rm   )r   Ú
ValueErrorrO   rk   Úappendr~   r   r   r?   Úuint8r   r   r¬   r   r   r   )Úkeypoint_logitsrR   Úgt_keypointsÚkeypoint_matched_idxsr&   ÚKÚHÚWrN   rj   rh   Úproposals_per_imageÚgt_kp_in_imageÚmidxÚkpÚheatmaps_per_imageÚvalid_per_imageÚkeypoint_targetsÚkeypoint_losss                      r)   Úkeypointrcnn_lossrÃ   *  s¬  € à Ô&�J€A€qˆ!ˆQØˆA‚v€vÝØ}ÐnoÐ}Ð}Ðz{Ð}Ð}ñ
ô 
ð 	
ð ÐØ€HØ€EÝ58¸ÀLÐRgÑ5hÔ5hð /ð /Ñ1Ð˜^¨TØ˜DÔ!ˆÝ.BÀ2ÐGZÐ\oÑ.pÔ.pÑ+Ð˜OØ�ŠÐ*×/Ò/°Ñ3Ô3Ñ4Ô4Ð4Ø�Š�_×)Ò)¨"Ñ-Ô-Ñ.Ô.Ð.Ð.å”y ¨qÐ1Ñ1Ô1ÐÝŒI�e Ð#Ñ#Ô#×&Ò&­U¬[Ð&Ñ9Ô9€EÝŒK˜ÑÔ˜qÔ!€Eð ×ÒÑÔ 1Ò$Ð$­¨E©
¬
°aª¨Ø×"Ò"Ñ$Ô$ qÑ(Ð(à%×*Ò*¨1¨q©5°!°a±%Ñ8Ô8€Oå”O O°EÔ$:Ð<LÈUÔ<SÑTÔT€MØÐr+   c                 óþ   — g }g }d„ |D ¦   «         }|                       |d¬¦  «        }t          ||¦  «        D ]B\  }}t          ||¦  «        \  }}	|                     |¦  «         |                     |	¦  «         ŒC||fS )Nc                 ó8   — g | ]}|                      d ¦  «        ‘ŒS r.   )r   )r0   Úboxs     r)   r2   z*keypointrcnn_inference.<locals>.<listcomp>N  s"   € Ð4Ð4Ð4 s�s—x’x ‘{”{Ð4Ð4Ð4r+   r   r   )r7   rO   r°   r³   )
r8   r	   Úkp_probsÚ	kp_scoresr;   Úx2ÚxxÚbbÚkp_probÚscoress
             r)   Úkeypointrcnn_inferencerÎ   I  s–   € à€HØ€Ià4Ð4¨eÐ4Ñ4Ô4€OØ	
�Š� aˆÑ	(Ô	(€Bå�b˜%‘.”.ð !ð !‰ˆˆBÝ/°°BÑ7Ô7‰ˆ�Ø�Š˜Ñ Ô Ð Ø×Ò˜Ñ Ô Ð Ð à�YÐÐr+   c                 óÌ  — | d d …df         | d d …df         z
  dz  }| d d …df         | d d …df         z
  dz  }| d d …df         | d d …df         z   dz  }| d d …df         | d d …df         z   dz  }|                      t          j        ¬¦  «        |z  }|                      t          j        ¬¦  «        |z  }||z
  }||z
  }||z   }||z   }	t          j        ||||	fd¦  «        }
|
S )NrY   r   rs   rZ   r   rm   )r?   r   rz   r|   )r	   ÚscaleÚw_halfÚh_halfÚx_cÚy_cÚ
boxes_exp0Ú
boxes_exp1Ú
boxes_exp2Ú
boxes_exp3Ú	boxes_exps              r)   Ú_onnx_expand_boxesrÚ   Y  s  € à�A�A�A�q�DŒk˜E ! ! ! Q $œKÑ'¨3Ñ.€FØ�A�A�A�q�DŒk˜E ! ! ! Q $œKÑ'¨3Ñ.€FØ����A�Œ;˜˜q˜q˜q !˜tœÑ$¨Ñ
+€CØ����A�Œ;˜˜q˜q˜q !˜tœÑ$¨Ñ
+€Cà�YŠY�Uœ]ˆYÑ+Ô+¨eÑ3€FØ�YŠY�Uœ]ˆYÑ+Ô+¨eÑ3€Fà�v‘€JØ�v‘€JØ�v‘€JØ�v‘€JÝ”˜Z¨°ZÀÐLÈaÑPÔP€IØÐr+   c                 óÈ  — t          j        ¦   «         rt          | |¦  «        S | d d …df         | d d …df         z
  dz  }| d d …df         | d d …df         z
  dz  }| d d …df         | d d …df         z   dz  }| d d …df         | d d …df         z   dz  }||z  }||z  }t          j        | ¦  «        }||z
  |d d …df<   ||z   |d d …df<   ||z
  |d d …df<   ||z   |d d …df<   |S )NrY   r   rs   rZ   r   )r©   rª   rÚ   r   Ú
zeros_like)r	   rÐ   rÑ   rÒ   rÓ   rÔ   rÙ   s          r)   Úexpand_boxesrÝ   n  s;  € åÔÑ Ô ð 0Ý! %¨Ñ/Ô/Ð/Ø�A�A�A�q�DŒk˜E ! ! ! Q $œKÑ'¨3Ñ.€FØ�A�A�A�q�DŒk˜E ! ! ! Q $œKÑ'¨3Ñ.€FØ����A�Œ;˜˜q˜q˜q !˜tœÑ$¨Ñ
+€CØ����A�Œ;˜˜q˜q˜q !˜tœÑ$¨Ñ
+€Cà
ˆe�O€FØ
ˆe�O€FåÔ  Ñ'Ô'€IØ˜F‘l€Iˆaˆaˆa�ˆd�OØ˜F‘l€Iˆaˆaˆa�ˆd�OØ˜F‘l€Iˆaˆaˆa�ˆd�OØ˜F‘l€Iˆaˆaˆa�ˆd�OØÐr+   c                 óÔ   — t          j        | d|z  z   ¦  «                             t           j        ¦  «        t          j        | ¦  «                             t           j        ¦  «        z  S )NrY   )r   ry   r?   rz   )rB   Úpaddings     r)   Úexpand_masks_tracing_scalerà   ‚  sK   € õ Œ<˜˜A ™K™Ñ(Ô(×+Ò+­E¬MÑ:Ô:½U¼\È!¹_¼_×=OÒ=OÕPUÔP]Ñ=^Ô=^Ñ^Ð^r+   c                 óä   — | j         d         }t          j                             ¦   «         rt	          ||¦  «        }nt          |d|z  z   ¦  «        |z  }t          j        | |fdz  ¦  «        }||fS )Nr   rY   r   )r   r   Ú_CÚ_get_tracing_staterà   r¯   r   Úpad)Úmaskrß   rB   rÐ   Úpadded_masks        r)   Úexpand_masksrç   ˆ  sp   € àŒ
�2Œ€AÝ„x×"Ò"Ñ$Ô$ð +Ý*¨1¨gÑ6Ô6ˆˆå�a˜!˜g™+‘oÑ&Ô&¨Ñ*ˆÝ”%˜˜w˜j¨1™nÑ-Ô-€KØ˜ÐÐr+   c                 óÀ  — d}t          |d         |d         z
  |z   ¦  «        }t          |d         |d         z
  |z   ¦  «        }t          |d¦  «        }t          |d¦  «        }|                      d¦  «        } t          j        | ||fdd¬¦  «        } | d         d         } t          j        ||f| j        | j        ¬	¦  «        }t          |d         d¦  «        }t          |d         dz   |¦  «        }	t          |d         d¦  «        }
t          |d         dz   |¦  «        }| |
|d         z
  ||d         z
  …||d         z
  |	|d         z
  …f         ||
|…||	…f<   |S )
Nr   rY   r   rZ   )r   r   r   r   ÚbilinearFrp   r˜   )
rw   ÚmaxÚexpandr   rv   r   r™   rn   r4   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õ   “  s_  € à€IÝˆC�ŒF�S˜”V‰O˜iÑ'Ñ(Ô(€AÝˆC�ŒF�S˜”V‰O˜iÑ'Ñ(Ô(€AÝˆAˆq‰	Œ	€AÝˆAˆq‰	Œ	€Að �;Š;�~Ñ&Ô&€Dõ Œ=˜ Q¨ F°È5ÐQÑQÔQ€DØ�Œ7�1Œ:€DåŒk˜4 ˜,¨d¬jÀÄÐMÑMÔM€GÝ
ˆc�!Œf�a‰.Œ.€CÝ
ˆc�!Œf�q‰j˜$Ñ
Ô
€CÝ
ˆc�!Œf�a‰.Œ.€CÝ
ˆc�!Œf�q‰j˜$Ñ
Ô
€Cà $ c¨C°¬F¡l°s¸SÀ¼V±|Ð%DÀsÈSÐQRÌVÁ|ÐX[Ð^aÐbcÔ^dÑXdÐFeÐ%eÔ f€GˆC�ˆG�S˜�WÐÑØ€Nr+   c                 óT  — t          j        dt           j        ¬¦  «        }t          j        dt           j        ¬¦  «        }|d         |d         z
  |z   }|d         |d         z
  |z   }t          j        t          j        ||f¦  «        ¦  «        }t          j        t          j        ||f¦  «        ¦  «        }|                      dd|                      d¦  «        |                      d¦  «        f¦  «        } t          j	        | t          |¦  «        t          |¦  «        fdd¬¦  «        } | d         d         } t          j        t          j        |d                              d¦  «        |f¦  «        ¦  «        }t          j        t          j        |d                              d¦  «        |z   |                     d¦  «        f¦  «        ¦  «        }	t          j        t          j        |d                              d¦  «        |f¦  «        ¦  «        }
t          j        t          j        |d                              d¦  «        |z   |                     d¦  «        f¦  «        ¦  «        }| |
|d         z
  ||d         z
  …||d         z
  |	|d         z
  …f         }t          j        |
|                     d¦  «        ¦  «        }t          j        ||z
  |                     d¦  «        ¦  «        }t          j        ||                     t           j        ¬¦  «        |fd¦  «        d|…d d …f         }t          j        |                     d¦  «        |¦  «        }t          j        |                     d¦  «        ||	z
  ¦  «        }t          j        |||fd¦  «        d d …d |…f         }|S )	Nr   rm   rY   r   rZ   ré   Frp   )r   r{   ru   r™   rê   r   rë   r   r   rv   rw   r›   r¥   r?   rz   )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Ð
*Ñ
*Ô
*€CÝŒ;�q¥¤Ð,Ñ,Ô,€DàˆAŒ��Q”‰˜#Ñ€AØˆAŒ��Q”‰˜#Ñ€AÝŒ	•%”)˜Q ˜HÑ%Ô%Ñ&Ô&€AÝŒ	•%”)˜Q ˜HÑ%Ô%Ñ&Ô&€Að �;Š;˜˜1˜dŸiši¨™lœl¨D¯IªI°a©L¬LÐ9Ñ:Ô:€Dõ Œ=˜¥S¨¡V¤V­S°©V¬VÐ$4¸:ÐUZÐ[Ñ[Ô[€DØ�Œ7�1Œ:€Då
Œ)•E”I˜s 1œv×/Ò/°Ñ2Ô2°DÐ9Ñ:Ô:Ñ
;Ô
;€CÝ
Œ)•E”I˜s 1œv×/Ò/°Ñ2Ô2°SÑ8¸$¿.º.ÈÑ:KÔ:KÐLÑMÔMÑ
NÔ
N€CÝ
Œ)•E”I˜s 1œv×/Ò/°Ñ2Ô2°DÐ9Ñ:Ô:Ñ
;Ô
;€CÝ
Œ)•E”I˜s 1œv×/Ò/°Ñ2Ô2°SÑ8¸$¿.º.ÈÑ:KÔ:KÐLÑMÔMÑ
NÔ
N€Cà˜C # a¤&™L¨S°3°q´6©\Ð:¸SÀ3ÀqÄ6¹\ÈcÐTWÐXYÔTZÉlÐ<[Ð[Ô\€Oõ
 Œ{˜3 × 4Ò 4°QÑ 7Ô 7Ñ8Ô8€HÝŒ{˜4 #™: ×';Ò';¸AÑ'>Ô'>Ñ?Ô?€HÝŒy˜( O×$6Ò$6½U¼]Ð$6Ñ$KÔ$KÈXÐVÐXYÑZÔZÐ[\Ð]aÐ[aÐcdÐcdÐcdÐ[dÔe€HåŒ{˜8Ÿ=š=¨Ñ+Ô+¨SÑ1Ô1€HÝŒ{˜8Ÿ=š=¨Ñ+Ô+¨T°C©ZÑ8Ô8€HÝŒi˜ 8¨XÐ6¸Ñ:Ô:¸1¸1¸1¸e¸t¸e¸8ÔD€GØ€Nr+   c                 ó  — t          j        d||¦  «        }t          |                      d¦  «        ¦  «        D ]Q}t	          | |         d         ||         ||¦  «        }|                     d¦  «        }t          j        ||f¦  «        }ŒR|S ©Nr   )r   r™   rš   r   rÿ   r›   r   )Úmasksr	   rì   rí   Ú
res_appendrM   Úmask_ress          r)   Ú_onnx_paste_masks_in_image_loopr  Ð  s„   € å”˜Q  dÑ+Ô+€JÝ�5—:’:˜a‘=”=Ñ!Ô!ð 7ð 7ˆÝ,¨U°1¬X°a¬[¸%À¼(ÀDÈ$ÑOÔOˆØ×%Ò% aÑ(Ô(ˆÝ”Y 
¨HÐ5Ñ6Ô6ˆ
ˆ
ØÐr+   c           	      óB  ‡‡— t          | |¬¦  «        \  } }t          ||¦  «                             t          j        ¬¦  «        }|\  ŠŠt          j        ¦   «         rXt          | |t          j        ‰t          j        ¬¦  «        t          j        ‰t          j        ¬¦  «        ¦  «        d d …d f         S ˆˆfd„t          | |¦  «        D ¦   «         }t          |¦  «        dk    r!t          j        |d¬¦  «        d d …d f         }n|                      dd‰‰f¦  «        }|S )N)rß   rm   c                 óF   •— g | ]\  }}t          |d          |‰‰¦  «        ‘ŒS r.   )rõ   )r0   rK   Úbrì   rí   s      €€r)   r2   z(paste_masks_in_image.<locals>.<listcomp>ä  s0   ø€ Ð
RÐ
RÐ
R¹¸¸1Õ˜q œt Q¨¨dÑ3Ô3Ð
RÐ
RÐ
Rr+   r   r   r   )rç   rÝ   r?   r   ru   r©   rª   r  rt   rO   r¬   r|   Ú	new_empty)	r  r	   Ú	img_shaperß   rÐ   ÚresÚretrì   rí   s	          @@r)   Úpaste_masks_in_imager  Ú  s"  øø€ å ¨wÐ7Ñ7Ô7�L€Eˆ5Ý˜ Ñ&Ô&×)Ò)µ´Ð)Ñ<Ô<€EØ�J€Dˆ$åÔÑ Ô ð Ý.Ø�5�%Ô-¨d½%¼+ÐFÑFÔFÍÔH[Ð\`ÕhmÔhsÐHtÑHtÔHtñ
ô 
à
ˆ!ˆ!ˆTˆ'ôð 	ð SÐ
RÐ
RÐ
RÐ
RÅÀEÈ5Ñ@QÔ@QÐ
RÑ
RÔ
R€CÝ
ˆ3�x„x�!‚|€|ÝŒk˜# 1Ð%Ñ%Ô% a a a¨ gÔ.ˆˆà�oŠo˜q ! T¨4Ð0Ñ1Ô1ˆØ€Jr+   c                   ó�   ‡ — e Zd Zej        ej        ej        dœZ	 	 	 	 	 	 dˆ fd„	Zd„ Z	d„ Z
d„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Z	 dd„Zˆ xZS )ÚRoIHeads)Ú	box_coderÚproposal_matcherÚfg_bg_samplerNc                 ó¸  •— t          ¦   «                              ¦   «          t          j        | _        t          j        ||d¬¦  «        | _        t          j        ||¦  «        | _	        |€d}t          j
        |¦  «        | _        || _        || _        || _        |	| _        |
| _        || _        || _        || _        || _        || _        || _        || _        d S )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  zRoIHeads.__init__ó  sÙ   ø€ õ. 	‰Œ×ÒÑÔÐå%œoˆÔå )Ô 1°-ÀÐjoÐ pÑ pÔ pˆÔå&ÔFÐG[Ð]nÑoÔoˆÔàÐ#Ø5ÐÝ"Ô+Ð,<Ñ=Ô=ˆŒà(ˆÔØ ˆŒØ*ˆÔà(ˆÔØ$ˆŒØ"4ˆÔà*ˆÔØ"ˆŒØ,ˆÔà!2ˆÔØ*ˆÔØ"4ˆÔÐÐr+   c                 ó<   — | j         €dS | j        €dS | j        €dS dS ©NFT)r&  r'  r(  ©r,  s    r)   Úhas_maskzRoIHeads.has_mask&  s0   € ØÔÐ%Ø�5ØŒ>Ð!Ø�5ØÔÐ&Ø�5Øˆtr+   c                 ó<   — | j         €dS | j        €dS | j        €dS dS r4  )r)  r*  r+  r5  s    r)   Úhas_keypointzRoIHeads.has_keypoint/  s1   € ØÔ!Ð)Ø�5ØÔÐ%Ø�5ØÔ"Ð*Ø�5Øˆtr+   c                 ó²  — g }g }t          |||¦  «        D �]=\  }}}|                     ¦   «         dk    rb|j        }	t          j        |j        d         ft          j        |	¬¦  «        }
t          j        |j        d         ft          j        |	¬¦  «        }n’t          j        ||¦  «        }|  	                    |¦  «        }| 
                    d¬¦  «        }
||
         }|                     t          j        ¬¦  «        }|| j	        j        k    }d||<   || j	        j        k    }d||<   |                     |
¦  «         |                     |¦  «         �Œ?||fS )Nr   r˜   r¤   rm   r   )rO   r   r4   r   r™   r   ru   r  r  r  r§   r?   ÚBELOW_LOW_THRESHOLDÚBETWEEN_THRESHOLDSr³   )r,  rR   Úgt_boxesrS   rA   r!   Úproposals_in_imageÚgt_boxes_in_imageÚgt_labels_in_imager4   Úclamped_matched_idxs_in_imageÚlabels_in_imageÚmatch_quality_matrixÚmatched_idxs_in_imageÚbg_indsÚignore_indss                   r)   Úassign_targets_to_proposalsz$RoIHeads.assign_targets_to_proposals8  s{  € àˆØˆÝILÈYÐX`ÐbkÑIlÔIlð 	+ñ 	+ÑEÐÐ 1Ð3Eà ×&Ò&Ñ(Ô(¨AÒ-Ð-à+Ô2�Ý05´Ø'Ô-¨aÔ0Ð2½%¼+Èfð1ñ 1ô 1Ð-õ #(¤+Ð/AÔ/GÈÔ/JÐ.LÕTYÔT_ÐhnÐ"oÑ"oÔ"o��õ (/¤Ð7HÐJ\Ñ']Ô']Ð$Ø(,×(=Ò(=Ð>RÑ(SÔ(SÐ%à0E×0KÒ0KÐPQÐ0KÑ0RÔ0RÐ-à"4Ð5RÔ"S�Ø"1×"4Ò"4½5¼;Ð"4Ñ"GÔ"G�ð 0°4Ô3HÔ3\Ò\�Ø+,� Ñ(ð 4°tÔ7LÔ7_Ò_�Ø/1� Ñ,à×ÒÐ =Ñ>Ô>Ð>Ø�MŠM˜/Ñ*Ô*Ð*Ñ*Ø˜VÐ#Ð#r+   c                 óê   — |                       |¦  «        \  }}g }t          t          ||¦  «        ¦  «        D ]:\  }\  }}t          j        ||z  ¦  «        d         }|                     |¦  «         Œ;|S r  )r  Ú	enumeraterO   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)   Ú	subsamplezRoIHeads.subsample[  s†   € à-1×-?Ò-?ÀÑ-GÔ-GÑ*ÐÐ*ØˆÝ5>½sÐCSÐUeÑ?fÔ?fÑ5gÔ5gð 	2ð 	2Ñ1ˆGÑ1�l LÝ$œ{¨<¸,Ñ+FÑGÔGÈÔJÐØ×ÒÐ 0Ñ1Ô1Ð1Ð1ØÐr+   c                 ó:   — d„ t          ||¦  «        D ¦   «         }|S )Nc                 ó@   — g | ]\  }}t          j        ||f¦  «        ‘ŒS rG   )r   r   )r0   ÚproposalÚgt_boxs      r)   r2   z-RoIHeads.add_gt_proposals.<locals>.<listcomp>f  s,   € ÐdÐdÐdÑ7G°xÀ•U”Y ¨&Ð1Ñ2Ô2ÐdÐdÐdr+   )rO   )r,  rR   r<  s      r)   Úadd_gt_proposalszRoIHeads.add_gt_proposalsd  s&   € àdÐdÍ3ÈyÐZbÑKcÔKcÐdÑdÔdˆ	àÐr+   c                 óD  — |€t          d¦  «        ‚t          d„ |D ¦   «         ¦  «        st          d¦  «        ‚t          d„ |D ¦   «         ¦  «        st          d¦  «        ‚|                      ¦   «         r(t          d„ |D ¦   «         ¦  «        st          d¦  «        ‚d S d S )Nútargets should not be Nonec                 ó   — g | ]}d |v ‘ŒS ©r	   rG   ©r0   Úts     r)   r2   z*RoIHeads.check_targets.<locals>.<listcomp>n  s   € Ð2Ð2Ð2 Q�G˜q�LÐ2Ð2Ð2r+   z0Every element of targets should have a boxes keyc                 ó   — g | ]}d |v ‘ŒS ©r!   rG   rZ  s     r)   r2   z*RoIHeads.check_targets.<locals>.<listcomp>p  s   € Ð3Ð3Ð3 a�H �MÐ3Ð3Ð3r+   z1Every element of targets should have a labels keyc                 ó   — g | ]}d |v ‘ŒS ©r  rG   rZ  s     r)   r2   z*RoIHeads.check_targets.<locals>.<listcomp>s  s   € Ð6Ð6Ð6¨˜ 1˜Ð6Ð6Ð6r+   z0Every element of targets should have a masks key)r²   Úallr6  )r,  Útargetss     r)   Úcheck_targetszRoIHeads.check_targetsj  sÌ   € àˆ?ÝÐ9Ñ:Ô:Ð:ÝÐ2Ð2¨'Ð2Ñ2Ô2Ñ3Ô3ð 	QÝÐOÑPÔPÐPÝÐ3Ð3¨7Ð3Ñ3Ô3Ñ4Ô4ð 	RÝÐPÑQÔQÐQØ�=Š=‰?Œ?ð 	UÝÐ6Ð6¨gÐ6Ñ6Ô6Ñ7Ô7ð UÝ Ð!SÑTÔTÐTð	Uð 	UðUð Ur+   c                 óð  ‡— |                       |¦  «         |€t          d¦  «        ‚|d         j        Š|d         j        }ˆfd„|D ¦   «         }d„ |D ¦   «         }|                      ||¦  «        }|                      |||¦  «        \  }}|                      |¦  «        }g }	t          |¦  «        }
t          |
¦  «        D ]•}||         }||         |         ||<   ||         |         ||<   ||         |         ||<   ||         }| 	                    ¦   «         dk    rt          j        d‰|¬¦  «        }|	                     |||                  ¦  «         Œ–| j                             |	|¦  «        }||||fS )NrW  r   c                 óF   •— g | ]}|d                                ‰¦  «        ‘ŒS rY  )r?   )r0   r[  rn   s     €r)   r2   z4RoIHeads.select_training_samples.<locals>.<listcomp>‚  s)   ø€ Ð:Ð:Ð:¨Q�A�g”J—M’M %Ñ(Ô(Ð:Ð:Ð:r+   c                 ó   — g | ]
}|d          ‘ŒS r]  rG   rZ  s     r)   r2   z4RoIHeads.select_training_samples.<locals>.<listcomp>ƒ  s   € Ð2Ð2Ð2 Q�Q�x”[Ð2Ð2Ð2r+   )r   r   r˜   )rb  r²   rn   r4   rU  rF  rP  r¬   rš   r   r   r™   r³   r  Úencode)r,  rR   ra  r4   r<  rS   rA   r!   rK  Úmatched_gt_boxesÚ
num_imagesÚimg_idrO  r>  r"   rn   s                  @r)   Úselect_training_samplesz RoIHeads.select_training_samplesv  s®  ø€ ð 	×Ò˜7Ñ#Ô#Ð#Øˆ?ÝÐ9Ñ:Ô:Ð:Ø˜!”Ô"ˆØ˜1”Ô$ˆà:Ð:Ð:Ð:°'Ð:Ñ:Ô:ˆØ2Ð2¨'Ð2Ñ2Ô2ˆ	ð ×)Ò)¨)°XÑ>Ô>ˆ	ð  $×?Ò?À	È8ÐU^Ñ_Ô_Ñˆ�fà—~’~ fÑ-Ô-ˆØÐÝ˜‘^”^ˆ
Ý˜JÑ'Ô'ð 		Mð 		MˆFØ+¨FÔ3ÐØ )¨&Ô 1Ð2BÔ CˆI�fÑØ# Fœ^Ð,<Ô=ˆF�6‰NØ#/°Ô#7Ð8HÔ#IˆL˜Ñ à (¨Ô 0ÐØ ×&Ò&Ñ(Ô(¨AÒ-Ð-Ý$)¤K°¸eÈFÐ$SÑ$SÔ$SÐ!Ø×#Ò#Ð$5°lÀ6Ô6JÔ$KÑLÔLÐLÐLà!œ^×2Ò2Ð3CÀYÑOÔOÐØ˜,¨Ð0BÐBÐBr+   c                 ó–  — |j         }|j        d         }d„ |D ¦   «         }| j                             ||¦  «        }t	          j        |d¦  «        }	|                     |d¦  «        }
|	                     |d¦  «        }g }g }g }t          |
||¦  «        D �]°\  }}}t          j	        ||¦  «        }t          j        ||¬¦  «        }|                     dd¦  «                             |¦  «        }|d d …dd …f         }|d d …dd …f         }|d d …dd …f         }|                     dd¦  «        }|                     d¦  «        }|                     d¦  «        }t          j        || j        k    ¦  «        d         }||         ||         ||         }}}t          j        |d¬¦  «        }||         ||         ||         }}}t          j        |||| j        ¦  «        }|d | j        …         }||         ||         ||         }}}|                     |¦  «         |                     |¦  «         |                     |¦  «         �Œ²|||fS )	Nr   c                 ó(   — g | ]}|j         d          ‘ŒS r.   r/   )r0   Úboxes_in_images     r)   r2   z3RoIHeads.postprocess_detections.<locals>.<listcomp>§  s    € ÐSÐSÐS°~˜>Ô/°Ô2ÐSÐSÐSr+   r   r3   r   r   g{®Gáz„?)Úmin_size)r4   r   r  Údecoder   Úsoftmaxr7   rO   r  Úclip_boxes_to_imager   r6   r~   Ú	expand_asr   r   r#  Úremove_small_boxesÚbatched_nmsr$  r%  r³   )r,  r   r    rR   Úimage_shapesr4   r'   r;   Ú
pred_boxesÚpred_scoresÚpred_boxes_listÚpred_scores_listÚ	all_boxesÚ
all_scoresÚ
all_labelsr	   rÍ   Úimage_shaper!   ÚindsÚkeeps                        r)   Úpostprocess_detectionszRoIHeads.postprocess_detectionsœ  sl  € ð Ô$ˆØ"Ô(¨Ô,ˆàSÐSÈÐSÑSÔSˆØ”^×*Ò*¨>¸9ÑEÔEˆ
å”i ¨bÑ1Ô1ˆà$×*Ò*¨?¸AÑ>Ô>ˆØ&×,Ò,¨_¸aÑ@Ô@Ðàˆ	Øˆ
Øˆ
Ý*-¨oÐ?OÐQ]Ñ*^Ô*^ð !	&ñ !	&Ñ&ˆE�6˜;ÝÔ/°°{ÑCÔCˆEõ ”\ +°fÐ=Ñ=Ô=ˆFØ—[’[  BÑ'Ô'×1Ò1°&Ñ9Ô9ˆFð ˜!˜!˜!˜Q˜R˜R˜%”LˆEØ˜A˜A˜A˜q˜r˜r˜E”]ˆFØ˜A˜A˜A˜q˜r˜r˜E”]ˆFð —M’M " aÑ(Ô(ˆEØ—^’^ BÑ'Ô'ˆFØ—^’^ BÑ'Ô'ˆFõ ”;˜v¨Ô(9Ò9Ñ:Ô:¸1Ô=ˆDØ$)¨$¤K°¸´¸vÀd¼|˜6�6ˆEõ Ô-¨e¸dÐCÑCÔCˆDØ$)¨$¤K°¸´¸vÀd¼|˜6�6ˆEõ Ô& u¨f°f¸d¼oÑNÔNˆDàÐ1˜$Ô1Ð1Ô2ˆDØ$)¨$¤K°¸´¸vÀd¼|˜6�6ˆEà×Ò˜UÑ#Ô#Ð#Ø×Ò˜fÑ%Ô%Ð%Ø×Ò˜fÑ%Ô%Ð%Ñ%à˜* jÐ0Ð0r+   c                 ó¸
  — |�Ø|D ]Õ}t           j        t           j        t           j        f}|d         j        |vrt          d|d         j        › �¦  «        ‚|d         j        t           j        k    st          d|d         j        › �¦  «        ‚|                      ¦   «         r8|d         j        t           j        k    st          d|d         j        › �¦  «        ‚ŒÖ| j	        r|  
                    ||¦  «        \  }}}}	nd}d}	d}|                      |||¦  «        }
|                      |
¦  «        }
|                      |
¦  «        \  }}g }i }| j	        r=|€t          d¦  «        ‚|	€t          d	¦  «        ‚t          ||||	¦  «        \  }}||d
œ}nh|                      ||||¦  «        \  }}}t#          |¦  «        }t%          |¦  «        D ]-}|                     ||         ||         ||         dœ¦  «         Œ.|                      ¦   «         �r¤d„ |D ¦   «         }| j	        r�|€t          d¦  «        ‚t#          |¦  «        }g }g }t%          |¦  «        D ]h}t          j        ||         dk    ¦  «        d         }|                     ||         |         ¦  «         |                     ||         |         ¦  «         Œind}| j        �B|                      |||¦  «        }|                      |¦  «        }|                      |¦  «        }nt3          d¦  «        ‚i }| j	        rE|�|�|€t          d¦  «        ‚d„ |D ¦   «         }d„ |D ¦   «         }t5          |||||¦  «        }d|i}n7d„ |D ¦   «         }t7          ||¦  «        }t9          ||¦  «        D ]
\  } }!| |!d<   Œ|                     |¦  «         | j        ��Ÿ| j        ��—| j         ���d„ |D ¦   «         }"| j	        r�t#          |¦  «        }g }"g }|€t          d¦  «        ‚t%          |¦  «        D ]h}t          j        ||         dk    ¦  «        d         }|"                     ||         |         ¦  «         |                     ||         |         ¦  «         Œind}|                      ||"|¦  «        }#|                      |#¦  «        }#|                       |#¦  «        }$i }%| j	        r6|�|€t          d¦  «        ‚d„ |D ¦   «         }&tC          |$|"|&|¦  «        }'d|'i}%nH|$�|"€t          d¦  «        ‚tE          |$|"¦  «        \  }(})t9          |(|)|¦  «        D ]\  }*}+}!|*|!d<   |+|!d<   Œ|                     |%¦  «         ||fS )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 r]   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Í   c                 ó   — g | ]
}|d          ‘ŒS rY  rG   ©r0   rL   s     r)   r2   z$RoIHeads.forward.<locals>.<listcomp>  s   € Ð9Ð9Ð9¨Q˜a œjÐ9Ð9Ð9r+   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 trainingc                 ó   — g | ]
}|d          ‘ŒS r_  rG   rZ  s     r)   r2   z$RoIHeads.forward.<locals>.<listcomp>/  s   € Ð8Ð8Ð8¨1˜A˜gœJÐ8Ð8Ð8r+   c                 ó   — g | ]
}|d          ‘ŒS r]  rG   rZ  s     r)   r2   z$RoIHeads.forward.<locals>.<listcomp>0  s   € Ð:Ð:Ð:¨Q˜Q˜xœ[Ð:Ð:Ð:r+   Ú	loss_maskc                 ó   — g | ]
}|d          ‘ŒS r]  rG   )r0   Úrs     r)   r2   z$RoIHeads.forward.<locals>.<listcomp>4  s   € Ð6Ð6Ð6¨!˜!˜Hœ+Ð6Ð6Ð6r+   r  c                 ó   — g | ]
}|d          ‘ŒS rY  rG   r…  s     r)   r2   z$RoIHeads.forward.<locals>.<listcomp>B  s   € Ð!=Ð!=Ð!=° ! G¤*Ð!=Ð!=Ð!=r+   z0if in trainning, matched_idxs should not be NonezJboth targets and pos_matched_idxs should not be None when in training modec                 ó   — g | ]
}|d          ‘ŒS )r]   rG   rZ  s     r)   r2   z$RoIHeads.forward.<locals>.<listcomp>[  s   € Ð@Ð@Ð@°1  +¤Ð@Ð@Ð@r+   Úloss_keypointzXboth keypoint_logits and keypoint_proposals should not be None when not in training modeÚkeypoints_scores)#r   r¯   ÚdoubleÚhalfrn   Ú	TypeErrorru   r8  rz   Útrainingrj  r   r!  r"  r²   r*   r€  r¬   rš   r³   r6  r   r&  r'  r(  Ú	ExceptionrW   r=   rO   Úupdater)  r*  r+  rÃ   rÎ   ),r,  ÚfeaturesrR   ru  ra  r[  Úfloating_point_typesrA   r!   r"   Úbox_featuresr   r    ÚresultÚlossesr‚  rƒ  r	   rÍ   rh  rM   Úmask_proposalsÚpos_matched_idxsri  rŒ   Úmask_featuresrQ   rˆ  r@   rS   Úrcnn_loss_maskÚmasks_probsr9   rŠ  Úkeypoint_proposalsÚkeypoint_featuresrµ   r�  r¶   Úrcnn_loss_keypointÚkeypoints_probsrÈ   Úkeypoint_probÚkpss,                                               r)   ÚforwardzRoIHeads.forward×  sl  € ð ÐØð 	tð 	t�å(-¬µU´\Å5Ä:Ð'NÐ$Ø˜”zÔ'Ð+?Ð?Ð?Ý#Ð$fÐTUÐV]ÔT^ÔTdÐ$fÐ$fÑgÔgÐgØ˜”{Ô(­E¬KÒ7Ð7Ý#Ð$hÐUVÐW_ÔU`ÔUfÐ$hÐ$hÑiÔiÐiØ×$Ò$Ñ&Ô&ð tØ˜[œ>Ô/µ5´=Ò@Ð@Ý'Ð(rÐ\]Ð^iÔ\jÔ\pÐ(rÐ(rÑsÔsÐsøàŒ=ð 	 ØBF×B^ÒB^Ð_hÐjqÑBrÔBrÑ?ˆI�| VÐ-?Ð-?àˆFØ!%ÐØˆLà×(Ò(¨°9¸lÑKÔKˆØ—}’} \Ñ2Ô2ˆØ'+×'9Ò'9¸,Ñ'GÔ'GÑ$ˆ�nà02ˆØˆØŒ=ð 	Øˆ~Ý Ð!8Ñ9Ô9Ð9Ø!Ð)Ý Ð!DÑEÔEÐEÝ,9¸,ÈÐX^Ð`rÑ,sÔ,sÑ)ˆO˜\Ø)8È,ÐWÐWˆFˆFà$(×$?Ò$?ÀÈnÐ^gÐiuÑ$vÔ$vÑ!ˆE�6˜6Ý˜U™œˆJÝ˜:Ñ&Ô&ð ð �Ø—’à!& q¤Ø"(¨¤)Ø"(¨¤)ðð ñô ð ð ð �=Š=‰?Œ?ñ '	%Ø9Ð9°&Ð9Ñ9Ô9ˆNØŒ}ð (ØÐ'Ý$Ð%VÑWÔWÐWõ ! ™^œ^�
Ø!#�Ø#%Ð Ý# JÑ/Ô/ð Gð G�FÝœ+ f¨V¤n°qÒ&8Ñ9Ô9¸!Ô<�CØ"×)Ò)¨)°FÔ*;¸CÔ*@ÑAÔAÐAØ$×+Ò+¨L¸Ô,@ÀÔ,EÑFÔFÐFÐFðGð
 $(Ð àÔ!Ð-Ø $× 2Ò 2°8¸^È\Ñ ZÔ Z�Ø $§¢¨}Ñ =Ô =�Ø"×1Ò1°-Ñ@Ô@��åÐ GÑHÔHÐHàˆIØŒ}ð +Ø�?Ð&6Ð&>À+ÐBUÝ$Ð%jÑkÔkÐkà8Ð8°Ð8Ñ8Ô8�Ø:Ð:°'Ð:Ñ:Ô:�	Ý!.¨{¸NÈHÐV_ÐaqÑ!rÔ!r�Ø(¨.Ð9�	�	à6Ð6¨vÐ6Ñ6Ô6�Ý0°¸fÑEÔE�Ý$'¨°VÑ$<Ô$<ð +ð +‘L�I˜qØ!*�A�g‘J�Jà�MŠM˜)Ñ$Ô$Ð$ð
 Ô"Ñ.ØÔ"Ñ.ØÔ'Ñ3à!=Ð!=°fÐ!=Ñ!=Ô!=ÐØŒ}ð (å  ™^œ^�
Ø%'Ð"Ø#%Ð ØÐ'Ý$Ð%WÑXÔXÐXå# JÑ/Ô/ð Gð G�FÝœ+ f¨V¤n°qÒ&8Ñ9Ô9¸!Ô<�CØ&×-Ò-¨i¸Ô.?ÀÔ.DÑEÔEÐEØ$×+Ò+¨L¸Ô,@ÀÔ,EÑFÔFÐFÐFðGð
 $(Ð à $× 6Ò 6°xÐASÐUaÑ bÔ bÐØ $× 2Ò 2Ð3DÑ EÔ EÐØ"×5Ò5Ð6GÑHÔHˆOàˆMØŒ}ð 0Ø�?Ð&6Ð&>Ý$Ð%qÑrÔrÐrà@Ð@¸Ð@Ñ@Ô@�Ý%6Ø#Ð%7¸ÐGWñ&ô &Ð"ð "1Ð2DÐ E��à"Ð*Ð.@Ð.HÝ$Ørñô ð õ .DÀOÐUgÑ-hÔ-hÑ*� Ý-0°À)ÈVÑ-TÔ-Tð 0ð 0Ñ)�M 3¨Ø%2�A�k‘NØ,/�AÐ(Ñ)Ð)Ø�MŠM˜-Ñ(Ô(Ð(à�vˆ~Ðr+   )NNNNNN)N)Ú__name__Ú
__module__Ú__qualname__r  r  r  r  Ú__annotations__r  r6  r8  rF  rP  rU  rb  rj  r€  r¥  Ú__classcell__)r2  s   @r)   r  r  ì  s  ø€ € € € € àÔ'Ø%Ô-Ø"ÔBðð €Oð, ØØØØØð+15ð 15ð 15ð 15ð 15ð 15ðfð ð ðð ð ð!$ð !$ð !$ðFð ð ðð ð ð
Uð 
Uð 
Uð$Cð $Cð $CðL91ð 91ð 91ð@ ðUð Uð Uð Uð Uð Uð Uð Ur+   r  )r   )*Útypingr   r   r   r   r   Útorch.nn.functionalr   Ú
functionalr   r©   r   Útorchvision.opsr	   r  r
   Ú r   r  r*   r=   rD   rW   rk   r–   ÚjitÚ_script_if_tracingr¢   r°   rÃ   rÎ   rÚ   rÝ   Úunusedrà   rç   rõ   rÿ   r  r  ÚModuler  rG   r+   r)   ú<module>r´     s-  ðØ .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .à €€€Ø Ð Ð Ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7à !Ð !Ð !Ð !Ð !Ð !ð%)ð %)ð %)ðPð ð ð<8ð 8ð 8ðð ð ð@!ð !ð !ðH0$ð 0$ð 0$ðf „Ôð ð  ñ Ôð ð"=1ð =1ð =1ð@ð ð ð>ð ð ð ð ð ð*ð ð ð( „Ôð_ð _ñ Ôð_ð
ð ð ðð ð ð2!ð !ð !ðH „Ôðð ñ Ôððð ð ð ð$@ð @ð @ð @ð @ˆrŒyñ @ô @ð @ð @ð @r+   