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

Learning Correspondence from the Cycle-consistency of Time

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

arxiv.org/pdf/1903.07593.pdf

 

video self-supervised learning 문제를 풀려면 뭐 아이디어 없나? 싶어서 고른 논문. 창작의 고통...

CVPR 19 oral paper이며, 깃허브에 코드가 공개되어있다.

저번에 리뷰한 task-aware한 video CSL 논문이 이 논문을 인용하였다.

 

아직 논문 리뷰 게시글 쓴걸 읽어도 좀 알아보기 어려운데, 많이 쓰면 언젠가 늘지 않을까...?
사실 글자가 잘 안읽혀서 쓰면서 논문을 읽는거지만...

 

ajabri.github.io/timecycle/

 

Learning Correspondence from the Cycle-Consistency of Time

Xiaolong Wang*, Allan Jabri*, Alexei A. Efros. Learning Correspondence from the Cycle-consistency of Time. In CVPR, 2019 (Oral Presentation). (hosted on arXiv)

ajabri.github.io


 

Keywords

  • Self-supervised Learning
  • unlabeled video
  • without fine-tuning (generalizability)
  • visual correspondence tasks: keypoint tracking, video object segmentation, optical flow.

 

Main Idea?

"cycle-consistency in time as free supervisory signal"

- train time : cycle-consistent tracking을 잘 할 수 있도록 feature map representation을 배운다.

- test time : space과 time을 따라서 봤을때, 그 representation space상에서 nearest neighbor를 구하고자함.

=> 무슨 cycle-consistency를 말하는거지?

 

비디오 클립이 있을 때, 시작점-끝점을 붙여서 circular하게 붙인다면?

=> start/end 지점은 inconsistency가 있다!

=> 이를 cycle-consistent loss로 지정

=> 그러면 frame간의 consistency를 배우도록 representation이 학습될 것이다!

 

이걸 tracker를 사용하여 탐지하고, 중간에 트래킹이 안되는 문제들을 해결하려고 skip-cycle, multiple cycles 개념을 설명한다.

(물론 아이디어는 간단해도 구현은 어려울 것이다. 실제로 optical flow도 사용하고 tracking도 해야한다.)

 

patch tracking이 circular하게 돌아와서, learning signal을 어디에 적용했는지 보도록 하자.

Method?

말로 풀어서 설명을 하자면,

이하 다룰 image, patch는 전부 encoder를 거쳐 feature space상에서 다뤄진다.

시작 프레임의 일부 patch를 뽑는다. 이 patch를 쭈우우욱 tracking할 것이다. clip의 forward, backward 양 방향으로.

다음 프레임에서는 어떤 location이 이전 프레임의 patch와 correspondence가 맞는가? => tracker T가 구한다.

다시 말해, tracker T의 output = patch와 가장 잘 맞는 image feature + similarity score 두가지라는거다.

이 output에 또 다음 프레임에서 tracker를 돌린다면, 방금 tracking된 patch와 또 잘 맞는 피쳐를 localize해서 결과로 뱉을 것이다. recursive하게 적용한다고 생각하면 된다.

이 tracker가 뭘 보길래 이런 연산이 가능한가? feature encoder pi가 consistency를 잘 반영하는 feature를 뽑아주는 역할을 한다. 그래서 tracker는 그렇게 복잡하지도 않고, 나중에 inference때는 tracker를 이용하지 않는다.

현재 하고있는 게 unsupervised learning이며, 우리 목표는 consistency를 잘 반영해줄만한 feature representation을 배우는 것이다. encoder를 잘 배우는 게 목적이라는 것이다.

헷갈리면 안되는게 좋은 tracker를 배우는 것은 우리 목적이 아니며, 그냥 인코더 배우려고 쓰는것 뿐이다.

 

아래 그림을 보자.

     

위 설명에 대한 그림

end-to-end로 좋은 인코더를 학습하려는 것 까지는 알겠다.

그렇다면 objective function은?

 

람다=0.1

1. Tracking.

첫 그림에서 설명된 것 처럼, initial patch - re-localized path 사이의 agreement measure.

