B
    IHe                 @   sb   d dl Z d dlm  mZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ G dd de jjZdS )    N)tqdm)get_points_on_a_grid)	smart_cat)build_cotrackerc                   s^   e Zd Zd fdd	Ze dejejeeeddd	Z	dddZ
dddZdd Z  ZS )CoTrackerPredictor3cotracker/checkpoints/cotracker_stride_4_wind_8.pthc                s2   t    d| _d| _t|}|| _| j  d S )N)i  i      )super__init__interp_shapesupport_grid_sizer   modeleval)self
checkpointr   )	__class__ >/home/camsmith/repos/flowmap/co-tracker/cotracker/predictor.pyr
      s    
zCoTrackerPredictor.__init__Nr   F)queries	segm_mask	grid_sizegrid_query_framebackward_trackingc       	   	   C   sV   |d kr&|dkr&| j |||d\}}n(| j|||||dkp@|d k	||d\}}||fS )Nr   )r   r   )add_support_gridr   r   )_compute_dense_tracks_compute_sparse_tracks)	r   videor   r   r   r   r   tracksvisibilitiesr   r   r   forward   s    zCoTrackerPredictor.forward   c             C   s
  |j ^ }}}|| }|| }	|| }
d  }}td|	|
 df|j}||dd d df< xtt|| D ]}|| }|| }t|	|
| | |dd d df< t|
	|	| | |dd d df< | j
|||d\}}t||dd}t||dd}qnW ||fS )N      r      )r   r   r   )dim)shapetorchzerostodevicer   rangearangerepeatrepeat_interleaver   r   )r   r   r   r   r   _HWZ	grid_step
grid_widthgrid_heightr   r   grid_ptsoffsetoxoyZtracks_stepZvisibilities_stepr   r   r   r   B   s&    &&z(CoTrackerPredictor._compute_dense_tracksc             C   s  |j \}}	}
}}|dkst|||	 |
||}tj|t| jdd}|||	d| jd | jd }|d k	r| }|j \}}}|dkst|d d d d df  | jd | 9  < |d d d d df  | jd | 9  < n|dkrt|| j|j	d}|d k	rrtj|t| jdd}|d	 |dd d df 
   |dd d df 
   f  }|d d |f }tjt|d d d d d df | |gdd
}|rt| j| j|j	d}tjt|d d d d d df |gdd
}tj||gdd
}| j||dd\}}}}|rX| ||||\}}|rX|	d |d d | jd  d df< |r|d d d d d | jd  f }|d d d d d | jd  f }d}||k}xztt|D ]j}||d |ddf tj}tdt|}||d |ddd f ||||f< d||||f< qW |d d d d d d df  |t| jd  9  < |d d d d d d df  |t| jd  9  < ||fS )Nr!   bilinear)moder"   r   r#   )r)   nearest)r   r   )r$   r   )rgbsr   itersg?T)r%   AssertionErrorreshapeFinterpolatetupler   cloner   r)   roundlongcpuboolr&   cat	ones_liker   
zeros_liker   _compute_backward_tracksr*   lensizer(   int64r+   float)r   r   r   r   r   r   r   r   BTCr/   r0   NDr3   Z
point_maskr   __r   thriZ	queries_tr+   r   r   r   r   _   s^    
(*

&&*""" &22z)CoTrackerPredictor._compute_sparse_tracksc             C   s   | d }| }|jd |d d d d df  d |d d d d df< | j||dd\}}}	}| d}|	 d}	|dk}
||
 ||
< |	|
d d d d d d df  ||
d d d d d d df < ||fS )Nr!   r   r   )r:   r   r;   )fliprA   r%   r   )r   r   r   r   r   Z	inv_videoZinv_queriesZ
inv_tracksrS   Zinv_visibilitiesmaskr   r   r   rI      s    6

<z+CoTrackerPredictor._compute_backward_tracks)r   )NNr   r   F)r    F)Nr   Fr   F)__name__
__module____qualname__r
   r&   no_gradTensorintrE   r   r   r   rI   __classcell__r   r   )r   r   r      s   

    
     
Gr   )r&   Ztorch.nn.functionalnn
functionalr>   r   Z)cotracker.models.core.cotracker.cotrackerr   Z!cotracker.models.core.model_utilsr   Z cotracker.models.build_cotrackerr   Moduler   r   r   r   r   <module>   s   