
    h                        d dl mZ d dlZd dlmc mZ d dlZd dlmZ d dlm	Z
mZ ddlmZ dej                  dej                  d	eej                     d
eej                     deej                  ej                  f   f
dZdej                  d	eej                     deej                     fdZd Zd Zd Zd Zej0                  j2                  d        Zd Zd Zd Zd Zd Zej0                  j@                  d        Z!d Z"d Z#d Z$ej0                  j2                  d        Z%d!dZ& G d d ejN                        Z(y)"    )OptionalN)nn)boxes	roi_align   )_utilsclass_logitsbox_regressionlabelsregression_targetsreturnc                    t        j                  |d      }t        j                  |d      }t        j                  | |      }t        j                  |dkD        d   }||   }| j
                  \  }}|j                  ||j                  d      dz  d      }t        j                  |||f   ||   dd      }	|	|j                         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)
r	   r
   r   r   classification_losssampled_pos_inds_subset
labels_posNnum_classesbox_losss
             d/var/www/html/eduruby.in/venv/lib/python3.12/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.
:;23	H &,,.(H((    xc                 4   | j                         }| j                  d   }|D cg c]  }|j                  d    }}t        j                  |      }t        j                  ||j
                        }|||f   dddf   }|j                  |d      }|S c c}w )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:%u{{1~:O:YYvFLL6==9E%-(D1IQ7I ;s   Bc                     |j                  |      }t        j                  |dddf   |gd      }| dddf   j                  |      } 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_boxesr<   U   sg      ??5)L99l1d7+U3;D4 ##D)HXtaVS1!Q$77r(   c                    | j                   d   }t        ||      D cg c]
  \  }}||    }}}t        |||      D 	
cg c]  \  }	}
}t        |	|
||       }}
}	}t        j                  |d      }t        j                  |d      }|j                         dk(  r| j                         dz  S t        j                  | t        j                  |j                   d   |j                        |f   |      }|S c c}}w c c}}
}	w )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/36yBS3TU4htnUFULOPXZcevLw AHAqq!Q(;<L  YYv1%F99\q1L q  1$$22ELLaGOPR^I ! Vs   C<Dc                 d   |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  }|j                         j                         }||z
  |z  }|j                         j                         }|dz
  ||	<   |dz
  ||
<   |dk\  |dk\  z  ||k  z  ||k  z  }| d   dkD  }||z  j                         }||z  |z   }||z  }||fS )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d1a4j41:56Gd1a4j41:56G4 H4 HagGagG&A&A41:ag..O41:ag..O	
X A		A	
X A		A%)Ao%)AoaAF#q<'78A<LMI
F
a
C_""$E,"GHU?r(   c                    t        j                  | j                  d      t         j                        }||z  }	||z  }
t	        j
                  |d d d f   t        |      t        |      fdd      d d df   }t        j                  |j                  d      t         j                        }|j                  |d      j                  d	      }||z  }||z
  |z  }t        j                  d
t         j                        |j                  t         j                        z   |	j                  t         j                        z  }t        j                  d
t         j                        |j                  t         j                        z   |
j                  t         j                        z  }||j                  t         j                        z   }||j                  t         j                        z   }t        j                  |j                  t         j                        }t        j                  |j                  t         j                        |j                  t         j                        |j                  t         j                        gd      }||z  |z   dz   }t        j                  |      }|j                  t         j                        |z  }|j!                  d|j                  t         j                              j!                  d|j                  t         j                              j#                  d      j!                  d|j                  t         j                              }||fS )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-/!N2mmq$ws>2C4FGigldG 	GLLO5;;?A
//-
,
3
3
3
:C!GE5[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	                 (   t        j                  ddt        |      ft         j                  | j                        }	t        j                  dt        |      ft         j                  | j                        }
t        t        |j                  d                  D ]  }t        | | |   ||   ||   ||   ||   ||   ||         \  }}t        j                  |	j                  t         j                        |j                  d      j                  t         j                        fd      }	t        j                  |
j                  t         j                        |j                  t         j                        j                  d      fd      }
 |	|
