Ë
    èÓ^jë!  ã                   óÚ   — d dl mZ d dlmZmZ d dlmc mZ d dl	mZm
Z
 ddlmZ ddlmZ  G d„ d	ej                  «      Z G d
„ dej                  «      Z G d„ de«      Z G d„ de«      Zy)é    )ÚOrderedDict)ÚCallableÚOptionalN)ÚnnÚTensoré   )ÚConv2dNormActivation)Ú_log_api_usage_oncec                   óP   — e Zd ZdZdee   dee   dee   deee   ee   f   fd„Zy)ÚExtraFPNBlockaª  
    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                  ó   — y )N© )Úselfr   r   r   s       úr/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torchvision/ops/feature_pyramid_network.pyÚforwardzExtraFPNBlock.forward   s   € ð 	ó    N©	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úlistr   ÚstrÚtupler   r   r   r   r   r      sP   „ ñðà�f‘ðð �‰<ðð �C‰yð	ð
 
ˆt�F‰|˜T #™YÐ&Ñ	'ôr   r   c                   óÄ   ‡ — e Zd ZdZdZ	 	 ddee   dedee   dee	de
j                  f      fˆ fd„Zˆ fd	„Zd
ededefd„Zd
ededefd„Zd
eeef   deeef   fd„Zˆ xZS )ÚFeaturePyramidNetworkac  
    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         ‰	| �  «        t        | «       t        j                  «       | _        t        j                  «       | _        |D ]i  }|dk(  rt        d«      ‚t        ||dd|d ¬«      }t        ||d|d ¬«      }| j
                  j                  |«       | j                  j                  |«       Œk | j                  «       D ]  }t        |t        j                  «      sŒt        j                  j                  |j                  d¬«       |j                   €ŒVt        j                  j#                  |j                   d«       Œ� |�'t        |t$        «      st'        dt)        |«      › �«      ‚|| _        y )	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   r.   zFeaturePyramidNetwork.__init__M   sM  ø€ ô 	‰ÑÔÜ˜DÔ!ÜŸM™M›OˆÔÜŸM™M›OˆÔØ+ò 
	9ˆKØ˜aÒÜ Ð!KÓLÐLÜ!5Ø˜\°qÀ!ÐPZÐmqô"Ðô "6Ø˜l¸ÀjÐcgô"Ðð ×Ñ×$Ñ$Ð%7Ô8Ø×Ñ×$Ñ$Ð%7Õ8ð
	9ð —‘“ò 	1ˆAÜ˜!œRŸY™YÕ'Ü—‘×(Ñ(¨¯©°QÐ(Ô7Ø—6‘6Ñ%Ü—G‘G×%Ñ% a§f¡f¨aÕ0ð		1ð Ð#Ü˜l¬MÔ:ÜÐ"SÔTXÐYeÓTfÐSgÐ hÓiÐiØ(ˆÕr   c           	      ó*  •— |j                  dd «      }|�|dk  rdt        | j                  «      }	dD ]J  }
t        |	«      D ]:  }dD ]3  }|› |
› d|› d|› �}|› |
› d|› d|› �}||v sŒ |j	                  |«      ||<   Œ5 Œ< ŒL t
        ‰| �  |||||||«       y )NÚversionr   )r0   r1   )r9   r:   ú.z.0.)ÚgetÚlenr0   ÚrangeÚpopr-   Ú_load_from_state_dict)r   Ú
state_dictÚprefixÚlocal_metadataÚstrictÚmissing_keysÚunexpected_keysÚ
error_msgsrD   Ú
num_blocksÚblockÚir=   Úold_keyÚnew_keyrB   s                  €r   rJ   z+FeaturePyramidNetwork._load_from_state_dictp   sÝ   ø€ ð !×$Ñ$ Y°Ó5ˆàˆ?˜g¨škÜ˜T×.Ñ.Ó/ˆJØ9ò J�Ü˜zÓ*ò J�AØ 2ò J˜Ø%+ H¨U¨G°1°Q°C°q¸¸Ð"?˜Ø%+ H¨U¨G°1°Q°C°s¸4¸&Ð"A˜Ø" jÒ0Ø2<·.±.ÀÓ2I˜J wÒ/ñ	JñJðJô 	‰Ñ%ØØØØØØØõ	
r   r   Úidxr   c                 óž   — t        | j                  «      }|dk  r||z  }|}t        | j                  «      D ]  \  }}||k(  sŒ ||«      }Œ |S )zs
        This is equivalent to self.inner_blocks[idx](x),
        but torchscript doesn't support this yet
        r   )rG   r0   Ú	enumerate©r   r   rW   rR   ÚoutrT   Úmodules          r   Úget_result_from_inner_blocksz2FeaturePyramidNetwork.get_result_from_inner_blocks�   ó_   € ô
 ˜×*Ñ*Ó+ˆ
