ó
    EñiÊ=  ã                   ó"  • S SK Jr  S SKrS SKJrJr  S SKJr  S SKJ	r
Jr  SSKJr  SSKJr  SS	KJr   " S
 S\R&                  5      rS\S\S\S\S\S\S\4S jrS\\   S\\   S\\\4   4S jr " S S\R                  R&                  5      rg)é    )ÚOptionalN)ÚnnÚTensor)Ú
functional)ÚboxesÚConv2dNormActivationé   )Ú_utils)ÚAnchorGenerator)Ú	ImageListc                   ó~   ^ • \ rS rSrSrSrSS\S\SS4U 4S jjjrU 4S	 jrS
\	\
   S\\	\
   \	\
   4   4S jrSrU =r$ )ÚRPNHeadé   z÷
Adds a simple RPN Head with classification and regression heads

Args:
    in_channels (int): number of channels of the input feature
    num_anchors (int): number of anchors to be predicted
    conv_depth (int, optional): number of convolutions
é   Úin_channelsÚnum_anchorsÚreturnNc           
      óz  >• [         TU ]  5         / n[        U5       H  nUR                  [	        XSS S95        M     [
        R                  " U6 U l        [
        R                  " XSSS9U l	        [
        R                  " XS-  SSS9U l
        U R                  5        H™  n[        U[
        R                  5      (       d  M$  [        R
                  R                  R                  UR                   SS9  UR"                  c  Me  [        R
                  R                  R%                  UR"                  S5        M›     g )	Né   )Úkernel_sizeÚ
norm_layerr	   )r   Ústrideé   g{®Gáz„?)Ústdr   )ÚsuperÚ__init__ÚrangeÚappendr   r   Ú
SequentialÚconvÚConv2dÚ
cls_logitsÚ	bbox_predÚmodulesÚ
isinstanceÚtorchÚinitÚnormal_ÚweightÚbiasÚ	constant_)Úselfr   r   Ú
conv_depthÚconvsÚ_ÚlayerÚ	__class__s          €Ú]/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torchvision/models/detection/rpn.pyr   ÚRPNHead.__init__   sÞ   ø€ Ü‰ÑÔØˆÜ�zÖ"ˆAØ�L‰LÔ-¨kÐTUÐbfÑgÖhñ #ä—M’M 5Ð)ˆŒ	ÜŸ)š) KÈ!ÐTUÑVˆŒÜŸš ;¸a±ÈQÐWXÑYˆŒà—\‘\–^ˆEÜ˜%¤§¡×+Ó+Ü—‘—‘×%Ñ% e§l¡l¸Ð%Ñ=Ø—:‘:Ó)Ü—H‘H—M‘M×+Ñ+¨E¯J©J¸Ö:ò	 $ó    c           	      óÈ   >• UR                  SS 5      nUb  US:  a1  S H+  n	U SU	 3n
U SU	 3nX¡;   d  M  UR                  U
5      X'   M-     [        TU ]  UUUUUUU5        g )NÚversionr   )r)   r*   zconv.z	conv.0.0.)ÚgetÚpopr   Ú_load_from_state_dict)r,   Ú
state_dictÚprefixÚlocal_metadataÚstrictÚmissing_keysÚunexpected_keysÚ
error_msgsr6   ÚtypeÚold_keyÚnew_keyr1   s               €r2   r9   ÚRPNHead._load_from_state_dict*   s‡   ø€ ð !×$Ñ$ Y°Ó5ˆà‰?˜g¨›kÛ*�Ø#˜H E¨$¨Ð0�Ø#˜H I¨d¨VÐ4�ØÕ(Ø*4¯.©.¸Ó*A�JÓ'ñ	 +ô 	‰Ñ%ØØØØØØØõ	
r4   Úxc                 óÄ   • / n/ nU HT  nU R                  U5      nUR                  U R                  U5      5        UR                  U R                  U5      5        MV     X#4$ ©N)r    r   r"   r#   )r,   rE   ÚlogitsÚbbox_regÚfeatureÚts         r2   ÚforwardÚRPNHead.forwardG   sY   € ØˆØˆÛˆGØ—	‘	˜'Ó"ˆAØ�M‰M˜$Ÿ/™/¨!Ó,Ô-Ø�O‰O˜DŸN™N¨1Ó-Ö.ñ ð ÐÐr4   )r#   r"   r    )r	   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú_versionÚintr   r9   Úlistr   ÚtuplerL   Ú__static_attributes__Ú__classcell__©r1   s   @r2   r   r      sa   ø† ñð €Hñ; Cð ;°cð ;ÈD÷ ;ð ;õ
ð: ˜˜f™ð  ¨%°°V±¸dÀ6¹lÐ0JÑ*K÷  ò  r4   r   r0   ÚNÚAÚCÚHÚWr   c                 ó~   • U R                  USX4U5      n U R                  SSSSS5      n U R                  USU5      n U $ )Néÿÿÿÿr   r   r   r	   r   )ÚviewÚpermuteÚreshape)r0   rZ   r[   r\   r]   r^   s         r2   Úpermute_and_flattenrd   Q   sC   € Ø�J‰J�q˜"˜a AÓ&€EØ�M‰M˜!˜Q  1 aÓ(€EØ�M‰M˜!˜R Ó#€EØ€Lr4   Úbox_clsÚbox_regressionc           	      ó”  • / n/ n[        X5       Hi  u  pEUR                  u  pgp‰UR                  S   n
U
S-  nX{-  n[        XFX¼X‰5      nUR                  U5        [        XVUSX‰5      nUR                  U5        Mk     [        R
                  " USS9R                  SS5      n [        R
                  " USS9R                  SS5      nX4$ )Nr	   r   ©Údimr   éþÿÿÿr`   )ÚzipÚshaperd   r   r&   ÚcatÚflattenrc   )re   rf   Úbox_cls_flattenedÚbox_regression_flattenedÚbox_cls_per_levelÚbox_regression_per_levelrZ   ÚAxCr]   r^   ÚAx4r[   r\   s                r2   Úconcat_box_prediction_layersru   X   sÝ   € ØÐØ!Ðô
 8;¸7Ö7SÑ3ÐØ(×.Ñ.‰ˆ�Ø&×,Ñ,¨QÑ/ˆØ�1‰HˆØ‰HˆÜ/Ð0AÀaÈAÓQÐØ× Ñ Ð!2Ô3ä#6Ð7OÐTUÐWXÐZ[Ó#_Ð Ø ×'Ñ'Ð(@ÖAñ 8Tô �iŠiÐ)¨qÑ1×9Ñ9¸!¸RÓ@€GÜ—Y’YÐ7¸QÑ?×GÑGÈÈAÓN€NØÐ"Ð"r4   c                   ó$  ^ • \ rS rSrSr\R                  \R                  \R                  S.r	 S$S\
S\R                  S\S\S\S	\S
\\\4   S\\\4   S\S\SS4U 4S jjjrS\4S jrS\4S jrS\\   S\\\\4      S\\\   \\   4   4S jrS\S\\   S\4S jrS\S\S\\\\4      S\\   S\\\   \\   4   4
S jrS\S\S\\   S\\   S\\\4   4
S jr S%S \S!\\\4   S\\\\\4         S\\\   \\\4   4   4S" jjrS#rU =r$ )&ÚRegionProposalNetworkéq   aw  
Implements Region Proposal Network (RPN).

Args:
    anchor_generator (AnchorGenerator): module that generates the anchors for a set of feature
        maps.
    head (nn.Module): module that computes the objectness and regression deltas
    fg_iou_thresh (float): minimum IoU between the anchor and the GT box so that they can be
        considered as positive during training of the RPN.
    bg_iou_thresh (float): maximum IoU between the anchor and the GT box so that they can be
        considered as negative during training of the RPN.
    batch_size_per_image (int): number of anchors that are sampled during training of the RPN
        for computing the loss
    positive_fraction (float): proportion of positive anchors in a mini-batch during training
        of the RPN
    pre_nms_top_n (Dict[str, int]): number of proposals to keep before applying NMS. It should
        contain two fields: training and testing, to allow for different values depending
        on training or evaluation
    post_nms_top_n (Dict[str, int]): number of proposals to keep after applying NMS. It should
        contain two fields: training and testing, to allow for different values depending
        on training or evaluation
    nms_thresh (float): NMS threshold used for postprocessing the RPN proposals
    score_thresh (float): only return proposals with an objectness score greater than score_thresh

)Ú	box_coderÚproposal_matcherÚfg_bg_samplerÚanchor_generatorÚheadÚfg_iou_threshÚbg_iou_threshÚbatch_size_per_imageÚpositive_fractionÚpre_nms_top_nÚpost_nms_top_nÚ
nms_threshÚscore_threshr   Nc                 ó@  >• [         TU ]  5         Xl        X l        [        R
                  " SS9U l        [        R                  U l	        [        R                  " UUSS9U l        [        R                  " XV5      U l        Xpl        X€l        X�l        X l        SU l        g )N)ç      ð?r‡   r‡   r‡   )ÚweightsT)Úallow_low_quality_matchesgü©ñÒMbP?)r   r   r|   r}   Ú	det_utilsÚBoxCoderry   Úbox_opsÚbox_iouÚbox_similarityÚMatcherrz   ÚBalancedPositiveNegativeSamplerr{   Ú_pre_nms_top_nÚ_post_nms_top_nr„   r…   Úmin_size)r,   r|   r}   r~   r   r€   r�   r‚   rƒ   r„   r…   r1   s              €r2   r   ÚRegionProposalNetwork.__init__’   sŒ   ø€ ô 	‰ÑÔØ 0ÔØŒ	Ü"×+Ò+Ð4HÑIˆŒô &Ÿo™oˆÔä )× 1Ò 1ØØØ&*ñ!
ˆÔô '×FÒFÐG[ÓoˆÔà+ÔØ-ÔØ$ŒØ(ÔØˆ�r4   c                 ó`   • U R                   (       a  U R                  S   $ U R                  S   $ ©NÚtrainingÚtesting)r—   r‘   ©r,   s    r2   r‚   Ú#RegionProposalNetwork.pre_nms_top_n·   s+   € Ø�=�=Ø×&Ñ& zÑ2Ð2Ø×"Ñ" 9Ñ-Ð-r4   c                 ó`   • U R                   (       a  U R                  S   $ U R                  S   $ r–   )r—   r’   r™   s    r2   rƒ   Ú$RegionProposalNetwork.post_nms_top_n¼   s+   € Ø�=�=Ø×'Ñ'¨
Ñ3Ð3Ø×#Ñ# IÑ.Ð.r4   ÚanchorsÚtargetsc                 ó¦  • / n/ n[        X5       GH;  u  pVUS   nUR                  5       S:X  am  UR                  n[        R                  " UR
                  [        R                  US9n	[        R                  " UR
                  S   4[        R                  US9n
O�U R                  Xu5      nU R                  U5      nX|R                  SS9   n	US:¬  n
U
R                  [        R                  S9n
XÀR                  R                  :H  nSX­'   XÀR                  R                  :H  nSX®'   UR                  U
5        UR                  U	5        GM>     X44$ )Nr   r   ©ÚdtypeÚdevice)Úmin)r¡   ç        g      ð¿)rk   Únumelr¢   r&   Úzerosrl   Úfloat32rŽ   rz   ÚclampÚtoÚBELOW_LOW_THRESHOLDÚBETWEEN_THRESHOLDSr   )r,   r�   rž   ÚlabelsÚmatched_gt_boxesÚanchors_per_imageÚtargets_per_imageÚgt_boxesr¢   Úmatched_gt_boxes_per_imageÚlabels_per_imageÚmatch_quality_matrixÚmatched_idxsÚ
bg_indicesÚinds_to_discards                  r2   Úassign_targets_to_anchorsÚ/RegionProposalNetwork.assign_targets_to_anchorsÁ   sV  € ð ˆØÐÜ47¸×4IÑ0ÐØ(¨Ñ1ˆHà�~‰~Ó 1Ó$à*×1Ñ1�Ü-2¯[ª[Ð9J×9PÑ9PÔX]×XeÑXeÐntÑ-uÐ*Ü#(§;¢;Ð0A×0GÑ0GÈÑ0JÐ/LÔTY×TaÑTaÐjpÑ#qÑ à'+×':Ñ':¸8Ó'WÐ$Ø#×4Ñ4Ð5IÓJ�ð
 .6×6HÑ6HÈQÐ6HÐ6OÑ-PÐ*à#/°1Ñ#4Ð Ø#3×#6Ñ#6¼U¿]¹]Ð#6Ð#KÐ ð *×-BÑ-B×-VÑ-VÑV�
Ø/2Ð Ñ,ð #/×2GÑ2G×2ZÑ2ZÑ"Z�Ø48Ð Ñ1à�M‰MÐ*Ô+Ø×#Ñ#Ð$>×?ñ; 5Jð< Ð'Ð'r4   Ú
objectnessÚnum_anchors_per_levelc                 ó   • / nSnUR                  US5       H`  nUR                  S   n[        R                  " XPR	                  5       S5      nUR                  USS9u  p‰UR                  X”-   5        XF-  nMb     [        R                  " USS9$ )Nr   r	   rh   )	Úsplitrl   rŠ   Ú	_topk_minr‚   Útopkr   r&   rm   )
r,   r¹   rº   ÚrÚoffsetÚobr   r‚   r/   Ú	top_n_idxs
             r2   Ú_get_top_n_idxÚ$RegionProposalNetwork._get_top_n_idxç   sŠ   € ØˆØˆØ×"Ñ"Ð#8¸!Ö<ˆBØŸ(™( 1™+ˆKÜ%×/Ò/°×4FÑ4FÓ4HÈ!ÓLˆMØŸ7™7 =°a˜7Ð8‰LˆAØ�H‰H�YÑ'Ô(ØÑ!ŠFñ =ô �yŠy˜ Ñ"Ð"r4   Ú	proposalsÚimage_shapesc                 ó$  • UR                   S   nUR                  nUR                  5       nUR                  US5      n[	        U5       VVs/ s H+  u  px[
        R                  " U4U[
        R                  US9PM-     n	nn[
        R                  " U	S5      n	U	R                  SS5      R                  U5      n	U R                  X$5      n
[
        R                  " XVS9nUS S 2S 4   nX,U
4   nXœU
4   n	XU
4   n[
        R                  " U5      n/ n/ n[        XX“5       Hæ  u  nnnn[        R                  " UU5      n[        R                   " UU R"                  5      nUU   UU   UU   nnn[
        R$                  " UU R&                  :¬  5      S   nUU   UU   UU   nnn[        R(                  " UUUU R*                  5      nUS U R-                  5        nUU   UU   nnUR/                  U5        UR/                  U5        Mè     Xï4$ s  snnf )Nr   r`   r    r	   )r¢   )rl   r¢   Údetachrc   Ú	enumerater&   ÚfullÚint64rm   Ú	expand_asrÃ   ÚarangeÚsigmoidrk   rŒ   Úclip_boxes_to_imageÚremove_small_boxesr“   Úwherer…   Úbatched_nmsr„   rƒ   r   )r,   rÅ   r¹   rÆ   rº   Ú
num_imagesr¢   ÚidxÚnÚlevelsrÂ   Úimage_rangeÚ	batch_idxÚobjectness_probÚfinal_boxesÚfinal_scoresr   ÚscoresÚlvlÚ	img_shapeÚkeeps                        r2   Úfilter_proposalsÚ&RegionProposalNetwork.filter_proposalsò   s  € ð —_‘_ QÑ'ˆ
Ø×!Ñ!ˆà×&Ñ&Ó(ˆ
Ø×'Ñ'¨
°BÓ7ˆ
ô S\Ð\qÔRrô
ÚRrÉÈŒE�JŠJ˜�t˜S¬¯©¸FÔCÑRrð 	ñ 
ô —’˜6 1Ó%ˆØ—‘  2Ó&×0Ñ0°Ó<ˆð ×'Ñ'¨
ÓJˆ	ä—l’l :Ñ=ˆØ¢ 4 Ñ(ˆ	à¨9Ð 4Ñ5ˆ
Ø 9Ð,Ñ-ˆØ¨Ð2Ñ3ˆ	äŸ-š-¨
Ó3ˆàˆØˆÜ-0°ÈVÖ-bÑ)ˆE�6˜3 	Ü×/Ò/°°yÓAˆEô ×-Ò-¨e°T·]±]ÓCˆDØ!& t¡¨f°T©l¸CÀ¹I˜3�6ˆEô —;’;˜v¨×):Ñ):Ñ:Ó;¸AÑ>ˆDØ!& t¡¨f°T©l¸CÀ¹I˜3�6ˆEô ×&Ò& u¨f°c¸4¿?¹?ÓKˆDð Ð/˜$×-Ñ-Ó/Ð0ˆDØ! $™K¨°©�6ˆEà×Ñ˜uÔ%Ø×Ñ Ö'ñ) .cð* Ð(Ð(ùóS
s   Á2HÚpred_bbox_deltasr¬   Úregression_targetsc                 ó  • U R                  U5      u  pV[        R                  " [        R                  " USS95      S   n[        R                  " [        R                  " USS95      S   n[        R                  " XV/SS9nUR	                  5       n[        R                  " USS9n[        R                  " USS9n[
        R                  " X%   XE   SSS9UR                  5       -  n[
        R                  " X   X7   5      n	X˜4$ )zº
Args:
    objectness (Tensor)
    pred_bbox_deltas (Tensor)
    labels (List[Tensor])
    regression_targets (List[Tensor])

Returns:
    objectness_loss (Tensor)
    box_loss (Tensor)
r   rh   gÇqÇq¼?Úsum)ÚbetaÚ	reduction)	r{   r&   rÑ   rm   rn   ÚFÚsmooth_l1_lossr¥   Ú binary_cross_entropy_with_logits)
r,   r¹   râ   r¬   rã   Úsampled_pos_indsÚsampled_neg_indsÚsampled_indsÚbox_lossÚobjectness_losss
             r2   Úcompute_lossÚ"RegionProposalNetwork.compute_loss+  sõ   € ð .2×-?Ñ-?ÀÓ-GÑ*ÐÜ Ÿ;š;¤u§y¢yÐ1AÀqÑ'IÓJÈ1ÑMÐÜ Ÿ;š;¤u§y¢yÐ1AÀqÑ'IÓJÈ1ÑMÐä—y’yÐ"2Ð!EÈ1ÑMˆà×'Ñ'Ó)ˆ
ä—’˜6 qÑ)ˆÜ"ŸYšYÐ'9¸qÑAÐä×#Ò#ØÑ.ØÑ0ØØñ	
ð
 ×ÑÓ!ñ#ˆô ×<Ò<¸ZÑ=UÐW]ÑWkÓlˆàÐ(Ð(r4   ÚimagesÚfeaturesc                 óÒ  • [        UR                  5       5      nU R                  U5      u  pEU R                  X5      n[	        U5      nU Vs/ s H  oˆS   R
                  PM     n	nU	 V
