준비하는 대학생

[Computer vision] 미디어 파이프 본문

Programming/Computer vision

[Computer vision] 미디어 파이프

Bangii 2023. 3. 28. 20:19

미디어파이프(MediaPipe)는 구글이 개발한 오픈 소스 프레임워크로, 머신러닝 및 영상 처리 기술을 실시간으로 사용할 수 있도록 돕습니다. 이 글에서는 미디어파이프의 주요 기능과 이를 활용한 영상 처리 애플리케이션을 소개합니다.

미디어파이프란?

미디어파이프는 다양한 플랫폼에서 사용할 수 있는 프레임워크로, 컴퓨터 비전, 머신러닝, 그래픽, 데이터 처리 등의 기능을 제공합니다. 간편한 API를 통해 빠르게 프로토타입을 개발하고, 고성능 애플리케이션을 구축할 수 있습니다.

주요 기능:

  • 실시간 영상 처리
  • 머신러닝 모델 통합
  • 다양한 플랫폼 지원(Android, iOS, Web, Desktop)

미디어파이프를 활용한 영상 처리 애플리케이션

1. 포즈 추정(Pose Estimation)

미디어파이프의 'Pose' 솔루션은 사람의 자세를 2D 또는 3D 좌표로 추정할 수 있습니다. 이를 활용하여 운동 자세 교정, 게임 개발, 인체 모션 분석 등 다양한 분야에서 사용할 수 있습니다.

2. 얼굴 랜드마크(Face Landmark) 추출

'Face Mesh' 솔루션을 사용하면, 얼굴의 랜드마크(특징점)를 추출할 수 있습니다. 이를 통해 실시간 얼굴 인식, 표정 분석, 아바타 생성 등의 애플리케이션을 구현할 수 있습니다.

3. 손 제스처 인식(Hand Gesture Recognition)

미디어파이프의 'Hands' 솔루션은 손의 랜드마크를 인식하여 다양한 손 제스처를 감지할 수 있습니다. 이 기능은 가상 현실, 증강 현실, 인터랙티브 시스템 등에서 활용할 수 있습니다.

미디어파이프 시작하기

Python을 사용하여 미디어파이프를 시작해 보겠습니다. 먼저, 필요한 라이브러리를 설치합니다.

pip install mediapipe

1. 미디어파이프 포즈 모델 초기화

import mediapipe as mp

mp_pose = mp.solutions.pose
pose = mp_pose.Pose()
  • import mediapipe as mp: 미디어파이프 라이브러리를 불러옵니다.
  • mp_pose = mp.solutions.pose: 미디어파이프의 pose 솔루션을 사용하기 위해 mp_pose 변수에 할당합니다.
  • pose = mp_pose.Pose(): Pose 클래스의 인스턴스를 생성합니다. 이 인스턴스를 사용하여 포즈 추정을 수행합니다.

2. 미디어파이프 그림 초기화

mp_drawing = mp.solutions.drawing_utils
  • mp_drawing = mp.solutions.drawing_utils: 랜드마크를 시각화하기 위해 미디어파이프의 drawing_utils를 mp_drawing 변수에 할당합니다.

3. 웹캠에서 이미지 캡처

import cv2

cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, frame = cap.read()
    ...
  • import cv2: OpenCV 라이브러리를 불러옵니다. OpenCV는 이미지 및 동영상 처리에 사용되는 라이브러리입니다.
  • cap = cv2.VideoCapture(0): 웹캠을 사용하여 이미지를 캡처하기 위해 VideoCapture 객체를 생성합니다. 인수 0은 기본 웹캠을 나타냅니다.
  • while cap.isOpened():: 웹캠이 열려 있는 동안 루프를 실행합니다.
  • ret, frame = cap.read(): 웹캠에서 이미지를 읽습니다. ret는 이미지를 정상적으로 읽었는지 여부를 나타내고, frame은 읽은 이미지입니다.

4. 이미지를 RGB로 변환

rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
  • rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB): OpenCV는 이미지를 BGR 형식으로 처리하지만, 미디어파이프는 RGB 형식을 사용합니다. 따라서 cvtColor 함수를 사용하여 이미지의 색상 공간을 BGR에서 RGB로 변환합니다.

5. 포즈 추정

result = pose.process(rgb_frame)
  • result = pose.process(rgb_frame): Pose 클래스의 인스턴스인 pose를 사용하여 RGB 이미지에 대한 포즈 추정을 수행합니다.  
    이 결과는 result 변수에 저장됩니다. result.pose_landmarks에 포즈 랜드마크 정보가 포함되어 있습니다.

6. 원본 이미지에 랜드마크 그리기

annotated_frame = frame.copy()
mp_drawing.draw_landmarks(annotated_frame, result.pose_landmarks, mp_pose.POSE_CONNECTIONS)
  • annotated_frame = frame.copy(): 원본 이미지의 복사본을 생성합니다. 이 복사본에 랜드마크를 그립니다.
  • mp_drawing.draw_landmarks(annotated_frame, result.pose_landmarks, mp_pose.POSE_CONNECTIONS): draw_landmarks 함수를 사용하여 이미지에 랜드마크를 그립니다. 이 함수는 다음 세 가지 인수를 받습니다.
    • annotated_frame: 랜드마크를 그릴 이미지입니다.
    • result.pose_landmarks: 포즈 랜드마크 정보를 포함하는 객체입니다.
    • mp_pose.POSE_CONNECTIONS: 랜드마크 간 연결 정보를 포함하는 객체입니다. 이 정보를 사용하여 랜드마크를 연결한 선을 그립니다.

7. 결과를 화면에 표시

cv2.imshow('Pose Estimation', annotated_frame)

if cv2.waitKey(5) & 0xFF == 27:
    break
  • cv2.imshow('Pose Estimation', annotated_frame): imshow 함수를 사용하여 랜드마크가 그려진 이미지를 화면에 표시합니다. 첫 번째 인수는 창의 제목을 나타내고, 두 번째 인수는 표시할 이미지입니다.
  • if cv2.waitKey(5) & 0xFF == 27: break: waitKey 함수는 지정된 시간 동안 키 입력을 기다립니다. 여기서는 5 밀리초 동안 키 입력을 기다립니다. ESC 키의 ASCII 코드가 27이므로, ESC 키를 누르면 루프가 종료됩니다.

8. 종료

cap.release()
cv2.destroyAllWindows()
  • cap.release(): 웹캠을 사용한 리소스를 해제합니다.
  • cv2.destroyAllWindows(): 생성된 모든 창을 닫습니다.

 

 

이처럼 미디어파이프를 활용하면 손쉽게 영상 처리 및 머신러닝 기반의 애플리케이션을 구축할 수 있습니다. 또한, 미디어파이프는 계속 업데이트되어 새로운 기능과 솔루션을 제공하고 있습니다.

참고:

 

Comments