두 feature 사이의 거리라도 구하나? 아직 안나와서 패스.

 

2. Skip Cycle

위에서는 연속 프레임으로 적용했으니, 여기서는 two-step skip cycle을 씀으로써 long-term도 커버할 수 있게 한다고 한다.

 

3. Feature Similarity.

negative Frobenius inner product를 사용하여 input patch와 현재의 localized patch간의 feature similarity를 구한다.

여러 프레임에 건너건너 적용했으니 여러번 sum한것을 수식에서 볼 수 있다.

 

 

Spatial Feature Encoder pi

ResNet-50에서 res5 (마지막 residual block 3개)를 뺀 것을 사용한다.

input frame은 240*240, random cropped video는 re-scale하여 min(H,W)=256이 되도록 한다고 한다.

그러면 인코더 사용하면 spatial feature는 30*30이 된다.

이미지 패치는 80*80 (240*240에서 랜덤크랍)이기 때문에, feature는 10*10이다.

나중에 cosine similarity를 구할거라서, 피쳐의 channel dimension에 L2 normalization 적용한다고 한다.

 

Differentiable Tracker T

main component 3개를 가지고 있다.

1. Affinity function.

아래 식을 보면 Output 차원이 900*100이다. Affinity Matrix를 구하는 것이다.

dot product에 softmax를 씌운 형태다.

2. Localizer g.

로컬라이저는 conv layer 2개 + linear layer로 구성되어있으며, localization parameter theta를 추정하는데 쓰인다.

이 파라미터는 딱 3개인데, 2d translation & rotation parameter를 의미한다.

논문에서 왜 이렇게 했냐면, encoder의 책임을 가중시키고 tracker가 하는 역할은 그렇게 크지 않도록 만들기 위해서라고 밝힌다.

 

3. Bilinear Sampler.

앞에서 구한 파라미터와 이미지 feature를 가지고 bilinear sampling을 통해서 new patch feature를 만들어줘야한다.

결과적으로 c*10*10의 패치 피쳐맵이 만들어진다고 생각하면 된다.

 

End-to-End Joint Training

인코더와 트래커 둘다 학습해야한다.

아까 위에서 일반 트래킹, skip cycle에서 패치끼리 계산한다는 로스가 바로 이 식이다.

그냥 bilinear sampling grid를 쓰고 두 패치간의 유클리디안 거리를 구하는 것 같다.

Experiment

Dataset

- VLOG : 이게 메인이다. 기본적으로 VLOG dataset에서 representation을 학습하며, 다른 pretraining, annotation은 사용하지 않는다.

 

- Kinetics : appendix에 넣었다고 함

 

- video propatation tasks : DAVIS-2017, JHMDB, Video Instance-level Parsing.

representation을 학습하여 얻고, 위 3개의 task에 대해 representation의 fine-tuning 없이 실험했다고 한다!

=> acquired representation generalizes to a range of visual correspondence tasks!

 

 

Training.

위에 브이로그 데이터셋은 11.4만개의 비디오가 총 344시간 분량. 이를 학습하기 위해서 4개의 GPU로 batch size 32로 학습. (GPU당 8클립) 총 30에폭을 돌렸다고 한다. (대박 오래걸리겠군...)

Adam optimizer, lr 0.0002, momentum beta1 0.5, beta2 0.999

 

Inference.

inference시에는 encoder representation의 역할 = dense correspondences를 계산.

무슨 의미냐면, 각각 태스크의 label이 있을거임. DAVIS라면 instance segmentation mask, JHMSB라면 human pose keypoints, VIP라면 instance/semantic level 각각의 마스크.

이걸가지고 첫번째 프레임에서의 initial label이 있으면 그걸 쭉 propagate 시킴. 그러면 계속 추정되어서 나올거니까!

그런데 아까 image patch의 각각 픽셀 intensity로 취급해서 학습했었음. 그렇기때문에 여기서는 이걸 맞추기 위해서 각 픽셀을 C class로 discritization 하는 것임. 예를 들어 세그멘테이션에서 가능한 레이블의 개수라든가, 키포인트의 개수라든가 그렇게.

