오픈포즈는 카메라 이미지로만 다음 그림과 같이 사람의 뼈대를 추출하는 딥러닝 모델이다. 오픈포즈는 CVPR(Computer Vision and Pattern Recognition) 2017에서 발표한 기술로, 카네기멜론 대학교에서 개발되었다. CNN(Convolutional Neural Network) 기반으로 관절과 뼈대를 예측한다. 이 글은 오픈포즈 설치, 구조 분석 및 사용 방법을 간단히 나눔한다.
빌드 및 설치
소스코드는 다음과 같이 다운로드 할 수 있다.
멀티 플랫폼을 지원하므로 윈도우에서도 실행할 수 있다. 단, 데이터 학습을 위해서는 Caffe 를 사용하므로 미리 설치하고 빌드해야 한다. 이와 관련해, 다음 링크를 참고해 설치 및 실행해 본다.
만약, 빌드가 불편하다면, 윈도우즈 버전을 설치해 사용할 수도 있다. 설치는 다음 링크를 참고한다.
설치 후 모델파일을 준비한다. 모델파일은 다음 링크를 참고해 다운로드한다.
- BODY_25 - pose_iter_584000.caffemodel
- COCO - pose_iter_440000.caffemodel
- MPI - pose_iter_160000.caffemodel
- Face - pose_iter_116000.caffemodel
- Hand - pose_iter_102000.caffemodel
만약, 앞서 설치가 쉽지 않다면, 다음 CoLab 환경에서 실행해보기를 바란다. 다만, 실제 활용을 위해서는 빌드 및 설치는 해야 한다.
기능 및 자료 구조 분석
오픈포즈는 다음과 같이 사람의 몸, 혹은 얼굴과 손을 함께 인식할 수 있다. --write_json 옵션을 추가하면, json파일로 해당 정보가 출력된다. --display 가 0이면 화면 출력 기능은 OFF할 수 있다.
# Only body
./build/examples/openpose/openpose.bin --write_json output/
./build/examples/openpose/openpose.bin --video examples/media/video.avi --write_json output/ --display 0 --render_pose 0
# Body + face + hands
./build/examples/openpose/openpose.bin --video examples/media/video.avi --write_json output/ --display 0 --render_pose 0 --face --hand
키포인트 파일
키포인트파일 형식(참고)
json 파일 구조는 다음과 같다.
- pose_keypoints_2d: 몸체 위치가 x1, y1, c1, x2, y2, c2,... 와 같이 배열로 저장됨. x, y는 픽셀위치이나 0 ~ 1, -1 ~ 0 과 같이 정규화될 수 있음(keypoint_scale 옵션에 따라). c는 신뢰도로 0 ~ 1 사이값.
참고로, 각 키포인트 배열 위치 의미는 다음과 같다. 이 형식을 BODY_25 구조라 한다(참고 - OpenPose Demo Output).
// {0, "Nose"},// {1, "Neck"},// {2, "RShoulder"},// {3, "RElbow"},// {4, "RWrist"},// {5, "LShoulder"},// {6, "LElbow"},// {7, "LWrist"},// {8, "MidHip"},// {9, "RHip"},// {10, "RKnee"},// {11, "RAnkle"},// {12, "LHip"},// {13, "LKnee"},// {14, "LAnkle"},// {15, "REye"},// {16, "LEye"},// {17, "REar"},// {18, "LEar"},// {19, "LBigToe"},// {20, "LSmallToe"},// {21, "LHeel"},// {22, "RBigToe"},// {23, "RSmallToe"},// {24, "RHeel"},// {25, "Background"}
다음 키포인트 데이터의 경우, Nose(0), REye(15), LEye(16), REar(17), LEar(18)이 출력된 것을 확인할 수 있다.
만약, 렌더링 이미지를 저장하고 싶다면 --write_video 옵션을 사용하면 된다.
./build/examples/openpose/openpose.bin --video examples/media/video.avi --write_video output/result.avi --write_json output/
./build/examples/openpose/openpose.bin --video clockwork.avi --write_video output/result.avi
다음은 오픈포즈 옵션을 설명한 것이다(참고).
--face: 얼굴 추출
--hand: 손 추출
--video input.mp4: 비디오 읽기
--camera 3: 3번 카메라 읽기
--image_dir path_to_images/: 폴더 내 이미지 입력
--ip_camera http://iris.not.iac.es/axis-cgi/mjpg/video.cgi?resolution=320x240?x.mjpeg: IP 카메라 입력
--write_video path.avi: 비디오 저장
--write_images folder_path: 폴더 내 이미지 출력
--write_keypoint path/: Output JSON, XML or YML files with the people pose data on a folder.
--process_real_time: For video, it might skip frames to display at real time.
--disable_blending: If enabled, it will render the results (keypoint skeletons or heatmaps) on a black background, not showing the original image. Related: part_to_show, alpha_pose, and alpha_pose.
--part_to_show: Prediction channel to visualize.
--display 0: Display window not opened. Useful for servers and/or to slightly speed up OpenPose.
--num_gpu 2 --num_gpu_start 1: Parallelize over this number of GPUs starting by the desired device id. By default it uses all the available GPUs.
--model_pose MPI: Model to use, affects number keypoints, speed and accuracy.
--logging_level 3: Logging messages threshold, range [0,255]: 0 will output any message & 255 will output none. Current messages in the range [1-4], 1 for low priority messages and 4 for important ones.
활용 방법
오픈포즈를 특정 어플리케이션에서 활용하려면 다음과 같은 실행 작업흐름을 고려할 수 있다.
- 오픈포즈 수행: 오픈포즈 옵션 설정 - 이미지 입력 - 오픈포즈 실행 - 키포인트 생성 - 키포인트 정규화 - 키포인트 출력
- 응용 서비스 실행: 키포인트 파싱 - 키포인트 패턴 매칭을 통한 패턴 범주 계산 - 패턴 범주에 따른 정보 생성 및 저장 - 패턴 범주 정보 사용
실행 결과
다양한 입력에 대한 실행결과는 다음과 같다.
OpenPoseDemo
OpenPoseDemo
다음은 영상을 입력한 결과이다.
OpenPoseDemo --video video.mp4
전반적으로 뼈대가 잘 인식되는 것을 알 수 있다. 참고로, openpose 설치 bin 폴더에는 다양한 실행 예제가 포함되어 있다.
01_body_from_image_default 실행화면
마무리
OpenPose는 대체적으로 밝은 조명과 명확한 실내 사람들 이미지에서는 잘 인식된다. 사람이 전혀 없는 장면에서 몇몇 노이즈가 있다. 군중은 개별적으로 사람을 인식하지는 못한다.
Reference
- Multi-person realtime action pose
- Human pose
- How to install openpose
- openpose performance test
- openpose lightweight
- openpose paper
엄청 빨리 돌아가네요 .. 컴퓨터 스펙좀 알수있을까요 ?
답글삭제GPU RTX 2080 입니다.
삭제안녕하세요. 질문이 있어서 이렇게 남깁니다
답글삭제제가 Windows Portable Version 으로 데모(video) 를 수행했는데 GTX 1660Ti 에서 out of memory 에러를 경험했습니다. 이미지에 대해서도 그런데 혹시 원인이 있을까요?
1개 GPU 입니다
우분투 설치해 두고 하시는 편 권장합니다. 참고로, 오픈포즈에 메모리 사용 옵션 있을 겁니다.
삭제안녕하세요. 질문이 있어서 이렇게 남깁니다
답글삭제제가 Windows Portable Version 으로 데모(video) 를 수행했는데 GTX 1660Ti 에서 out of memory 에러를 경험했습니다. 이미지에 대해서도 그런데 혹시 원인이 있을까요?
1개 GPU 입니다
우분투 설치해 두고 하시는 편 권장합니다. 참고로, 오픈포즈에 메모리 사용 옵션 있을 겁니다
삭제선생님 안녕하세요. 죄송한데 ㅠㅠ 한가지만 여쭤봐도 되나요?
답글삭제opnepose json 파일로 추출하였는데, 이 데이터를 선생님처럼 3개씩 배열되도록 정리하고 싶은데 어떻게 정리를 해야하는지 도저히 모르겠어서요...
자세하게 좀 알려주실 수 있으실까요?
작업한지가 좀 오래되어 생각은 잘 안나지만, 실행 시 출력 포맷 옵션이 있었던것 같습니다. 안되면, json파일을 파싱해도 될 듯 합니다. 파싱은 텍스트파일이니 파이썬으로 코딩하셔야 합니다.
삭제