
    eg                         d dl Z d dlmc 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e j                  j                        Zy)    N)tqdm)get_points_on_a_grid)	smart_cat)build_cotrackerc                        e Zd Z	 d fd	Z ej
                         	 	 	 	 	 ddej                  dej                  dededef
d       Z		 ddZ
	 	 	 	 	 dd	Zd
 Z xZS )CoTrackerPredictorc                     t         |           d| _        d| _        t	        |      }|| _        | j
                  j                          y )N)i  i      )super__init__interp_shapesupport_grid_sizer   modeleval)self
checkpointr   	__class__s      P/home/cameronsmith/repos/flowmap++/third_party/co-tracker/cotracker/predictor.pyr   zCoTrackerPredictor.__init__   s?     	&!"
+


    queries	segm_mask	grid_sizegrid_query_framebackward_trackingc           	          | |dk(  r| j                  |||      \  }}||fS | j                  |||||dk(  xs |d u||      \  }}||fS )Nr   )r   r   )add_support_gridr   r   )_compute_dense_tracks_compute_sparse_tracks)	r   videor   r   r   r   r   tracksvisibilitiess	            r   forwardzCoTrackerPredictor.forward   s    " ?yA~#'#=#=!1"3 $> $ FL  |## $(#>#>"+q."IIT4I!1"3 $? $ FL |##r   c                 F   |j                   ^ }}}||z  }||z  }	||z  }
d x}}t        j                  d|	|
z  df      j                  |j                        }||dd d df<   t        t        ||z              D ]  }||z  }||z  }t        j                  |	      j                  |
      |z  |z   |dd d df<   t        j                  |
      j                  |	      |z  |z   |dd d df<   | j                  |||      \  }}t        ||d      }t        ||d      } ||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W	grid_step
grid_widthgrid_heightr    r!   grid_ptsoffsetoxoytracks_stepvisibilities_steps                      r   r   z(CoTrackerPredictor._compute_dense_tracksB   s]    ;;AqN	)^
9n $$;;:#;Q?@CCELLQ,Aq5Y!678 	MF)#B9$BZ(//<yH2M Q1W [);;JG)SVXX Q1W .2-H-H "3 .I .*K*
 v{:F$\3D!LL	M" |##r   c           	      >   |j                   \  }}	}
}}|dk(  sJ |j                  ||	z  |
||      }t        j                  |t	        | j
                        d      }|j                  ||	d| j
                  d   | j
                  d         }|q|j                         }|j                   \  }}}|dk(  sJ |d d d d dfxx   | j
                  d   |z  z  cc<   |d d d d dfxx   | j
                  d   |z  z  cc<   n|dkD  rt        || j
                  |j                        }|t        j                  |t	        | j
                        d      }|d	   |dd d df   j                         j                         j                         |dd d df   j                         j                         j                         f   j                         }|d d |f   }t        j                  t        j                  |d d d d d df         |z  |gd
      }|r}t        | j                   | j
                  |j                        }t        j                  t        j"                  |d d d d d df         |gd
      }t        j                  ||gd
      }| j%                  ||d      \  }}}}|r6| j'                  ||||      \  }}|r|	dz
  |d d | j                   dz   d df<   |r8|d d d d d | j                   dz   f   }|d d d d d | j                   dz   f   }d}||kD  }t)        t+        |            D ]  }||d |j-                  d      df   j/                  t        j0                        }t        j2                  dt+        |            }||d |j-                  d      dd f   ||||f<   d||||f<    |d d d d d d dfxx   |t5        | j
                  d         z  z  cc<   |d d d d d d dfxx   |t5        | j
                  d         z  z  cc<   ||fS )Nr$   bilinear)moder%   r   r&   )r-   nearest)r   r   r'   r
   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Cr3   r4   NDr8   
point_maskr    __r!   thri	queries_tr/   s                           r   r   z)CoTrackerPredictor._compute_sparse_tracks_   s.    1aAAva!eQ1-eU4+<+<%=JOaAt'8'8';T=N=Nq=QRmmoGmmGAq!6MAq!G 1 1! 4q 88Aq!G 1 1! 4q 88]+It7H7HQVQ]Q]^H$MMuT%6%67i	 't_aAg&--/446::<aAg&--/446::<> $&  $AzM2ii!Q(!347GGRG
 +D,B,BDDUDU^c^j^jkHyy!!(1a!8"45x@aH ii( 3;G'+zzugUVz'W$L"#'#@#@w$ FL  @AAD22a7791<=Aq"@T%;%;q%@$@"@@AF'1.L1G1G11L0L.L(LML#c) s7|$ 	6A?FKKN?A 5699%++FI\\!S^4F ,31ov{{1~oqr3I+JF1i'( 26LIv-.	6 	q!Qza%(9(9!(<"===q!Qza%(9(9!(<"===|##r   c                    |j                  d      j                         }|j                         }|j                  d   |d d d d df   z
  dz
  |d d d d df<   | j                  ||d      \  }}}	}|j                  d      }|	j                  d      }	|dk(  }
||
   ||
<   |	|
d d d d d d df      ||
d d d d d d df   <   ||fS )Nr$   r   r
   rB   )fliprI   r)   r   )r   r   r   r    r!   	inv_videoinv_queries
inv_tracksr\   inv_visibilitiesmasks              r   rQ   z+CoTrackerPredictor._compute_backward_tracks   s    JJqM'')	mmo(q1K1a4HH1LAq!G/3zzKq 0: 0
,
B("  __Q'
+003{!$'t)9$q!Qz:J)KT!Q1*%&|##r   )z3cotracker/checkpoints/cotracker_stride_4_wind_8.pth)NNr   r   F)   F)Nr   Fr   F)__name__
__module____qualname__r   r*   no_gradTensorintrM   r"   r   r   rQ   __classcell__)r   s   @r   r   r      s    N	 U]]_ !%"& !"'!$ !$ <<!$ !$ !$  !$ !$H HM$B M$^$r   r   )r*   torch.nn.functionalnn
functionalrF   r   )cotracker.models.core.cotracker.cotrackerr   !cotracker.models.core.model_utilsr    cotracker.models.build_cotrackerr   Moduler    r   r   <module>rw      s4        J 7
l$ l$r   