엔지니어스 - Engineeus

오픈포즈(Openpose) 공부했다. 이렇게 쉬울 줄은.. 본문

Autonomous Tech./Image Processing

오픈포즈(Openpose) 공부했다. 이렇게 쉬울 줄은..

Engineeus 2021. 5. 14. 18:00
728x90

start()

{


시작에 앞서

본 포스팅은 아래 순서로 작성 될 예정입니다. 이번 포스트는 1번 'OpenPose' 이론에 해당 합니다.

1. OpenPose 이론

2. OpenPose를 하기 위한 환경 설정 (Ubuntu 기반)

3. OpenPose 작동시켜보고 KeyPoint 데이터 출력 해 보기

4. Python Code를 이용하여 OpenPose를 이미지, 영상, 웹캠 등으로 작동 시켜보기

 

시작 전 Human Pose Estimation에 관한 제 포스팅을 보고 오시면 더 이해가 잘 되리라 봅니다.

mickael-k.tistory.com/151

 

Human Pose Estimation (휴먼 포즈 에스티메이션, 인간 자세 예측)

Human Pose Estimation은 인간이 어떤 자세를 하고 있는지에 관해 예측을 하는 것입니다. 전통적인 방식 전통적인 자세 인식 방법은 사람에게 장비를 부착하여 측정을 하였습니다. 아래와 같은 사진으

mickael-k.tistory.com

 

OpenPose란?


OpenPose는 인간 자세 예측 (Human Pose Estimation)의 한 분야로 오로지 카메라 한대로만 가지고 사람의 몸, 얼굴, 손가락마디를 정확하게 예측 하는 것 입니다.

세계 최대의 '컴퓨터 비전 및 패턴 인식' 컨퍼런스인 CVPR(IEEE Conference on Computer Vision and Pattern Recognition)에서 2017년에 미국 카네기멜론대학교에서 개발하여 발표를 하였습니다. 이는 딥러닝 합성곱 신경망을 기반하여 영상 및 사진으로만 사람의 몸, 손, 얼굴의 특징점을 추축 하는 결과를 냈습니다.

 

'전통적인 방식의 Human Pose Estimation'

기존 전통적인 방식은 사람 몸에 무언가를 부착하고 하기에 돈이 많이 들고 공간의 제약, 사람 체형에 따라 달라지는 장비로 많은 불편함이 있었죠. (링크 참고)

하지만 컴퓨터 성능의 발전으로 인해 컴퓨터비전(Computer Vision)에 딥러닝(Deep Learning) 기술이 사용되었고. 이러한 기술을 조합하여 영상으로만 이 Human Pose Estimation을 정확하게 할수 있게 된 것입니다.

 

'업그레이드 된 Human Pose Estimation -> OpenPose'

OpenPose 전에도 이렇게 인간의 스켈레톤을 찾는 방법은 연구가 되었지만 그 전에는 사람을 검출하고, 검출된 사람에 대한 자세를 찾도록 반복 수행하는 Top-Down 방식을 사용 하였지만 OpenPose는 Bottom-Up 방식으로 반복처리 없이 수행을 하였습니다.

*Bottom-up 방식은 모든 사람의 관절을 추정 후 그 관절 위치를 이어 스켈레톤을 형성.

그렇다면 우리는 공대생이니 그냥 지나칠수 없잖아요. 이 원리를 한번 또 한번 알아봐야겠죠!?

 

 

OpenPose 원리


OpenPose는 신체의 특징점 (관절)을 추론합니다. 이후 이 관절들을 이어 주는 방식으로 되어 있습니다.

아래를 보시면 Body, Hand, Face 총 3개의 Skeleton을 유추 할 수 있습니다.

 

기본 OpenPose에 있는 CNN네트워크는 BODY-25, COCO, MPII 가 있습니다. 

1. BODY-25

: 출력 관절이 25개 (기존 COCO랑 다른점은 골반과 발이 추가 됨)

2. COCO

: 출력 관절이 18개

3. MPII

: 출력 관절이 15개

 

딥러닝 네트워크


OpenPose의 딥러닝 네트워크는 VGG-19를 사용 하였습니다. 이건 다른 네트워크로 변환 가능 합니다. 

VGG-19는 구조가 간단 하고 쉽게 변형시킬수 있기에 테스트용으로 적합한 CNN(Convolutional Nural Network) 입니다.

*C = Convolution / P = Pooling / S = Confidence Map / L = Part Affinity Field

 

OpenPose Deep-learning Network에 관한 설명

순서 : Image -> VGG -> Stage 1 -> Stage 2 -> Stage N -> result

 

1. 이미지가 VGG-19로 들어 간다.

2. Convolution Layer(C)와 Pooling Layer(P)를 거쳐 *특징맵(Feature Map, F)를 생성하게 된다.

 *특징맵은 큰 의미가 처음엔 없지만 학습 데이터와 비교하며 차이점을 줄여나가면서 최적화를 하게 되면 나중에 학습 데이터에 맞는 특징을 갖게 됩니다.

 

3. F(특징맵)이 Stage 1으로 들어가게 됩니다. (Input = F, Output = S & L)

 

1) 1번 Stage

