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()
마지막으로 위 코드를 작성해 주면 완성!
실행을 해보면 아래 사진과 같이 표시가 된다.
마스크를 쓰고 있고 앉아 있어서 제대로 표시가 되지는 않는다.
잘 잡히는지 보여드리기 위해 영상을 업로드하여 캡처해 보면! 잘 인식하는 걸 볼 수 있다.
'과정 > 2차 AI프로젝트(해커톤참가)' 카테고리의 다른 글
프로젝트 '재움' 서비스 개발 시작 (0) | 2023.10.17 |
---|---|
MediaPipe를 통해 지정한 자세 정확도 테스트 (1) | 2023.10.13 |
2차 프로젝트 재움 진행사하아앙_1005 (1) | 2023.10.06 |
MediaPipe 각도를 이용한 자세 유추해보기 (0) | 2023.10.02 |
MediaPipe를 이용한 간단한 앉은 자세 인식하기 (0) | 2023.09.26 |
댓글