Ø�Š7Ø�:ÑˆCØˆÜ" 4×#4Ñ#4Ó5ò 	 ‰IˆAˆvØ�C‹xÙ˜Q“i‘ð	 ð ˆ
r   c                 óž   — t        | j                  «      }|dk  r||z  }|}t        | j                  «      D ]  \  }}||k(  sŒ ||«      }Œ |S )zs
        This is equivalent to self.layer_blocks[idx](x),
        but torchscript doesn't support this yet
        r   )rG   r1   rY   rZ   s          r   Úget_result_from_layer_blocksz2FeaturePyramidNetwork.get_result_from_layer_blocksž   r^   r   c                 ó€  — t        |j                  «       «      }t        |j                  «       «      }| j                  |d   d«      }g }|j	                  | j                  |d«      «       t        t        |«      dz
  dd«      D ]e  }| j                  ||   |«      }|j                  dd }t        j                  ||d¬«      }||z   }|j                  d| j                  ||«      «       Œg | j                  �| j                  |||«      \  }}t        t        ||«      D �	�
cg c]	  \  }	}
|	|
f‘Œ c}
}	«      }|S c c}
}	w )a6  
        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Úvaluesr]   r3   r`   rH   rG   ÚshapeÚFÚinterpolateÚinsertr#   r   Úzip)r   r   r   Ú
last_innerr   rW   Úinner_lateralÚ
feat_shapeÚinner_top_downÚkÚvr[   s               r   r   zFeaturePyramidNetwork.forward¬   s/  € ô �Q—V‘V“X“ˆÜ�—‘“Óˆà×6Ñ6°q¸±u¸bÓAˆ
ØˆØ�‰�t×8Ñ8¸ÀRÓHÔIäœ˜Q› !™ R¨Ó,ò 	RˆCØ ×=Ñ=¸aÀ¹fÀcÓJˆMØ&×,Ñ,¨R¨SÐ1ˆJÜŸ]™]¨:¸JÈYÔWˆNØ&¨Ñ7ˆJØ�N‰N˜1˜d×?Ñ?À
ÈCÓPÕQð	Rð ×ÑÐ(Ø!×.Ñ.¨w¸¸5ÓA‰NˆG�Uô ¬c°%¸Ó.A×B¡d a¨˜A˜qš6ÓBÓCˆàˆ
ùó Cs   Ä"D:
)NN)r   r   r   r   Ú_versionr   Úintr   r   r   r   ÚModuler.   rJ   r   r]   r`   Údictr   r   Ú__classcell__©rB   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                   óP   — e Zd ZdZdee   dee   dee   deee   ee   f   fd„Zy)ÚLastLevelMaxPoolzh
    Applies a max_pool2d (not actual max_pool2d, we just subsample) on top of the last feature map
    r   Úyr   r   c                 ó‚   — |j                  d«       |j                  t        j                  |d   ddd¬«      «       ||fS )NÚpoolrb   r&   r   r   )r'   Ústrider(   )r3   rj   Ú
max_pool2d)r   r   r|   r   s       r   r   zLastLevelMaxPool.forwardÔ   s8   € ð 	�‰�VÔà	�‰”—‘˜a ™e°¸1ÀaÔHÔIØ�%ˆxˆr   Nr   r   r   r   r{   r{   Ï   sP   „ ñð	à�‰<ð	ð �‰<ð	ð �C‰yð		ð
 
ˆt�F‰|˜T #™YÐ&Ñ	'ô	r   r{   c                   ól   ‡ — e Zd ZdZdedefˆ fd„Zdee   dee   dee   de	ee   ee   f   fd	„Z
ˆ xZS )
ÚLastLevelP6P7zO
    This module is used in RetinaNet to generate extra layers, P6 and P7.
    r>   r"   c                 ó’  •— t         ‰| �  «        t        j                  ||ddd«      | _        t        j                  ||ddd«      | _        | j                  | j
                  fD ]W  }t        j                  j                  |j                  d¬«       t        j                  j                  |j                  d«       ŒY ||k(  | _        y )Nr*   r   r&   r+   r   )r-   r.   r   r6   Úp6Úp7r7   r8   r9   r;   r:   Úuse_P5)r   r>   r"   r\   rB   s       €r   r.   z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                 óô   — |d   |d   }}| j                   r|n|}| j                  |«      }| j                  t        j                  |«      «      }|j                  ||g«       |j                  ddg«       ||fS )Nrb   r„   r…   )r†   r„   r…   rj   ÚreluÚextend)	r   r‡   rˆ   r   Úp5Úc5r   r„   r…   s	            r   r   zLastLevelP6P7.forwardî   sn   € ð �2‘˜˜"™ˆBˆØ—+’+‰B 2ˆØ�W‰W�Q‹ZˆØ�W‰W”Q—V‘V˜B“ZÓ ˆØ	�‰�"�b�ÔØ�‰�d˜D�\Ô"Ø�%ˆxˆr   )r   r   r   r   ru   r.   r   r   r   r   r   rx   ry   s   @r   r‚   r‚   à   sd   ø„ ñð2 Cð 2°sõ 2ðà�‰<ðð �‰<ðð �C‰yð	ð
 
ˆt�F‰|˜T #™YÐ&Ñ	'÷r   r‚   )Úcollectionsr   Útypingr   r   Útorch.nn.functionalr   Ú
functionalrj   Útorchr   Úops.miscr	   Úutilsr
   rv   r   r    r{   r‚   r   r   r   ú<module>r•      sU   ðÝ #ß %ç Ð ß å +Ý 'ô�B—I‘Iô ô2h˜BŸI™Iô hôV�}ô ô"�Mõ r   