U
    (d                     @   sz   d dl Z d dl mZmZ d dlmZ d dlmZ ddlmZ ddl	m
Z
mZ deeeeed
ddZG dd dejZdS )    N)nnTensor)_pair)_assert_has_ops   )_log_api_usage_once   )convert_boxes_to_roi_formatcheck_roi_boxes_shape      ?)inputboxesoutput_sizespatial_scalereturnc                 C   sp   t j st j stt t  t| |}t|}t	|t j
sJt|}t jj| |||d |d \}}|S )a  
    Performs Position-Sensitive Region of Interest (RoI) Pool operator
    described in R-FCN

    Args:
        input (Tensor[N, C, H, W]): The input tensor, i.e. a batch with ``N`` elements. Each element
            contains ``C`` feature maps of dimensions ``H x W``.
        boxes (Tensor[K, 5] or List[Tensor[L, 4]]): the box coordinates in (x1, y1, x2, y2)
            format where the regions will be taken from.
            The coordinate must satisfy ``0 <= x1 < x2`` and ``0 <= y1 < y2``.
            If a single Tensor is passed, then the first column should
            contain the index of the corresponding element in the batch, i.e. a number in ``[0, N - 1]``.
            If a list of Tensors is passed, then each Tensor will correspond to the boxes for an element i
            in the batch.
        output_size (int or Tuple[int, int]): the size of the output (in bins or pixels) after the pooling
            is performed, as (height, width).
        spatial_scale (float): a scaling factor that maps the box coordinates to
            the input coordinates. For example, if your boxes are defined on the scale
            of a 224x224 image and your input is a 112x112 feature map (resulting from a 0.5x scaling of
            the original image), you'll want to set this to 0.5. Default: 1.0

    Returns:
        Tensor[K, C / (output_size[0] * output_size[1]), output_size[0], output_size[1]]: The pooled RoIs.
    r   r   )torchZjitZis_scripting
is_tracingr   ps_roi_poolr   r
   r   
isinstancer   r	   opsZtorchvision)r   r   r   r   roisoutput_ r   ?/tmp/pip-unpacked-wheel-vx7f76es/torchvision/ops/ps_roi_pool.pyr   
   s    "r   c                       sH   e Zd ZdZeed fddZeeedddZe	dd	d
Z
  ZS )	PSRoIPoolz"
    See :func:`ps_roi_pool`.
    )r   r   c                    s"   t    t|  || _|| _d S N)super__init__r   r   r   )selfr   r   	__class__r   r   r   9   s    
zPSRoIPool.__init__)r   r   r   c                 C   s   t ||| j| jS r   )r   r   r   )r   r   r   r   r   r   forward?   s    zPSRoIPool.forward)r   c                 C   s"   | j j d| j d| j d}|S )Nz(output_size=z, spatial_scale=))r!   __name__r   r   )r   sr   r   r   __repr__B   s    zPSRoIPool.__repr__)r$   
__module____qualname____doc__intfloatr   r   r"   strr&   __classcell__r   r   r    r   r   4   s   r   )r   )r   r   r   Ztorch.nn.modules.utilsr   Ztorchvision.extensionr   utilsr   _utilsr	   r
   r*   r+   r   Moduler   r   r   r   r   <module>   s    *