아래 그림이 그 아웃풋이라고 보면 됨.

 

d는 texture map이고, a,b,c는 위에 언급한 태스크 3개 순서대로.

 

 

 

아래는 propagation 방법. Eq.1은 위에 나온 affinity function 수식이다. 그냥 encoder feature가지고 바로 스코어 계산해서 argmax로 인덱스 뽑는 것 같은데.

 

이게 신기하다.

인코더 피쳐 뒤에 뭔가 FC같은걸 넣어서 앞부분 프리징하고 뒷부분만 finetuning 하는 방법이 아니라, 그러면 downstream task들에 그냥 브이로그에서 학습한 그 인코더 피쳐가지고 곧바로 similarity만 계산해서 다른 task를 수행할 수 있다는 것임. segmentation이라든가 human pose라든가.

correspondence가 이렇게까지 곧바로 사용할 수 있을만큼 인코더가 학습된다는게 신기하다.

 

propagation.

이제 본격적으로 성능을 보자.

Baseline은 supervised와도 비교했고, 거의 self-supervised 기법들과 비교한다.

 

Segmentation
Human Pose. 브이로그에서 correspondence가지고 학습했음에도 불구하고, imagenet pretrained와 거의 유사한 성능을 보인다!
instance/semantic mask

 

아래는 texture visualization이다. 5프레임 차이가 나는 이미지를 두고, correspondence를 구하여 워프시킨 결과가 우측이다. 아래 그림의 다리를 보면 잘 맞추는 것 같다. 오른쪽 사이드의 식물도 잘 이동되었다.

 

실험 양이 많아서 그런지 ablation이 appendix에 있다.

아래처럼 skip cycle (long term 보는 게 중요)라든가, Nearest Neighbor에서 k라든가, kinetics 등의 다양한 실험결과가 있긴 한데 첫번째 것만 가져왔다.

그리고 fine-tuning 한것도 있긴 한데, 성능이 오른다고 하기에 약간 애매한? 숫자이다.

이건 correspondence.

Conclusion

이 논문에서 30에폭을 돌린 이유가, 그 이후에는 학습이 미미하기 때문이라고 한다.

따라서 중요한 next step은 larger, noisier data에서 학습하는 방법이라고 설명한다. 더 자세히 말하자면,

1. occlusions이나 partial observability에서의 robustness를 향상시키는 것이다. 예를 들면, 학습하는 중간에 cycle을 찾기 위해 더 좋은 search strategy를 쓸 수도 있지 않나? 그런 것들.

2. 학습중에 '무엇'을 tracking할지에 관한 것. 여기서는 그냥 랜덤한 패치를 tracking했다. 중간에 물체가 사라지거나 둘로 갈라지거나 합쳐지는 그런 문제가 object detection에서도 난감한걸로 알고있는데, 그러면 unsupervised object detection은 어떻게 해야하나 싶다.

3. 뭔가 train/test time의 context를 통합하는 그런 것들도 중요할거라고 한다.

 

감상(?)

전반적으로 굉장히 멋진 연구다! 저번 AL+KD 논문만큼 감동적인 논문이다. 앞서 살펴봤던 페이스북의 올해 11월 논문은 contrastive learning 기반이었는데, 이 논문은 다른 접근 방식의 self supervised learning이었다.

어제 들은 얀르쿤의 self supervised talk이 생각난다. 거기서 contrastive learning 기반이랑 latent variable EBM 두가지로 나눠서 설명한게 떠오르는데, 이 논문은 후자에 속할 것 같다. 이 관점에서 논문을 생각하면, 어떤 도움이 되는 latent variable이 z이고, 이 latent space로 input을 맵핑해주는 게 인코더. 추측해야하는 y는 다음 프레임의 패치, x는 전 프레임의 패치가 되겠다.

 

그냥 데이터셋이 커서 잘되는건가? 싶은 의문이 있긴 하지만, 아무튼 label을 사용하지 않고 배운 representation이라는건 의미있다. 

반응형

댓글