본문 바로가기
AIML 분야/Video Classification & Detection

Video Representation Learning by Dense Predictive Coding

by 포숑은 맛있어 2020. 12. 28.
반응형

없는줄 알았는데 코드가 공개되어있길래 리뷰하기 시작함.

video domain에서의 self-supervised learning 연구이다.

 

ECCV 2020의 spotlight를 받은 논문이다. 코드 또한 공개되어있다.

arxiv.org/pdf/1909.04656.pdf

github.com/TengdaHan/DPC.git


What is the paper about?

Task : Video Representation Learning (for action recognition)

Main idea : CPC를 확장한 방법인 DPC(Dense Predictive Coding) framework를 제안하여 action recognition을 타겟으로 temporal-spatial 정보를 잘 인코딩하도록 한다. 

Details

  • DPC라는 이름에서 알 수 있다시피, 'predictive'. 이 모델의 주된 특징은 previous knowledge가 주어진다면, 미래 프레임들을 예측하는데에 있다.
  • 물론 우리의 task는 action recognition이기 때문에 프레임을 픽셀단위 예측이 아니라 latent embedding을 예측하는 것이다.
    • 생각해보면, frame단위의 prediction을 한다는 것은 디코더 파트에서 illumination, shadow, texture 등의 reconstruction 능력까지 배워야한다는 의미가 되기 때문에 우리 목표를 생각한다면 이런건 크게 쓸모가 없다.
  • 그런데 prediction이라고 하면 문제점이 있다. 다음 프레임 정보가 deterministic하지 않다는 것. 이 논문에서도 이런 문제를 언급하면서 해결하고자 한다.
    • multi-way classification을 한다.
      (예전에 NLP에서 주워들은 것 같은 N-gram 방식으로 한다고 한다.)
    • recurrent하게 한다고 한다. 그러면 뒤로 갈수록 (prediction을 위해) 주어진 context는 더 적다고 생각할 수 있다.
  • 논문에서 제안한 DPC는 기존의 CPC (contrastive predictive learning)를 발전시킨 방법이다. 이름만 보면 예전 연구 또한 contrastive learning과 관련있을 것 같으므로 한번 보면 좋을 것 같다.
  • curriculum training scheme을 사용한다. 모델이 더 까다로운 training sample을 배우게 한다는 것 같은데 이 설명만으로는 잘 모르겠다.
  • Related Works에 action recognition의 two-stream architecture가 있다. 왜냐면 optical flow가 이런 representaion을 잘 배우는데에 큰 도움을 주기 때문에. 그런데 이 논문에서는 audio, optical flow를 안쓰고 RGB만 쓴다고 한다. (그럼 왜넣은겨)

# Keywords

Self-supervised Learning, Representation Learning, Video Action Recognition, SpatioTemporal Correspondence, Contrastive Learning, + Curriculum Learning (?)

 

여담으로, introduction 처음에 언급된 바에 의하면 비디오 데이터는 굉장히 많으며 비디오라는 특성 때문에 supervision을 주기 매우 좋다고 언급한다. 그래서 저번에 본 논문처럼 downstream task들이 image domain임에도 비디오에서 pre-training을 했던 것일까. 역시 correspondence를 배우는 게 challenging한 이슈인가 싶다.

 

 

Architecture. 좌측이 DPC, 우측이 contrastive loss를 위한 Pred-GT.

 

Method

DPC의 목적 : slowly varying semantic representation을 예측. (from recent past)

Input & Output (DPC)

Given: 2.5초 가량의 비디오.

Output: 그 다음 1.5초 가량의 embedding을 예측

 

  1. Input: blocks with non-overlapping videos (N개의 block)
    비디오를 끊어서 블록단위로 묶으며, 이를 x1, x2, ... , xn으로 표현한다.
    예를 들어, 8개의 block을 쓸건데 각각은 5 frames로 이루어짐.
  2. Non-Linear encoder function f(.)
    얘가 각 block xt를 latent representation zt로 mapping한다.
    3D-ResNet-18을 사용함 - strong encoder
  3. Aggregation function g(.)
    t개의 consecutive latent representation => context representation ct로 압축.

    weak aggregation function을 사용함.
    a one-layer Convolutional Gated Recurrent Unit (ConvGRU) with kernel size (1, 1) is used, which shares the weights amongst all spatial positions in the feature map.
    여기서 hidden state 계산할 때 dropout rate 0.1로 했다고 함.
  4. pi function : to predict the future.
    2 layer perceptron 사용.

