Python용 얼굴 특징 감지 가이드

MediaPipe 얼굴 랜드마크 작업을 사용하면 컴퓨터에서 얼굴의 랜드마크와 표정을 이미지 및 동영상입니다. 이 작업을 사용하여 인간의 표정을 식별할 수 있습니다. 얼굴 필터와 효과를 적용하여 가상 아바타를 만들어 보세요. 이 태스크에서는 다음을 사용합니다. 머신러닝 (ML) 모델은 단일 이미지 또는 연속된 이미지 이미지 스트림입니다. 이 작업은 3차원 얼굴 랜드마크, 혼합형을 출력합니다. 상세한 얼굴 표정을 추론하기 위한 점수 (얼굴 표정을 나타내는 계수) 실시간으로 표시, 변환 행렬을 사용하여 변환이 필요합니다.

이 지침에서 설명하는 코드 샘플은 GitHub 기능, 모델, 구성 옵션에 대한 자세한 내용은 개요를 참조하세요.

코드 예

얼굴 랜드마크의 코드 예는 다음의 전체 구현을 제공합니다. 참고하세요. 이 코드는 이 작업을 테스트하고 자체 얼굴 랜드마크를 만들기 시작했습니다. 얼굴 랜드마크 도구 예 코드 할 수 있습니다.

Raspberry Pi용 Face TRADEMARKer를 구현하는 경우 다음을 참조하세요. Raspberry Pi 예시 앱을 엽니다.

설정

이 섹션에서는 개발 환경을 설정하는 주요 단계를 설명하고 코딩 프로젝트를 사용하여 얼굴 랜드마크를 만들 수 있습니다. 일반적인 정보 다음과 같은 MediaPipe 작업을 사용하기 위한 개발 환경 설정 플랫폼 버전 요구사항에 대한 자세한 내용은 Python을 사용합니다.

<ph type="x-smartling-placeholder">

패키지

MediaPipe 얼굴 랜드마크 작업자 작업에는 mediapipe PyPI 패키지가 필요합니다. Cloud Shell을 설치하고 다음을 사용하여 이러한 종속 항목을 가져옵니다.

$ python -m pip install mediapipe

가져오기

다음 클래스를 가져와 얼굴 랜드마크 작업 함수에 액세스합니다.

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

모델

MediaPipe Face TRADEMARKer 작업을 수행하려면 이 작업과 호환되는 학습된 모델이 필요합니다. 태스크에 맞추는 것입니다. 얼굴 랜드마크에 사용할 수 있는 학습된 모델에 대한 자세한 내용은 다음을 참조하세요. 작업 개요의 모델 섹션을 확인합니다.

모델을 선택하고 다운로드한 후 로컬 디렉터리에 저장합니다.

model_path = '/absolute/path/to/face_landmarker.task'

BaseOptions 객체 model_asset_path 매개변수를 사용하여 지정할 수도 있습니다 코드 예는 다음 섹션을 참고하세요.

할 일 만들기

MediaPipe 얼굴 랜드마크 작업자 작업은 create_from_options 함수를 사용하여 태스크에 맞추는 것입니다. create_from_options 함수는 구성 값을 허용함 처리할 수 있습니다. 구성 옵션에 대한 자세한 내용은 다음을 참조하세요. 구성 옵션.

다음 코드는 이 작업을 빌드하고 구성하는 방법을 보여줍니다.

또한 이 샘플은 이미지에 대한 작업 구성의 변형도 보여줍니다. 동영상 파일, 라이브 스트림 등이 있죠

이미지

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.IMAGE)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

동영상

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a face landmarker instance with the video mode:
options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.VIDEO)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

실시간 스트림

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
FaceLandmarkerResult = mp.tasks.vision.FaceLandmarkerResult
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a face landmarker instance with the live stream mode:
def print_result(result: FaceLandmarkerResult, output_image: mp.Image, timestamp_ms: int):
    print('face landmarker result: {}'.format(result))

options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

이미지에 사용할 얼굴 랜드마크를 만드는 전체 예는 다음을 참조하세요. 코드 예시를 참조하세요.

구성 옵션

이 작업에는 Python 애플리케이션을 위한 다음과 같은 구성 옵션이 있습니다.

옵션 이름 설명 값 범위 기본값
running_mode 작업의 실행 모드를 설정합니다. 세 가지 모드:

IMAGE: 단일 이미지 입력 모드입니다.

동영상: 동영상의 디코딩된 프레임 모드입니다.

LIVE_STREAM: 입력의 라이브 스트림 모드 데이터를 수집할 수 있습니다. 이 모드에서는 resultListener가 결과를 수신하도록 리스너를 설정하기 위해 호출 있습니다.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_faces 기기가 인식할 수 있는 최대 얼굴 수입니다. FaceLandmarker 평활화는 num_faces가 1로 설정됩니다. Integer > 0 1
min_face_detection_confidence 얼굴 인식에 필요한 최소 신뢰도 점수입니다. 성공으로 간주됩니다. Float [0.0,1.0] 0.5
min_face_presence_confidence 얼굴 존재의 최소 신뢰도 점수입니다. 얼굴 특징 감지에서 점수를 계산할 수 있습니다. Float [0.0,1.0] 0.5
min_tracking_confidence 얼굴 추적의 최소 신뢰도 점수입니다. 합격해야 합니다. Float [0.0,1.0] 0.5
output_face_blendshapes 얼굴 랜드마크 도구가 얼굴 혼합 형태를 출력하는지 여부입니다. 얼굴 혼합 모양은 3D 얼굴 모델을 렌더링하는 데 사용됩니다. Boolean False
output_facial_transformation_matrixes FaceShadower가 얼굴 인식을 출력하는지 여부 변환 행렬입니다. FaceTRADEMARKer는 행렬을 사용하여 얼굴 랜드마크를 표준 얼굴 모델에서 이를 통해 사용자는 감지된 랜드마크에 효과를 적용할 수 있습니다. Boolean False
result_callback 랜드마크 결과를 수신하도록 결과 리스너를 설정합니다. FaceTRADEMARKer가 라이브 스트림 모드에 있을 때 비동기식으로 반환됩니다. 달리기 모드가 LIVE_STREAM로 설정된 경우에만 사용할 수 있습니다. ResultListener N/A

