o
    VhN                     @   s   d dl Z 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 		
		
	ddedededee deeef deeef deeef dee defddZG dd dejZdS )    N)OptionalTuple)nnTensor)init)_pair)	Parameter)_assert_has_ops   )_log_api_usage_once   r   r   r   inputoffsetweightbiasstridepaddingdilationmaskreturnc                 C   s0  t j st j stt t  |jd }|du}	|du r-t j| jd df| j	| j
d}|du r;t j|| j	| j
d}t|\}
}t|\}}t|\}}|jdd \}}| j\}}}}|jd d| |  }||jd  }|dkrtd|jd  dd| |  t jj| |||||
||||||||	S )	a?  
    Performs Deformable Convolution v2, described in
    `Deformable ConvNets v2: More Deformable, Better Results
    <https://arxiv.org/abs/1811.11168>`__ if :attr:`mask` is not ``None`` and
    Performs Deformable Convolution, described in
    `Deformable Convolutional Networks
    <https://arxiv.org/abs/1703.06211>`__ if :attr:`mask` is ``None``.

    Args:
        input (Tensor[batch_size, in_channels, in_height, in_width]): input tensor
        offset (Tensor[batch_size, 2 * offset_groups * kernel_height * kernel_width, out_height, out_width]):
            offsets to be applied for each position in the convolution kernel.
        weight (Tensor[out_channels, in_channels // groups, kernel_height, kernel_width]): convolution weights,
            split into groups of size (in_channels // groups)
        bias (Tensor[out_channels]): optional bias of shape (out_channels,). Default: None
        stride (int or Tuple[int, int]): distance between convolution centers. Default: 1
        padding (int or Tuple[int, int]): height/width of padding of zeroes around
            each image. Default: 0
        dilation (int or Tuple[int, int]): the spacing between kernel elements. Default: 1
        mask (Tensor[batch_size, offset_groups * kernel_height * kernel_width, out_height, out_width]):
            masks to be applied for each position in the convolution kernel. Default: None

    Returns:
        Tensor[batch_sz, out_channels, out_h, out_w]: result of convolution

    Examples::
        >>> input = torch.rand(4, 3, 10, 10)
        >>> kh, kw = 3, 3
        >>> weight = torch.rand(5, 3, kh, kw)
        >>> # offset and mask should have the same spatial size as the output
        >>> # of the convolution. In this case, for an input of 10, stride of 1
        >>> # and kernel size of 3, without padding, the output size is 8
        >>> offset = torch.rand(4, 2 * kh * kw, 8, 8)
        >>> mask = torch.rand(4, kh * kw, 8, 8)
        >>> out = deform_conv2d(input, offset, weight, mask=mask)
        >>> print(out.shape)
        >>> # returns
        >>>  torch.Size([4, 5, 8, 8])
    r   Nr   )devicedtyper
   zthe shape of the offset tensor at dimension 1 is not valid. It should be a multiple of 2 * weight.size[2] * weight.size[3].
Got offset.shape[1]=z,, while 2 * weight.size[2] * weight.size[3]=)torchjitis_scripting
is_tracingr   deform_conv2dr	   shapezerosr   r   r   RuntimeErroropstorchvision)r   r   r   r   r   r   r   r   out_channelsuse_maskstride_hstride_wpad_hpad_wdil_hdil_w	weights_h	weights_w_n_in_channelsn_offset_grpsn_weight_grps r3   O/var/www/vscode/kcb/lib/python3.10/site-packages/torchvision/ops/deform_conv.pyr      sP   1

r   c                       s   e Zd ZdZ					ddedededed	ed
ededef fddZdddZddedede	e defddZ
defddZ  ZS )DeformConv2dz$
    See :func:`deform_conv2d`.
    r   r   Tin_channelsr%   kernel_sizer   r   r   groupsr   c	           	         s   t    t|  || dkrtd|| dkrtd|| _|| _t|| _t|| _t|| _	t|| _
|| _tt||| | jd | jd | _|rXtt|| _n| dd  |   d S )Nr   z'in_channels must be divisible by groupsz(out_channels must be divisible by groupsr   r   )super__init__r   
ValueErrorr6   r%   r   r7   r   r   r   r8   r   r   emptyr   r   register_parameterreset_parameters)	selfr6   r%   r7   r   r   r   r8   r   	__class__r3   r4   r:   s   s(   




zDeformConv2d.__init__r   Nc                 C   sX   t j| jtdd | jd ur*t | j\}}dt| }t | j| | d S d S )N   )ar   )r   kaiming_uniform_r   mathsqrtr   _calculate_fan_in_and_fan_outuniform_)r?   fan_inr/   boundr3   r3   r4   r>      s   
zDeformConv2d.reset_parametersr   r   r   c              
   C   s"   t ||| j| j| j| j| j|dS )a  
        Args:
            input (Tensor[batch_size, in_channels, in_height, in_width]): input tensor
            offset (Tensor[batch_size, 2 * offset_groups * kernel_height * kernel_width, out_height, out_width]):
                offsets to be applied for each position in the convolution kernel.
            mask (Tensor[batch_size, offset_groups * kernel_height * kernel_width, out_height, out_width]):
                masks to be applied for each position in the convolution kernel.
        )r   r   r   r   )r   r   r   r   r   r   )r?   r   r   r   r3   r3   r4   forward   s   	zDeformConv2d.forwardc              	   C   s   | j j d| j d| j d| j d| j 	}|| jdkr"d| j nd7 }|| jdkr1d	| j nd7 }|| jd
kr@d| j nd7 }|| j	d u rKdnd7 }|d7 }|S )N(z, z, kernel_size=z	, stride=r   z
, padding= r   z, dilation=r   z	, groups=z, bias=False))
rA   __name__r6   r%   r7   r   r   r   r8   r   )r?   sr3   r3   r4   __repr__   s    
zDeformConv2d.__repr__)r   r   r   r   T)r   N)N)rO   
__module____qualname____doc__intboolr:   r>   r   r   rK   strrQ   __classcell__r3   r3   r@   r4   r5   n   s6    		
& r5   )Nr   r   r   N)rE   typingr   r   r   r   r   torch.nnr   torch.nn.modules.utilsr   torch.nn.parameterr   torchvision.extensionr	   utilsr   rU   r   Moduler5   r3   r3   r3   r4   <module>   sD    


	
`