ursobad
ursobad
ursobad
전체 방문자
오늘
어제
  • 분류 전체보기 (116)
    • Emotion (35)
      • 파이썬 (10)
      • 문제 (10)
      • 인공지능 기초 (15)
    • Best of the Best (3)
    • Hacking (58)
      • HackCTF (12)
      • DreamHACK (7)
      • Webhacking.kr (19)
      • Root Me (6)
      • HTB (5)
      • 기타 (7)
      • 리버싱 소수전공 (2)
    • 기능반 (16)
      • 2과제 (14)
      • 3과제 (2)
    • 기록 (3)
    • 짧은 글들 (0)
    • 기타 (1)
    • Zombie (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • BoB 질문
  • 얼굴검출
  • Bob
  • 파이썬
  • 머신러닝
  • 앙상블
  • 의사결정트리
  • BoB 자기소개서
  • 함수
  • BoB 11기
  • Python
  • KNN
  • OpenCV
  • 구독자 전용 다시보기
  • BoB 필기
  • BoB 면접
  • 123
  • BoB 자기소개
  • BoB 자소서
  • 백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ursobad

ursobad

mediapipe 관련 1
Emotion/인공지능 기초

mediapipe 관련 1

2021. 3. 20. 22:32

이 글은 mediapipe의 공식 홈페이지를 참고하여 mediapipe와 관련 코드에 대해 이해하는 과정을 정리할 것입니다.

 

google.github.io/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
    'Emotion/인공지능 기초' 카테고리의 다른 글
    • Dlib을 이용하여 얼굴 랜드마크 찍기
    • Opencv 얼굴 인식(영상)
    • Opencv 얼굴 인식(사진)
    • 앙상블 학습법(Ensemble Learning)
    ursobad
    ursobad

    티스토리툴바