잡동사니 블로그
MediaPipe Pose 사용 본문
MediaPipe란?
구글에서 개발한 오픈소스 미디어 프레임워크이며 컴퓨터 비전 및 머신러닝 알고리즘을 사용하여 실시간으로 비디오 및 오디오 데이터를 분석하고 처리하는 데 사용됨. 주로 자세 인식, 얼굴 감지, 손 모션 추적, 물체 추적, 동작 인식 등의 작업을 수행할 수 있음.
관절 정의

0 - nose
1 - left eye (inner)
2 - left eye
3 - left eye (outer)
4 - right eye (inner)
5 - right eye
6 - right eye (outer)
7 - left ear
8 - right ear
9 - mouth (left)
10 - mouth (right)
11 - left shoulder
12 - right shoulder
13 - left elbow
14 - right elbow
15 - left wrist
16 - right wrist
17 - left pinky
18 - right pinky
19 - left index
20 - right index
21 - left thumb
22 - right thumb
23 - left hip
24 - right hip
25 - left knee
26 - right knee
27 - left ankle
28 - right ankle
29 - left heel
30 - right heel
31 - left foot index
32 - right foot index
코드 실습
#라이브러리 설치
!pip install mediapipe
import re
import cv2
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
#옵션 및 경로 설정
model_path = 'pose_landmarker_full.task'
BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode
#지정한 모델을 사용하며 이미지에서 랜드마크를 감지
options = PoseLandmarkerOptions(
base_options=BaseOptions(model_asset_path=model_path),
running_mode=VisionRunningMode.IMAGE)
#MediaPipe 라이브러리를 활용하여 자세 랜드마크를 수행
with PoseLandmarker.create_from_options(options) as landmarker:
mp_image = mp.Image.create_from_file('./male.jpg')
pose_landmarker_result = landmarker.detect(mp_image)
출력 결과에는 정규화된 좌표계 (Landmarks)와 월드 좌표계(WorldLandmarks)에서의 랜드마크 결과 포함

x: 랜드마크의 x 좌표
y: 랜드마크의 y 좌표
z: 랜드마크의 z 좌표
visibility: 랜드마크의 가시성
presence: 랜드마크의 존재 여부
모듈을 이용한 시각화
mp_pose = mp.solutions.pose
mp_drawing = mp.solutions.drawing_utils
image_path = './male.jpg'
image = cv2.imread(image_path)
with mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose:
result = pose.process(image)
if result.pose_landmarks:
mp_drawing.draw_landmarks(image, result.pose_landmarks, mp_pose.POSE_CONNECTIONS)
cv2.imshow('Landmarks', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

CV2를 활용하여 직접 만든 시각화
image_path = './male.jpg'
image = cv2.imread(image_path)
total=[]
for i in range(len(pose_landmarker_result.pose_landmarks[0])):
total.append([float(val) for val in re.findall(r'-?\d+\.\d+', ' '.\
join(list(str(pose_landmarker_result.pose_landmarks[0][i]).split('='))))])
z,c=0,0
cnt=0
line=[]
line_total=[(28,30),(30,32),(32,28),(28,26),(26,24),(24,23),
(23,25),(25,27),(27,31),(31,29),(29,27),
(23,11),(11,12),(12,24),(24,23),(12,14),(14,16),(16,22),(16,20),(20,18),
(18,16),(11,13),(13,15),(15,21),(15,19),(19,17),(17,15),(10,9),
(0,1),(1,2),(2,3),(3,7),(0,4),(4,5),(5,6),(6,8)]
#Nomalize된 데이터를 반환하기에 이미지 크기를 곱함
#cv2.circle()를 활용하여 랜드마크 표시
#cv2.line()를 활용하여 랜드마크를 연결하는 선 그림
for i in total:
x = int(image.shape[1] * i[0])
y = int(image.shape[0] * i[1])
line.append((x,y))
image = cv2.circle(image, (x, y), 2, (0, 0, 255), -1)
def lineshow(q,w):
global image
x=line[q][0]
y=line[q][1]
z=line[w][0]
c=line[w][1]
image = cv2.line(image, (x, y), (z, c), (0,255,0))
for i in line_total:
lineshow(i[0],i[1])
cv2.imshow('Landmarks', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

'공부용' 카테고리의 다른 글
Yolov5 커스텀 데이터 학습 Object detection (0) | 2023.08.20 |
---|---|
K-nearest neighbor(KNN) (0) | 2023.08.12 |
[논문 읽기] CutMix(2019) (0) | 2023.07.18 |
.gitignore 자동생성 (0) | 2023.06.12 |
[CS231n] 2장 Image Classification (0) | 2023.02.10 |