이 글은 mediapipe의 공식 홈페이지를 참고하여 mediapipe와 관련 코드에 대해 이해하는 과정을 정리할 것입니다.
MediaPipe의 ML 솔루션
얼굴인식
페이스 메쉬
모션캡처
물체감지,
등등...
얼굴인식
min_detection_confidence
최소 신뢰값([0.0, 1.0]) 기본값은 0.5로 모델에서 얼굴 감지가 성공한 것으로 간주
감지된 얼굴은 경계상자와 6개의 랜드마크 표시. xmain, width 및 ymin height
import cv2
import mediapipe as mp
mp_face_detection = mp.solutions.face_detection
mp_drawing = mp.solutions.drawing_utils
# For webcam input:
cap = cv2.VideoCapture(0)
with mp_face_detection.FaceDetection(min_detection_confidence=0.8) as face_detection:
while cap.isOpened():
success, image = cap.read()
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
image.flags.writeable = False #읽기 전용
#아마도 image에서 얼굴을 감지하는것 같음
results = face_detection.process(image)
image.flags.writeable = True #쓸수 있게 만듬
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
#results.detections이 xmin, width, ymin, height를 저장하는것 같음
if results.detections:
for detection in results.detections:
mp_drawing.draw_detection(image, detection)
cv2.imshow('ex.A', image)
if cv2.waitKey(5) & 0xFF == 27:
break
cap.release()
opencv코드랑 매우 유사하다.
마치 dlib을 사용하는 느낌을 받았는데 dlib보다 훨씬 간편한거 같음
페이스 메쉬
모바일 장치에서도 실시간으로 468 개의 3D 얼굴 랜드 마크를 추정
static_image_mode
max_num_faces
감지할 최대 얼굴 수
기본값 : 1
min_detection_confidence
최소 신뢰값([0.0, 1.0]) 기본값은 0.5로 모델에서 얼굴 감지가 성공한 것으로 간주
기본값 : 0.5
min_tracking_confidence
성공적으로 추적되는 얼굴 랜드마크에 대한 랜드마크 추적 모델의 최소 신뢰 값([0.0, 1.0])
기본값 : 0.5
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_face_mesh = mp.solutions.face_mesh
# For webcam input:
drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1) #원의 크기와 선 두께
cap = cv2.VideoCapture(0)
with mp_face_mesh.FaceMesh(min_detection_confidence=0.5, min_tracking_confidence=0.5, max_num_faces= 5) as face_mesh:
while cap.isOpened():
success, image = cap.read()
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
image.flags.writeable = False #읽기 전용
#result에 랜드마크 값이 들어가는듯
results = face_mesh.process(image)
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.multi_face_landmarks:
for face_landmarks in results.multi_face_landmarks:
mp_drawing.draw_landmarks(
image=image, #그릴 이미지
landmark_list=face_landmarks, #랜드마크 리스트
connections=mp_face_mesh.FACE_CONNECTIONS, #이건 먼지 모르겠음
landmark_drawing_spec=drawing_spec, #랜드마크 점두깨
connection_drawing_spec=drawing_spec) #랜드마크 선두깨
cv2.imshow('ex.B', image)
if cv2.waitKey(5) & 0xFF == 27:
break
cap.release()
손 랜드마크
21개의 손 랜드마크 추출
static_image_mode
max_num_hands
감지 할 최대 손 수입니다. 기본값은 2
min_detection_confidence
최소 신뢰 값 ( [0.0, 1.0]) 손 감지 모델에서 감지가 성공한 것으로 간주됩니다. 기본값은 0.5.
min_tracking_confidence
핸드 랜드마크를 성공적으로 추적하는 것으로 간주되는 랜드마크 추적 모델의 최소 신뢰 값([0.0, 1.0]) 기본값은 0.5
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands
# For webcam input:
cap = cv2.VideoCapture(0)
with mp_hands.Hands(min_detection_confidence=0.5,min_tracking_confidence=0.5, max_num_hands= 4) as hands:
while cap.isOpened():
success, image = cap.read()
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
image.flags.writeable = False
results = hands.process(image)
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
mp_drawing.draw_landmarks(image, hand_landmarks, mp_hands.HAND_CONNECTIONS)
cv2.imshow('MediaPipe Hands', image)
if cv2.waitKey(5) & 0xFF == 27:
break
cap.release()
슬슬 패턴이 보이기 시작한다.
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands
#원의 크기와 선 두께
cap = cv2.VideoCapture(0)
with mp_hands.Hands(min_detection_confidence=0.5,min_tracking_confidence=0.5, max_num_hands= 4) as hands:
while cap.isOpened():
success, image = cap.read()
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
image.flags.writeable = False
results = hands.process(image)
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
keypoints = []
for data_point in hand_landmarks.landmark:
keypoints.append({
'X': data_point.x,
'Y': data_point.y,
})
thumbIsOpen = 0
firstFingerIsOpen = 0
secondFingerIsOpen = 0
thirdFingerIsOpen = 0
fourFingerIsOpen = 0
if keypoints[7]['Y'] < keypoints[6]['Y'] or keypoints[8]['Y'] < keypoints[6]['Y']:
firstFingerIsOpen = 1
if keypoints[11]['Y'] < keypoints[10]['Y'] or keypoints[12]['Y'] < keypoints[10]['Y']:
secondFingerIsOpen = 1
if keypoints[15]['Y'] < keypoints[14]['Y'] or keypoints[16]['Y'] < keypoints[14]['Y']:
thirdFingerIsOpen = 1
if keypoints[19]['Y'] < keypoints[18]['Y'] or keypoints[20]['Y'] < keypoints[18]['Y']:
fourFingerIsOpen = 1
a = 0
a = str(thumbIsOpen+firstFingerIsOpen+secondFingerIsOpen+thirdFingerIsOpen+fourFingerIsOpen)
cv2.putText(image, a, (100, 100), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 2, (0, 255, 0), 2)
print(a)
# if keypoints[4]['Y'] < keypoints[3]['Y']:
# print('4')
mp_drawing.draw_landmarks(image, hand_landmarks, mp_hands.HAND_CONNECTIONS)
cv2.imshow('MediaPipe Hands', image)
if cv2.waitKey(5) & 0xFF == 27:
break
cap.release()
펴진 손가락 계산
일단 엄지는 잘 안되서 빼놓았다
'Emotion > 인공지능 기초' 카테고리의 다른 글
Dlib을 이용하여 얼굴 랜드마크 찍기 (0) | 2020.12.01 |
---|---|
Opencv 얼굴 인식(영상) (0) | 2020.11.27 |
Opencv 얼굴 인식(사진) (0) | 2020.11.27 |
앙상블 학습법(Ensemble Learning) (0) | 2020.09.29 |
로지스틱 회귀(Logistic Regression) (0) | 2020.09.29 |