Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

잡동사니 블로그

MediaPipe Pose 사용 본문

공부용

MediaPipe Pose 사용

코딩부대찌개 2023. 8. 9. 19:42

MediaPipe란?

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


관절 정의

https://developers.google.com/mediapipe/solutions/vision/pose_landmarker

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