논문 요약

[CVPR-2019]Actional-Structural Graph Convolutional Networks for Skeleton-based Action Recognition

논문읽어주는석사생 2019. 9. 3. 11:15

* 본글의 모든 그림은 논문의 본문에서 가져왔습니다.

 

이번 요약하는 논문은 CVPR 2019에 나온 "Actional-Structural Graph Convolutional Networks for Skeleton-based Action Recognition"입니다. 

 

지난번 포스팅했던 ST-GCN 논문의 후속 논문으로 컴퓨터 비젼 분야에서 가장 유명한 학회에 나온 논문입니다. (부럽다...)

 

이전 논문에서 사용했던 GCN(Graph Convolutional Networks)을 사용하는 논문입니다. 지난번 말씀드렸던 이전 논문들의 문제점을 해결하고자 나왔는데 완성도 있고 어려운 논문이에욯ㅎㅎㅎ

 

구체적으로 어떻게 적용하고 있는지는 아래의 설명을 통해 풀어보도록 하겠습니다.

 

논문 전문 : https://arxiv.org/pdf/1904.12659.pdf

[출처]Li, Maosen, et al. "Actional-Structural Graph Convolutional Networks for Skeleton-based Action Recognition." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019.

 

<개요>


행동인식을 구현하기 위해 최근 GCN을 많이 사용한다. 특히 이전 포스팅에서 설명했던 ST-GCN의 경우 한 프레임의 skeleton을 계층적 구조에 따라 그래프를 연결하는 것이 아니라, 공간상, 시간상에서 모두 연결하여 두 특징을 모두 학습할 수 있도록 만들었다.

 

본 논문에서는 좀 더 풍부한 관절간의 관계성을 추가할 수 있도록 ST-GCN에 A-link 구조를 더했다. A-link는 인코더-디코더 구조로 구성되는데, 이 구조를 통해 인근에 연결되어 있는 관절간의 관계성 뿐만 아니라 멀리 떨어져있는 관절간의 관계성도 찾아낼 수 있다. 

 

본 논문에서는 기존의 그래프 구조에 고차원의 관계를 표현하기 위해 확장된 구조인 S-link와 A-link를 이용해 AS-GCN(Actional-Structure graph convolutional network)를 제안한다.

 

아래를 통해 각각의 알고리즘을 자세히 알아보자.

 

 

<알고리즘 설명>


 

위의 그림에서 개략적인 이 논문에 구조를 보여준다. 

 

1. 동영상으로부터 skeleton을 추출한다.

2. 미리 학습시킨 인코더-디코더 구조를 통해 A-link를 추출한다.

3. skeleton으로부터 S-link를 추출한다.

4. 총 9개의 AS-GCN 모듈을 통해 feature를 추출한다. 

5. pooling과 softmax 함수를 이용하여 행동을 분류한다. 

 

각각을 자세히 살펴보자. 

 

1. Actional Links (A-link)

 

사람들이 하는 많은 동작들은 멀리 떨어진 관절들이 협력적으로 움직이는 것이 필요하다. 즉, 바로 연결되어있는 관절간의 관계성 뿐만 아니라 멀리 떨어져있는 관절간의 관계성 또한 중요하다. 이러한 포괄적인 관계성을 찾기 위해 위의 그림과 같은 인코더-디코더로 구성된 A-link inference module(AIM)을 학습시킨다. 

 

먼저 인코더의 구조에 대해 알아보자. 

우선 link feature를 위의 식을 통해 구한다. Xi는 i번째 관절의 모든 frame에서의 값의 집합인 feature vector이다. k는 iteration을 나타내며 f는 multi-layer perceptron를 의미한다. 따라서 link feature는 관계성을 찾고자하는 두 관절의 모든 시간에 대한 feature vector를 mlp layer에 통과시키고 해당 결과를 concat한 것이다. 

 

joint feature는 앞서 구한 link feature를 평균을 구하고 원소간의 최대치를 구하는것과 같이 link feature의 값을 강조시킨다. 이 계산을 F에서 진행한다. 다음으로 현재 관절의 feature vector와 concat한다. 

 

이와 같은 과정을 K번 반복한 후에 얻어진 Q값을 이용하여 두 관절간의 관계성을 나타내는  확률을 softmax 함수를 통해 구한다. 구해진 값이 특정 확률 이상일 경우 두 관절의 관계성이 높다고 판단되고 edge로 연결하게 된다. 

 

 

디코더 구조는 다음과 같다. 

두 관절의 t번째 frame의 feature vector를 각각 MLP layer에 통과시켜 나온 결과를 concat한 뒤 인코더 결과와 곱해 평균을 구한다. 즉, (a)를 통해 link feature를 구한다. 구해진 link feature를 (b)를 통해 인코더에서 했던 것과 같이 반응하는 joint feature를 찾기 위해 강조시킨다. 다음으로 (c)롸 같이 GRU를 통해 다음 시간에서의 joint feature를 업데이트 한다. 마지막으로 MLP layer를 통과시켜 다음 frame의 포즈를 예측한다. 예측을 위해서는 구해진 (d)의 값을 guassian distribution에 따라 x를 구한다. 

 

