Hướng dẫn phát hiện mốc khuôn mặt cho Python

Nhiệm vụ MediaPipe Face Editioner cho phép bạn phát hiện các điểm mốc khuôn mặt và biểu cảm khuôn mặt trong hình ảnh và video. Bạn có thể sử dụng nhiệm vụ này để xác định biểu cảm khuôn mặt của người, đồng thời áp dụng các bộ lọc và hiệu ứng khuôn mặt để tạo hình đại diện ảo. Nhiệm vụ này sử dụng các mô hình học máy (ML) có thể hoạt động với một hình ảnh đơn lẻ hoặc một luồng hình ảnh liên tục. Nhiệm vụ này sẽ tạo ra các điểm mốc 3 chiều trên khuôn mặt, điểm kết hợp hình dạng (hệ số biểu thị biểu cảm khuôn mặt) để suy ra bề mặt khuôn mặt chi tiết theo thời gian thực và ma trận biến đổi để thực hiện các phép biến đổi cần thiết cho việc kết xuất hiệu ứng.

Mã mẫu được mô tả trong những hướng dẫn này hiện có trên GitHub. Để biết thêm thông tin về các tính năng, mô hình và lựa chọn cấu hình của nhiệm vụ này, hãy xem phần Tổng quan.

Ví dụ về mã

Để bạn tham khảo, mã mẫu cho Face Thắng cảnh cung cấp phương thức triển khai đầy đủ tác vụ này trong Python. Mã này giúp bạn kiểm thử tác vụ này và bắt đầu tạo điểm mốc khuôn mặt của riêng bạn. Bạn chỉ cần dùng trình duyệt web để xem, chạy và chỉnh sửa mã ví dụ về Face Remarker.

Nếu bạn đang triển khai Face Remarker cho Rspberry Pi, hãy tham khảo ứng dụng mẫu Rspberry Pi.

Thiết lập

Phần này mô tả các bước chính để thiết lập môi trường phát triển và viết mã cho các dự án dành riêng cho việc sử dụng Face Marker. Để biết thông tin chung về cách thiết lập môi trường phát triển nhằm sử dụng các tác vụ của MediaPipe, bao gồm cả các yêu cầu về phiên bản nền tảng, hãy xem Hướng dẫn thiết lập dành cho Python.

Gói

Tác vụ MediaPipe Face Editioner cần có gói Mediapipe PyPI. Bạn có thể cài đặt và nhập các phần phụ thuộc này bằng cách sau:

$ python -m pip install mediapipe

Nhập

Nhập các lớp sau đây để truy cập vào các chức năng tác vụ của Face Marker:

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

Mẫu

Tác vụ MediaPipe Face Marker cần có một mô hình đã qua huấn luyện tương thích với tác vụ này. Để biết thêm thông tin về các mô hình đã huấn luyện hiện có cho Face Marker, hãy xem phần Mô hình tổng quan về tác vụ.

Chọn và tải mô hình xuống rồi lưu trữ trong thư mục cục bộ:

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

Sử dụng tham số model_asset_path của đối tượng BaseOptions để chỉ định đường dẫn của mô hình sẽ sử dụng. Để biết ví dụ về mã, hãy xem phần tiếp theo.

Tạo việc cần làm

Tác vụ có tên MediaPipe Face Editioner sử dụng hàm create_from_options để thiết lập tác vụ đó. Hàm create_from_options chấp nhận các giá trị cho các tuỳ chọn cấu hình cần xử lý. Để biết thêm thông tin về các lựa chọn cấu hình, hãy xem phần Lựa chọn cấu hình.

Mã sau đây minh hoạ cách tạo và định cấu hình tác vụ này.

Những mẫu này cũng cho thấy các biến thể của quá trình tạo tác vụ cho hình ảnh, tệp video và sự kiện phát trực tiếp.

Bài đăng có hình ảnh

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.
  # ...
    

Video

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.
  # ...
    

Sự kiện trực tiếp

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.
  # ...
    

Để biết ví dụ đầy đủ về cách tạo một Khuôn mặt nổi bật để sử dụng với hình ảnh, hãy xem ví dụ về mã.

Các lựa chọn về cấu hình

Tác vụ này có các lựa chọn cấu hình sau đây cho các ứng dụng Python:

Tên lựa chọn Nội dung mô tả Khoảng giá trị Giá trị mặc định
running_mode Đặt chế độ chạy cho tác vụ. Có 3 chế độ:

IMAGE: Chế độ nhập một hình ảnh.

VIDEO: Chế độ khung hình đã giải mã của video.

