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

[Action Detection] ACAR Net

by 포숑은 맛있어 2021. 5. 11.
반응형

"Actor-Context-Actor Relation Network for Spatio-Temporal Action Localization"

AVA-Kinetics Challenge에서 1등을 차지한 모델.

Kinetics는 딱히 관심 없으나 현재 AVA Action을 셋업중이기에 이 논문을 살펴볼 필요가 있다.

 

본문에 들어가기에 앞서, 현재까지 진행을 정리하면 이렇다.

AVA dataset이 여러가지가 있는데, AVA Action은 버전 2.2까지 나왔다. 이게 내가 다음에 연구해야하는 task와 관련이 있다.
아마 이 데이터셋에 대해서 예전에 블로그에 썼었던것같다.
그래서 이쪽 조사가 필요한데, 마침 mmdetection과 mmsegmentation을 만든 그룹에서 mmaction도 만들었다는 것을 발견했다.
Task는 3가지를 다루고 있었다. 일반적으로 알고있는 action recognition, temporal action localization (시간 only), spatio-temporal action detection (localization이라고도 부르는데, 해결방법이 detection에서 발전한 모양새다보니 저렇게 부른다.)  이렇게 세가지이다.
아쉽게도 action detection에 대해서는 모델이 하나만 공개되어있다. I3D backbone과 Fast RCNN을 사용한 조합이다.

그래도 pretrained model을 (하나지만) 제공하고 있으며, config 파일을 수정해서 backbone도 교체하여 학습해볼수 있어보이기에 mmaction부터 셋업했다. 반드시 opencv, denseflow, decord, mmcv 등을 직접 make하여 설치해야하기에 시간이 다소 걸린다.
귀찮다고 denseflow를 깔지 않으면 테스트 코드에 있는 ucf모델을 쓸 수 없고 (flow를 input으로 받음), extract_rgb_frames.sh를 통해 프레임을 자를때 mmcv.VideoReader()가 먹히지 않아서 decord를 사용하도록 코드를 수정했었다. 그래서 결국 optional이라고 적혀있던 부분도 다 사용하게 되었으니 이왕이면 한번에 다 설치하도록 하자.

한편으로는, mmaction에서 action detection에 대해서는 제공하는 모델에 대한 레퍼런스도, 논문도 없다. 설명도 없다!
그래서 AVA challenge 2020을 서베이하였다.
2019에는 SlowFast가 1등을 했던 것 같고 (대충봐서 모름), 2020에는 AVA-Kinetics로 데이터셋이 합쳐진 챌린지로 보인다. 아무튼 여기서 1, 2등을 차지한 모델을 보니 모두 백본은 SlowFast-101을 사용했다. pretraining도 중요했는데, 데이터셋은 모두 Kinetics700을 썼다. 600이나 400을 쓴 실험도 있는데 성능차이가 꽤 큰 것을 알 수 있었다. 성능이 중요하다면 웬만해서 Kinetics700 pretrained model을 반드시 구하도록 하자.
어쨌거나 1위를 한 모델이 성능차가 꽤 났었는데, 그게 지금 리뷰하려는 논문이다. ACAR이라는 모듈을 통해 뒷부분에 처리하는 방식에 변화를 줬다. 이를 살펴보려고 한다.

비록 AVA Action이 최종 목적이 아니긴 해도, 그런 triplet 정보를 어떻게 학습하도록 아이디어를 냈는지를 봐야하는 상황이라 가볍게 살펴봐야한다.

 

 junting.github.io/preprint/acar.pdf 

깃허브 링크가 있지만 훼이크이다. 모델이랑 코드 공개한다고 한지 1년이 되어가는데 ㄱ-

 

 

제목에서도 알 수 있다시피 Actor-Context-Actor 관계를 배우려고 한다.

아래 그림을 보면 Actor Context, Actor-Actor는 이미 다른 논문이 있는 것으로 보인다.

'Ride'처럼 누군가가 운전을 하고, 거기에 탑승하는 승객의 행위를 맞추는데에 있어서는 위의 두가지 모델로는 정보가 부족하다고 설명한다.

 

그러면 그걸 어떻게 배울건가. 그게 중요한데.

ACAR-Net은 input으로 두가지를 받는다. context featuresactor features.

여기서 actor features는 그냥 obj detection에서 RoI Align으로 얻은 object의 feature라고 생각하면 된다.

왜냐면 actor feature를 얻는 방식은 그냥 클립의 'center(key) frame'에 대해서만 Faster-RCNN을 해서 RoI Align을 거쳐 얻기 때문이다. detection에서랑 똑같다. 잘 모르긴 하지만 RoI Pooling보다 정확하게 bbox를 얻는 것 같다.

context features야, I3D와 같이 동영상을 backbone에 넣어 얻은 피쳐가 되겠다.

 

모듈을 간단하게 설명하면 다음과 같다.

 

1. first-order actor-context 관계를 인코딩한다.

2. High-Order Relation Reasoning Operator를 적용한다. (여기에 굵은 글씨로 강조되어있음)

3. long-term high order operations를 모델링하기 위해서, Actor-Context Feature Bank를 만들었다고 한다. 여기에는 actor-context 관계가 각 시간별로 담겨있다.

 

결국 그 ACAR network는 relational reasoning moduled인건데, 이부분에 있어서는 최근 transformersk graph attention network쪽도 많은 주목을 받고 있다. 하지만 이 논문에서 말하길, 그런 연구들은 single frame에서만 수행했거나 annotation을 추가로 요한다는 단점이 있다고 설명하고 있다.

 


 

