o
    oi                     @  s   d dl mZ d dlZd dlm  mZ d dlmZm	Z	m
Z
mZmZ dd	d
ZdddZG dd deZG dd deZdd ddZdd!ddZdS )"    )annotationsN)ModuleTensoreyepadzeroskxintkyreturnr   c                 C  s4   ||  }|d }t |}d|||f< ||d|| S z"Return neigh2channels conv kernel.   r      r   view)r   r
   numelcenterweight r   N/home/ubuntu/.local/lib/python3.10/site-packages/kornia/geometry/subpix/nms.py_get_nms_kernel2d   s
   r   kdc                 C  s:   | | | }|d }t |}d|||f< ||d| ||S r   r   )r   r
   r   r   r   r   r   r   r   _get_nms_kernel3d#   s
   r   c                      sF   e Zd ZU dZded< d fdd	ZedddZddddZ  Z	S )NonMaximaSuppression2dzApply non maxima suppression to filter.

    Flag `minima_are_also_good` is useful, when you want to detect both maxima and minima, e.g. for DoG
    r   kernelkernel_sizetuple[int, int]r   Nonec                   s0   t    || _| || _| dt|  d S )Nr   )super__init__r   _compute_zero_padding2dpaddingregister_bufferr   selfr   	__class__r   r   r   4   s   
zNonMaximaSuppression2d.__init__tuple[int, int, int, int]c                 C  sX   t | tstt| t| dkrt| ddd}| \}}||||||||fS )Nr   xr	   r   c                 S     | d d S Nr   r   r   r(   r   r   r   r   B      z;NonMaximaSuppression2d._compute_zero_padding2d.<locals>.padr(   r	   r   r	   
isinstancetupleAssertionErrortypelen)r   r   r
   r   r   r   r   r    :   s   

z.NonMaximaSuppression2d._compute_zero_padding2dFr(   	mask_onlyboolc                 C  s   t |jdkrt|j| \}}}}t|t| jd d d dd}| \}}}}	tj|	|| d||	| j
|j|jdd	||d||}
|
jddd	 }||k}|rY|S |||j S )
N   	replicatemoder   )strider   )dimr   )r3   shaper1   sizer   listr!   Fconv2dr   r   todevicedtypemax)r$   r(   r4   BCHHWx_paddedHPWPneighborhoodmax_non_centermaskr   r   r   forwardH   s   
.
zNonMaximaSuppression2d.forward)r   r   r   r   )r   r   r   r'   Fr(   r   r4   r5   r   r   )
__name__
__module____qualname____doc____annotations__r   staticmethodr    rP   __classcell__r   r   r%   r   r   ,   s   
 r   c                      s<   e Zd ZdZd fddZedd	d
ZddddZ  ZS )NonMaximaSuppression3dz'Apply non maxima suppression to filter.r   tuple[int, int, int]r   r   c                   s*   t    || _| || _t| | _d S )N)r   r   r   _compute_zero_padding3dr!   r   r   r#   r%   r   r   r   ]   s   
zNonMaximaSuppression3d.__init__#tuple[int, int, int, int, int, int]c                 C  sf   t | tstt| t| dkrt| ddd}| \}}}||||||||||||fS )N   r(   r	   r   c                 S  r)   r*   r   r+   r   r   r   r   k   r,   z;NonMaximaSuppression3d._compute_zero_padding3d.<locals>.padr-   r.   )r   r   r   r
   r   r   r   r   r\   c   s   


(z.NonMaximaSuppression3d._compute_zero_padding3dFr(   r   r4   r5   c              	   C  s(  t |jdkrt|j| \}}}}}| jdkrPt||||||jtjd}t	dd}	t	dd}
t	dd }|d	|	|	|	f }||d	|	|	|
f k||d	|	|	|f k@ ||d	|	|
|	f k@ ||d	|	|
|
f k@ ||d	|	|
|f k@ ||d	|	||	f k@ ||d	|	||
f k@ ||d	|	||f k@ ||d	|
|	|	f k@ ||d	|
|	|
f k@ ||d	|
|	|f k@ ||d	|
|
|	f k@ ||d	|
|
|
f k@ ||d	|
|
|f k@ ||d	|
||	f k@ ||d	|
||
f k@ ||d	|
||f k@ ||d	||	|	f k@ ||d	||	|
f k@ ||d	||	|f k@ ||d	||
|	f k@ ||d	||
|
f k@ ||d	||
|f k@ ||d	|||	f k@ ||d	|||
f k@ ||d	|||f k@ |d	ddddddf< n7t
jt|t| jd d d d
d| j|dddd|j|jd|d||d|||jdddd }||k}|r|S |||j S )N   )r^   r^   r^   )rC   rD   r   r7   r   r   .r8   r9   )r;   groupsF)r<   keepdim)r3   r=   r1   r>   r   r   rC   torchr5   slicer@   conv3dr   r?   r!   r   repeatrB   rD   r   rE   )r$   r(   r4   rF   rG   DrH   rI   rO   r   leftrightcenter_tensorrN   r   r   r   rP   q   s   



	

zNonMaximaSuppression3d.forward)r   r[   r   r   )r   r[   r   r]   rQ   rR   )	rS   rT   rU   rV   r   rX   r\   rP   rY   r   r   r%   r   rZ   Z   s    rZ   Finputr   r   r4   r5   c                 C     t || |S )zzApply non maxima suppression to filter.

    See :class:`~kornia.geometry.subpix.NonMaximaSuppression2d` for details.
    )r   rk   r   r4   r   r   r   nms2d   s   rn   r[   c                 C  rl   )zwApply non maxima suppression to filter.

    See
    :class: `~kornia.feature.NonMaximaSuppression3d` for details.
    )rZ   rm   r   r   r   nms3d   s   ro   )r   r	   r
   r	   r   r   )r   r	   r
   r	   r   r	   r   r   rQ   )rk   r   r   r   r4   r5   r   r   )rk   r   r   r[   r4   r5   r   r   )
__future__r   rc   torch.nn.functionalnn
functionalr@   kornia.corer   r   r   r   r   r   r   r   rZ   rn   ro   r   r   r   r   <module>   s   

		.R