0. Abstract
- Part Affinity Fields(PAF)라는 비모수적 표현 이용하여 신체부위 연결하는 bottom-up 방식
- 사람 수에 상관없이 real-time으로 high accuracy 달성
- PAF & body part location 모두 refine 하는 것보다 PAF만 refine하는 것만 성능 올라감.
- OpenPose라는 오픈소스 라이브러리 배포
1. Introduction
- 용어
- body part (joint, keypoint): 관절
- limb (part pair, part connection): 두 관절의 연결. 뼈라고 보면 될듯
- 여러 사람 자세 추정 문제
1) 이미지 내 몇명 등장하는지 모름; 어느 자세나 크기로 나타날 수 있음
2) 사람들 간의 상포작용은 복잡한 결합을 만듦; 구분해서 보기 힘듦
3) 사람 많이 등장 할수록 시간 복잡도 증가; 실시간하기 어려움
-
top-down 방식
- 먼저 사람을 detection → bounding box 내부에서 한사람한사람 pose 예측하는 방식
- 장점: 정확도가 bottom-up 방식보다 높음
- 사람을 먼저 찾고, 사람안에서 joint들을 찾기 때문
- 단점: 각 사람마다 별도로 pose 예측 → computational cose 큼, 속도느림
- 검출된 사람들을 순회하며 joint들을 찾기 때문
-
bottom-up 방식
- 영상에 포함된 사람의 keypoint(joint)를 먼저 예측, keypoint 간의 관계를 분석해서 pose를 예측
- 장점: 사람을 detection하는 과정이 없어서 계산 비용이 적음 → real time 가능
- 단점: top-down 방식에 비해 정확도는 떨어짐
왼: 오른쪽 팔꿈치와 손목을 연결하는 PAF/ 오: PAF 픽셀마다 2D 벡터가 point & limb position/orientation 인코드
- Open pose는 PAF (Part Affinity Fields)을 이용한 bottom-up 방식 제안.
- PAF: limb의 위치와 방향을 표현하는 2d vector field
3. Method
1) 이미지에서 Part Confidence Maps 와 Part Affinity Fields(PAF) 검출하여 관절을 찾아줌
2) 찾아진 관절간의 관계성을 찾아 matching
- w X h 크기의 input image 입력
- Network가 S, L 출력
- S, L를 greedy inference로 parsing해서 각 사람에 대한 keypoint의 위치출력
3.1. Network Architecture
- 파란색 부분이 PAF 예측; part-to-part association
- 빨간색 부분이 confidence map 예측
- 측정 신체부위 위치 정보를 담고 있는 heatmap
- 이미지를 VGG 네트워크를 이용하여 feature map (=F)를 추출.
- 추출한 F를 입력값으로 사용하여 convolution 연산을 통해 PAF 추출
- PAF의 dimension은 총 (h’ X w’ X 관절 개수 X 2), 즉 왼쪽 lower arm에 해당하는 heat map 한장, 왼쪽 upper arm에 해당하는 heat map 한장
- PAF는 vectors로 구성됨. 오른쪽 upper arm에 대한 PAT를 추출한다면, 팔꿈치와 어깨 사이의 픽셀들의 값이 팔꿈치를 향하는 2차원 벡터로 구성됨.
- 각 stage마다 intermediate supervision을 이용해 예측을 반복하면서 예측값을 refine
- Intermediate supervision: Stacked HR에서 등장한 개념으로, 최종 prediction에서만 loss를 구하는 것이 아니라 중간에서 추가적으로 HR module에서 heatmap을 만들어 GT와 비교해 loss를 구해 적용함으로써 틀린 부분을 보다 정교하게 보정
- Convolutional kernel을 7×7에서 3×3으로 바꿔 receptive field를 유지하며 parameter 수를 줄임
- 각 convolutional kernel의 output은 concat
- CM
- input: 컬러이미지.
- ground truth: 각 관절의 위치를 나타내는 x,y 좌표값
3.2. Simultaneous Detection and Association
- Image는 CNN(VGG-19의 초기 10 layer를 이용)에서 feature map F를 생성
- Stage1: F에서 CNN ϕ1을 통해 PAF L1을 생성
- PAF는 여러번의 stage를 거쳐서 나옴. 정해진 만큼의 루프를 돌리면서 좀 . 더치밀하게 PAF 찾을 수 있음. 아래는 stage에 따른 PAF 개선
- CVPR버전에서는 모델이 직렬이 아닌 병렬구조로 연결되어 있음.
- 2019 버전에서는 병렬로 처리하지 않아도 되기때문에 성능, 속도에서 이득
- PAFs의 값을 confidence map을 구하는 데에 넣어줌 → 정확도도 함께 올라감.
- 우선 PAFs를 알고나면 관절의 위치를 찾는 것은 훨씬 쉬운 일이 되기 때문에 네트워크의 성능이 올라가감 .쉽게 말해서 upper arm의 위치를 알면 그 방향성에 따라 어깨와 팔꿈치의 위치를 예측하는 것은 매우 쉬운일
3.3 Confidence Maps for Part Detection
j : 관절 유형
k : 특정 사람객체
- S_j,k→ 각 사람(k)의 각 관절(j)에 대한 confidence map
- x 값은 쉽게 말해서 k번째 사람의 j번째 신체 부위의 Ground truth 좌표 값입니다.
- 시그마 값은 gt 좌표값에서 부터 얼마만큼 넓게 분포를 만들 것인가를 나타냄
- S_j → 각 관절(j)에 대한 confidence map
- 그결과, 각 관절의 confidence map(S_j)에는 사람들(k)의 각 관절(j)에 대한 정보가 모두 포함 → max 사용
- 각 CM의 평균을 구하는 것이 아니라 max aggregation해서 각 peak의 특징이 분명하게 남아있을수 있게 함 (??)
3.4 Part Affinity Fields for Part Association
- Part Association은 3.3.에서 찾은 body part를 같은 사람끼리 묶어주는 문제
- (b)처럼 PAF 없는 상태에서 pair 찾기 위해서는 각각의 중심점을 찾고 연결해줌 → 이미지가 복잡한 경우에는 잘못된 pair 찾을 수 있음.
- PAF는 방향과 위치 정보 가지고 있음. → 두 관절 사이의 방향에 대한 정보를 vector 값으로 갖고 있기 때문에 해당 방향에 맞는 관절과 pair 해주면 됨.
- PAF를 학습시켜 추출하기 위해서는 ground truth data 필요
- 그림처럼 ground truth의 관절 위치가 주어지면, 각각의 관절 사이의 pixel들에 대해 뼈 위에 존재하는지 안하는지 판단→ 아래수식 사용
-
- 초록색의 벡터의 길이가 두 관절 사이의 거리보다 크거나 작을 경우, 초록색 벡터와 두 관절을 이은 벡터 사이의 각도가 특정 한계치의 값보다 크거나 작을 경우 모두 예외처리. 즉, 적정 범위 안에 있는 픽셀들에게 v의 단위 벡터값을 부여
- 똑같은 upper arm에 대해 두가지 후보가 존재하여 vector가 겹칠때를 처리하기 위해 구해진 ground truth 값들은 각각 픽셀에 대해 평균을 구해 정함
- *nc*(*p*) : pixel *p*에 affinity vector 가 할당된 사람 수
- 이렇게 구해진 ground truth dat를 이용해 학습 → pair의 후보인 관절을 연결하는 뼈 위에 있는 것으로 예상되는 pixel들의 모든 PAF 값을 적분하여 E값을 구함
- 뼈 위에 있을 것으로 예상되는 pixel들의 모든 벡터 방향과 두 후보 관절간의 단위벡터의 방향이 일치할수록 E의 값이 커지게 됨.
- 관절 위에 있을 것이라고 유추되는 픽셀들은 아래의 p(u)를 통해 구함
3.5.Multi-Person Parsing using PAFs
- 두 관절 간의 pair를 찾았으니, 뼈들의 조합을 찾아 한 사람의 skeleton 만들어줘야함.
- 각각의 body part의 후보들이 각자의 E값의 weight를 가지고 있음
- 관절 pair 찾은 것처럼, body part들의 pair도 찾아줘야 함 → 한사람의 upper arm과 lower art을 찾아서 매칭시켜줘야함
- 위 수식:
- 연결하고자 하는 body part에서 동일한 node가 존재하지 말아야함(한 사람의 몸에 upper arm이 두 개인 경우)
- E의 값을 최대화 시켜줄 수 있는 pair 찾기
- Body part를 연결하는 최적해를 찾는 것은 NP-Hard
- 속도를 높여줄 제약조건이 붙음
- 1) 하나의 keypoint와 이어질 수 있는 keypoint는 정해져있다. 사람의 몸이므로 연결될 수 있는 body part는 정해져 있음. (갑자기 upper arm과 발이 붙지는 않을 거임) → edge 구성하는 최소의 개수만 선정
- 2) 한번에 두개의 part만 매칭. 모든 노드를 전부 연결하고 계산하지 않고, 위 그림 (d)처럼 나눠서 계산. 그 다음 동일한 노드를 가지는 애들끼리 연결
= 그래프를 bipartite로 분해
- 최종 *E*는 각 limb type별 *E*의 합
- 최종 limb connection으로 같은 part를 공유하는 limb끼리 모아 full-body pose를 생성
- 3) CPVR에서 한가지 더 추가; redundant PAF connection을 포함
- redundant PAF connection은 귀와 어깨/ 손목과 어깨 같은 것들로 구성. → 사람이 몰렸을때, 기존보다 더 정확하게 pose를 찾아주게 됨
- 아래그림 (b)에서 보라색 어깨와 오른쪽 귀를 연결해주는 edge로 올바르게 목&얼굴 연결
4. OpenPose
- OpenPose는 신체, 발, 손, 얼굴 keypoint를 찾는 첫 real-time multi-person 오픈소스 라이브러리
- Mask R-CNN, AlphaPose와는 달리 여러 플랫폼, 하드웨어에서 돌릴 수 있으며 input도 사진, 영상, 웹캠 가능
- 3가지 블록
- body+foot detection (얘가 코어)
- hand detection
- face detection
- 3d keypoint pose detection, facial keypoint detection 등 여러가지 가능
- 1080ti 기준 22fps
4.2. Extended Foot Keypoint Detection
- 아바타나 3D 모델 만드는 그래픽 작업에서 foot keypoint가 없으면 발이 땅을 뚫거나 미끄러지는 등 candy wrapper effect가 발생
- Pose Detection 같은 경우에는 Body25라는 데이터셋을 활용하여 keypoint를 추정했는데 이는 기존 COCO dataset에 Foot 데이터셋이 추가된 데이터 셋으로 25개의 keypoinf를 추가된 것
- MPII, COCO에 6개의 foot keypoint를 라벨링 후 학습해 다리 keypoint에 대한 정확도를 올림
- 골반 사이에도 keypoint를 추가해 상체가 가려져도 성능이 잘 나옴
5. Datasets and Evaluations
- COCO-Pose
- Train2017: 이 하위 집합에는 COCO 데이터 세트의 118K 이미지 중 일부가 포함되어 있으며, 포즈 추정 모델 학습을 위해 주석이 추가되어 있습니다.
- Val2017: 이 하위 집합에는 모델 학습 중 유효성 검사 목적으로 사용되는 이미지가 포함되어 있습니다.
- Test2017: 이 하위 집합은 학습된 모델을 테스트하고 벤치마킹하는 데 사용되는 이미지로 구성됩니다. 이 하위 집합에 대한 실측 자료 주석은 공개되지 않으며, 결과는 성능 평가를 위해 COCO 평가 서버에 제출됩니다.
- COCO 2016 keypoint challenge에서 1등
- PCKh: 관절점의 추정 좌표와 정답 좌표의 거리가 어느 임계값보다 작다면 그 관절점이 옳다고 판단- PCK. 임계값은 인물의 머리 크기에 따라 결정되는 PCKh@0.5인 경우, 머리 사이즈의 0.5를 임계값으로 설정
- mAP: AP는 단일 객체에 대한 모델의 검출 성능을 측정. 예를 들어 자전거, 새, 비행기에 대한 객체를 검출하는 모델이 있다면 각 객체별로 AP값이 도출됨. 모든 객체에 대한 모델의 종합적인 검출 성능을 측정하기 위해 모든 AP값의 평균을 매긴 mAP(mean Average Precision)
5.1. Results on the MPII Multi-Person Dataset
이전 SOTA보다 6배 빠르고, mAP 8.5% 높음
- one/two-midpoint 같이 모두 part 사이에 추가적인 중간 point를 추가해 limb의 정확도를 높이는 방식보다 PAF 성능이 잘나옴
5.2. Results on the COCO Keypoints Challenge
- CPM: Convolutional Pose Machine; PAF로 자세추정
- PAF는 반복해서 refine하면 성능이 상승.
- PAF 먼저 하면 accuracy 4% 상승
5.3. Inference Runtime Analysis
- Top-down은 detect한 사람 수에 따라 속도 느려지나, bottom up은 invariant
5.4. Trade-off between Speed and Accuracy
- Top-down은 각 사람을 crop해서 network의 input으로 넣어 정확/느림
- bottom-up은 이미지 자체를 입력. resolution, 정확도 떨어지나 빠름.
5.5. Result on the Foot Keypoint Dataset
5.6. Vehicle Pose Estimation
5.7. Failure Case Analysis
- 성능 잘안나오는 경우
- 일반적이지 않은 자세
- body occlusion.(몸이 가려짐)
- 여러 사람 겹침
Conclusion
- PAF: keypoint를 연결하는 위치와 방향을 모두 표현하는 nonparametric representation
- Part detection과 association을 학습하는 모델
- 사람 수에 상관 없이 part를 연결하는 greedy parsing algorithm
- Body part location refinement보다 PAF refinement가 중요하다는 점
- Body, foot을 하나로 합친 모델
- 오픈소스 라이브러리 OpenPose
keypointsMapping의 경우 output 결과의 2번째 차원 PCM 인덱스와 같은 순서로 인덱싱이 되어있다.
Pose_Pairs의 경우 keypointsMapping의 인덱스와 인덱스의 쌍으로 되어 있어 매칭 될 수 있는 keypoint의 쌍을 나타냄
mapIdX의 경우 output 결과의 2번째 차원 PAF인덱스와 같은 순서로 인덱싱 되었고, Pose_Pairs와 같은 limb의 PAF를 매핑