✔️ Project page : https://co-tracker.github.io/

 

CoTracker: It is Better to Track Together

We track points sampled on a regular grid starting from the initial video frame. The colors represent the object (magenta) and the background (cyan). For PIPs, many points are incorrectly tracked and end up being ’stuck’ on the front of the object or t

co-tracker.github.io

 

✔️  Practice link : https://huggingface.co/spaces/facebook/cotracker

 

CoTracker - a Hugging Face Space by facebook

 

huggingface.co

 


➡️ Abstract

  • 본 논문의 저자는 transformer를 기반으로 해서 영상에 걸친 dense point들을 추적할 수 있는 CoTracker를 제안
  • 해당 방식은 다른 point tracking 방식에서 각 point들을 독립적으로 추적하는 것과는 달리 다른 point 추적을 동시에 고려하면서 진행함으로써 더 높은 정확도와 안정성을 확보한다고 주장

 


➡️ Introduction

지점 일치(point correspondences)를 잘 하도록 설계하는 task는 컴퓨터 비전 분야에서 기초적인 문제이면서도 이후의 downstream task 수행을 위해 필수적이다. 논문의 저자는 동적인 물체가 있고 움직이는 카메라가 촬영한 영상에서 지점 일치 문제를 풀고자 했다. 특히 주어진 한 개 이상의 3차원에서의 정사영에 해당하는 2차원 점이 주어졌을 때, 영상 내의 다른 frame 에서 해당하는 지점이 어디에 위치하는지 찾고자 하는 것이 목표였다.

 

이와 유사한 두 가지 문제가 존재한다. 첫 번째로 optical flow는 영상 frame 내의 각 지점의 속도를 예측하고자 했지만 짧은 frame 이내의 지점들에 대해서만 잘 예측하는 한계가 있었다. 두 번째로 tracking은 조금 더 긴 기간동안의 지점의 움직임을 예측하고자 했는데, 효율성을 위해 sparse한 몇 개의 지점에 대해서만 독립적으로 작업을 수행한다는 한계가 있었다. 

 

본 논문에서는 추적된 지점 사이의 상관관계를 고려할 수 있다면 성능이 크게 향상할 것으로 가정했다. 이러한 특성을 구현하기 위해서 transformer 구조를 차용했으며, 여러 지점의 tracking 과정을 동시에 고려할 수 있게 됨으로써 큰 성능 향상을 이뤄냈다. Self-attention을 통해서 각 track 사이의 정보들이 서로 고려할 수 있게 되었고 virtual track 이라는 기법을 통해 조금 더 효율적인 self-attention 연산을 수행할 수 있었다. 

 


➡️ Introduction

(중략)

 


➡️ CoTracker

 

✔️ 모델의 목표

  • 영상 \({V} = (I_t)^{T}_{t=1}\) 에 걸쳐서 2D point들을 track하는 것
    • 영상은 \({T}\) 개의 RGB frame 들로 구성되어 있음
    • \({I}_t \in \mathbb{R}^{3 \times H \times W}\)
  • 구체적으로 tracker는 \({N}\) 개의 point를 추적하고 예측함
    • \({P}_t^i = (x_t^i, y_t^i) \in \mathbb{R}^2\;,\;\;t=t^i,\ldots,T,\;\;i=1,\ldots,N\)
    • 이때 \({t}^i \in {1, \ldots, T} \) 는 track이 시작되는 시점
  • 또한 지점이 특정 frame에서 화면에 보이는지 여부도 visibility flag \({v}_t^i \in {0, 1}\)를 통해 예측함
    •  작업의 편의를 위해 영상의 첫 frame에서는 지점이 visible 하도록 설정함 ( \({v}_{t_i}^i = 1\) )

 

✔️  모델의 입 / 출력

  • 입력
    • 영상 : \({V}\)
    • \({N}\) 개의 track들에 대한 시작 위치와 시간 : \( ( {P}_{t^i}^i, t^i )^N_{i=1} \) 
  • 출력
    • track 위치와 visibility 예측 :  \( \hat{P}_t^i = (\hat{x}_t^i, \hat{y}_t^i ), \hat{v}_t^i \)

 

