U
    ­Ê¹j*  ã                
   @   sæ   d dl mZmZ d dlZd dl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mZ ddlmZ d	d
lmZmZ dd„ Zdd„ Zejjdd„ ƒZejj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Ú_has_opsé   )Ú_log_api_usage_onceé   )Úcheck_roi_boxes_shapeÚconvert_boxes_to_roi_formatc                    s”  ˆ  ¡ \}‰ }}|jdd�}|jdd�}| ¡ }	| ¡ }
t |	|d k|d |	d ¡}t |	|d k|d |	¡}	t |	|d k| ˆj¡|¡}t |
|d k|d |
d ¡}t |
|d k|d |
¡}
t |
|d k| ˆj¡|¡}||	 }||
 }d| }d| }‡ ‡‡‡‡fdd„}||	|
ƒ}||	|ƒ}|||
ƒ}|||ƒ}dd„ }|||ƒ}|||ƒ}|||ƒ}|||ƒ}|| ||  ||  ||  }|S )	Nr   ©Úminr   ç      ð?c                    sÐ   ˆd k	rTˆd k	st ‚t ˆd d …d d d …f | d¡} t ˆd d …d d d …f |d¡}ˆˆd d …d d d d d f tjˆ ˆjd�d d d …d d d d f | d d …d d d …d d d …d f |d d …d d d d …d d d …f f S )Nr   ©Údevice)ÚAssertionErrorÚtorchÚwhereÚaranger   ©ÚyÚx©ZchannelsÚinputÚroi_batch_indÚxmaskÚymask© úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchvision/ops/roi_align.pyÚmasked_index/   s      "ýÿz+_bilinear_interpolate.<locals>.masked_indexc              	   S   s@   | d d …d d d …d d d …d f |d d …d d d d …d d d …f  S ©Nr    r   r    r    r!   Ú
outer_prodD   s    z)_bilinear_interpolate.<locals>.outer_prod)ÚsizeÚclampÚintr   r   ÚtoÚdtype)r   r   r   r   r   r   Ú_ÚheightÚwidthZy_lowZx_lowZy_highZx_highZlyÚlxÚhyÚhxr"   Zv1Zv2Zv3Zv4r$   Zw1Zw2Zw3Zw4Úvalr    r   r!   Ú_bilinear_interpolate   s6    







 r1   c                 C   s*   t  ¡ r"| jr"| jt jkr"|  ¡ S | S d S r#   )r   Zis_autocast_enabledÚis_cudar)   ÚdoubleÚfloat)Ztensorr    r    r!   Ú
maybe_castR   s    r5   c           $   
   C   s:  | j }t| ƒ} t|ƒ}|  ¡ \}}}	}
tj|| jd�}tj|| jd�}|d d …df  ¡ }|rbdnd}|d d …df | | }|d d …df | | }|d d …df | | }|d d …df | | }|| }|| }|sötj|d	d
�}tj|d	d
�}|| }|| }|dk}|�r|nt || ¡}|�r0|nt || ¡}|�r|t	|| dƒ}tj|| jd�}tj|| jd�}d }d }nrtj|| dd
�}tj|	| jd�}tj|
| jd�}|d d d …f |d d …d f k }|d d d …f |d d …d f k }dd„ }||ƒ|d d d …d f ||ƒ  |d d d d …f d  
| j ¡||| ƒ  } ||ƒ|d d d …d f ||ƒ  |d d d d …f d  
| j ¡||| ƒ  }!t| || |!||ƒ}"|�sòt |d d …d d d d d …d f |"d¡}"t |d d …d d d d d d …f |"d¡}"|" d¡}#t|tjƒ�r$|#|d d …d d d f  }#n|#| }#|# 
|¡}#|#S )Nr   r   g      à?g        r   r
   é   é   r   r   c                 S   s   | d d …d d f S r#   r    )Útr    r    r!   Úfrom_K›   s    z_roi_align.<locals>.from_K)éÿÿÿÿéþÿÿÿ)r)   r5   r%   r   r   r   r'   r&   ÚceilÚmaxr(   r1   r   ÚsumÚ
isinstancer   )$r   ÚroisÚspatial_scaleZpooled_heightZpooled_widthÚsampling_ratioÚalignedZ
orig_dtyper*   r+   r,   ÚphÚpwr   ÚoffsetZroi_start_wZroi_start_hZ	roi_end_wZ	roi_end_hZ	roi_widthZ
roi_heightZ
bin_size_hZ
bin_size_wZexact_samplingZroi_bin_grid_hZroi_bin_grid_wÚcountZiyZixr   r   r9   r   r   r0   Úoutputr    r    r!   Ú
_roi_aligna   sp      ÿ(þÿÿ(þÿ&&

rI   r   r:   F)r   ÚboxesÚoutput_sizerA   rB   rC   Úreturnc              	   C   s¬   t j ¡ st j ¡ sttƒ t|ƒ |}t|ƒ}t|t j	ƒsDt
|ƒ}t j ¡ s„tƒ rht  ¡ r„| jsh| jr„t| |||d |d ||ƒS tƒ  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   )r   ZjitZis_scriptingÚ
is_tracingr   Ú	roi_alignr   r   r?   r   r   r	   Z$are_deterministic_algorithms_enabledr2   Zis_mpsrI   r   ZopsZtorchvision)r   rJ   rK   rA   rB   rC   r@   r    r    r!   rN   º   s(    )
      ÿrN   c                       s^   e Zd ZdZdee eeedœ‡ fdd„Ze	e
e	ee	 f e	dœdd„Zed	œd
d„Z‡  ZS )ÚRoIAlignz 
    See :func:`roi_align`.
    F)rK   rA   rB   rC   c                    s.   t ƒ  ¡  t| ƒ || _|| _|| _|| _d S r#   )ÚsuperÚ__init__r   rK   rA   rB   rC   )ÚselfrK   rA   rB   rC   ©Ú	__class__r    r!   rQ   ø   s    
zRoIAlign.__init__)r   r@   rL   c                 C   s   t ||| j| j| j| jƒS r#   )rN   rK   rA   rB   rC   )rR   r   r@   r    r    r!   Úforward  s    zRoIAlign.forward)rL   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=ú))rT   Ú__name__rK   rA   rB   rC   )rR   Úsr    r    r!   Ú__repr__	  s    ,ÿzRoIAlign.__repr__)F)rW   Ú
__module__Ú__qualname__Ú__doc__r   r'   r4   ÚboolrQ   r   r   r   rU   ÚstrrY   Ú__classcell__r    r    rS   r!   rO   ó   s   	 ûûrO   )r   r:   F)!Útypingr   r   r   Ztorch._dynamoZtorch.fxr   r   Ztorch.jit.annotationsr   Ztorch.nn.modules.utilsr   Ztorchvision.extensionr   r	   Úutilsr   Z_utilsr   r   r1   r5   Z_dynamoZallow_in_graphrI   ZfxÚwrapr'   r4   r]   rN   ÚModulerO   r    r    r    r!   Ú<module>   s6   B
X   úù8