본문 바로가기

인공지능 공부

Openpose를 사용해보자

https://github.com/CMU-Perceptual-Computing-Lab/openpose

 

GitHub - CMU-Perceptual-Computing-Lab/openpose: OpenPose: Real-time multi-person keypoint detection library for body, face, hand

OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation - GitHub - CMU-Perceptual-Computing-Lab/openpose: OpenPose: Real-time multi-person keypoint de...

github.com

 

원문을 기준으로 번역 및 추가 작업 내용을 기술했다.

 

0~1장: 번역

 

2장: 사용해가며 작성

 

 3. 2d keypoint 탐지 -> 성공

 4. 3d keypoint recon -> 실패

 5. 2d keypoint export 


0. Openpose의 개념

 

최초로 실시간에 이미지 안에서 여러명의 몸, 손, 얼굴, 발을 탐지해내는 기술로 CMU Panoptic Studio dataset을 기반으로 생성되었다.  

 

1. 결과들

 

 * Whole-body의 2D estimation

 

 * Whole-body의 3D Pose Reconstruction and Estimation

 

 * Unity Plugin

 

 * 실시간 분석

  현재 비교가능한 오픈포즈, 알파포즈, Mask R-CNN과 비교해보았을 때, Openpose는 constant한 시간에 작동하는 것이 특징임

 

2. 특징

 * 주기능

  - 2D 실시간 다자 키포인트 탐지

    ' 15, 18, 25 키포인트 body/foot 추정 지원. 사람 수에 관계없이 런타임 작동

    ' 2x21-keypoint 핸드 키포인트 추정. 탐지된 사람 수에 따라 런타임이 안될 수 있음

    ' 70-keypoint 얼굴 키포인트 추정. 탐지된 사람 수에 따라 런타임이 안될 수 있음

  - 3D 실시간 1인 키포인트 탐지

    ' 여러 뷰로 3D triangluation 지원

    ' Flir 카메라 핸들 싱크로

    ' Flir/Point Grey 카메라 호환

  - 칼리브레이션 도구

    ' 디스토션, in/extrinsic 카메라 파라미터

 

 * 입력

   - 이미지, 비디오, 웹캠, Flir/Point Grey, IP 카메라, 뎁스 카메라 등

 

 * 출력

   - 기본 이미지 + 키포인트(PNG, JPG, AVI....)

   - 키포인트(JSON, XML, YML)

   - array class 형태의 키포인트들

   - 커스텀 형태

 

 * 운영체제

   - 우분투, 윈도우, 맥, TX2

 

 * 하드웨어

   - CUDA, OpenCL, CPU-only

 

 * 사용 대안

   - 빌트인 기능: Command-line demo를 이용

   - C++/Pytho API: 커스텀 기능 개발에 활용

 

2. Openpose 사용을 위한 세팅  

https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/installation/0_index.md#windows-portable-demo

 

위 링크로 가면 윈도우즈 포터블 데모를 받을 수 있도록 안내되어있다. 

 

주된 내용은 릴리즈 섹션에서 오픈포즈를 다운받고, 압축 파일 내의 instructions.txt에 적힌대로 model을 다운받기만 하면 된다.

 

커맨드라인 명령어는 아래 페이지를 참조하자. 

 

https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/01_demo.md

 

GitHub - CMU-Perceptual-Computing-Lab/openpose: OpenPose: Real-time multi-person keypoint detection library for body, face, hand

OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation - GitHub - CMU-Perceptual-Computing-Lab/openpose: OpenPose: Real-time multi-person keypoint de...

github.com

 

그럼 비디오를 하나 가지고 이런저런 기능을 확인해보자. 

 

우선 아래 이미지를 보고 적절한 위치에 media 폴더를 만든 후 영상을 삽입해주자. 

 

3. 2D 키포인트 추적을 해보자. 

 * 기본적인 2D 키포인트 추적

  bin\openposeDemo --video media/파일명.mp4

 * 손도 추적

  bin\openposeDemo --video media/파일명.mp4 --hand

 * face도 추적

  bin\openposeDemo --video media/파일명.mp4 --face

 * face hand 추적 -> 실패

  bin\openposeDemo --video media/파일명.mp4 --face --hand

 

   

4. 3D 키포인트 추적을 해보자. (실패)

 

      bin\openposeDemo --video media/파일명.mp4 --3d --number_people_max 1

    로 실행해봤는데, 

 

그러면

3-D reconstruction (`--3d`) requires at least 2 camera views, only found 1 camera parameter matrices. If you are simultaneously using FLIR cameras (`--flir_camera`) and the 3-D reconstruction module (`--3d), you should also enable `--frame_undistort` so their camera parameters are read.

이런 메세지가 나온다.

 

FLIR 카메라가 뭐지?...

 

https://namu.wiki/w/FLIR

 나무위키를 보니 그냥 적외선 카메라라고 한다.

 

자 아무튼 그럼 카메라를 두대 연결하고 나서 잘 되나 해볼까?...

 

우선 usb 카메라를 두대 달아주고, 

 

bin\openposeDemo --3d --number_people_max 1

 

요 명령어로 실행해봤다. 음 안된다. 같은 카메라 모델을 두대를 달아서 그런가?

 

각기 다른 제품을 가져다 꽂아본다. 여전히 에러는 똑같다. 이유를 모르겠네....

 

아무튼 3D 키포인트 추출은 일단 멈추는 것으로......

 

5. 2d 키포인트를 출력해보자. 

 

  bin\openposeDemo --video media/파일명.mp4 --write_json export 

 

그럼

 

요렇게 프레임별로 결과가 나온다.

 

내부를 열어보면, 

이런식으로 값이 나온다. 

pose_keypoints 안에 있는 쉼표의 갯수를 보니 총 74개다.

 

https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/02_output.md

 

GitHub - CMU-Perceptual-Computing-Lab/openpose: OpenPose: Real-time multi-person keypoint detection library for body, face, hand

OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation - GitHub - CMU-Perceptual-Computing-Lab/openpose: OpenPose: Real-time multi-person keypoint de...

github.com

아웃풋에 대한 설명을 보면  x,y,c 로 하나의 조인트가 표현되는데 c는 confidence 값으로 0과 1사이의 값이라고 한다.

 

결과적으로 지금 내가 뽑아본 파일에는 75개의 값이 있고, 이걸 3으로 나눠보면 25가 된다. 그러므로 총 25개의 조인트에 대한 내용이 뽑혀진 것으로 추정할 수 있다.

 

그리고 각 조인트는 BODY_25 포맷으로 뽑혀진 것이다. 이건 openpose의 기본 옵션이다. 

이렇게 디자인된 것이다.

 

 

이상으로  openpose에 대해 간단한 개념에 대한 정리를 마친다.