비전

[MediaPipe] 얼굴 매쉬1

왕초보코딩러 2024. 9. 2. 19:50
728x90

미디어파이프란 구글에서 제공하는 AI 오픈소스이다

 

 

미디어파이프 설치

pip install mediapipe

 

 

import mediapipe as mp
import cv2

 

 

mp.solutions: 미디어파이프 솔루션들이 포함되어 쉽게 사용할 수 있다

 

 

- 얼굴 탐지

mp.solutions.face_detection

- 얼굴 매쉬 

mp.solutions.face_mesh

- 손 추적

mp.solutions.hands

- 포즈 추정

mp.solutions.pose

- 신체 전체 추적

mp.solutions.holistic

- 랜드마크 시각화 툴

mp.solutions.drawing_utils

- 미리 정의된 스타일 툴

mp.solutions.drawing_styles

- 인물과 배경 분리

mp.solutions.selfie_segmentation

 

https://github.com/google-ai-edge/mediapipe/blob/master/docs/solutions/face_mesh.md

 

mediapipe/docs/solutions/face_mesh.md at master · google-ai-edge/mediapipe

Cross-platform, customizable ML solutions for live and streaming media. - google-ai-edge/mediapipe

github.com

 


이번에는 얼굴 메시를 보겠습니다

from mediapipe.python.solutions import face_mesh as mp_facemesh
from mediapipe.python.solutions import drawing_utils as mp_drawing
from mediapipe.python.solutions import drawing_styles as mp_drawing_style

face_mesh = mp_facemesh.FaceMesh()

 

 

img = cv2.imread('data/karina.jpg')
    
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
# 값이 계산되는 동안에 얼굴을 틀어서 이미지 좌표가 바뀌지 않게 lock
img_rgb.flags.writeable = False
# 결과
result = face_mesh.process(img_rgb) # rgb로 넣어줘야 한다 미디어파이프에 넣어서 정보 추출. 점 좌표값이 468개
img_rgb.flags.writeable = True

    
print(result.multi_face_landmarks)

 

 

이렇게 468개의 landmark가 나옵니다

[landmark {
  x: 0.496099442
  y: 0.443154395
  z: -0.0194834154
}
landmark {
  x: 0.488465339
  y: 0.416837752
  z: -0.0540649854
}
landmark {
  x: 0.492410809
  y: 0.422806978
  z: -0.0230866689
}
landmark {
  x: 0.476272255
  y: 0.385627717
  z: -0.0472301133
}
.
.
.
]

 

 

result.multi_face_landmarks를 이용합니다

# 인식이 됐으면
if result.multi_face_landmarks:
    for face_landmarks in result.multi_face_landmarks: # 468개
        mp_drawing.draw_landmarks(
            image = img, # 이미지
            landmark_list = face_landmarks, # 랜드마크 목록
        )

 

 

이미지 출력

cv2.imshow('face_mesh', img)
    
cv2.waitKey() 
cv2.destroyAllWindows()

 

 

이제 이것을 더 이쁘게 이어보겠습니다.

이때 mp.solutions의 drawing_styles를 사용합니다.

# 인식이 됐으면
if result.multi_face_landmarks:
    for face_landmarks in result.multi_face_landmarks: # 468개
        mp_drawing.draw_landmarks(
            image = img, # 이미지
            landmark_list = face_landmarks, # 랜드마크 목록
            connections = mp_facemesh.FACEMESH_TESSELATION, # 랜드마크 연결선
            connection_drawing_spec = mp_drawing_style.get_default_face_mesh_tesselation_style(), # 연결선 스타일
            landmark_drawing_spec = None, # 점 표시
        )

 

 

 

'비전' 카테고리의 다른 글

[MediaPipe] face_detection으로 얼굴 모자이크  (0) 2024.09.04
[MediaPipe] 얼굴 매쉬2  (0) 2024.09.03
[MediaPipe] 포즈 인식  (0) 2024.08.25
[MediaPipe] 얼굴 인식  (0) 2024.08.23
[OpenCV] 특정 색 검출  (0) 2024.08.20