데이터 준비

입력을 이미지 파일 또는 NumPy 배열로 준비한 후 mediapipe.Image 객체. 입력이 동영상 파일 또는 YouTube의 웹캠과 같은 외부 라이브러리를 입력 프레임을 Numpy로 로드하는 OpenCV 배열입니다.

이미지

import mediapipe as mp

# Load the input image from an image file.
mp_image = mp.Image.create_from_file('/path/to/image')

# Load the input image from a numpy array.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
    

동영상

import mediapipe as mp

# Use OpenCV’s VideoCapture to load the input video.

# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You’ll need it to calculate the timestamp for each frame.

# Loop through each frame in the video using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

실시간 스트림

import mediapipe as mp

# Use OpenCV’s VideoCapture to start capturing from the webcam.

# Create a loop to read the latest frame from the camera using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

작업 실행

얼굴 랜드마크는 detect, detect_for_video, detect_async를 사용합니다. 함수를 사용하여 추론을 트리거합니다. 얼굴 특징화의 경우 다음과 같은 작업이 포함됩니다. 입력 데이터를 전처리하고 이미지에서 얼굴을 감지합니다.

다음 코드는 작업으로 처리를 실행하는 방법을 보여줍니다. 있습니다.

이미지

# Perform face landmarking on the provided single image.
# The face landmarker must be created with the image mode.
face_landmarker_result = landmarker.detect(mp_image)
    

동영상

# Perform face landmarking on the provided single image.
# The face landmarker must be created with the video mode.
face_landmarker_result = landmarker.detect_for_video(mp_image, frame_timestamp_ms)
    

실시간 스트림

# Send live image data to perform face landmarking.
# The results are accessible via the `result_callback` provided in
# the `FaceLandmarkerOptions` object.
# The face landmarker must be created with the live stream mode.
landmarker.detect_async(mp_image, frame_timestamp_ms)
    

다음에 유의하세요.

  • 동영상 모드 또는 라이브 스트림 모드에서 실행하는 경우 얼굴 랜드마크 작업 작업은 입력 프레임의 타임스탬프입니다.
  • 이미지 또는 동영상 모델에서 실행하는 경우 얼굴 랜드마크 작업이 차단됩니다. 현재 스레드가 입력 이미지 또는 프레임 처리를 완료할 때까지 스레드를 대기시킵니다.
  • 라이브 스트림 모드에서 실행하면 얼굴 랜드마크 작업이 반환됩니다. 현재 스레드를 차단하지 않습니다. 그러면 감지 결과를 수신 대기하는 리스너가 입력 프레임에 연결됩니다. 얼굴 랜드마크 작업 시 감지 기능이 호출되는 경우 다른 프레임을 처리 중인 경우 작업은 새 입력 프레임을 무시합니다.

이미지에서 얼굴 랜드마크를 실행하는 전체 예제는 코드 예 참조하세요.

결과 처리 및 표시

얼굴 랜드마크는 각 감지마다 FaceLandmarkerResult 객체를 반환합니다. 실행할 수 있습니다 결과 객체에는 인식된 각 얼굴에 대한 얼굴 메시가 포함되며 좌표입니다. 선택적으로 결과 객체는 얼굴 표정을 나타내는 혼합 형태와 변환 매트릭스를 사용하여 인식된 랜드마크에 얼굴 효과를 적용합니다.

다음은 이 작업의 출력 데이터 예시를 보여줍니다.

FaceLandmarkerResult:
  face_landmarks:
    NormalizedLandmark #0:
      x: 0.5971359014511108
      y: 0.485361784696579
      z: -0.038440968841314316
    NormalizedLandmark #1:
      x: 0.3302789330482483
      y: 0.29289937019348145
      z: -0.09489090740680695
    ... (478 landmarks for each face)
  face_blendshapes:
    browDownLeft: 0.8296722769737244
    browDownRight: 0.8096957206726074
    browInnerUp: 0.00035583582939580083
    browOuterUpLeft: 0.00035752105759456754
    ... (52 blendshapes for each face)
  facial_transformation_matrixes:
    [9.99158978e-01, -1.23036895e-02, 3.91213447e-02, -3.70770246e-01]
    [1.66496094e-02,  9.93480563e-01, -1.12779640e-01, 2.27719707e+01]
    ...

다음 이미지는 작업 출력을 시각화한 것입니다.

얼굴 랜드마크 도구 예제 코드는 반환된 결과를 표시하는 방법을 보여줍니다. 자세한 내용은 코드 예 참조하세요.