[MediaPipe] 동영상 속 사람 포즈 인식하기

정기용·2023년 1월 26일
0

lunalabs

목록 보기
4/5

목표

  • MediaPipe를 사용하여 영상 속 사람의 특징점을 점으로 인식하고 그린다.
  • cv2를 활용해 동영상을 불러들이고 쓸 수 있다.

1. MediaPipe 설치

MediaPipe는 Google에서 만든 사람 인식 Library이다. 포즈 뿐만 아니라 다양한 카테고리를 인식할 수 있다.

# 다운로드 코드
!pip install mediapipe

홈페이지에 자세하게 MediaPipe에 대한 설명이 나와있지만 영어다. 한국어로 간단하게 설명해보겠다.

간단 MediaPipe 설명

MediaPipe는 아래와 같은 사람의 특징점들을 인식하는 머신러닝 라이브러리다.

동영상의 경우 각 프레임별로 아래의 프로세스가 수행된다.
1. 가장 중심이 되는 사람을 감지(detect)한다.
2. 그 사람의 특징점을 찾는다.
여기서 사람 하나를 먼저 감지하는 단계가 있다. 이 부분을 수정해 여러 사람을 감지하게 만들면 한 프레임 안의 여러사람에게서 특징점을 도출할 수 있다. 그만큼 시간이 오래 걸리겠지만.

2. 코드

MediaPipe 홈페이지에 사용 코드가 나와있다. 하지만 동영상을 돌리려면 코드를 약간 수정할 필요가 있다. 아래는 내가 수정한 코드다. 설명은 주석으로 달아놓았다.

import cv2
import mediapipe as mp
import numpy as np
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose

#파일 위치 미리 지정
input_video_path = "/content/in_theft.mp4"
save_video_path = '/content/in_theft_output.mp4'

cap = cv2.VideoCapture(input_video_path)

#재생할 파일의 넓이와 높이
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
#video controller
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter(save_video_path, fourcc, 30.0, (int(width), int(height)))


with mp_pose.Pose(
        min_detection_confidence=0.7,
        min_tracking_confidence=0.7) as pose:
    while cap.isOpened():
        success, image = cap.read()
        if not success:
            print("카메라를 찾을 수 없습니다.")
            # 웹캠을 불러올 경우는 'continue', 동영상을 불러올 경우 'break'를 사용합니다.
            break

        # 필요에 따라 성능 향상을 위해 이미지 작성을 불가능함으로 기본 설정합니다.
        image.flags.writeable = False
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        results = pose.process(image)

        # 포즈 주석을 이미지 위에 그립니다.
        image.flags.writeable = True
        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
        mp_drawing.draw_landmarks(
            image,
            results.pose_landmarks,
            mp_pose.POSE_CONNECTIONS,
            landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style())
        # 보기 편하게 이미지를 좌우 반전합니다.
        cv2.imshow('MediaPipe Pose', image) #코랩에서 돌릴거면 imshow()문은 주석처리할 것.
        out.write(image)
        if cv2.waitKey(5) & 0xFF == 27:
            break
cap.release()
out.release()
cv2.destroyAllWindows()

결과는 아래 사진을 클릭하면 볼 수 있다.

보면 잘못 인식한 부분이 보인다. 사람이 여러명이라 그런듯 하다. 다음에 고쳐보자.!

profile
SKKU CS 23

0개의 댓글