o
    *jM                     @   sd   d dl Zd dlZd dlm  mZ d dlmZ G dd dZ	dd Z
dd	d
Zdd ZdddZdS )    N)interpolatec                   @   s*   e Zd ZdZd
ddZdd Zdd Zd	S )InputPadderz5 Pads images such that dimensions are divisible by 8 sintelc                 C   s   |dd  \| _ | _| j d d d | j  d }| jd d d | j d }|dkr?|d ||d  |d ||d  g| _d S |d ||d  d|g| _d S )N      r      r   )htwd_pad)selfdimsmodeZpad_htZpad_wd r   y/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/video_stabilization/utils/RAFTUtils.py__init__   s   

zInputPadder.__init__c                    s    fdd|D S )Nc                    s   g | ]}t j| jd dqS )Z	replicate)r   )Fpadr   ).0xr   r   r   
<listcomp>   s    z#InputPadder.pad.<locals>.<listcomp>r   )r   Zinputsr   r   r   r      s   zInputPadder.padc                 C   sd   |j dd  \}}| jd || jd  | jd || jd  g}|d|d |d |d |d f S )Nr   r      r   r   .)shaper   )r   r   r	   r
   cr   r   r   unpad   s   ,&zInputPadder.unpadN)r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   
   s
    
r   c                 C   s  |     } | d | d }}|j\}}tt|t|\}}|| }|| }|d}|d}|d}|d}|dk||k @ |dk@ ||k @ }	||	 }||	 }||	 }||	 }tj	||f|||fddd}
tj	||f|||fddd}tj
|
|gdd} t|  S )Nr   r   nearest)methodZ
fill_value)Zaxis)detachcpunumpyr   npmeshgridarangeZreshaper   ZgriddatastacktorchZ
from_numpyfloat)flowZdxZdyr	   r
   Zx0Zy0x1y1validZflow_xZflow_yr   r   r   forward_interpolate"   s6   




 

r0   bilinearFc           	      C   s   | j dd \}}|jddgdd\}}d| |d  d }d| |d  d }tj||gdd}tj| |dd} |rQ|dk|dk@ |dk @ |dk @ }| | fS | S )	z1 Wrapper for grid_sample, uses pixel coordinates r   Nr   r    dimr   T)align_corners)r   splitr*   catr   Zgrid_sampler+   )	Zimgcoordsr   maskHWZxgridZygridgridr   r   r   bilinear_samplerE   s    r<   c                 C   sP   t t j||dt j||d}t j|d d d dd }|d  | dddS )N)devicer    r   r2   r   )r*   r'   r(   r)   r+   repeat)batchr	   r
   r=   r7   r   r   r   coords_gridV   s
   r@   c                 C   s2   d| j d  d| j d  f}dtj| ||dd S )Nr   r   r   T)sizer   r4   )r   r   r   )r,   r   new_sizer   r   r   upflow8]   s   rC   )r1   F)r1   )r%   r&   r*   Ztorch.nn.functionalnnZ
functionalr   Zscipyr   r   r0   r<   r@   rC   r   r   r   r   <module>   s   
#