o
    e                     @   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dejdejd	ed
edef
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   s\   |d u r|dkr| j |||d\}}||fS | j|||||dkp#|d u||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< tt|| D ]H}|| }|| }t|	|
| | |dd d df< t|
	|	| | |dd d df< | j
|||d\}}t||dd}t||dd}q6||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J |||	 |
||}tj|t| jdd}|||	d| jd | jd }|d uro| }|j \}}}|dksFJ |d d d d df  | jd | 9  < |d d d d df  | jd | 9  < na|dkrt|| j|jd}|d urt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\}}}}|r)| ||||\}}|r)|	d |d d | jd  d df< |rN|d d d d d | jd  f }|d d d d d | jd  f }d}||k}tt|D ]5}||d |ddf tj}tdt|}||d |ddd f ||||f< d||||f< qZ|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   Zrgbsr   itersgH.?T)r'   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Cr1   r2   NDr5   Z
point_maskr   __r   thriZ	queries_tr-   r   r   r   r   _   sn   
(*&$""" &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<   )fliprB   r'   r   )r   r   r   r   r   Z	inv_videoZinv_queriesZ
inv_tracksrT   Zinv_visibilitiesmaskr   r   r   rJ      s   6

<z+CoTrackerPredictor._compute_backward_tracks)r   )NNr   r   F)r!   F)Nr   Fr   F)__name__
__module____qualname__r
   r(   no_gradTensorintrF   r    r   r   rJ   __classcell__r   r   r   r   r      s:    
	
$
!
Or   )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   