ó
    Eñië!  ã                   óÚ   • S SK Jr  S SKJrJr  S SKJs  Jr  S SK	JrJ
r
  SSKJr  SSKJr   " S S	\R                  5      r " S
 S\R                  5      r " S S\5      r " S S\5      rg)é    )ÚOrderedDict)ÚCallableÚOptionalN)ÚnnÚTensoré   )ÚConv2dNormActivation)Ú_log_api_usage_oncec                   óZ   • \ rS rSrSrS\\   S\\   S\\   S\\\   \\   4   4S jr	Sr
g	)
ÚExtraFPNBlocké   a~  
Base class for the extra block in the FPN.

Args:
    results (List[Tensor]): the result of the FPN
    x (List[Tensor]): the original feature maps
    names (List[str]): the names for each one of the
        original feature maps

Returns:
    results (List[Tensor]): the extended set of results
        of the FPN
    names (List[str]): the extended set of names for the results
ÚresultsÚxÚnamesÚreturnc                 ó   • g )N© )Úselfr   r   r   s       Úd/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torchvision/ops/feature_pyramid_network.pyÚforwardÚExtraFPNBlock.forward   s   € ð 	ó    r   N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úlistr   ÚstrÚtupler   Ú__static_attributes__r   r   r   r   r      sP   † ñðà�f‘ðð �‰<ðð �C‰yð	ð
 
ˆt�F‰|˜T #™YÐ&Ñ	'÷r   r   c                   óÚ   ^ • \ rS rSrSrSr  SS\\   S\S\\	   S\\
S\R                  4      4U 4S	 jjjrU 4S
 jrS\S\S\4S jrS\S\S\4S jrS\\\4   S\\\4   4S jrSrU =r$ )ÚFeaturePyramidNetworké$   aë  
Module that adds a FPN from on top of a set of feature maps. This is based on
`"Feature Pyramid Network for Object Detection" <https://arxiv.org/abs/1612.03144>`_.

The feature maps are currently supposed to be in increasing depth
order.

The input to the model is expected to be an OrderedDict[Tensor], containing
the feature maps on top of which the FPN will be added.

Args:
    in_channels_list (list[int]): number of channels for each feature map that
        is passed to the module
    out_channels (int): number of channels of the FPN representation
    extra_blocks (ExtraFPNBlock or None): if provided, extra operations will
        be performed. It is expected to take the fpn features, the original
        features and the names of the original features as input, and returns
        a new list of feature maps and their corresponding names
    norm_layer (callable, optional): Module specifying the normalization layer to use. Default: None

Examples::

    >>> m = torchvision.ops.FeaturePyramidNetwork([10, 20, 30], 5)
    >>> # get some dummy data
    >>> x = OrderedDict()
    >>> x['feat0'] = torch.rand(1, 10, 64, 64)
    >>> x['feat2'] = torch.rand(1, 20, 16, 16)
    >>> x['feat3'] = torch.rand(1, 30, 8, 8)
    >>> # compute the FPN on top of x
    >>> output = m(x)
    >>> print([(k, v.shape) for k, v in output.items()])
    >>> # returns
    >>>   [('feat0', torch.Size([1, 5, 64, 64])),
    >>>    ('feat2', torch.Size([1, 5, 16, 16])),
    >>>    ('feat3', torch.Size([1, 5, 8, 8]))]