쉽게 설명하자면, 인코더를 통해 구해진 값을 인코더의 반대 순서로 link feature를 구한 후 link feature GRU 함수에 넣어 다음 순서에서의 distribution 값을 구해 다음 순서의 포즈를 예측한다. 

 

이 과정을 전체 AS-GCN을 학습시키기 전 먼저 학습을 해둔다. loss function은 다음과 같다. 

 

loss function은 크게 두가지 구역으로 나뉘는데 앞부분의 경우 예측되어진 포즈가 distribution에 잘 따르는지를 계산하는 부분으로 평균에 값이 모이면 모일 수 록, 즉 값이 크면 클 수 록 학습이 잘 되었음을 나타낸다. 

두번째 구역의 경우 중간에 구해진 관계성의 확률적인 부분에서 특정 관절간의 관계성이 얼마나 높게 나왔는지, 즉 모두 골고루 값이 퍼지는 것이 아닌 하나에 집중되어졌는지를 확인하는 부분으로 값이 크면 클 수 록 학습이 잘 되었다고 할 수 있다. 

 

 

2. Structural Links(S-Links)

S-link는 skeleton의 구조를 보여주는 그래프로 위의 그림에서 기존의 skeleton graph와 A-links와의 차이를 알 수 있다. 

기존의 skeleton graph의 경우 skeleton의 구성에 따라 이웃 노드가 정해진다. 따라서 바로 옆 관절과의 관계성을 중심으로 네트워크에서 학습하게 된다. 이러한 단점을 극복하고자 본 논문에서는 정해진 범위에 따라 새로운 link를 추가하는 S-links를 제안했다. 최대 범위가 4인 경우 (b)그림의 보라색, 노란색, 빨간색과 같은 link를 새로 추가한다. 

 

3. Actional-Structual Graph Convolution Block

 

위의 방식으로 구해진 각각의 link는 서로 다른 Graph Convolution 연산을 거힌다. 두 연산 결과에 어떤 정해진 비율 값을 곱해 더한다. 

 

두 결과를 합한 하나의 AS-GCN 모듈은 아래와 같이 구성되어 있다. 

구해진 link들을 이용해 ASGC로 feature를 추출한 후 T-CN을 통해 시간 축에 대한 feature를 추출한다. T-CN은 시간 축을 따라 convolution 연산을 하는데 이를 통해 각각의 관절의 독립적이지만 weight를 공유하며 시간축에 대한 feature를 추출한다. 

 

위의 과정을 아래와 같이 총 9번 반복하여 최종 결과를 낸다. 

 

 

<사족>


제가 행동인식 알고리즘에서 해결해야한다고 생각했던 부분을 이 논문에서는 일부 해결했습니다!

바로 멀리 떨어진 관절간의 관계가 명시적으로 드러나게 하기 위해 A-Links를 만들었습니다. 

 

단점으로 말하자면, A-links를 추출하기 위해 encoder 파트에서 시간 축에 따라 값을 모두 하나로 concat시킨 후 관절 간의 관계성을 따져서 link를 만드는데요. 아무래도 시간 축에 대한 정보가 충분히 담기기 어려운 구조가 아닌가 생각됩니다. 그렇기 때문에 특정 시간 간의 멀리 떨어진 두 관절의 관계성은 잘 드러나지 않을 수 있습니다. 

두번째로 모델이 엄청나게 큽니다...! 성능이 좋기 때문에 참아줄 수 있는 부분이긴 하지만.... 지금 코드 돌려보고 있는데 모델이 커서 자원의 한계가 너무 보이네요ㅜ 연산을 조금 더 간략화 시킬 수 있는 방안을 찾으면 좋을 것 같아요.

 

이 논문 또한 아주 감사하게도 코드가 공개되어있습니다.

코드 : https://github.com/limaosen0/AS-GCN

 

저의 환경에 맞춰서 약간 수정하고 실험을 돌려보았는데 성능은 정확도 85.16%로 얼추 논문에서 리포트한 수치와 비슷하게 나옵니다! (NTU-rgbd dataset 기준, batch size 10, cross_view subject 기준) 제가 갖고있는 서버가 gpu 2개다 보니 최대 batch size가 논문에서 실험한 것보다 작아서... 정확도가 조금 낮게 나왔을 가능성이 있습니다. 

 


그럼 이번 논문 리뷰도 여기서 마치겠습니다.

제가 하는 논문 리뷰의 경우 논문에서 제안하는 알고리즘에 주 초점이 맞춰져 있기 때문에 구체적으로 어떻게 구현되어있는지나 수식, 이런 것들은 논문을 직접 읽으시면 더 다양한 정보들이 있습니다. 참고하세요!

 

질문이나....오류가 있다면 댓글 언제든지 환영이에요!