✔️  Transformer formulation

저자는 Transformer 네트워크 ( \({\Psi} : {G} \mapsto {O}\) )를 통해서 track의 최초 예측을 개선하고자 했음.

  • Track들은 입력 토큰 grid \({G}_t^i\)로 인코딩됨
    • \({i} = 1, \ldots, N \)는 각 track을 나타내고, \({t} = 1, \ldots, T\)는 시간을 나타냄
  • 업데이트된 track들은 출력 토큰 grid \({O}_t^i\)로 표현됨

 

◾ Image features

  • 각 영상 frame \({I_t}\)로 부터 convolutional 네트워크를 사용해서 dense \({d}\)-차원 appearance feature \({\phi}(I_t) \in \mathbb{R}^{d \times \frac{H}{k} \times \frac{W}{k}}\)를 추출함
    • 이때 효율성을 고려해서 \({k} = 4\) 를 사용해 resolution을 줄임
  • 저자는 추가로 몇몇 scale 된 버전을 실험했음
    • \( \phi_s(I_t) \in \mathbb{R}^{d \times \frac{H}{k2^{s-1}} \times \frac{W}{ k2^{s-1} } }\)
    • \({s} = 1,\ldots,S\) 로 변경하며 실험했고, 최종적으로 \({S} = 4\) 를 사용함
    • 이러한 downscale된 feature들은 base feature로 부터 average pooling을 통해 계산되었음

 

◾ Track features

  • track의 appearance는 feature vector \( {Q}_t^i \in \mathbb{R}^d \) 를 통해 iteration을 통해 지속적으로 연산됨
    • 시작지점의 image feature를 sampling 해서 초기화 되고 이후 네트워크를 통해 업데이트 됨

 

 

◾ Correlation features

  • 이미지에 맞는 track을 찾기 위해서 RAFT에서 사용한 correlation feature \({C}_t^i \in \mathbb{R}^s\)를 사용함
    • \({C}_t^i\) 는 track feature \({Q}_t^i\) 와 현재 track의 예측 위치 \(\hat{P}_t^i\) 근처의 image feature \(\phi(I_t)\) 를 내적해서 계산함
      • \({C}_t^i\) 는 내적 결과를 쌓아서 얻어짐
        • \( [C_t^i]_{s\delta} = < Q_t^i, \phi_s(I_t) [\hat{P}_t^i / ks + \delta] >, \)
        • 이때 \({s}=1, \ldots, S\)는 feature scale 이고 offset은 \({\delta} \in \mathbb(Z)^2, ||\delta||_{\infty} \leq \Delta  \)
    • image feature \({\phi}_s (I_t)\)는 bilinear interpolation과  border padding을 통해 정수가 아닌 위치로 sampling 되었음
      • \({C}_t^i\)의 차원은 \((2\Delta + 1)^2S = 196\) ( \({S} = 4\), \({\Delta} = 3\) 을 사용 )

 

◾ Tokens

  • Position, visibility, appearance와 track들의 correlation에 대한 입력 토큰 \({G}(\hat{P}, \hat{v}, Q)\)는 다음과 같은 feature들의 합으로 계산됨
    • \({G_t^i=\left(\hat{P}_t^i-\hat{P}_1^i, \hat{v}_t^i, Q_t^i, C_t^i, \eta\left(\hat{P}_t^i-\hat{P}_1^i\right)\right)+\eta^{\prime}\left(\hat{P}_1^i\right)+\eta^{\prime}(t) \tag{1}}\)
  • \({\eta}\)는 시작 지점 \({t}=1\)에 비해 예측된 위치가 얼만큼 떨어져있는지를 계산하기 위한 sinusoidal positional encoding이고 \({\eta}^{\prime}\)은 시작위치와 현 시점 \({t}\)에 대한 자체 positional encoding 을 계산하기 위해 사용됨
    • 이 정보는 예측 위치 \({P}\)에 내포되긴하지만, 위와 같이 직접 계산해서 추가해주는 방식이 더 좋은 성능을 냈다고 주장함
  • 최종 출력 토큰은 \(O(\Delta\hat{P}, \Delta Q)\) 이며, 각각 position 과 appearance 값에 대해 다음 iteration에서 업데이트 해줄 값임

 