Method.

 

앞서 말했듯이 actor proposal은 key frame에 대해서만 수행한다. 논문의 표현을 빌리면 off-the-shelf person detector. (예시: Faster RCNN) 이걸 다른 frames에게도 duplicate한다고 한다. 연산량때문인가..?

 

그리고 context features는 video backbone network에서 뽑는다. (예시: I3D) 그러면 T*C*H*W feature.

여기에 temporal average pooling 적용해서, context feature map V는 [C*H*W] 형태.

 

  • 그리고나서 RoIAlign을 통해 (7*7 spatial output) actor proposal의 위치에서 feature를 추출
  • 거기에 다시 spatial max pooling을 적용하면, N개의 actor features는 각각 [C] dimension을 갖게 된다.

여기서 굵은 글씨로 쓴 V와 RoI Feature를 input으로 ACAR에 넣겠다는 소리가 된다.

1. first-order actor-context 관계를 인코딩한다.

=> 각 actor와 각각의 spatio-temporal context 사이의 relation을 배우는 것.

temporal축은 아까 GAP로 없앴으면서 왜 단어를 저렇게 쓴건진 모르겠다.

그림을 보면 tile+concat이라고 써있는데, 채널축밖에 없는 actor feature를 모든 spatial위치에 있도록 복붙하는(tile) 모양이다.

그러면 context features(C*H*W)와 오버랩 가능하니까 concat 해주기. 그러면 [2C*H*W].

이건 actor i와 특정 spatial location (x,y)에서의 관계를 인코딩 한것이라고 보면 된다. 여기까지가 actor context 정보.

논문에서 F^i_{x,y}로 표기했다.

 

2. High-Order Relation Reasoning Operator를 적용한다. (여기에 굵은 글씨로 강조되어있음)

이를 설명하기에 앞서, 이 연구에서는 Actor-Centric Relation Network 논문에 대해 우선적으로 언급한다. 1에서 설명한 방식은 ACRN에서 한다. 하지만 indirect한 관계까지 인코딩 하기 위해서는 그 F^i_{x,y}에 해당하는 1<=i<=N, 1<=x<=H, 1<=y<=W combination의 relation을 전부 봐줘야한다!

음. 너무 많다. 그래서 이 논문에서는 그냥 같은 location에서의 관계만 고려하기로 했다. 다시 말해, 같은 (x,y)에서 actor i와 j 사이의 정보를 인코딩했다고 보면 된다.

그래서 second order relations, actor-context-actor 정보라고 표현한 것이다.

 

그래서 어떻게 계산하는가. location-wise attention 연산을 통해 얻는다.

 

방법1: Non-local block + layer norm + dropout.

FC 대신이라고 한다. 최대 3개까지 NL을 사용한다.

그리고 연산 효율때문에 2*2 spatial max pooling부터 적용한 다음에 이후 연산을 수행.

아무튼 q,k,v에 i와 j번째 actor를 넣어서 relation을 배우도록 하겠지.

 

방법2: 간단한 graph attention mechanism.

2개의 conv layer (중간에 concat), LeakyReLU와 softmax. 이 attention map을 가지고 linear combination 한다고 한다.

근데 실험을 안했다네. (흠...) 그냥 NL로 생각하자.

 

 

3. long-term high order operations를 모델링하기 위해서, Actor-Context Feature Bank를 만들었다고 한다. 여기에는 actor-context 관계가 각 시간별로 담겨있다.

 

long-term feature bank(LFB)라는 논문이 있었는데, 여기서 영감을 받았다고 한다.

각 시간마다 뽑는거다. F_{bank} = F0, .... F_{T-1}

 

설명이 잘 안나와있어서 LBF 논문에서 가져왔다. arxiv.org/pdf/1812.05038.pdf   

(b)처럼, bank가 있어서 classifier에 넣을 수 있게 되어있다.

 

 

아래는 논문 그림인데, 이해가 잘 안된다. (a)야 nonlocal이라 LFB에서도 봤는데 (b)는?

각기 다른 ACAR-Net 인스턴스가 있는데, bank로 사용할건 그냥 first order relation까지만 뽑아서 쓰겠다는 의미로 보인다.

현재 프레임에 대한건 second order까지 뽑고. 좀 헷갈리게 써있다.

그림을 왜 저렇게 그린거지...

 

 

Implementation Details & Experiments

Person Detector: ResNeXt-101-FPN + Faster RCNN

ImageNet과 COCO Human keypoint images에서 pretrain.

 

Backbone Network: SlowFast-50, Kinetics400 pretrain.

 

feature bank 부분 빼면 end-to-end라고 한다.

 

 

ablation study는 다음과 같다. 어떤 방법으로 relation을 주느냐에 따라 성능이 다르다.

second order relation과 bank가 중요함을 알 수 있다.

 

class별로 분석한 결과도 있다.

확실히 interaction, 특히 사람과 사람간의 interaction에 해당하는 클래스들을 전반적으로 잘 배우는 것 같다.

 

 

실험 테이블이다. 당연히 제안한 모델 성능이 가장 좋겠지.

여기서 주목했던건, 모델도 중요하긴 한데 결국 어떤 데이터셋에서 pretrain 했느냐가 상당히 중요해보인다.

근데 slowfast는 왜 kinetics700이 없는거람.

아래는 CAM visualization.

코드 공개했으면 좋겠다...

 

 

[2021.07.19] 추가

깃허브에 코드가 올라와있다. AVA 돌려보도록 하자.

그림도 더 알아보기 쉽게 업데이트 되어있다.

반응형

댓글