Optical Flow Estimation using a Spatial Pyramid Network

Inc Lomin's avatar
Jan 06, 2021
Optical Flow Estimation using a Spatial Pyramid Network
이 논문에서는 네트워크를 이용하여 optical flow를 추출하는 방법을 소개하고 있으며, 이를 SPyNet으로 명명하였습니다. 2017 CVPR에서 발표되었습니다.
Unofficial reimplementation (pytorch): https://github.com/sniklaus/pytorch-spynet
 

Introduction

기존의 신경망을 이용하여 optical flow를 계산하는 방법의 문제점은, 프레임 간의 움직임이 수 픽셀보다 클 경우 의미있는 결과물을 얻어내기 힘들다는 것입니다. 즉 한 프레임에서의 convolutional window가 다른 이미지에서의 해당 물체 픽셀을 커버하지 못하면 학습이 어려워집니다. 따라서 optical flow는 넓은 범위를 커버해야 하지만 여전히 sub-pixel 단위의 정확도도 중요합니다. 이 논문에서는 큰 움직임들을 처리하기 위해서 전통적인 spatial pyramid를 이용한 coarse-to-fine 접근법을 사용합니다.
논문에서 제시한 방법의 장점은 세 가지로 요약할 수 있습니다. 먼저 optical flow를 추출하는 기존의 방법들에 비견될만한 정확도를 보이며, 실시간에 가까울 정도로 빠르게 결과를 얻을 수 있고, 마지막으로 임베디드나 모바일 환경에서도 사용이 가능하도록 메모리 요구량이 적습니다.
 

Spatial Pyramid Network

Inference

SPyNet은 여러 개의 모델로 이루어져 있습니다. 전체 K개의 모델이 있다고 가정하고, k번째 모델을 G_k와 같이 나타냅니다. 0번째 모델을 제외한 각 모델은 순차적인 두 개의 이미지와 이전 단계에서 계산된 optical flow가 입력되면, 현재 단계에서의 optical flow와 이전 단계에서의 optical flow의 차에 해당하는 residual flow를 출력합니다. 이를 수식으로 나타내면 다음과 같습니다.
notion image
각 단계에서는 해당하는 크기의 residual flow들이 계산되며, 이를 이전 단계의 optical flow에 계속 누적해감으로써 다양한 크기의 flow들이 합해지게 됩니다. 이전 단계의 optical flow는 크기가 작기 때문에, upsampling을 한 후에 현재 단계의 residual을 더합니다.
0번째 모델에서는 이전 단계가 없으므로, 이전 단계에서 넘어와야 하는 optical flow는 zeros로 채우고 이미지 warping은 하지 않습니다. 따라서 0번째 모델의 출력값은 residual이 아니라, 이후 단계에서 residual들이 합해질 기본 바탕이 됩니다.
 

Training and Network Architecture

각 단계의 모델들은 독립적으로 학습됩니다. 즉 G0을 먼저 끝까지 학습한 후에, G0 파라미터들을 이용해서 G1을 초기화하고 학습하는 식으로 학습이 진행됩니다.
각 모델의 출력값인 residual flow의 loss는 target residual flow와의 end point error (EPE)를 최소화하는 방향으로 최적화됩니다. 이 때 target residual flow \hat{v}_k는 다음과 같이 정의됩니다. 해당 레벨의 사이즈로 다운샘플된 groundtruth \hat{V}_k와 이전 단계의 flowmap을 업샘플한 것의 residual입니다.
아래 그림과 같이, 오른쪽에서는 지난 단계에서 추정된 더 작은 optical flow가 upsampling되어 넘어옵니다. 이를 이용해서 이미지 I2를 I1의 시점으로 warping한 후에 현재 단계의 모델에 통과시키면 residual flow가 출력됩니다.
notion image
Inference에서 설명한 바와같이 각 단계들에서는 residual만을 계산하기 때문에 업데이트되는 정보의 양이 적으며, 네트워크를 간단하게 할 수 있습니다. 전체 모델은 0단계부터 4단계까지로 구성하였고, 각 단계는 5개의 레이어로 이루어져 있으며 0번째 네트워크에서는 이미지의 크기가 24*32, 마지막 네트워크에서는 384*512가 됩니다.
각 단계 모델 input은 해당 사이즈로 다운샘플된 이미지1, 이전 단계의 flow map으로 warping하고 다운샘플된 이미지2, 이전 단계의 flow map vector, 이렇게 8개의 채널을 지니고 있습니다. 각 컨볼루션은 7*7 사이즈이며, 채널 수는 {32, 64, 32, 16, 2}로, 마지막에는 x,y 방향으로의 flow인 두 채널이 됩니다.
Experiment