fS )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      sO    {{Aq#m"45U]]SWS^S^_Ha]!34EMMRVR]R]^J3tyy|$% 
#>$q';q><?F1IwqzS[\]S^`hij`k$
 
L 99hkkk>
@T@TUV@W@Z@Zafanan@Z@oprstYY]]]/u}}1U1_1_`a1bcef


 Zr(   c                    |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
  }|j                  d      }|j                  d      }|j                         }|j                         }| j                  d   }t        j                         rNt        | |||||||t        j                  |t        j                        	      \  }	}
|	j                  ddd      |
fS t        j                  t        |      d|ft        j                  | j                        }	t        j                  t        |      |ft        j                  | j                        }
t        t        |            D ]L  }t        ||   j!                               }t        ||   j!                               }||   |z  }||   |z  }t#        j$                  | |   dddf   ||fd	d
      dddf   }|j                  d   }|j'                  |d      j)                  d      }||z  }t        j*                  ||z
  |d      }|j-                         dz   |z  }|j-                         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<   O |	j                  ddd      |
fS )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 eKN//12\!_1134!!9}4#AJ7--GAtGNM#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
1a4+e. Aq!$j00r(   c                    | j                   \  }}}}||k7  rt        d| d|       |}g }	g }
t        |||      D ][  \  }}}||   }t        |||      \  }}|	j	                  |j                  d             |
j	                  |j                  d             ] t        j                  |	d      }t        j                  |
d      j                  t        j                        }
t        j                  |
      d   }
|j                         dk(  st        |
      dk(  r| j                         dz  S | j                  ||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   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   -  st    &&JAq!QAvmnomppyz{y|}
 	
 HE58LRg5h /1^TD!.B2GZ\o.p+O*//34_))"-.	/ yyq1IIe#&&U[[&9EKKq!E 1$E
a""$q((%**1q5!a%8OOOOE$:<LU<STMr(   c                    g }g }|D cg c]  }|j                  d       }}| j                  |d      }t        ||      D ]6  \  }}t        ||      \  }	}
|j	                  |	       |j	                  |
       8 ||fS c c}w )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4ssxx{4O4	
a	(Bb%. !B/B7  !
 Y 5s   A?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  }|j                  t        j                        |z  }|j                  t        j                        |z  }||z
  }||z
  }||z   }||z   }	t        j                  ||||	fd      }
|
S )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vJvJvJvJZZLaPI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 )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
eOF
eOF  'IFlIadOFlIadOFlIadOFlIadOr(   c                     t        j                  | d|z  z         j                  t         j                        t        j                  |       j                  t         j                        z  S )NrN   )r   rn   r7   ro   )r:   paddings     r&   expand_masks_tracing_scaler     sI     <<AK(++EMM:U\\!_=O=OPUP]P]=^^^r(   c                     | j                   d   }t        j                  j                         rt	        ||      }nt        |d|z  z         |z  }t        j                  | |fdz        }||fS )Nr   rN   r   )r   r   _C_get_tracing_stater   r   r   pad)maskr   r:   r   padded_masks        r&   expand_masksr     sc    

2Axx""$*1g6a!g+o&*%%wj1n-Kr(   c                 6   d}t        |d   |d   z
  |z         }t        |d   |d   z
  |z         }t        |d      }t        |d      }| j                  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   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     sD   ICFSVOi'(ACFSVOi'(AAq	AAq	A ;;~&D ==QF5QD71:Dkk4,djjMG
c!fa.C
c!fqj$
C
c!fa.C
c!fqj$
C $cCFlsSV|%DsSQRV|X[^abc^dXdFe%e fGCGSWNr(   c                    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            }| j                  dd| j                  d      | j                  d      f      } t        j                  | t        |      t        |      fdd      } | d   d   } t        j                  t        j
                  |d   j                  d      |f            }t        j                  t        j
                  |d   j                  d      |z   |j                  d      f            }	t        j                  t        j
                  |d   j                  d      |f            }
t        j                  t        j
                  |d   j                  d      |z   |j                  d      f            }| |
|d   z
  ||d   z
  ||d   z
  |	|d   z
  f   }t        j                  |
|j                  d            }t        j                  ||z
  |j                  d            }t        j
                  ||j                  t         j                        |fd      d|d d f   }t        j                  |j                  d      |      }t        j                  |j                  d      ||	z
        }t        j
                  |||fd      d d d |f   }|S )	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		%))QH%&A		%))QH%&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C#a&LS3q6\:S3q6\cTWXYTZl<[[\O
 {{3 4 4Q 78H{{4#:';';A'>?Hyy(O$6$6U]]$6$KXVXYZ[\]a[acd[deH{{8==+S1H{{8==+TCZ8Hii8X6:1ete8DGNr(   c                     t        j                  d||      }t        | j                  d            D ]A  }t	        | |   d   ||   ||      }|j                  d      }t        j                  ||f      }C |S Nr   )r   r   r   r   r   r   r   )masksr   r   r   
res_appendrI   mask_ress          r&   _onnx_paste_masks_in_image_loopr     sw    Qd+J5::a=! 7,U1Xa[%(D$O%%a(YY
H56
7 r(   c           
      N   t        | |      \  } }t        ||      j                  t        j                        }|\  }}t        j                         r[t        | |t        j                  |t        j                        t        j                  |t        j                              d d d f   S t        | |      D cg c]  \  }}t        |d   |||       }	}}t        |	      dkD  r t        j                  |	d      d d d f   }
|
S | j                  dd||f      }
|
S c c}}w )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   w7LE5&)))<EJD$ .5%--d%++FH[H[\`hmhshsHt

T' 	 ADE5@Q
R1qtQd3
RC
R
3x!|kk#1%ag. J ooq!T401J Ss   >D!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eeej(                  f   deej(                     deeeef      deeeeej(                  f         deeeeej(                  f      eeej(                  f   f   f
dZ xZS )RoIHeads)	box_coderproposal_matcherfg_bg_samplerc                    t         |           t        j                  | _        t        j                  ||d      | _        t        j                  ||      | _	        |d}t        j                  |      | _        || _        || _        || _        |	| _        |
| _        || _        || _        || _        || _        || _        || _        || _        y )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    . 	%oo ) 1 1-jo p&FFG[]no#5"++,<=( *($"4*",!2*"4r(   c                 R    | j                   y| j                  y| j                  yyNFT)r  r  r  r  s    r&   has_maskzRoIHeads.has_mask)  s0    %>>!&r(   c                 R    | j                   y| j                  y| j                  yyr'  )r  r  r  r(  s    r&   has_keypointzRoIHeads.has_keypoint2  s2    !!)%""*r(   c                    g }g }t        |||      D ]K  \  }}}|j                         dk(  ru|j                  }	t        j                  |j
                  d   ft        j                  |	      }
t        j                  |j
                  d   ft        j                  |	      }nt        j                  ||      }| j                  |      }|j                  d      }
||
   }|j                  t        j                        }|| j                  j                  k(  }d||<   || j                  j                  k(  }d||<   |j                  |
       |j                  |       N ||fS )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_proposalsz$RoIHeads.assign_targets_to_proposals;  si   ILYX`bkIl 	+E 13E &&(A-+2205'--a02%++f1- #(++/A/G/G/J.LTYT_T_hn"o (/7HJ\']$(,(=(=>R(S%0E0K0KPQ0K0R-"45R"S"1"4"45;;"4"G 043H3H3\3\\+,( 4t7L7L7_7__/1, =>MM/*9	+: V##r(   c                     | j                  |      \  }}g }t        t        ||            D ]4  \  }\  }}t        j                  ||z        d   }|j                  |       6 |S 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&   	subsamplezRoIHeads.subsample^  su    -1-?-?-G**5>sCSUe?f5g 	21G1lL${{<,+FGJ 01	2 r(   c                 x    t        ||      D cg c]  \  }}t        j                  ||f       }}}|S c c}}w N)r>   r   r   )r  rA   r/  proposalgt_boxs        r&   add_gt_proposalszRoIHeads.add_gt_proposalsg  s<    KNyZbKcd7GxUYY&12d	d es   !6c                 B   |t        d      t        |D cg c]  }d|v  c}      st        d      t        |D cg c]  }d|v  c}      st        d      | j                         r't        |D cg c]  }d|v  c}      st        d      y y c c}w c c}w c c}w )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_targetszRoIHeads.check_targetsm  s    ?9::'2QGqL23OPP73aHM34PQQ==?g6167 !STT 8 	 33 7s   BB3Bc                    | j                  |       |t        d      |d   j                  }|d   j                  }|D cg c]  }|d   j	                  |       }}|D cg c]  }|d   	 }}| j                  ||      }| j                  |||      \  }}	| j                  |	      }
