Computer Vision

Human Pose Estimation(1)

Adulescentia 2024. 10. 18. 14:35

 

0. 프로젝트 시작

학교에서 자기주도프로젝트로 "Human Pose Estimation을 기초로 한 포즈 점수 및 피드백 시스템 구현" 이라는 주제를 선택하였다. 내가 사진을 찍을때 포즈가 항상 너무 이상해서 이걸 개선해보면 어떨까 하는 아이디어에서 시작한 주제 선정이였다.

 

사실 내가 제일 처음 pose estimation을 접한 곳은 ComfyUI와 같은 image generator이다. 사진을 넣으면 사진 속 인물의 포즈를 파악하고 이를 바탕으로 이미지를 생성하는 controllnet의 openpose와 같은 것을 보며 참 신기하다 생각했었는데, 학기를 시작하기 전 자기주도 프로젝트 관련 공지를 보다가 문득 이 기술을 가져다 사용하면 쉽게 프로젝트를 구현할 수 있지 않을까 라는 생각이 들어서 이번 프로젝트를 시작하게 되었다.

 

프로젝트를 구상할 때 맨 처음 고민하던 문제는 포즈를 측정한 다음 이걸 어떻게 평가하고 피드백할 것인지에 관한 것이였다. 이게 객관적으로 "좋은 포즈"라는게 존재하지 않고 매우 주관적으로 평가되며 같은 포즈라고 하더라도 찍는 구도, 배경, 위치 등에 따라 다르게 사진에 담길 수 있기 때문에 평가를 어떻게 할 것인지에 대한 고민이 있었다. 

 

그렇게 고민하던 와중 일단 뭐라도 해서 매주 발표를 해야했기 때문에 먼저 정확한 pose estimation을 구현하기로 하였다. 먼저 원래 알고 있던 openpose의 python example 코드를 가지고 하였는데 생각보다 성능이 별로였다. 그래서 좀 찾아보던 도중 ViTPose 깃허브 사이트를 찾았고, 이걸로 해보기로 결정하였다.

 

근데, 이렇게 환경 세팅이 어려운지 알았으면 안했지... 

진짜 일주일은 세팅만 한 것 같다. cuda 버전 깔고 지우고 torch 깔고 지우고...

 

결국

WSL ubuntu 20.04 LTS + CUDA 11.8 + cudnn 8.7.0 + torch 2.0.0 + mmcv 1.5.0 + numpy 1.24.3 + mmdet 2.28.2

이 조합으로 ViTPose의 demo 코드를 실행시키는데 성공했다.

참고로 필자의 컴퓨터 사양은 Ryzen 7500f, ram 32gb, RTX 4060ti 16gb 이다.

 

1. ViTPose 실행

ViTPose에서 pose estimation을 하는 방식은 크게 2단계로 나눠진다.

  1. Bounding Box 설정
  2. Keypoints 설정

Bounding box는 객체가 있다고 판단된 부분의 영역을 설정하는 것이고 그 bounding box 영역 안에서 Keypoints를 찾게 된다.  ViTPose는 COCO 데이터셋을 이용했으므로 관절별 keypoint 매핑은 다음 사이트에 정리되어 있다.  (https://www.researchgate.net/figure/Key-points-for-human-poses-according-to-the-COCO-output-format-R-L-right-left_fig3_353746430)

 

나만 그런건지 모르겠는데 demo 파일중 하나를 실행하려 하니 에러가 자꾸 발생했다. 에러 원인을 찾아가던 도중 mmdetection에서 configs\_base_\models\faster_rcnn_r50_fpn.py 파일의 test_cfg 설정을 다음과 같이 설정해주니 정상적으로 작동하였다.

// mmdetection\configs\_base_\models\faster_rcnn_r50_fpn.py
test_cfg = dict(
    rpn=dict(
        nms_across_levels=False,
        nms_pre=1000,
        nms_post=1000,
        max_num=1000,
        nms=dict(type='nms', iou_threshold=0.7),
        min_bbox_size=0,
        max_per_img=100  # max_per_img 추가
    ),
    rcnn=dict(
        score_thr=0.05,
        nms=dict(type='nms', iou_threshold=0.5),
        max_per_img=100  # max_per_img 유지
    )
)

 

ViTPose/demo/top_down_pose_tracking_demo_with_mmdet.py 파일을 실행시킨 결과는 다음과 같다

 

 

 

 

 

2. Bounding Box 크기 설정

내가 구현하고 싶은 시스템은 (일단은) 한 명의 포즈를 분석하고 평가 및 피드백하는 것이 목표이다. 그런데 사진에 많은 사람이 존재한다면 문제가 발생한다. 따라서 일단 bounding box의 크기를 설정하여 너무 작은 사람은 제외하고 pose estimaion을 진행하는 옵션을 추가하였다.

 

[설정 X]

 

[box_ratio = 0.1]

 

여기서 bounding box의 크기를 결정하는 과정은 구체적으로 다음과 같다

  1. opencv를 이용해 영상의 크기 데이터를 가져온다 (frame_width, frame_height)
  2. frame_width, frame_height 에 box_ratio 를 곱해준다

 

이제 이걸로 어떻게 학습을 시킬지 고민해봐야겠다...