이런식으로 seq2seq처럼.

 

위와같은 과정을 Kinetics400에서 self-supervised training 한다고 생각하면 된다.

 

그러면 downstream task에서 supervised training시에는 어떤 모델을 쓸지 궁금해진다.

아래와 같다. pi가 빠지고 맨 마지막에 pooling, FC가 들어간다. 음, 그러면 supervised learning때에도 recurrent unit을 쓴다는 의미가 된다.

 

action classifier (supervised learning with pre-trained DPC architecture.)

 

Loss

NCE (Noise contrastive estimation): binary classification task.

real sample이랑 noise sample을 넣은 후 둘을 구분하는 task. 이걸 z representation에 적용.

그리고 이에 대한 변형으로 NCE를 embedding space에 사용하는 연구가 있었고, 이 논문 또한 그 방식을 따른다.

 

최종 loss 형태는 cross entropy 형태가 됨.

z_i,k라고 하면 i는 temporal index, k는 spatial index. z representation이 (H,W) 이렇게 생겼기 때문에 각 location마다 아래와같은 similarity loss를 계산할 수 있다. 그래서 temporal & spatial 위치가 일치한 것만 positive pair가 되는거고, 나머지는 negative pair가 된다.

loss 설명

negative에도 종류가 있다.

  1. easy negative : 아예 다른 비디오에 뽑음 -> 완전 쉬움
  2. spatial negative : 같은 비디오인데 spatial 위치가 다름. temporal은 같을수도, 다를수도 있음. -> spatial 위치가 다르면 그리 어렵진 않을 것임.
  3. temporal negative (hard example): 같은 비디오인데다가 같은 spatial location임. 어렵다!

각각의 비율은 무슨 multi-batch training 방식을 따랐다고 하는데, 아래와 같다.

Curriculum Learning.

related work에서 언급하지는 않았지만 커리큘럼 러닝 방법을 썼다고 한다. 왜냐면 처음에는 2개의 timestep만 예측하게 학습했다가, 어느정도 학습이 되면 3개를 예측하게 하는 식으로 하기 때문. 이때 1개의 timestep은 0.5초 간격이다.

 

 

Avoid Shortcuts and Learning Semantic

우선 왜 shortcuts를 피해야하냐면, future prediction이 단순히 extrapolation이면 안되기 때문.

수영하는 동작을 상상한다면, 팔이 회전한다든가 몸과 머리가 물 위아래로 왔다갔다하는 그런 시맨틱을 배워야하기 때문.

 

low level semantic 뿐만 아니라 high-level semantic을 배워야함. 이를 위해서 color jittering 등의 augmentation 기법을 frame-wise로 적용한다.

 

  1. Batch Normalization : encoder에서 그냥 BN을 쓴다.
    사실 저자들은 Instance Normalization도 써봤음. 왜냐면 BN이 network cheating하는 효과가 있는데, 이 논문에서는 representation을 잘 배우기 위해서 shortcuts은 피해야했기 때문임. 그런데 실험 결과, self-supervised learning의 성능으로는 둘다 비슷한 성능인데, downstream task에서는 BN이 5~10%정도의 성능 차이가 났다고함. 역시 deep CNN은 BN없이는 배우기 어렵구나를 깨닫고 BN을 썼다고.
  2. Spatial RF: 별로 제한을 두지 않음.
    이것도 encoder에서 patch별로 보도록 제한을 둬야하나? 고민했다는데, 결국 large RF에서의 context라는것도 절대 무시할 수 없는 영역이기 때문에 위에서 이해한것처럼 이미지단위로 수행했다고 한다.
  3. Temporal RF: 각각의 block에서 너무 많은 RF를 볼 수 없도록 설정했다고함. 왜냐면 그래야지 temporal consistency를 그 윗단 레이어에서 배울 수 있기 때문.

 