LIVE_STREAM: Chế độ phát trực tiếp dữ liệu đầu vào, chẳng hạn như từ máy quay. Ở chế độ này, bạn phải gọi resultsListener để thiết lập trình nghe nhằm nhận kết quả không đồng bộ.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_faces FaceLandmarker có thể phát hiện số lượng khuôn mặt tối đa. Tính năng làm mượt chỉ được áp dụng khi đặt num_faces thành 1. Integer > 0 1
min_face_detection_confidence Điểm số tin cậy tối thiểu để phát hiện khuôn mặt được coi là thành công. Float [0.0,1.0] 0.5
min_face_presence_confidence Điểm số tin cậy tối thiểu về sự hiện diện khuôn mặt trong công cụ phát hiện mốc khuôn mặt. Float [0.0,1.0] 0.5
min_tracking_confidence Điểm số tin cậy tối thiểu để theo dõi khuôn mặt được coi là thành công. Float [0.0,1.0] 0.5
output_face_blendshapes Liệu Face Addresser có tạo ra các hình dạng khuôn mặt pha trộn hay không. Hình dạng khuôn mặt được dùng để kết xuất mô hình khuôn mặt 3D. Boolean False
output_facial_transformation_matrixes Liệu FaceLandmarker có xuất ra ma trận biến đổi khuôn mặt hay không. FaceLandmarker dùng ma trận để chuyển đổi các điểm mốc trên khuôn mặt từ mẫu khuôn mặt chính tắc sang khuôn mặt được phát hiện, nhờ đó, người dùng có thể áp dụng hiệu ứng cho các điểm mốc được phát hiện. Boolean False
result_callback Đặt trình nghe kết quả để nhận kết quả mốc không đồng bộ khi FaceLandmarker ở chế độ phát trực tiếp. Chỉ có thể sử dụng khi bạn đặt chế độ chạy thành LIVE_STREAM ResultListener N/A

Chuẩn bị dữ liệu

Chuẩn bị dữ liệu đầu vào dưới dạng tệp hình ảnh hoặc mảng numpy, sau đó chuyển đổi dữ liệu đó thành đối tượng mediapipe.Image. Nếu dữ liệu đầu vào là tệp video hoặc sự kiện phát trực tiếp từ webcam, bạn có thể sử dụng thư viện bên ngoài như OpenCV để tải khung hình đầu vào dưới dạng mảng numpy.

Bài đăng có hình ảnh

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)
    

Video

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)
    

Sự kiện trực tiếp

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)
    

Chạy tác vụ

Tính năng Điểm mốc khuôn mặt sử dụng các hàm detect, detect_for_videodetect_async để kích hoạt thông tin dự đoán. Để tạo mốc khuôn mặt, quy trình này liên quan đến việc xử lý trước dữ liệu đầu vào và phát hiện các khuôn mặt trong hình ảnh.

Mã sau đây minh hoạ cách thực thi quá trình xử lý bằng mô hình tác vụ.

Bài đăng có hình ảnh

# 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)
    

Video

# 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)
    

Sự kiện trực tiếp

# 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)
    

Xin lưu ý những điều sau:

  • Khi chạy ở chế độ video hoặc chế độ phát trực tiếp, hãy cung cấp dấu thời gian của khung nhập dữ liệu cho tác vụ Face Marker.
  • Khi chạy trong hình ảnh hoặc mô hình video, tác vụ của Trình đánh dấu khuôn mặt sẽ chặn luồng hiện tại cho đến khi xử lý xong hình ảnh hoặc khung đầu vào.
  • Khi chạy ở chế độ phát trực tiếp, tác vụ Face Marker sẽ trả về ngay lập tức và không chặn luồng hiện tại. Hàm này sẽ gọi trình nghe kết quả cùng với kết quả phát hiện mỗi khi xử lý xong một khung đầu vào. Nếu chức năng phát hiện được gọi khi tác vụ Face Marker đang bận xử lý một khung khác, thì tác vụ đó sẽ bỏ qua khung đầu vào mới.

Để biết ví dụ đầy đủ về cách chạy Trình đánh dấu khuôn mặt trên một hình ảnh, hãy xem ví dụ về mã để biết thông tin chi tiết.

Xử lý và hiển thị kết quả

Face View (Điểm mốc khuôn mặt) trả về một đối tượng FaceLandmarkerResult trong mỗi lần chạy phát hiện. Đối tượng kết quả chứa một lưới khuôn mặt cho mỗi khuôn mặt đã phát hiện, với toạ độ cho từng mốc khuôn mặt. Nếu muốn, đối tượng kết quả cũng có thể chứa các hình dạng hỗn hợp (biểu thị biểu cảm khuôn mặt) và ma trận biến đổi khuôn mặt để áp dụng hiệu ứng khuôn mặt trên các điểm mốc đã phát hiện.

Sau đây là ví dụ về dữ liệu đầu ra của nhiệm vụ này:

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]
    ...

Hình ảnh sau đây minh hoạ kết quả của tác vụ:

Mã ví dụ về Khuôn mặt biểu thị cách hiển thị kết quả được trả về từ tác vụ, hãy xem ví dụ về mã để biết thông tin chi tiết.