Intro
오늘은 ECCV 2020 Best Paper Award를 수상한 RAFT: Recurrent All-Pairs Field Transforms for Optical Flow를 같이 살펴보겠습니다. 원래 2022년 중순쯤에 포스팅을 준비했었는데, 현실에 치여 이제야 포스팅을 준비하고 있네요. 사실 이 논문 리뷰를 꼭 하고 싶던 이유가 있는데요.
이 논문의 가장 인상 깊었던 부분은 뒤에서도 자세히 말씀드리겠지만 Optical Flow iteration입니다. 쉽게 말하면 반복적인 연산을 통해 결과물의 정확도를 높이는 작업이죠. 이 부분이 인상 깊었던 이유는 해당 내용을 졸업 논문을 작성하며 아이디어만 살포시 첨가했었기 때문입니다. 벽에 부딪혀 최종적으로 수행하지는 못했었지만, 관련 내용이 논문에 적혀있으니 RAFT 소개 이후에 간단히 다뤄보도록 하겠습니다.
Abstract
RAFT는 흔히 말하는 성능으로 찍어 누른 논문이라고 저는 생각합니다. 저는 기존에 Best Paper는 획기적인 기법이나 접근법을 제안해 game changer가 되는 논문이라고 생각했습니다. RAFT는 새로움보다는 성능과 기술적인 부분에 집중했습니다. 그럼에도 불구하고 당당하게 Best Paper Award를 수상한 배경에는 압도적인 성능이 주는 강한 인상이 큰 지분을 차지했을 것입니다.
그렇다고 아예 새로운 알고리즘이 없냐고 물어본다면 아니라고 답할 것입니다. 기존 Optical Flow 연산은 주로 Scale/Sampling 등에 변화를 준 이후 결괏값들을 concate 해 최종 답을 구했습니다. RAFT는 아예 재귀적으로 Iteration을 돌며 최종 답을 향해 나아가는 방식을 제안했습니다. 이는 Optical Flow와 같이 groundtruth/labeling 없이 input 만을 활용해 답을 구하며, 어느 정도 평가가 가능한 분야에 합리적인 방법이라고 생각됩니다.
이는 앞에서 언급했듯이 제 연구 분야와 일맥상통하는 부분이 있습니다. FlowNet2.0을 활용해 과제를 진행하던 중, Iteration을 돌며 Gradient Descent 알고리즘과 같이 정답을 향해 나아가면 좋겠다는 생각을 한 적이 있습니다. 이는 연구실에서 진행하던 강화 학습을 활용한 알고리즘에서 영감을 얻었었죠. 하지만 결국 Correlation volume 계산을 반복적으로 수행함에 따라 발생하는 overhead를 감당하지 못해 최종 과제 결과에서는 제외되고 말았습니다.
앞으로 나올 내용 중 RAFT가 correlation 계산을 어떻게 획기적으로 줄일 수 있었는지 살펴보는 것 역시 하나의 중요 포인트로 생각해 주시면 좋겠습니다.
Energy Minimization
RAFT는 고전적인 Optical Flow 알고리즘 기법 중 일부분을 차용합니다. Optical Flow Constraint를 최소화하는 방향으로 최적화를 진행했으며, 이 과정에 iteration이 들어가는데 여기서 아이디어를 가져옵니다. OFC와 관련된 내용은 이미 포스팅을 통해 소개해 드렸으니, 자세한 내용은 아래 링크를 통해 봐주시면 감사하겠습니다 :)
Network Architecture
RAFT는 크게 세 부분으로 구분됩니다. 자세한 내용은 아래에서 각각 소개하기로 하고, 일단 간단하게 이름만 살펴보죠.
- Feature Encoder, Context Encoder : Feature Extraction을 진행
- Correlation Layer : Image 간 Correlation Volume 생성
- Update Operator : 초기값[Zero]부터 시작해 iteration을 돌며 Flow Field를 update 및 refine
이런 three-stage architecture를 통해 RAFT는 Optical Flow를 아래와 같은 순서로 계산하게 됩니다.
- Feature Extraction
- Computing Visual Similarity
- Iterative Updates
Feature Extraction
Feature Extractor는 CNN [ResNet] 구조로, Feature Encoder Network(a.k.a. F-Net)와 Context Encoder Network(a.k.a. C-Net)으로 이루어져 있습니다. 최종적으로는 256 channel의 feature를 추출하게 되는데 각각을 좀 더 자세히 살펴보도록 하겠습니다.
F-Net은 down-sampling 된 이미지의 pixel 당 feature vector를 계산하는 network입니다. Fig 1에서 볼 수 있듯이 Frame 1, Frame 2 각각의 feature map을 추출합니다. 최종적으로는 기존 Optical Flow model들과 같이 두 frame 간 motion 계산하는 것이 목표입니다.
C-Net은 저는 처음 본 network로, 말 그대로 문맥적 특징을 추출하는 network입니다. Optical Flow의 기준점은 Frame 1이기 때문에 Frame 1의 context에 해당하는 feature map을 추출합니다. 구조적으로는 F-Net과 차이가 없으며, Frame 1에만 적용해 Update Operator에 입력값으로 주게 됩니다.
4D Correlation Layer (Correlation Volume)
FlowNet 이후부터 Optical Flow Model에 빠지지 않는 Correlation layer는 RAFT에서도 역시나 사용되었습니다. Correlation layer 관련해서는 이미 FlowNet/FlowNet2.0을 리뷰하며 다루었기 때문에 기본적인 내용은 다루지 않을 것입니다. 그러나 Fig 3의 그림은 Correlation volume을 생성한다는 게 무슨 의미인지 너무나 잘 설명했다고 느껴 가져오게 되었습니다. RAFT의 Correlation layer에 대해 본격적으로 들어가기 전, 전반적인 Optical Flow Model들에서 사용되는 Correlation layer에 대해 자세히 알고 싶으시면 아래 링크를 클릭하셔서 참고 부탁드립니다 :D
RAFT에서 Correlation volume을 생성하는 시점과 사용하는 시점은 조금 차이가 있습니다. 이는 Update operator 진입 시점을 기준으로 iteration 전과 후로 나눌 수 있습니다. 지금부터 이 부분에 대해 조금 더 자세히 살펴보겠습니다.
4D Correlation Volume Generation - before iteration
기존의 Correlation과 다르게 RAFT는 4D Correlation volume을 생성합니다. 위 식에서 보면 알 수 있듯이 $Image_{1}(i, j)\cdot Image_{2}(k, l)$ 결과를 저장합니다. 위 식의 결과물로서는 $H_{1} \times W_{1}$개의 tensor를 생성하며, 각각의 크기는 $H_{2} \times W_{2}$입니다. 즉, 총 size는 $H_{1} \times W_{1} \times H_{2} \times W_{2}$입니다.
여기에 좀 특별한 부분은 Fig 3에서 볼 수 있습니다. 위 식으로 우리는 $C^{1}$에 대한 결과를 얻을 수 있습니다. 이제부터는 down-sampling을 해 가며 Correlation Pyramid를 생성합니다. Kernel size를 {1, 2, 4, 8}로 변경하며 Average pooling을 적용하며, 최종 결과로 $C^{1}, C^{2}, C^{3}, C^{4}$를 생성하게 됩니다. Average pooling 사용을 통해 coarse correlation 계산을 빠르게 할 수 있는 것 역시 좋은 접근입니다.
이제부터 우리는 $Image_{1}$과 $Image_{2}$의 확정적인 Correlation Pyramid를 가지게 됩니다. 따라서 Iteration을 도는 과정에서 Correlation 계산을 별도로 하지 않아 overhead를 굉장히 크게 줄일 수 있습니다.
Correlation Lookup - during iteration
Update operator 진입 이후에 사전에 구한 Correlation volume은 Correlation Lookup 과정을 통해 참조됩니다. 현재 상태의 Optical Flow에 해당하는 위치 주변부를 Correlation volume에서 bilinear sampling을 통해 추출합니다. Current Optical Flow와 추출한 Correlation volume을 통해 3D Correlation feature를 얻을 수 있습니다. 최종적으로는 각 Target point 기준으로 $(2r+1)^{2}$의 vector를 reshape 해 $H \times W \times (2r+1)^{2}$의 tensor로 변환합니다.
Update Operator
RAFT는 iteration을 돌며 점점 더 정확한 Flow field에 근접해 갑니다. 이를 위해서 GRU structure를 이용하는데, CNN을 이용해 recursive 하게 layer를 쌓은 방식이라고 보시면 됩니다. 굉장히 RNN과 모양새가 닮아 있습니다 (사실 맞습니다). Computer vision 영역에 transformer의 침공이 이어지면서 RNN like architecture에 대한 이해도가 굉장히 중요해졌지만, 이 포스트에서는 간단하게만 정리하고 넘어가도록 하겠습니다.
Fig 4에서 ConvGRU, 즉 Update operator에는 총 세 가지의 input이 합쳐져 입력으로 들어가게 됩니다. 여기에 이전 hidden state까지 더해져 최종 입력값이 되는데, 출력값은 결과로 나온 hidden state를 바로 활용하는 것이 아니라 추가적으로 conv. layer를 통과시키게 됩니다. 이로서 현재의 Flow가 결정되는데, 이런 과정을 iteration을 거쳐 최종 Flow field를 만들 수 있습니다.
- Input
- $x_{t}$: Encoded previous Optical Flow + Encoded Correlation lookup + Output of C-Net
- $h_{t-1}$: Previous hidden state, hidden unit of GRU
Iteration을 거치며 Flow field는 다음의 식을 따라 update 됩니다.
$$f_{k+1}=f_{k}+ \bigtriangleup{f_{k}}$$
여기서 $\bigtriangleup{f_{k}}$는 Iteration의 결과로 나온 Flow field이며, output은 초기값$(f_{0})$ 0에서부터 업데이트됩니다. 처음 상태에는 이전 프레임도 없고, 아무런 변화도 없으니 0이라는 값은 매우 합리적으로 보입니다. 이렇듯 iteration에 대한 고민이 페이퍼의 많은 부분에 녹아 있음을 느낄 수 있죠. 아래에서 이러한 부분들에 대해 좀 더 살펴보겠습니다.
Considering Iteration
RAFT에서 추가적으로 Iteration을 고려한 부분은 크게 두 가지가 있습니다. Training 과정과 Inference 과정에서 이런 모습을 확인할 수 있는데 하나씩 살펴보겠습니다.
Training
RAFT의 training은 iteration이 더해질수록 loss 반영이 커지는 형태입니다. Groundtruth와의 error loss를 계산하는 단순하지만 확실한 방법을 선택하지만, iteration 내 모든 feature map을 전부 groundtruth와 비교해 특성을 잘 반영하게 합니다. 이럴 경우 iteration이 커지면 weight 역시 증가하게 됩니다. 아래 식에서 실험적으로 최적값을 구한 결과, $\gamma = 0.8$으로 표기되어 있습니다.
Inference
Inference에서는 Zero Initialization과 Warm Start라는 방법들로 iteration을 고려하고 있습니다. 이 중 Zero Initialization은 Flow field의 초기값을 0으로 하는 것으로, 앞에서 이미 살펴보았기 때문에 더 이상 다루지는 않겠습니다. Warm Start는 이전 Flow를 활용하게 위해 제안된 방법으로, 실제로 움직여 다음 Initialization에 활용하는 Forward Projection 기법입니다. 이는 이전 Flow field를 다음 iteration에서 가이드 역할로 활용하기 위함이며, 이를 위한 식은 아래와 같습니다.
$$f_{t}(x+f_{t-1}(x))=f_{t-1}(x)$$
Result
- EPE [End-Point-Error]
- Performance Plot
Appendix
RAFT가 상당히 반가웠던 이유는 앞서 말씀드린 것처럼 제 졸업 논문에서 시도했던 방법이 녹아있기 때문입니다. 해당 방법을 이용해 정확도를 1도 내외로 줄일 수 있었으나, 그만큼 시간이 오래 걸리고 소요 시간을 정의할 수 없다는 문제가 있었습니다. 특히 Correlation volume을 매번 생성하는 과정이 큰 overhead로 작용했는데, RAFT의 저자가 이를 해결하는 과정을 보며 크게 감명받았습니다. 논문의 2.6 오차 보정 장에 해당 내용이 녹아 있으며, 아래는 그 내용을 캡처한 이미지입니다.
Reference