s/ s H  oªS   U
S   -  U
S   -  PM     nn
[        XE5      u  pEU R                  R                  UR                  5       U5      nUR                  USS5      nU R                  XÄUR                  U5      u  pÞ0 nU R                  (       aY  Uc  [        S5      eU R                  Xc5      u  nnU R                  R!                  UU5      nU R#                  XEUU5      u  nnUUS.nXß4$ s  snf s  sn
f )aÍ  
Args:
    images (ImageList): images for which we want to compute the predictions
    features (Dict[str, Tensor]): features computed from the images that are
        used for computing the predictions. Each tensor in the list
        correspond to different feature levels
    targets (List[Dict[str, Tensor]]): ground-truth boxes present in the image (optional).
        If provided, each element in the dict should contain a field `boxes`,
        with the locations of the ground-truth boxes.

Returns:
    boxes (List[Tensor]): the predicted boxes from the RPN, one Tensor per
        image.
    losses (Dict[str, Tensor]): the losses for the model during training. During
        testing, it is an empty dict.
r   r	   r   r`   r   ztargets should not be None)Úloss_objectnessÚloss_rpn_box_reg)rU   Úvaluesr}   r|   Úlenrl   ru   ry   ÚdecoderÈ   ra   rà   Úimage_sizesr—   Ú
ValueErrorr·   Úencoderð   )r,   rò   ró   rž   r¹   râ   r�   rÓ   ÚoÚ#num_anchors_per_level_shape_tensorsÚsrº   rÅ   r   rÜ   Úlossesr¬   r­   rã   rõ   rö   s                        r2   rL   ÚRegionProposalNetwork.forwardP  sm  € ô. ˜Ÿ™Ó)Ó*ˆØ'+§y¡y°Ó':Ñ$ˆ
Ø×'Ñ'¨Ó9ˆä˜“\ˆ
ÙCMÓ.NÂ:¸a°©t¯z¬zÁ:Ð+Ð.NÙ=`Ó aÒ=`¸ 1¡¨¨!©¡¨q°©tÔ!3Ñ=`ÐÐ aÜ'CÀJÓ'aÑ$ˆ
ð —N‘N×)Ñ)Ð*:×*AÑ*AÓ*CÀWÓMˆ	Ø—N‘N :¨r°1Ó5ˆ	Ø×-Ñ-¨iÀV×EWÑEWÐYnÓo‰ˆàˆØ�=�=Ø‰Ü Ð!=Ó>Ð>Ø'+×'EÑ'EÀgÓ'WÑ$ˆFÐ$Ø!%§¡×!6Ñ!6Ð7GÈÓ!QÐØ04×0AÑ0AØ¨fÐ6Hó1Ñ-ˆOÐ-ð $3Ø$4ñˆFð ˆ}Ðùò/ /OùÚ as   ÁEÁ+E$)r’   r‘   r|   ry   rŽ   r{   r}   r“   r„   rz   r…   )r¤   rG   ) rN   rO   rP   rQ   rR   rŠ   r‹   r�   r�   Ú__annotations__r   r   ÚModuleÚfloatrT   ÚdictÚstrr   r‚   rƒ   rU   r   rV   r·   rÃ   rà   rð   r   r   rL   rW   rX   rY   s   @r2   rw   rw   q   s7  ø† ñð6 ×'Ñ'Ø%×-Ñ-Ø"×BÑBñ€Oð& "ñ#à)ð#ð �i‰ið#ð
 ð#ð ð#ð "ð#ð !ð#ð ˜C ˜H‘~ð#ð ˜S #˜X™ð#ð ð#ð ð#ð 
