
    h                        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	XR                  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
             ^/var/www/auris/envauris/lib/python3.13/site-packages/torchvision/models/detection/roi_heads.pyfastrcnn_lossr'      s    ( YYv1%F#51=//,?
 $kk&1*5a80J!''NA#++A/B/B2/F!/KQON
:;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 
I39:6%{{1~6O:YYvFLL==9E-(D1IQ7I ;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99l1d7+U3;D4 ##D)HXaVS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  pn[        XX5      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/36y3TU3Thn3TFULOPXevLwLwqqQ<Lw   YYv1%F99\q1L q  1$$22ELLaGOPR^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	XS 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X4$ )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   AqDzHAqDzH1a4j41:56G1a4j41:56G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8A<LMI
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    ''		!EKKHM/!2mmq$ws>2C4FGigldG 	GLLO5;;?A
//-
,
3
3
3
:CGE[QE	c	/%(((2O	OScSfSfmm Tg T 	A 
c	/%(((2O	OSdSgSgmm Th T 	A z}}5==}99Lz}}5==}99L::l00FLOO%--O0OO%--O0OO%--O0	

 	
J (=81<D
,,}
%C
&&u{{&
#d
*CQu{{ ;<	a4	5	b	aekk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     X4$ )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    {{Aq#m"45U]]SWS^S^_Ha]!34EMMRVR]R]^J3tyy|$%#>q';><?FIwzS[S^`h`k$
 
 99hkkk>
@T@TUV@W@Z@Zafanan@Z@oprstYY]]]/u}}1U1_1_`a1bcef

 & 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  pU	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   X4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+   -   XSSS24'   UX;   -   XSSS24'   SXSSS24'   U[        R.                  " UUR                  S9UU4   XSS24'   GM;     U	R                  SSS5      U
4$ )zExtract 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   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    AqDzHAqDzH!Q$Z$q!t*$F1a4j41:%G\\a\ Fmmm"G++-K<<>LJJqMM  ?U[[A
 
 1a(*44{{CIq-8VZVaVabHc$i7u}}UYU`U`aJ3t9KN//12\_1134!9}4#J7--GAtGN#Bbg

Q$ MM!oomR077A7>a		#+q@ [[]S $44[[]S $55OAqOAqAq"5<<gnn#UW\^c#cd
a4+ . Aq!$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  pnX   n[        XU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   -  s[    &&JA!vmnomppyz{y|}
 	
 HE58Rg5h1T!.B2\o.p+O*//34_))"-.	 6i yyq1IIe#&&U[[&9EKKq!E 1$E
a""$q((%**15!%8OOOO$:<LU<STM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  pU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   L  s~    HI.34esxx{eO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                  " XgX4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   \  s    AqDkE!Q$K'3.FAqDkE!Q$K'3.FA;q!t$
+CA;q!t$
+CYYU]]Y+e3FYYU]]Y+e3FJJJJZZLaPI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   q  s      !%//AqDkE!Q$K'3.FAqDkE!Q$K'3.FA;q!t$
+CA;q!t$
+C
OF
OF  'IlIadOlIadOlIadOlIadO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(++EMM:U\\!_=O=OPUP]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xx""$$*16a!g+o&*%%j1n-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   -
  XS   -
  2XS   -
  XS   -
  24   XzU2X2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FSVOi'(ACFSVOi'(AAq	AAq	A ;;~&D ==F5QD71:Dkk4,djjMG
c!fa.C
c!fqj$
C
c!fa.C
c!fqj$
C $CFlsV|%DsQRV|X[bc^dXdFe%e fGGSW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   -
  XS   -
  2XS   -
  XS   -
  24   n[         R                  " XR                  S5      5      n[         R                  " X+-
  UR                  S5      5      n[         R
                  " XR                  [         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   
**Qekk
*C;;q,DAQ#AAQ#A		%))QH%&A		%))QH%&A ;;1diilDIIaL9:D ==SVSV$4:UZ[D71:D
))EIIs1v//2D9:
;C
))EIIs1v//2S8$..:KLM
NC
))EIIs1v//2D9:
;C
))EIIs1v//2S8$..:KLM
NC#a&LSq6\:Sq6\cXYTZl<[[\O
 {{3 4 4Q 78H{{4:';';A'>?Hyy($6$6U]]$6$KXVXYZ[\]a[acd[deH{{8==+S1H{{8==+TZ8Hii8X6:1ete8DG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=!,UXa[%(DO%%a(YY
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   XU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   7LE&)))<EJD  .%--d%++FH[H[\`hmhshsHt

T' 	 ADE@Q
R@QqtQd3@QC
R
3x!|kk#1%ag. J ooq!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        Xl        Xl        Xl        Xl        Xl        Xl        Xl        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    . 	%oo ) 1 1-jo p&FFG[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_mask)  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_keypoint2  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XR                  R                  :H  nSX'   XR                  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_proposals;  sP   ILYbkIlE3E &&(A-+2205'--a02%++f1- #(++/A/G/G/J.LTYT_T_hn"o (/7H']$(,(=(=>R(S%0E0K0KPQ0K0R-"4"S"1"4"45;;"4"G 03H3H3\3\\+,( 47L7L7_7__/1, =>MM/*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.subsample^  sg    -1-?-?-G*5>sCS?f5g1G1l${{<+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_proposalsg  s8    KNyKcdKc7GxUYY12Kc	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_targetsm  s    ?9::'2'QGqL'233OPP737aHM7344PQQ==??g6g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  pU 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                  XU      5        Mg     U R                  R                  X5      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_samplesy  sv    	7#?9::!""1$$29:'QgJMM%(':*12'Qx['	2 )))>	  $??	U^_~~f-^
J'F+3 ) 12B CI#^,<=FN#/#78H#IL  ( 0 &&(A-$)KKe$S!##$566J$KL ( "^^223CO0BBB1 ;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[        XU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     XU4$ s  snf )Nr   r   r+   r   r   g{Gz?)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
iib1$**?A>&,,_a@	

*-oQ]*^&E6;//{CE \\+=F[[B'11&9F !QR%LEAqrE]FAqrE]F MM"a(E^^B'F^^B'F ;;v(9(99:1=D$)$Kvd|66E --edCD$)$Kvd|66E &&uffdooND1$112D$)$Kvd|66E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'pO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[        XX5      u  nnUUS
.nOQU R!                  XX#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        X4$ 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:##+??#&STUV]T^TdTdSe$fgg{((EKK7#&TUVW_U`UfUfTg$hii$$&&[>//5==@'*[\]^i\j\p\p[q(rss  ==BFB^B^_hBr?IV-?F!%L((lK}}\2'+'9'9,'G$02==~ !899!) !DEE,9,X^,s)O\)8,WF$($?$?^g$v!E66UJ:&!&q"()"() ' ==??289&Qaj&N9}}'$%VWW !^
!##% #J/F++fVnq&89!<C")))F*;C*@A$++L,@,EF 0
 $( !!- $ 2 28^\ Z $} ="11-@ GHHI}}?&6&>+BU$%jkk0781gJ829:'Qx['	:!.{NHV_aq!r(.9	/56v!!H+v60fE$'V$<LIq!*AgJ %= MM)$
 ""."".''36<!=f!G*f!=}} ^
%'"#% '$%WXX#J/F++fVnq&89!<C&--i.?.DE$++L,@,EF 0
 $(  $ 6 6xASUa b $ 2 23D E"556GHOM}}?&6&>$%qrr8?@1+@%6#%7GW&" "12D E"*.@.H$r  .DOUg-h*-0)V-T)M3%2AkN,/A() .U MM-(~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5f!$F
U$CL91@ <@TsELL()T %T 5c?+	T
 $tC$5678T 
tDell*+,d3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     sa         7 !)),,))LL)) )) U\\*	))
 5<<%&))X%,, U\\0B tELLGY :8@!H0$f    "=1@> *( _ _
2!H  $ryy r(   