
    QЦi                        S SK JrJrJrJr  S SKrS SKJs  Jr	  S SK
r
S SKJrJr  S SKJrJr  SSKJr  S rS rS	 rS
 rS rS r\R2                  R4                  S 5       rS rS rS rS rS r \R2                  RB                  S 5       r"S r#S r$S r%\R2                  R4                  S 5       r&SS jr' " S S\RP                  5      r)g)    )DictListOptionalTupleN)nnTensor)boxes	roi_align   )_utilsc                    [         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)
class_logitsbox_regressionlabelsregression_targetsclassification_losssampled_pos_inds_subset
labels_posNnum_classesbox_losss
             e/var/www/html/ai-image-ml/venv/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((    c                 ,   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 ech image

Returns:
    results (list[BoxList]): one BoxList for each image, containing
        the extra field mask
r   deviceNr   )sigmoidr   r   r   aranger.   split)xr!   	mask_prob	num_maskslabelboxes_per_imageindexs          r)   maskrcnn_inferencer8   4   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?   R   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_logitsr0   r.   )mask_logits	proposalsr;   	gt_labelsmask_matched_idxsdiscretization_sizegt_labelidxsr!   mpimask_targets	mask_losss                 r)   maskrcnn_lossrO   a   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   ).rQ   )floorlong)	keypointsr>   heatmap_sizeoffset_xoffset_yscale_xscale_yr2   yx_boundary_indsy_boundary_inds	valid_locvisvalidlin_indheatmapss                   r)   keypoints_to_heatmaprc      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   rQ   r   r         ?)r   scalar_tensorr   int64r   interpolateintr   argmaxtensorfloat32r:   onesr   stackr0   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_intr2   r[   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   rR   rf   r.   re   )r   zerosro   rr   r.   ranger   r   r   r:   	unsqueeze)rw   r>   widths_ceilheights_ceilwidthsheightsrW   rX   r   xy_preds
end_scoresrL   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   rQ   rR   minre   r   rg   Frh   r   r   rS   )rounding_moderk   r-   )clampceilr   torchvision_is_tracingr   r   rl   rm   permuter   lenrr   r.   r   ro   itemr   rn   r   rp   divfloatr0   )rw   r>   rW   rX   r   r   r   r   r   r   r   rL   ry   rz   r   r   r   r   r   r   r   r2   r[   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   re   )r   
ValueErrorrA   rc   appendrv   r   r   r:   uint8r   r   r   r   r   r   )keypoint_logitsrD   gt_keypointskeypoint_matched_idxsr&   KHWrG   rb   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   r1   rA   r   r   )r2   r	   kp_probs	kp_scoresboxr6   x2xxbbkp_probscoress              r)   keypointrcnn_inferencer   I  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
$ )NrQ   r   rk   rR   r   re   )r:   r   rr   rt   )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    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$ )NrQ   r   rk   rR   r   )r   r   r   r   
zeros_like)r	   r   r   r   r   r   r   s          r)   expand_boxesr   n  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      -  $ )NrQ   )r   rq   r:   rr   )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   rQ   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   rQ   r   rR   )r   r   r   r   bilinearFrh   r   )
ro   maxexpandr   rn   r   r   rf   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   re   rQ   r   rR   r   Frh   )r   rs   rm   r   r   r   r   r   r   rn   ro   r   r   r:   rr   )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_appendrL   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   re   r   r   r   )r   r   r:   r   rm   r   r   r   rl   rA   r   r   rt   	new_empty)r   r	   	img_shaper   r   r   r   rJ   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 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_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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   re   r   )rA   r   r.   r   r   r   rm   r  r  r  r   r:   BELOW_LOW_THRESHOLDBETWEEN_THRESHOLDSr   )r"  rD   gt_boxesrE   r<   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_proposals8  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  	enumeraterA   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)rA   r   r   )r"  rD   r5  proposalgt_boxs        r)   add_gt_proposalsRoIHeads.add_gt_proposalsd  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_targetsj  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 )NrS  r   r	   r!   )r   r   r   )rW  r   rf   r.   r:   rP  r?  rJ  r   r   r   r   r   r   r  encode)r"  rD   rU  rf   r.   rV  r5  rE   r<   r!   rE  matched_gt_boxes
num_imagesimg_idrI  r7  r"   s                    r)   select_training_samples RoIHeads.select_training_samplesv  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   softmaxr1   rA   r  clip_boxes_to_imager   r0   rv   	expand_asr   r   r  remove_small_boxesbatched_nmsr  r  r   )r"  r   r    rD   image_shapesr.   r'   boxes_in_imager6   
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!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 rU   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halfrf   	TypeErrorrm   r0  rr   trainingr^  r  r  r  r   r*   rt  r   r   r   r-  r   r  r  r  	ExceptionrO   r8   rA   updater  r   r!  r   r   )-r"  featuresrD   rh  rU  rV  floating_point_typesr<   r!   r"   box_featuresr   r    resultlossesrw  rx  r	   r   r\  rL   rK   mask_proposalspos_matched_idxsr]  r   mask_featuresrC   ry  r;   rE   rcnn_loss_maskrmasks_probsr3   keypoint_proposalskeypoint_featuresr   rz  r   rcnn_loss_keypointkeypoints_probsr   keypoint_probkpss-                                                r)   forwardRoIHeads.forward  s    (-U\\5::'N$z''+??#&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  )NNNNNNrM  )__name__
__module____qualname____firstlineno__r  r  r  r  __annotations__r  r-  r0  r?  rJ  rP  rW  r^  rt  r  __static_attributes____classcell__)r(  s   @r)   r  r    s}    ''%--"BBO, +15f!$F
U$CL91@ U Ur+   r  )r   )*typingr   r   r   r   r   torch.nn.functionalr   
functionalr   r   r   torchvision.opsr	   r  r
    r   r  r*   r8   r?   rO   rc   r   jit_script_if_tracingr   r   r   r   r   r   unusedr   r   r   r   r   r  Moduler   r+   r)   <module>r     s    . .      7 !%)P<8@!H0$f    "=1@> *( _ _
2!H  $@ryy @r+   