◾ Iterated transformer applications

  • Transformer 구조를 \({M}\)번 적용하면서 track에 대한 예측을 점진적으로 개선함
    • \({m}=0,1,\ldots,M\) 을 예측 단계의 index라고 할 때, \({m}=0\)은 최초 initialization을 의미함
    • 각 iteration 마다 update가 진행됨
      • iteration의 출력 토큰 : \({O}( \Delta \hat{P}, \Delta Q ) = \Psi (G(\hat{P}^{(m)}, \hat{v}^{(0)}, Q^{(m)} )) \)
      • update 진행 : \(\hat{P}^{(m+1)} = \hat{P}^{(m)} + \Delta \hat{P} \) 과 \({ {Q}^{(m+1)} = {Q}^{(m)} + \Delta \hat{Q}  }\)
    • 단, visibility mask \(\hat{v}\) 는 transformer를 통해 매번 업데이트되지 않고, \({M}\) 번의 iteration 이후 마지막에 한번 업데이트됨
      • \(\hat{v}^{(M)} = \sigma( WQ^{(M)} )\)
      • \({\sigma}\) 는 sigmoid 활성화 함수이고 \({W}\) 는 학습된 가중치 행렬
    • \({m} = 0\) 일 때, \(\hat{P}^{(0)}\), \({v} ^{(0)} \), \({Q} ^{(0)} \) 는 각각 모든 시간 \({t}=1, \ldots, T\) 에 대해서 \({P}^i_{t^i}\), 1, \(\phi{(I_{t^i})[P^i_{t^i}/k]}\) 로 설정함

 

✔️  Transformer architecture and vitual tracks

  • Transformer \(\Psi\) 는 attention 연산을 time과 track 차원에 각각 수행함
    • 이 연산을 통해 효과적으로 연산할 수 있게 되어 시간 복잡도도 줄일 수 있다 
      • (\ (O({N^2T^2}\) 에서 \(O({N^2 + T^2})\)
    • 하지만 여전히 큰 \({N}\)의 경우 계산량이 커서 사용하기 힘듦
  • 저자는 이러한 문제를 극복할 수 있는 \({K} \;\; virtual tracks tokens\) 방식을 제안함 ( \( K {\ll} N \) )
    •  고정되고 학습 가능한 초기화를 사용하여 입력 그리드에 추가 토큰으로 추가되고 출력에서 제거

 

✔️  Windowed inference

  • Iterative 한 업데이트 방식 tracking의 주요 장점은 길이가 긴 영상에 대해서 sliding window 방식을 적용하기 쉽다는 점임
    • 최대 window 크기 \({T}\)보다 더 긴 길이 \({T}^{\prime}\) 를 갖는 영상 \({V}\) 를 가정
    • 영상 전체를 따라 track을 하기 위해서, 영상을 \({T}\) 길이를 가지며 \({T/2}\) frame이 겹치는 \({J} = \lceil 2T^{\prime}/T-1 \rceil \) 개의 window로 나눔
  • \({(m, j)}\) 는 \({m}\) 번째 transformer의 \({j}\) 번째 window 값이라고 가정
    • 즉, \({M \times J}\) 크기를 가지며 \( ( \hat{P}^{(m,j)}, \hat{v} ^{(m,j)}, Q ^{(m,j)} ) \) 값을 갖는 grid가 transformer iteration과 window를 따라 존재함
    • \({m}=0, \; j=1\) 은 초기화값을 사용하고 이후 transformer를 통해 \({M}\) 번의 업데이트를 진행
      • 이후에 \({m}=M, \; j=1\) 의 값을 통해 \(j=2\) 의 업데이트를 동일한 과정으로 진행
      • 마찬가지로 마지막 window에 도달할 때까지 반복적으로 수행함

+ Recent posts