Details and Results

학습에는 MPI Sintel, Flying Chairs 데이터셋을 이용하였으며, FlowNet, Classic+NL과 일반적인 optical flow 벤치마크 성능을 비교하였습니다. 각 데이터셋마다 학습 시의 내용들이 조금씩 차이가 있습니다. 예를 들어, Sintel같은 경우에는 굉장히 큰 모션들이 포함되어 있기 때문에 피라미드 계층을 하나 더 늘려서 6단계를 사용하였습니다. 성능은 평균 EPE를 이용하여 비교하였으며, 모든 standard benchmark들을 계산하였을 때 SpyNet이 전반적으로 성능이 좋은 것을 확인할 수 있었으며, 가장 빠르기도 했습니다.
notion image
notion image
다음은 Sintel dataset의 모션을 다양한 속도(s)와 거리(d)로 분류하여 fine-tuned 모델을 성능을 FlowNet과 비교한 결과입니다. SPyNet은 가장 큰 displacement (>40pixels/frame)를 제외한 모든 속도 셋에서 더 좋은 성능을 보였습니다.
notion image
 

Analysis

  • Model Size
    • notion image
      각 레벨의 모델은 240,050개의 파라미터를 갖기 때문에, 5개의 모델(G0~G4)을 사용할 경우 총 파라미터 수는 1,200,250개가 됩니다. FlowNetS의 파라미터 수는 32,070,472개, FlowNetC는 32,561,032개이기 때문에 SPyNet의 크기는 FlowNet의 4%정도 밖에 되지 않습니다. 또한 전체 모델 파라미터가 9.7MB에 불과하기 때문에, GPU가 있는 임베디드 혹은 모바일 환경에서도 사용이 가능합니다.
 
  • Visualization of Learned Filters
    • notion image
      왼쪽 그림은 G2 네트워크의 첫번째 레이어 필터를 시각화한 것입니다. 각 행의 첫 두 열은 입력되는 두 이미지의 채널에 적용되는 weight이며, 세 번째 열은 두 weight 간의 차를 나타냅니다. 즉 모델이 학습하는 시간 차에 해당합니다. 모델의 필터들은 모든 컬러 채널에 동일한 수준으로 sensitive 하기 때문에 시각화한 weight가 거의 흑백으로 나오는 것을 확인할 수 있습니다. 또한 이러한 필터들은 고전적인 Gauissan derivative filters의 형태와 비슷했는데, 이런 고전적인 필터들은 매뉴얼하게 설정된 뒤 수평, 수직 방향으로만 작용하는 것과는 달리 이 모델에서의 필터들은 다양한 orientation과 scale의 필터를 포함하고 있었습니다.
      오른쪽 그림은 피라미드의 각 레벨의 필터들이 어떻게 다른지 시각화한 것입니다. 학습할 때는 분명 이전 레벨의 weight를 초기값으로 사용하였기 때문에 유사한 값을 가지고 있지만, residual flow를 학습하는 과정에서 분포가 달라지며, 특히 레벨이 높아질수록, 즉 해상도가 높아질수록 필터들이 sharp해지는 것도 확인할 수 있었습니다.
 
  • Speed
    • notion image
      Sintel 데이터셋을 대상으로 optical flow를 계산하는 방법들의 평균 EPE와 runtime을 비교해 보았을 때, SPyNet은 속도와 정확도의 균형이 가장 좋은 편에 속했습니다. 특히 SPyNet보다 더 빠르면서 더 정확한 결과를 주는 기법은 없었습니다. 속도와 모델 사이즈를 함께 고려했을 때 SPyNet이 임베디드 시스템에 적용하기에 가장 적합하다고 할 수 있습니다.
 

Discussions and Conclusions

이 논문에서는 기존의 optical flow 알고리즘을 deep learning을 이용해서 해결했습니다. Spatial pyramid를 deep하게 만듦으로써 보다 큰 스케일의 움직임들을 잡아내고, 각 피라미드 계층에서 deep network를 사용함으로서 flow들이 계층에 맞게 적절하게 업데이트 되도록 하였습니다. 이렇게 계층을 나누어 각 계층의 사이즈 상에서 '작은' 움직임들만을 포착하다 보니 task가 한결 간단해졌고, 따라서 파라미터의 수를 크게 줄일 수 있었습니다.
Pyramid들은 큰 움직임들을 나타내는 부분에서 한계가 있다는 점이 잘 알려져 있습니다. 특히 작고 얇은 물체들이 빠르게 움직일 경우, coarse level에서 포착되지 않기 때문에 flow map에서 사라지곤 합니다. 이러한 문제점을 개선하기 위해서 long-range match를 고려할 필요가 있습니다.
 
Share article