✔️ Project page : https://co-tracker.github.io/
✔️ Practice link : https://huggingface.co/spaces/facebook/cotracker
➡️ 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 \)
- \({C}_t^i\) 는 내적 결과를 쌓아서 얻어짐
- image feature \({\phi}_s (I_t)\)는 bilinear interpolation과 border padding을 통해 정수가 아닌 위치로 sampling 되었음
- \({C}_t^i\)의 차원은 \((2\Delta + 1)^2S = 196\) ( \({S} = 4\), \({\Delta} = 3\) 을 사용 )
- 각 \({C}_t^i\) 는 track feature \({Q}_t^i\) 와 현재 track의 예측 위치 \(\hat{P}_t^i\) 근처의 image feature \(\phi(I_t)\) 를 내적해서 계산함
◾ 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에 도달할 때까지 반복적으로 수행함