: 1번 Stage에선 Branch 1과 Branch 2로 나뉩니다.

이곳에서 입력은 특징맵(F)이며 출력은 Confidence Map(S)와 Part Affinity Field(L) 입니다.

Branch 1 : 관절 예측

Branch 1에서는 Confidence Map(S)과 결과값으로 나오며, Branch 2에서는 Part Affinity Field(L)이 결과 값으로 나옵니다.

 

Confidence Map은 아래 그림으로 보면 이해가 쉽습니다.

위 그림을 보면 관절(Joint)이 위치할수 있는 가능성이 높은 흑백이미지(Greyscale)를 만들어 놓고, 모든 픽셀을 0~1값으로 표현 합니다. 그리고 관절이 표현되는 한 중심점을 뽑아 그 주위가 점점 퍼지도록 하여 값이 감소하게 되는 Heatmap을 만들게 됩니다. 이 Heatmap을 표현한게 위 그림입니다.

이렇게 Confidence Map을 학습 시켜 사진으로부터 각 관절의 위치를 알 수 있게 됩니다.

 

Branch 2 : 사람 예측

Branch 2 에서는 Part Affinity Fields(PAFs)를 예측 합니다. 이는 L로 표현 됩니다.

이 Part Affinity Fields는 한 관절에서 다른 관절로 이어지는 방향을 인코딩한 2D 벡터이며 이는 인체 부위 사이의 연관 정도를 나타냅니다. 이 정보는 관절(Joint)이 연결된 정보를 가지고 있으며 누구의 것인지에 관해 파악하는데 사용이 됩니다.

 

 

 

 

2) 2번 Stage 에선 1번 Stage의 결과값 2개(S + L)을 조합하여 새로운 특징점을 만들게 됩니다. 그 후 같은 원리로 N번 Stage까지 가게 됩니다.

Stage가 여러 개인 이유는 네트워크가 깊어질수록 앞에 위치한 Layer는 학습의 영향이 줄어듭니다. 따라서 1개의 Stage보다는 여러개의 Stage를 사용하여 중간 중간 Stage 사이에 결과값을 특징맵(F)로 만들어 입력하는 구조로 만들어져 있습니다.

이렇게 여러 Stage를 거칠수록 Key Point에 대한 예측 정확도가 올라갑니다.

각 Stage에서는 예측한 값과 실제 훈련 데이터의 '정답'과 비교하여 차이를 구한 후 이게 최소화 되도록 네트워크를 학습 시킵니다.

 

결과


보시다 시피 사람 형태만 뚜렷하다면 이렇게 검출 결과가 좋게 나옵니다.

 

한계점


- 학습되지 않은 희귀한 자세 (추정은 어느정도 하지만 떨리는 현상)

- 몸의 일부가 잘 안보이게 될 시 (잘려서 나오거나 스켈레톤이 떨림)

- 사람 형태를 하고 있는 경우 (옷, 등)

- 원거리 스켈레톤 검출 잘 안됨 (원거리의 기준은 카메라 해상도, FOV마다 다름)

 

 

도움이 되셨다면


이 포스트가 도움이 되셨다면 블로그의 광고 한번 클릭 해주면 감사하겠습니다!! 블로그를 하며 얻는 정말 한달 교통비도 안되는 작은 금액이지만 이점이 포스팅을 하는데 큰 힘이 됩니다^^

 

OpenPose 환경 설정


그러면 다음번에는 환경 설정을 해보겠습니다.

mickael-k.tistory.com/159

불러오는 중입니다...


return 0;

}

 

 

 

 

 
 
 
 
Comments