2020년 7월 3일 금요일

뼈대 예측 딥러닝 모델 OpenPose 설치, 구조 분석 및 사용하기

오픈포즈는 카메라 이미지로만 다음 그림과 같이 사람의 뼈대를 추출하는 딥러닝 모델이다. 오픈포즈는 CVPR(Computer Vision and Pattern Recognition) 2017에서 발표한 기술로, 카네기멜론 대학교에서 개발되었다. CNN(Convolutional Neural Network) 기반으로 관절과 뼈대를 예측한다. 이 글은 오픈포즈 설치, 구조 분석 및 사용 방법을 간단히 나눔한다.

빌드 및 설치
소스코드는 다음과 같이 다운로드 할 수 있다. 

멀티 플랫폼을 지원하므로 윈도우에서도 실행할 수 있다. 단, 데이터 학습을 위해서는 Caffe 를 사용하므로 미리 설치하고 빌드해야 한다. 이와 관련해, 다음 링크를 참고해 설치 및 실행해 본다.
만약, 빌드가 불편하다면, 윈도우즈 버전을 설치해 사용할 수도 있다. 설치는 다음 링크를 참고한다.
설치 후 모델파일을 준비한다. 모델파일은 다음 링크를 참고해 다운로드한다. 
만약, 앞서 설치가 쉽지 않다면, 다음 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파일에는 각 관절 keypoint가 저장된다.
입력 이미지
키포인트 파일
키포인트파일 형식(참고)

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"}
BODY_25 의미

다음 키포인트 데이터의 경우, 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 --video video.mp4

전반적으로 뼈대가 잘 인식되는 것을 알 수 있다. 참고로, openpose 설치 bin 폴더에는 다양한 실행 예제가 포함되어 있다.
01_body_from_image_default 실행화면

마무리
OpenPose는 대체적으로 밝은 조명과 명확한 실내 사람들 이미지에서는 잘 인식된다. 사람이 전혀 없는 장면에서 몇몇 노이즈가 있다. 군중은 개별적으로 사람을 인식하지는 못한다.

Reference

댓글 8개:

  1. 엄청 빨리 돌아가네요 .. 컴퓨터 스펙좀 알수있을까요 ?

    답글삭제
  2. 안녕하세요. 질문이 있어서 이렇게 남깁니다
    제가 Windows Portable Version 으로 데모(video) 를 수행했는데 GTX 1660Ti 에서 out of memory 에러를 경험했습니다. 이미지에 대해서도 그런데 혹시 원인이 있을까요?
    1개 GPU 입니다

    답글삭제
    답글
    1. 우분투 설치해 두고 하시는 편 권장합니다. 참고로, 오픈포즈에 메모리 사용 옵션 있을 겁니다.

      삭제
  3. 안녕하세요. 질문이 있어서 이렇게 남깁니다
    제가 Windows Portable Version 으로 데모(video) 를 수행했는데 GTX 1660Ti 에서 out of memory 에러를 경험했습니다. 이미지에 대해서도 그런데 혹시 원인이 있을까요?
    1개 GPU 입니다

    답글삭제
    답글
    1. 우분투 설치해 두고 하시는 편 권장합니다. 참고로, 오픈포즈에 메모리 사용 옵션 있을 겁니다

      삭제
  4. 선생님 안녕하세요. 죄송한데 ㅠㅠ 한가지만 여쭤봐도 되나요?
    opnepose json 파일로 추출하였는데, 이 데이터를 선생님처럼 3개씩 배열되도록 정리하고 싶은데 어떻게 정리를 해야하는지 도저히 모르겠어서요...
    자세하게 좀 알려주실 수 있으실까요?

    답글삭제
    답글
    1. 작업한지가 좀 오래되어 생각은 잘 안나지만, 실행 시 출력 포맷 옵션이 있었던것 같습니다. 안되면, json파일을 파싱해도 될 듯 합니다. 파싱은 텍스트파일이니 파이썬으로 코딩하셔야 합니다.

      삭제