Experiment

Self-supervised Pre-train : Kinetics 400

Supervised Training: UCF101, HMDB51

학습 디테일은 논문에 자세히 나와있으며, 코드도 공개되어있으니 참고하면 좋을 것 같다.

 

기존 방법 대비 큰 차이로 좋은 성능을 보임을 확인했다.

 

Ablation

Ablation의 설명이 약간 이해가 안된다만, 저렇게 block 단위로 dense하게 feature map을 뽑았던 게 성능향상에 큰 도움이 되었다고 한다.

remove Seq.는 sequential prediction을 빼고 각각 FC를 둬서 parallel하게 추측한건데, 이미 g(.)에서 recurrent model을 썼는데 무슨 의미인가 싶긴 했다. 그냥 future prediction에서 순서대로 추측하느냐 따로 하느냐 정도의 차이이다.

아래 테이블에서는 dataset이 커야함을 시사한다. supervised를 UCF에서 할건데, self-supervised를 UCF에서 한것보다는 kinetics에서한 게 성능 차이가 컸기 때문.

그리고 self-supervised learning (Kinetics) 각 에폭의 checkpoint를 가져와 supervised learning (UCF)를 했을때 성능의 correlation을 보는 실험도 했다. 당연히 두 성능은 같이 올랐고, 이를 통해서 pretrained model 성능이 좋으면 downstream task의 성능이 좋다는 것을 언급했다.

 

이외에도 curriculum learning을 적용한 실험이 있다.

 

Visualization은 논문을 참고하도록 하자. 논문에서 크게 세가지를 제공한다.

  1. nearest neighbor를 통해서 가장 그럴듯한 다음 프레임 (0.5초단위로) 3개를 뽑은 visualization
  2. t-sne 시각화.
  3. positive/negative sample에 대해 distance를 histogram.

 

 

 


Summary

각 시각마다 5프레임정도 단위를 block으로 묶어 feature를 각각 뽑아준다. 이 정보를 aggregation하고, recurrent unit을 통해 다음 step의 embedding을 예측할 수 있게 만든다. 일반적인 RNN 생각하면 편하다.

 

Contrastive loss가 작용하는게 특히 같은 비디오, 같은 spatial location이지만 temporal축이 다른 경우(hard example)에서도 잘 수렴되게 만듦을 생각하면, contrastive learning이 tracker같은 모듈이 없어도 학습할 수 있도록 모델을 잘 고안한 것 같다.

 

- 저번에 cycle loss를 사용한 논문에서는 (CVPR 2019) tracker를 사용함으로써 consistency를 추적할 수 있게하며 이를 loss로 줬었다. 유클리디안 거리를 사용했다. 이렇게하면 (tracker를 간단하게 하면) encoder가 잘 배워진다. inference 및 supervised training시에 finetuning 없이 encoder (2D ResNet)만 사용한다.

 

- 여기선 recurrent unit이 prediction을 잘 하게 만들거라고 생각을 하고, loss는 그냥 positive인지 negative인지를 CE loss로 학습한다. downstream task에서도 recurrent unit을 사용한다.

=> 의문인건 그러면 downstream에서 f(.) 인코더만 사용한다면, self-supervised pre-training에서 recurrent unit의존도가 컸을 경우에는 representation 능력이 더 떨어지는거 아닌가? 이런 생각이 든다. 인코더 구조에 3D cnn만 쓰는 게 아니라 recurrent unit까지 무조건 써야하는 상황이다. 물론 위의 cycle loss논문은 VLOG or Kinetics400으로 self-supervised learning을 했더라 해도 downstream task가 action classification이 아니라 segmentation, object detection같은 이미지 기반이었기 때문에 fair-comparison이 불가능하겠지만 말이다.

 

 

=> recurrent unit 안쓰고 배울 방법은 없을까? 논문에서 사용한 g(.)가 얼마나 큰건지는 잘 모르겠는데 한번 살펴볼 필요가 있어보인다. 물론 5 step정도밖에 안써서 연산량이 많이 크진 않겠지만 말이다.

반응형

댓글