126 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Copyright 2020 The MediaPipe Authors.
 | |
| #
 | |
| # Licensed under the Apache License, Version 2.0 (the "License");
 | |
| # you may not use this file except in compliance with the License.
 | |
| # You may obtain a copy of the License at
 | |
| #
 | |
| #      http://www.apache.org/licenses/LICENSE-2.0
 | |
| #
 | |
| # Unless required by applicable law or agreed to in writing, software
 | |
| # distributed under the License is distributed on an "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| # See the License for the specific language governing permissions and
 | |
| # limitations under the License.
 | |
| 
 | |
| """MediaPipe Face Mesh."""
 | |
| 
 | |
| from typing import NamedTuple
 | |
| 
 | |
| import numpy as np
 | |
| 
 | |
| # pylint: disable=unused-import
 | |
| from mediapipe.calculators.core import constant_side_packet_calculator_pb2
 | |
| from mediapipe.calculators.core import gate_calculator_pb2
 | |
| from mediapipe.calculators.core import split_vector_calculator_pb2
 | |
| from mediapipe.calculators.tensor import image_to_tensor_calculator_pb2
 | |
| from mediapipe.calculators.tensor import inference_calculator_pb2
 | |
| from mediapipe.calculators.tensor import tensors_to_classification_calculator_pb2
 | |
| from mediapipe.calculators.tensor import tensors_to_detections_calculator_pb2
 | |
| from mediapipe.calculators.tensor import tensors_to_landmarks_calculator_pb2
 | |
| from mediapipe.calculators.tflite import ssd_anchors_calculator_pb2
 | |
| from mediapipe.calculators.util import association_calculator_pb2
 | |
| from mediapipe.calculators.util import detections_to_rects_calculator_pb2
 | |
| from mediapipe.calculators.util import landmarks_refinement_calculator_pb2
 | |
| from mediapipe.calculators.util import logic_calculator_pb2
 | |
| from mediapipe.calculators.util import non_max_suppression_calculator_pb2
 | |
| from mediapipe.calculators.util import rect_transformation_calculator_pb2
 | |
| from mediapipe.calculators.util import thresholding_calculator_pb2
 | |
| # pylint: enable=unused-import
 | |
| from mediapipe.python.solution_base import SolutionBase
 | |
| # pylint: disable=unused-import
 | |
| from mediapipe.python.solutions.face_mesh_connections import FACEMESH_CONTOURS
 | |
| from mediapipe.python.solutions.face_mesh_connections import FACEMESH_FACE_OVAL
 | |
| from mediapipe.python.solutions.face_mesh_connections import FACEMESH_IRISES
 | |
| from mediapipe.python.solutions.face_mesh_connections import FACEMESH_LEFT_EYE
 | |
| from mediapipe.python.solutions.face_mesh_connections import FACEMESH_LEFT_EYEBROW
 | |
| from mediapipe.python.solutions.face_mesh_connections import FACEMESH_LEFT_IRIS
 | |
| from mediapipe.python.solutions.face_mesh_connections import FACEMESH_LIPS
 | |
| from mediapipe.python.solutions.face_mesh_connections import FACEMESH_NOSE
 | |
| from mediapipe.python.solutions.face_mesh_connections import FACEMESH_RIGHT_EYE
 | |
| from mediapipe.python.solutions.face_mesh_connections import FACEMESH_RIGHT_EYEBROW
 | |
| from mediapipe.python.solutions.face_mesh_connections import FACEMESH_RIGHT_IRIS
 | |
| from mediapipe.python.solutions.face_mesh_connections import FACEMESH_TESSELATION
 | |
| # pylint: enable=unused-import
 | |
| 
 | |
| FACEMESH_NUM_LANDMARKS = 468
 | |
| FACEMESH_NUM_LANDMARKS_WITH_IRISES = 478
 | |
| _BINARYPB_FILE_PATH = 'mediapipe/modules/face_landmark/face_landmark_front_cpu.binarypb'
 | |
| 
 | |
| 
 | |
| class FaceMesh(SolutionBase):
 | |
|   """MediaPipe Face Mesh.
 | |
| 
 | |
|   MediaPipe Face Mesh processes an RGB image and returns the face landmarks on
 | |
|   each detected face.
 | |
| 
 | |
|   Please refer to https://solutions.mediapipe.dev/face_mesh#python-solution-api
 | |
|   for usage examples.
 | |
|   """
 | |
| 
 | |
|   def __init__(self,
 | |
|                static_image_mode=False,
 | |
|                max_num_faces=1,
 | |
|                refine_landmarks=False,
 | |
|                min_detection_confidence=0.5,
 | |
|                min_tracking_confidence=0.5):
 | |
|     """Initializes a MediaPipe Face Mesh object.
 | |
| 
 | |
|     Args:
 | |
|       static_image_mode: Whether to treat the input images as a batch of static
 | |
|         and possibly unrelated images, or a video stream. See details in
 | |
|         https://solutions.mediapipe.dev/face_mesh#static_image_mode.
 | |
|       max_num_faces: Maximum number of faces to detect. See details in
 | |
|         https://solutions.mediapipe.dev/face_mesh#max_num_faces.
 | |
|       refine_landmarks: Whether to further refine the landmark coordinates
 | |
|         around the eyes and lips, and output additional landmarks around the
 | |
|         irises. Default to False. See details in
 | |
|         https://solutions.mediapipe.dev/face_mesh#refine_landmarks.
 | |
|       min_detection_confidence: Minimum confidence value ([0.0, 1.0]) for face
 | |
|         detection to be considered successful. See details in
 | |
|         https://solutions.mediapipe.dev/face_mesh#min_detection_confidence.
 | |
|       min_tracking_confidence: Minimum confidence value ([0.0, 1.0]) for the
 | |
|         face landmarks to be considered tracked successfully. See details in
 | |
|         https://solutions.mediapipe.dev/face_mesh#min_tracking_confidence.
 | |
|     """
 | |
|     super().__init__(
 | |
|         binary_graph_path=_BINARYPB_FILE_PATH,
 | |
|         side_inputs={
 | |
|             'num_faces': max_num_faces,
 | |
|             'with_attention': refine_landmarks,
 | |
|             'use_prev_landmarks': not static_image_mode,
 | |
|         },
 | |
|         calculator_params={
 | |
|             'facedetectionshortrangecpu__facedetectionshortrange__facedetection__TensorsToDetectionsCalculator.min_score_thresh':
 | |
|                 min_detection_confidence,
 | |
|             'facelandmarkcpu__ThresholdingCalculator.threshold':
 | |
|                 min_tracking_confidence,
 | |
|         },
 | |
|         outputs=['multi_face_landmarks'])
 | |
| 
 | |
|   def process(self, image: np.ndarray) -> NamedTuple:
 | |
|     """Processes an RGB image and returns the face landmarks on each detected face.
 | |
| 
 | |
|     Args:
 | |
|       image: An RGB image represented as a numpy ndarray.
 | |
| 
 | |
|     Raises:
 | |
|       RuntimeError: If the underlying graph throws any error.
 | |
|       ValueError: If the input image is not three channel RGB.
 | |
| 
 | |
|     Returns:
 | |
|       A NamedTuple object with a "multi_face_landmarks" field that contains the
 | |
|       face landmarks on each detected face.
 | |
|     """
 | |
| 
 | |
|     return super().process(input_data={'image': image})
 |