오픈포즈 설치 사용 방법


오픈포즈 설치 사용 방법
이번 글에서는 오픈 포즈(OpenPose) 라이브러리를 설치 후 사용방법에 대해서 설명드리도록 하겠습니다.

OpenPose 라이브러리는 Carnegie Mellon University에서 개발된 라이브러리로 사진 또는 영상에서 실시간으로 여러 사람들의 동작에서 몸, 손, 그리고 얼굴의 키 형태, 포인트를 추출할 수 있는 라이브러리 입니다.

라이브러리의 입력으로는 이미지, 영상, 웹캠 그리고 아이피 카메라 정보를 입력 받을 수 있으며, C++ 데모를 함께 제공하므로 직접 입력 데이터를 만들어서 입력으로 제공할 수 있습니다.

그리고 라이브러리의 출력으로는 기본이미지와 키포인트가 추가된 내용을 출력하거나 PNG, JPG, AVI 등으로 저장 할 수 있으며, 키 포인트는 이미지 또는 영상에 포함하여 저장될 수도 있지만 JSON, XML, YML 등으로 저장 할 수도 있습니다.

라이브러리는 명령어 형태로도 사용될 수 있을 뿐만 아니라, C++ wrapper 와 C++ API 가 제공되므로 실제 어플리케이션을 개발하여 사용하실 수도 있습니다.

GPU 서버 제공 및 OpenPose 설치 지원

오픈포즈를 효과적으로 사용하기 위해서는 GPU가 지원되는 서버가 필요합니다. 그리고 오픈포즈 설치 및 환경 구축과정이 다소 복잡할 수 있습니다. 아래의 페이지에서 GPU 서버를 신청하시면서 오픈포즈를 설치 요청을 해주시면 호스팅 서버를 제공해 드리면서 함께 기술지원을 해 드리도록 하겠습니다.

OpenPose 라이브러리를 사용하는데 필요한 환경은 아래와 같습니다.

  • 1.6GB 이상의 여유공간을 갖는 메모리를 갖은 NVIDIA 그래픽카드
  • 2.0GB 이상의 시스템 메모리(RAM)
  • cuDNN라이브러리와 적어도 8코어 이상의 CPU

현재 OpenPose 에서 사용되는 cuDNN 라이브러리의 버전은 5.1이며, CUDA 8.0 Toolkit이 필요합니다.
직접 CUDA 라이브러리를 설치하여 환경을 구축 할 수도 있지만, 이번 글에서는 nvidia-docker 의 컨테이너 이미지를 이용하여 환경을 사용하도록 하겠습니다. 직접 CUDA 라이브러리 등을 설치 하는 경우 아래의 내용을 참고해 주시기 바랍니다.

CUDA 설치 우분투 환경

우분투 환경의 도커(Docker)이미지를 이용하여 설명드리도록 하겠습니다. NVIDIA 드라이버와 docker(nvidia-docker)가 설치되지 않았을 경우 아래의 글을 참고하여, 먼저 드라이버와 docker를 설치해 주시기 바랍니다.

우분투에서 NVIDIA 드라이버 설치 방법

우분투에서 docker 설치 방법

오픈포즈 설치 사용 방법

1. 호스트 환경

nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04의 도커 이미지를 이용하여 환경을 준비하겠습니다. 아래의 명령어로 도커 이미지를 다운 받습니다.

$ docker pull nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04

그리고 다음 명령어로 호스트에 설치된 NVIDIA 드라이버가 사용 가능한지 nvidia-smi를 실행합니다.

$ docker run --runtime=nvidia --rm nvidia/:8.0-cudnn5-devel-ubuntu16.04 nvidia-smi
Tue Mar 20 13:45:42 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.30                 Driver Version: 390.30                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 750 Ti  Off  | 00000000:02:00.0  On |                  N/A |
| 38%   37C    P8     1W /  38W |     36MiB /  2000MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

위와 같은 내용의 NVIDIA GPU 드라이버 정보가 나타나지 않을 경우, 아래의 페이지를 참고하셔서 먼저 NVIDIA 드라이버를 설치해 주신 다음에, 다음 과정을 진행해 주셔야 합니다. 드라이버 설치 방법은 아래 페이지에서 참고 하실 수 있습니다.

우분투에서 NVIDIA 드라이버 설치 방법

드라이버 정보가 확인 되신 다면, 아래의 명령어를 이용하여 docker 컨테이너를 실행합니다. 호스트에서 사용되는 /data 위치를 함께 마운트 되록 추가 옵션을 지정하였기에, 호스트에 /data 디렉토리가 없을 경우 생성해 주시거나 원하는 디렉토리로 변경하신다음에 진행하셔도 좋습니다.

$ docker run --runtime=nvidia -it -v /data:/data nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04 /bin/bash