g }t        |      }t        |      D ]o  }|
|   }||   |   ||<   |	|   |   |	|<   ||   |   ||<   ||   }|j                         dk(  rt        j                  d||      }|j                  |||             q | j                  j                  ||      }|||	|fS c c}w c c}w )NrJ  r   r   r   )r   r   r   )rN  r   rc   r,   r7   rH  r9  rC  r   r   r   r   r   r   r  encode)r  rA   rL  rc   r,   rM  r/  rB   r9   r   r>  matched_gt_boxes
num_imagesimg_idrB  r1  r   s                    r&   select_training_samplesz RoIHeads.select_training_samplesy  s    	7#?9::!""1$$29:QAgJMM%(::*12QQx[2	2 )))X>	  $??	8U^_f~~f-^
J' 		MF+F3 )& 12B CIf#F^,<=F6N#/#78H#IL  ( 0 &&(A-$)KKeF$S!##$5l66J$KL		M "^^223CYO,0BBB1 ;2s   E"Ec                 L   |j                   }|j                  d   }|D cg c]  }|j                  d    }}| j                  j                  ||      }	t	        j
                  |d      }
|	j                  |d      }|
j                  |d      }g }g }g }t        |||      D ]w  \  }}}t        j                  ||      }t        j                  ||      }|j                  dd      j                  |      }|d d dd f   }|d d dd f   }|d d dd f   }|j                  dd      }|j                  d      }|j                  d      }t        j                  || j                   kD        d   }||   ||   ||   }}}t        j"                  |d      }||   ||   ||   }}}t        j$                  |||| j&                        }|d | j(                   }||   ||   ||   }}}|j+                  |       |j+                  |       |j+                  |       z |||fS c c}w )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_detectionszRoIHeads.postprocess_detections  sD    $$"((,IRS~>//2SS^^**>9E
iib1$**?A>&,,_a@	

*-o?OQ]*^ !	&&E6;//{CE \\+f=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   r]  rL  r   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                         | j                         s|d   j                  t         j                  k(  rt        d|d   j                          | j                  r| j                  ||      \  }}}}	nd}d}	d}| j                  |||      }
| j                  |
      }
