o
    ߥiM                     @   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modepad_htpad_wd r   l/home/ubuntu/.local/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 )	replicate)r   )Fpadr   ).0xr   r   r   
<listcomp>   s    z#InputPadder.pad.<locals>.<listcomp>r   )r   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)method
fill_value)axis)detachcpunumpyr   npmeshgridarangereshaper   griddatastacktorch
from_numpyfloat)flowdxdyr	   r
   x0y0x1y1validflow_xflow_yr   r   r   forward_interpolate"   s6   




 

r?   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   splitr2   catr   grid_sampler4   )	imgcoordsr   maskHWxgridygridgridr   r   r   bilinear_samplerE   s    rO   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   rA   r   )r2   r-   r.   r1   r4   repeat)batchr	   r
   rP   rH   r   r   r   coords_gridV   s
   rS   c                 C   s2   d| j d  d| j d  f}dtj| ||dd S )Nr   r   r   T)sizer   rC   )r   r   r   )r5   r   new_sizer   r   r   upflow8]   s   rV   )r@   F)r@   )r+   r,   r2   torch.nn.functionalnn
functionalr   scipyr   r   r?   rO   rS   rV   r   r   r   r   <module>   s   
#