2. 컨테이너 환경

아래의 명령어는 기본 언어 및 로케일 등을 설정하는 것으로, 도커에서 생성된 컨테이너 안에서 실행시켜 주시면 됩니다.

# apt update
# apt install -y dialog language-pack-en

# export LANGUAGE=en_US
# export LANG=en_US.UTF-8
# export LC_ALL=en_US.UTF-8

# update-locale

그리고 아래의 명령어를 실행하여 OpenPose를 설치하는데 필요한 라이브러리등을 설치해 주시기 바랍니다.

# apt install -y sudo wget vim cmake cmake-qt-gui python-dev python-pip python-numpy
# pip install --upgrade pip

# apt install -y libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libboost-all-dev libgoogle-glog-dev liblmdb-dev libopenblas-dev libatlas-base-dev

3. 소스 코드 다운로드

아래의 명령어를 이용하여 OpenPose 라이브러리를 다운 받으시고, 빌드환경, 서브 모듈등을 설정해 주시기 바랍니다.

# git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose.git /data/openpose
# cd /data/openpose
/data/openpose# git submodule init
/data/openpose# git submodule update

4. 소스코드 설정

소스코드를 설정하는 방법은 cmake를 이용하는 방법과 cmake-gui를 이용하여 설정하는 방법입니다. 2가지 방법중에 환경에 따라 선호하시는 방법을 이용하여 오픈포즈 소스코드를 설정해 주시면 됩니다.

CMake
이미 정의된 설정 파일을 이용하여, 빌드하실 경우 설정 파일을 복사하여 파일이름을 수정해 주셔야 합니다. ubuntu_deprecated 또는 ubuntu 디렉터리에 미리 정의된 설정 파일이 존재하는 것을 확인 하실 수 있을 겁니다. 아래의 내용은 우분투 16.04 환경의 CUDA 8.0 설정 파일을 복사하여 소스코드를 설정 하는 내용입니다.

/data/openpose# cp ubuntu_deprecated/Makefile.config.Ubuntu16_cuda8.example Makefile.config
/data/openpose# cp 3rdparty/caffe/Makefile.config.Ubuntu16_cuda8.example 3rdparty/caffe/Makefile.config

그리고 다음과 같이 빌드 디렉터리를 생성하시고 소스코드 설정 명령어를 실행해 주시면 됩니다.

/data/openpose/# mkdir build && cd build
/data/openpose/build# cmake ..

CMake GUI
이 방법은 GUI를 이용하여 간편하게 소스코드를 설정 하는 방법입니다. 소스코드를 설정 하기 위해서 다음 명령어를 실행해 주시기 바랍니다.

/data/openpose/# mkdir build && cd build
/data/openpose/build# cmake-gui ..

위의 명령어가 실행되면 아래와 같이 소스코드 설정 팝업이 나타납니다.

소스코드 위치와 빌드 후 생성될 바이너리 파일 위치등을 확인하시고, [Configure] 버튼을 클릭합니다.

빌드 방법을 묻는 팝업이 나타면, [Unix Makefiles]를 선택하여, [Finish] 버튼을 클릭하면 소스코드 설정을 시작하게 됩니다.

만약 GPU를 사용하지 않을 경우, GPU_MODE 값을 CPU_ONLY으로 변경하여 설정하시면 됩니다. 설정이 완료되게 되면, 소스코드 설정 팝업을 닫으면 됩니다.

5. 빌드

아래의 위치에서 빌드 디렉토리를 생성하시고, make 명령어를 실행하면 소스코드가 빌드되게 됩니다.

/data/openpose/build# make -j`nproc`
/data/openpose/build# make install

6. 데모

오픈포즈 설치 사용 방법 아래의 명령어는 비디오 영상에 추출된 포즈 정보를 중첩해서 나타내는 명령어입니다.
몸정보만 추출할 수도 있으며, 얼굴과 손 정보를 함께 추출 할 수도 있습니다.

# Only Body
/data/openpose# ./build/examples/openpose/openpose.bin --video examples/media/video.avi
# With face and hands
/data/openpose# ./build/examples/openpose/openpose.bin --video examples/media/video.avi --face --hand

그리고 아래의 명령어는 화면에 출력하지 않고, JSON 형태로 저장하는 예제입니다.

# Only body
/data/openpose# ./build/examples/openpose/openpose.bin --video examples/media/video.avi --write_json output/ --display 0
# Body + face + hands
/data/openpose# ./build/examples/openpose/openpose.bin --video examples/media/video.avi --write_json output/ --display 0 --face --hand

몇가지 데모 예제를 설명드렸는데 아래의 사이트에 방문하시면 보다 다양한 예제를 확인 하실 수 있으실 겁니다.

( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)