| j                  |
      \  }}g }i }| j                  r1|t        d      |	t        d	      t        ||||	      \  }}||d
}nQ| j!                  ||||      \  }}}t#        |      }t%        |      D ]   }|j'                  ||   ||   ||   d       " | j)                         r|D cg c]  }|d   	 }}| j                  ry|t        d      t#        |      }g }g }t%        |      D ]N  }t        j*                  ||   dkD        d   }|j'                  ||   |          |j'                  ||   |          P nd}| j,                  6| j-                  |||      }| j/                  |      }| j1                  |      }nt3        d      i }| j                  rI|||t        d      |D cg c]  }|d   	 }}|D cg c]  }|d   	 }}t5        |||||      }d|i}n7|D  cg c]  } | d   	 }} t7        ||      }!t9        |!|      D ]
  \  }"} |"| d<    |j;                  |       | j<                  y| j>                  l| j@                  _|D cg c]  }|d   	 }#}| j                  ryt#        |      }g }#g }|t        d      t%        |      D ]N  }t        j*                  ||   dkD        d   }|#j'                  ||   |          |j'                  ||   |          P nd}| j=                  ||#|      }$| j?                  |$      }$| jA                  |$      }%i }&| j                  r4||t        d      |D cg c]  }|d   	 }'}tC        |%|#|'|      }(d|(i}&n>|%|#t        d      tE        |%|#      \  })}*t9        |)|*|      D ]  \  }+},} |+| d<   |,| d<    |j;                  |&       ||fS c c}w c c}w c c}w c c} w c c}w c c}w )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   trainingrT  r  r  r  r   r'   ri  r   r   r   r)  r   r  r  r  	ExceptionrL   r5   r>   updater  r  r  r   r   )-r  rj  rA   r]  rL  rM  floating_point_typesr9   r   r   box_featuresr	   r
   resultlossesrl  rm  r   r   rR  rI   rH   mask_proposalspos_matched_idxsrS  r   mask_featuresr@   rn  r8   rB   rcnn_loss_maskrmasks_probsr0   keypoint_proposalskeypoint_featuresr   ro  r   rcnn_loss_keypointkeypoints_probsr   keypoint_probkpss-                                                r&   forwardzRoIHeads.forward  s     	t(-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	t ==BFB^B^_hjqBr?I|V-?F!%L((9lK}}\2'+'9'9,'G$n02==~ !899!) !DEE,9,X^`r,s)O\)8,WF$($?$?n^giu$v!E66UJ:& !&q"()"() ==?289Qaj9N9}}'$%VWW !^
!##% #J/ GF++fVnq&89!<C")))F*;C*@A$++L,@,EFG
 $( !!- $ 2 28^\ Z $} ="11-@ GHHI}}?&6&>+BU$%jkk0781AgJ8829:QQx[:	:!.{NHV_aq!r(.9	/56!!H+660fE$'V$< +LIq!*AgJ+ MM)$
 ""."".''36<!=!G*!=!=}} ^
%'"#% '$%WXX#J/ GF++fVnq&89!<C&--i.?.DE$++L,@,EFG
 $(  $ 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 0)M3%2AkN,/A()0 MM-(v~s :8 9: 7 ">2  As$   5T :TT
2T!TT)NNNNNNrE  )__name__
__module____qualname__r  r  r  r  __annotations__r  r)  r+  r9  rC  rH  rN  rT  ri  dictstrr   Tensorlisttuplerl   r   r  __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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(   