÷#ð #ðJ.˜sô .ð
/ ô /ð
$(Ø˜F‘|ð$(Ø.2°4¸¸V¸Ñ3DÑ.Eð$(à	ˆt�F‰|˜T &™\Ð)Ñ	*ô$(ðL	#¨ð 	#ÈÈSÉ	ð 	#ÐV\ô 	#ð7)àð7)ð ð7)ð ˜5  c ™?Ñ+ð	7)ð
  $ C™yð7)ð 
ˆt�F‰|˜T &™\Ð)Ñ	*ô7)ðr#)Ø ð#)Ø4:ð#)ØDHÈÁLð#)ØfjÐkqÑfrð#)à	ˆv�vˆ~Ñ	ô#)ðR 6:ñ	3àð3ð �s˜F�{Ñ#ð3ð ˜$˜t C¨ KÑ0Ñ1Ñ2ð	3ð
 
ˆt�F‰|˜T # v +Ñ.Ð.Ñ	/÷3ó 3r4   rw   )Útypingr   r&   r   r   Útorch.nnr   rè   Útorchvision.opsr   rŒ   r   Ú r
   rŠ   Úanchor_utilsr   Ú
image_listr   r  r   rT   rd   rU   rV   ru   rw   © r4   r2   Ú<module>r     s¬   ðÝ ã ß Ý $ß Bå !õ *Ý !ô? ˆb�i‰iô ? ðD˜vð ¨#ð °#ð ¸#ð À#ð È#ð ÐRXô ð#¨$¨v©,ð #ÈÈVÉð #ÐY^Ð_eÐgmÐ_mÑYnô #ô2R˜EŸH™HŸO™Oõ Rr4   