r   Úin_channels_listÚout_channelsÚextra_blocksÚ
norm_layer.c           
      ó  >• [         T	U ]  5         [        U 5        [        R                  " 5       U l        [        R                  " 5       U l        U Hc  nUS:X  a  [        S5      e[        XRSSUS S9n[        X"SUS S9nU R
                  R                  U5        U R                  R                  U5        Me     U R                  5        H…  n[        U[        R                  5      (       d  M$  [        R                  R                  UR                  SS9  UR                   c  M[  [        R                  R#                  UR                   S5        M‡     Ub,  [        U[$        5      (       d  ['        S[)        U5       35      eX0l        g )	Nr   z(in_channels=0 is currently not supportedé   )Úkernel_sizeÚpaddingr)   Úactivation_layeré   )r,   r)   r.   ©Úaz1extra_blocks should be of type ExtraFPNBlock not )ÚsuperÚ__init__r
   r   Ú
ModuleListÚinner_blocksÚlayer_blocksÚ
ValueErrorr	   ÚappendÚmodulesÚ
isinstanceÚConv2dÚinitÚkaiming_uniform_ÚweightÚbiasÚ	constant_r   Ú	TypeErrorÚtyper(   )
r   r&   r'   r(   r)   Úin_channelsÚinner_block_moduleÚlayer_block_moduleÚmÚ	__class__s
            €r   r3   ÚFeaturePyramidNetwork.__init__M   sC  ø€ ô 	‰ÑÔÜ˜DÔ!ÜŸMšM›OˆÔÜŸMšM›OˆÔÛ+ˆKØ˜aÓÜ Ð!KÓLÐLÜ!5Ø°qÀ!ÐPZÐmqñ"Ðô "6Ø¸ÀjÐcgñ"Ðð ×Ñ×$Ñ$Ð%7Ô8Ø×Ñ×$Ñ$Ð%7Ö8ñ ,ð —‘–ˆAÜ˜!œRŸY™Y×'Ó'Ü—‘×(Ñ(¨¯©°QÐ(Ñ7Ø—6‘6Ó%Ü—G‘G×%Ñ% a§f¡f¨aÖ0ñ	  ð Ñ#Ü˜l¬M×:Ñ:ÜÐ"SÔTXÐYeÓTfÐSgÐ hÓiÐiØ(Õr   c           	      ó<  >• UR                  SS 5      nUb  US:  ak  [        U R                  5      n	S HP  n
[        U	5       H>  nS H5  nU U
 SU SU 3nU U
 SU SU 3nXÑ;   d  M"  UR	                  U5      X'   M7     M@     MR     [
        TU ]  UUUUUUU5        g )NÚversionr   )r5   r6   )r>   r?   Ú.z.0.)ÚgetÚlenr5   ÚrangeÚpopr2   Ú_load_from_state_dict)r   Ú
state_dictÚprefixÚlocal_metadataÚstrictÚmissing_keysÚunexpected_keysÚ
error_msgsrJ   Ú
num_blocksÚblockÚirB   Úold_keyÚnew_keyrG   s                  €r   rP   Ú+FeaturePyramidNetwork._load_from_state_dictp   sÄ   ø€ ð !×$Ñ$ Y°Ó5ˆà‰?˜g¨›kÜ˜T×.Ñ.Ó/ˆJÛ9�Ü˜zÖ*�AÛ 2˜Ø%+ H¨U¨G°1°Q°C°q¸¸Ð"?˜Ø%+ H¨U¨G°1°Q°C°s¸4¸&Ð"A˜Ø"Õ0Ø2<·.±.ÀÓ2I˜JÓ/ó	 !3ó +ñ :ô 	‰Ñ%ØØØØØØØõ	
r   r   Úidxr   c                 ó¢   • [        U R                  5      nUS:  a  X#-  nUn[        U R                  5       H  u  pVXR:X  d  M  U" U5      nM     U$ )z[
This is equivalent to self.inner_blocks[idx](x),
but torchscript doesn't support this yet
r   )rM   r5   Ú	enumerate©r   r   r^   rX   ÚoutrZ   Úmodules          r   Úget_result_from_inner_blocksÚ2FeaturePyramidNetwork.get_result_from_inner_blocks�   óT   € ô
 ˜×*Ñ*Ó+ˆ
Ø�‹7ØÑˆCØˆÜ" 4×#4Ñ#4Ö5‰IˆAØ�xÙ˜Q“i’ñ 6ð ˆ
r   c                 ó¢   • [        U R                  5      nUS:  a  X#-  nUn[        U R                  5       H  u  pVXR:X  d  M  U" U5      nM     U$ )z[
This is equivalent to self.layer_blocks[idx](x),
but torchscript doesn't support this yet
r   )rM   r6   r`   ra   s          r   Úget_result_from_layer_blocksÚ2FeaturePyramidNetwork.get_result_from_layer_blocksž   rf   r   c                 óv  • [        UR                  5       5      n[        UR                  5       5      nU R                  US   S5      n/ nUR	                  U R                  US5      5        [        [        U5      S-
  SS5       H`  nU R                  X   U5      nUR                  SS n[        R                  " X7SS9nXh-   nUR                  SU R                  X55      5        Mb     U R                  b  U R                  XAU5      u  pB[        [        X$5       V	V
s/ s H  u  pšXš4PM
     sn
n	5      nU$ s  sn
n	f )zþ
Computes the FPN for a set of feature maps.

Args:
    x (OrderedDict[Tensor]): feature maps for each feature level.

Returns:
    results (OrderedDict[Tensor]): feature maps after FPN layers.
        They are ordered from the highest resolution first.
éÿÿÿÿr   éþÿÿÿNÚnearest)ÚsizeÚmoder   )r   ÚkeysÚvaluesrd   r8   rh   rN   rM   ÚshapeÚFÚinterpolateÚinsertr(   r   Úzip)r   r   r   Ú
last_innerr   r^   Úinner_lateralÚ
feat_shapeÚinner_top_downÚkÚvrb   s               r   r   ÚFeaturePyramidNetwork.forward¬   s  € ô �Q—V‘V“X“ˆÜ�—‘“Óˆà×6Ñ6°q¸±u¸bÓAˆ
ØˆØ�‰�t×8Ñ8¸ÀRÓHÔIäœ˜Q› !™ R¨Ö,ˆCØ ×=Ñ=¸a¹fÀcÓJˆMØ&×,Ñ,¨R¨SÐ1ˆJÜŸ]š]¨:ÈYÑWˆNØ&Ñ7ˆJØ�N‰N˜1˜d×?Ñ?À
ÓPÖQñ -ð ×ÑÑ(Ø!×.Ñ.¨w¸5ÓA‰NˆGô ¬c°%Ô.AÔBÒ.A¡d a˜A›6Ñ.AÒBÓCˆàˆ
ùó Cs   ÄD5
)r(   r5   r6   )NN)r   r   r   r   r   Ú_versionr   Úintr   r   r   r   ÚModuler3   rP   r   rd   rh   Údictr    r   r"   Ú__classcell__©rG   s   @r   r$   r$   $   sÈ   ø† ñ$ðL €Hð 15Ø9=ñ!)à˜s™)ð!)ð ð!)ð ˜}Ñ-ð	!)ð
 ˜X c¨2¯9©9 nÑ5Ñ6÷!)ð !)õF
ð@¨fð ¸3ð À6ô ð¨fð ¸3ð À6ô ð ˜˜c 6˜kÑ*ð  ¨t°C¸°KÑ/@÷  ò  r   r$   c                   óZ   • \ rS rSrSrS\\   S\\   S\\   S\\\   \\   4   4S jr	Sr
g	)
ÚLastLevelMaxPooléÏ   z`
Applies a max_pool2d (not actual max_pool2d, we just subsample) on top of the last feature map
r   Úyr   r   c           	      ó|   • UR                  S5        UR                  [        R                  " US   SSSS95        X4$ )NÚpoolrk   r+   r   r   )r,   Ústrider-   )r8   rs   Ú
max_pool2d)r   r   r‡   r   s       r   r   ÚLastLevelMaxPool.forwardÔ   s6   € ð 	�‰�VÔà	�‰”—’˜a ™e°¸1ÀaÑHÔIØˆxˆr   r   Nr   r   r   r   r…   r…   Ï   sP   † ñð	à�‰<ð	ð �‰<ð	ð �C‰yð		ð
 
ˆt�F‰|˜T #™YÐ&Ñ	'÷	r   r…   c                   óz   ^ • \ rS rSrSrS\S\4U 4S jjrS\\   S\\   S\\	   S	\
\\   \\	   4   4S
 jrSrU =r$ )ÚLastLevelP6P7éà   zG
This module is used in RetinaNet to generate extra layers, P6 and P7.
rC   r'   c                 óŽ  >• [         TU ]  5         [        R                  " XSSS5      U l        [        R                  " X"SSS5      U l        U R                  U R
                  4 HU  n[        R                  R                  UR                  SS9  [        R                  R                  UR                  S5        MW     X:H  U l        g )Nr/   r   r+   r0   r   )r2   r3   r   r;   Úp6Úp7r<   r=   r>   r@   r?   Úuse_P5)r   rC   r'   rc   rG   s       €r   r3   ÚLastLevelP6P7.__init__å   s�   ø€ Ü‰ÑÔÜ—)’)˜K°q¸!¸QÓ?ˆŒÜ—)’)˜L¸¸1¸aÓ@ˆŒØ—w‘w §¡Ó(ˆFÜ�G‰G×$Ñ$ V§]¡]°aÐ$Ñ8Ü�G‰G×Ñ˜fŸk™k¨1Ö-ñ )ð "Ñ1ˆ�r   ÚpÚcr   r   c                 óú   • US   US   pTU R                   (       a  UOUnU R                  U5      nU R                  [        R                  " U5      5      nUR                  Xx/5        UR                  SS/5        X4$ )Nrk   r‘   r’   )r“   r‘   r’   rs   ÚreluÚextend)	r   r•   r–   r   Úp5Úc5r   r‘   r’   s	            r   r   ÚLastLevelP6P7.forwardî   sh   € ð �2‘˜˜"™ˆBØ—+—+‰B 2ˆØ�W‰W�Q‹ZˆØ�W‰W”Q—V’V˜B“ZÓ ˆØ	�‰�"�ÔØ�‰�d˜D�\Ô"Øˆxˆr   )r‘   r’   r“   )r   r   r   r   r   r   r3   r   r   r    r!   r   r"   r‚   rƒ   s   @r   rŽ   rŽ   à   si   ø† ñð2 Cð 2°s÷ 2ðà�‰<ðð �‰<ðð �C‰yð	ð
 
ˆt�F‰|˜T #™YÐ&Ñ	'÷ò r   rŽ   )Úcollectionsr   Útypingr   r   Útorch.nn.functionalr   Ú
functionalrs   Útorchr   Úops.miscr	   Úutilsr
   r€   r   r$   r…   rŽ   r   r   r   Ú<module>r¤      sU   ðÝ #ß %ç Ð ß å +Ý 'ô�B—I‘Iô ô2h˜BŸI™Iô hôV�}ô ô"�Mõ r   