본문 바로가기
과정/2차 AI프로젝트(해커톤참가)

MediaPipe를 이용한 실시간 랜드마크 생성

by 줘요 2023. 9. 26.

2차 프로젝트가 영상을 통한 자세인식이기에 사용할 모델을 구글에 pose estimation python을 검색하다 MediaPipe API를 찾아냈다.

 

MediaPipe 홈페이지 내에 python 예제코드가 있었고, 참고할만한 블로그도 많이 보여서 채택하였다.

 

MediaPipe에 대해 간략하게 소개해보자면 

 

제작사: Google

2D~3D 지원하며, 오픈소스 라이브러리로 누구나 다운로드하여 사용 가능하며 필요에 따라 사용자가 정의하고 확장이 가능하다.

 

정확성이 높고 실시간 분석에 특화되어 있다.

 

 

 

실시간 웹캠으로 랜드마크가 생성되는 것을 먼저 확인해 보자

 

MediaPipe와 영상을 처리하는 라이브러리를 사용하기 위해 먼저 다운로드하여주자

pip install opencv-python mediapipe

#or

pip install opencv-python
pip install mediapipe

 

첫 번째 방법을 하든 두 번째 방법을 하든 opencv-python과 mediapipe가 설치된다.

 

#먼저 MediaPipe 및 OpenCV를 포함하여 필요한 라이브러리를 가져옵니다.
import cv2
import mediapipe as mp

 

라이브러리를 가져와주고

 

#신체 랜드마크 감지를 위해 MediaPipe 포즈 모델을 초기화합니다.
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()

#mp_drawing 변수를 초기화하고 이를 mp.solutions.raw_utils 클래스와 연결
mp_drawing = mp.solutions.drawing_utils

 

초기화를 몇 개 해준다.

 

 

mp.solutions.drawing_utils는 변수 초기화를 사용하지 않고 코드 작성을 하면 AttributeError: module 'mediapipe' has no attribute 'drawing_utils' 해당 오류가 나오는데 이유를 정확하게 모르겠다 흠,,;

#실시간 비디오를 캡처하려면 웹캠 피드를 엽니다.
cap = cv2.VideoCapture(1)

 

촬영할 웹캠을 설정해 준다. 보통은 0번으로 해야 컴퓨터에 있는 디폴트 값의 웹캠으로 연결이 되는데 맥북을 쓰는 나는 왜인지 모르게 핸드폰으로 연결되어 1번으로 설정했다. (웹캠으로 진행이 어려울 경우 동영상의 파일 경로를 넣어주어도 된다.)

 

 

#비디오 프레임을 지속적으로 처리하고 신체 랜드마크를 오버레이하는 루프를 만들자
while True:
    #웹캠에서 프레임을 읽는다.
    ret, frame = cap.read()
    if not ret:
        break

    #프레임을 RGB로 변화해준다.
    frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    #MediaPipe Pose로 프레임을 처리한다.
    results = pose.process(frame_rgb)

    #랜드마크가 감지되었는지 확인
    if results.pose_landmarks:
        #프레임에 랜드마크를 렌더링한다.
        mp_drawing.draw_landmarks(frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)

    # 랜드마크가 있는 프레임을 보여준다.
    cv2.imshow('Body Landmarks', frame)

    # q를 누르면 while문 종료됨.
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

 

while문을 통해 실시간으로 웹캠에 랜드마크를 렌더링 해준다.

 

#프로그램 작업을 마친 후 할당된 리소르를 남기거나 열어두지 않게 함

#비디오 캡처 리소스를 해제
cap.release()
#모든 OpenCV 표시 창을 닫습니다.
cv2.destroyAllWindows()

 

마지막으로 위 코드를 작성해 주면 완성! 

 

실행을 해보면 아래 사진과 같이 표시가 된다.

 

마스크를 쓰고 있고 앉아 있어서 제대로 표시가 되지는 않는다.

 

랜드마크 형성!

잘 잡히는지 보여드리기 위해 영상을 업로드하여 캡처해 보면! 잘 인식하는 걸 볼 수 있다.

왜 이렇게 빵실한지,,

 

댓글