U
    (d                  	   @   s   d dl mZmZ 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 d	d
lmZmZ deeeee f ee eeeedddZG dd dejZdS )    )ListUnionN)nnTensor)BroadcastingList2)_pair)_assert_has_ops   )_log_api_usage_once   )convert_boxes_to_roi_formatcheck_roi_boxes_shape      ?F)inputboxesoutput_sizespatial_scalesampling_ratioalignedreturnc              	   C   sl   t j st j stt t  t| |}t|}t	|t j
sJt|}t jj| |||d |d ||S )aj  
    Performs Region of Interest (RoI) Align operator with average pooling, as described in Mask R-CNN.

    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``.
            If the tensor is quantized, we expect a batch size of ``N == 1``.
        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
        sampling_ratio (int): number of sampling points in the interpolation grid
            used to compute the output value of each pooled output bin. If > 0,
            then exactly ``sampling_ratio x sampling_ratio`` sampling points per bin are used. If
            <= 0, then an adaptive number of grid points are used (computed as
            ``ceil(roi_width / output_width)``, and likewise for height). Default: -1
        aligned (bool): If False, use the legacy implementation.
            If True, pixel shift the box coordinates it by -0.5 for a better alignment with the two
            neighboring pixel indices. This version is used in Detectron2

    Returns:
        Tensor[K, C, output_size[0], output_size[1]]: The pooled RoIs.
    r   r   )torchZjitZis_scripting
is_tracingr
   	roi_alignr   r   r   
isinstancer   r   opsZtorchvision)r   r   r   r   r   r   rois r   =/tmp/pip-unpacked-wheel-vx7f76es/torchvision/ops/roi_align.pyr      s"    (      r   c                       sR   e Zd ZdZdee eeed fddZe	e	e	dddZ
ed	d
dZ  ZS )RoIAlignz 
    See :func:`roi_align`.
    F)r   r   r   r   c                    s.   t    t|  || _|| _|| _|| _d S N)super__init__r
   r   r   r   r   )selfr   r   r   r   	__class__r   r   r"   G   s    
zRoIAlign.__init__)r   r   r   c                 C   s   t ||| j| j| j| jS r    )r   r   r   r   r   )r#   r   r   r   r   r   forwardU   s    zRoIAlign.forward)r   c              
   C   s2   | j j d| j d| j d| j d| j d
}|S )Nz(output_size=z, spatial_scale=z, sampling_ratio=z
, aligned=))r%   __name__r   r   r   r   )r#   sr   r   r   __repr__X   s    ,zRoIAlign.__repr__)F)r(   
__module____qualname____doc__r   intfloatboolr"   r   r&   strr*   __classcell__r   r   r$   r   r   B   s   	 r   )r   r   F)typingr   r   r   r   r   Ztorch.jit.annotationsr   Ztorch.nn.modules.utilsr   Ztorchvision.extensionr   utilsr
   _utilsr   r   r.   r/   r0   r   Moduler   r   r   r   r   <module>   s(      5