
    kh                        d dl mZmZmZmZ d dlZd dlmc mZ	 d dl
Z
d dlmZmZ d dlmZmZ ddlmZ d Zd Zd	 Zd
 Zd Zd Zej2                  j4                  d        Zd Zd Zd Zd Zd Z ej2                  jB                  d        Z"d Z#d Z$d Z%ej2                  j4                  d        Z&ddZ' G d dejP                        Z)y)    )DictListOptionalTupleN)nnTensor)boxes	roi_align   )_utilsc                    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)
class_logitsbox_regressionlabelsregression_targetsclassification_losssampled_pos_inds_subset
labels_posNnum_classesbox_losss
             b/var/www/teggl/fontify/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((    c                 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 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:%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?   R   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_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/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   ).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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   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-/!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   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      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   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 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   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   *  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   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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 )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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 )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
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 )NrQ   )r   rq   r:   rr   )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   rQ   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   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     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   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		%))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_appendrL   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   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   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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_keypoint/  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   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_proposalsz$RoIHeads.assign_targets_to_proposals8  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  	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)   	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)rA   r   r   )r"  rD   r2  proposalgt_boxs        r)   add_gt_proposalszRoIHeads.add_gt_proposalsd  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_targetsj  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 )NrM  r   r	   r!   )r   r   r   )rQ  r   rf   r.   r:   rK  r<  rF  r   r   r   r   r   r   r  encode)r"  rD   rO  rf   r.   rP  r2  rE   r<   r!   rA  matched_gt_boxes
num_imagesimg_idrE  r4  r"   s                    r)   select_training_samplesz RoIHeads.select_training_samplesv  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   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_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!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 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   r.  rr   trainingrW  r  r  r  r   r*   rl  r   r   r   r,  r   r  r  r  	ExceptionrO   r8   rA   updater  r   r!  r   r   )-r"  featuresrD   r`  rO  rP  floating_point_typesr<   r!   r"   box_featuresr   r    resultlossesrn  ro  r	   r   rU  rL   rK   mask_proposalspos_matched_idxsrV  r   mask_featuresrC   rp  r;   rE   rcnn_loss_maskrmasks_probsr3   keypoint_proposalskeypoint_featuresr   rq  r   rcnn_loss_keypointkeypoints_probsr   keypoint_probkpss-                                                r)   forwardzRoIHeads.forward  s     	t(-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	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)NNNNNNrH  )__name__
__module____qualname__r  r  r  r  __annotations__r  r,  r.  r<  rF  rK  rQ  rW  rl  r  __classcell__)r(  s   @r)   r  r    sw    ''%--"BBO, +15f!$F
U$CL91@ 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+   