Project import generated by Copybara.

GitOrigin-RevId: f7d09ed033907b893638a8eb4148efa11c0f09a6
This commit is contained in:
MediaPipe Team
2020-11-04 19:09:58 -05:00
committed by chuoling
parent a8d6ce95c4
commit f96eadd6df
250 changed files with 15261 additions and 4620 deletions
+10 -12
View File
@@ -28,12 +28,10 @@ mediapipe_simple_subgraph(
deps = [
"//mediapipe/calculators/core:gate_calculator",
"//mediapipe/calculators/core:split_vector_calculator",
"//mediapipe/calculators/image:image_cropping_calculator",
"//mediapipe/calculators/image:image_transformation_calculator",
"//mediapipe/calculators/tflite:tflite_converter_calculator",
"//mediapipe/calculators/tflite:tflite_inference_calculator",
"//mediapipe/calculators/tflite:tflite_tensors_to_floats_calculator",
"//mediapipe/calculators/tflite:tflite_tensors_to_landmarks_calculator",
"//mediapipe/calculators/tensor:image_to_tensor_calculator",
"//mediapipe/calculators/tensor:inference_calculator",
"//mediapipe/calculators/tensor:tensors_to_floats_calculator",
"//mediapipe/calculators/tensor:tensors_to_landmarks_calculator",
"//mediapipe/calculators/util:landmark_projection_calculator",
"//mediapipe/calculators/util:thresholding_calculator",
],
@@ -46,12 +44,10 @@ mediapipe_simple_subgraph(
deps = [
"//mediapipe/calculators/core:gate_calculator",
"//mediapipe/calculators/core:split_vector_calculator",
"//mediapipe/calculators/image:image_cropping_calculator",
"//mediapipe/calculators/image:image_transformation_calculator",
"//mediapipe/calculators/tflite:tflite_converter_calculator",
"//mediapipe/calculators/tflite:tflite_inference_calculator",
"//mediapipe/calculators/tflite:tflite_tensors_to_floats_calculator",
"//mediapipe/calculators/tflite:tflite_tensors_to_landmarks_calculator",
"//mediapipe/calculators/tensor:image_to_tensor_calculator",
"//mediapipe/calculators/tensor:inference_calculator",
"//mediapipe/calculators/tensor:tensors_to_floats_calculator",
"//mediapipe/calculators/tensor:tensors_to_landmarks_calculator",
"//mediapipe/calculators/util:landmark_projection_calculator",
"//mediapipe/calculators/util:thresholding_calculator",
],
@@ -74,6 +70,7 @@ mediapipe_simple_subgraph(
"//mediapipe/calculators/image:image_properties_calculator",
"//mediapipe/calculators/util:association_norm_rect_calculator",
"//mediapipe/calculators/util:collection_has_min_size_calculator",
"//mediapipe/calculators/util:logic_calculator",
"//mediapipe/modules/face_detection:face_detection_front_cpu",
],
)
@@ -95,6 +92,7 @@ mediapipe_simple_subgraph(
"//mediapipe/calculators/image:image_properties_calculator",
"//mediapipe/calculators/util:association_norm_rect_calculator",
"//mediapipe/calculators/util:collection_has_min_size_calculator",
"//mediapipe/calculators/util:logic_calculator",
"//mediapipe/modules/face_detection:face_detection_front_gpu",
],
)
@@ -28,51 +28,33 @@ input_stream: "ROI:roi"
# the absence of this packet so that they don't wait for it unnecessarily.
output_stream: "LANDMARKS:face_landmarks"
# Crops the input image to the region of interest.
node {
calculator: "ImageCroppingCalculator"
# Transforms the input image into a 192x192 tensor.
node: {
calculator: "ImageToTensorCalculator"
input_stream: "IMAGE:image"
input_stream: "NORM_RECT:roi"
output_stream: "IMAGE:face_region"
output_stream: "TENSORS:input_tensors"
options: {
[mediapipe.ImageCroppingCalculatorOptions.ext] {
border_mode: BORDER_REPLICATE
[mediapipe.ImageToTensorCalculatorOptions.ext] {
output_tensor_width: 192
output_tensor_height: 192
output_tensor_float_range {
min: 0.0
max: 1.0
}
}
}
}
# Transforms the input image on CPU to a 192x192 image. To scale the input
# image, the scale_mode option is set to FIT to preserve the aspect ratio,
# resulting in potential letterboxing in the transformed image.
node: {
calculator: "ImageTransformationCalculator"
input_stream: "IMAGE:face_region"
output_stream: "IMAGE:transformed_face_region"
options: {
[mediapipe.ImageTransformationCalculatorOptions.ext] {
output_width: 192
output_height: 192
}
}
}
# Converts the transformed input image on CPU into an image tensor stored as a
# TfLiteTensor.
node {
calculator: "TfLiteConverterCalculator"
input_stream: "IMAGE:transformed_face_region"
output_stream: "TENSORS:input_tensor"
}
# Runs a TensorFlow Lite model on CPU that takes an image tensor and outputs a
# vector of tensors representing, for instance, detection boxes/keypoints and
# scores.
node {
calculator: "TfLiteInferenceCalculator"
input_stream: "TENSORS:input_tensor"
calculator: "InferenceCalculator"
input_stream: "TENSORS:input_tensors"
output_stream: "TENSORS:output_tensors"
options: {
[mediapipe.TfLiteInferenceCalculatorOptions.ext] {
[mediapipe.InferenceCalculatorOptions.ext] {
model_path: "mediapipe/modules/face_landmark/face_landmark.tflite"
delegate { xnnpack {} }
}
@@ -81,7 +63,7 @@ node {
# Splits a vector of tensors into multiple vectors.
node {
calculator: "SplitTfLiteTensorVectorCalculator"
calculator: "SplitTensorVectorCalculator"
input_stream: "output_tensors"
output_stream: "landmark_tensors"
output_stream: "face_flag_tensor"
@@ -96,7 +78,7 @@ node {
# Converts the face-flag tensor into a float that represents the confidence
# score of face presence.
node {
calculator: "TfLiteTensorsToFloatsCalculator"
calculator: "TensorsToFloatsCalculator"
input_stream: "TENSORS:face_flag_tensor"
output_stream: "FLOAT:face_presence_score"
}
@@ -125,11 +107,11 @@ node {
# Decodes the landmark tensors into a vector of lanmarks, where the landmark
# coordinates are normalized by the size of the input image to the model.
node {
calculator: "TfLiteTensorsToLandmarksCalculator"
calculator: "TensorsToLandmarksCalculator"
input_stream: "TENSORS:ensured_landmark_tensors"
output_stream: "NORM_LANDMARKS:landmarks"
options: {
[mediapipe.TfLiteTensorsToLandmarksCalculatorOptions.ext] {
[mediapipe.TensorsToLandmarksCalculatorOptions.ext] {
num_landmarks: 468
input_image_width: 192
input_image_height: 192
@@ -26,6 +26,10 @@ input_stream: "IMAGE:image"
# Max number of faces to detect/track. (int)
input_side_packet: "NUM_FACES:num_faces"
# Whether face detection can be skipped when face regions can already be
# approximated from face landmarks on the previous frame.
input_side_packet: "CAN_SKIP_DETECTION:can_skip_detection"
# Collection of detected/predicted faces, each represented as a list of 468 face
# landmarks. (std::vector<NormalizedLandmarkList>)
# NOTE: there will not be an output packet in the LANDMARKS stream for this
@@ -54,12 +58,22 @@ node {
}
# Drops the incoming image if FaceLandmarkCpu was able to identify face presence
# in the previous image. Otherwise, passes the incoming image through to trigger
# a new round of face detection in FaceDetectionFrontCpu.
# in the previous image and skipping face detection is enabled. Otherwise,
# passes the incoming image through to trigger a new round of face detection
# in FaceDetectionFrontCpu.
node {
calculator: "LogicCalculator"
options: {
[mediapipe.LogicCalculatorOptions.ext] { op: AND }
}
input_side_packet: "can_skip_detection"
input_stream: "prev_has_enough_faces"
output_stream: "skip_detection"
}
node {
calculator: "GateCalculator"
input_stream: "image"
input_stream: "DISALLOW:prev_has_enough_faces"
input_stream: "DISALLOW:skip_detection"
output_stream: "gated_image"
options: {
[mediapipe.GateCalculatorOptions.ext] {
@@ -67,6 +81,12 @@ node {
}
}
}
node {
calculator: "GateCalculator"
input_stream: "prev_face_rects_from_landmarks"
input_stream: "ALLOW:skip_detection"
output_stream: "gated_prev_face_rects_from_landmarks"
}
# Detects faces.
node {
@@ -129,7 +149,7 @@ node {
# overlapping regions based on the specified min_similarity_threshold.
node {
calculator: "AssociationNormRectCalculator"
input_stream: "prev_face_rects_from_landmarks"
input_stream: "gated_prev_face_rects_from_landmarks"
input_stream: "face_rects_from_detections"
output_stream: "face_rects"
options: {
@@ -26,6 +26,10 @@ input_stream: "IMAGE:image"
# Max number of faces to detect/track. (int)
input_side_packet: "NUM_FACES:num_faces"
# Whether face detection can be skipped when face regions can already be
# approximated from face landmarks on the previous frame.
input_side_packet: "CAN_SKIP_DETECTION:can_skip_detection"
# Collection of detected/predicted faces, each represented as a list of 468 face
# landmarks. (std::vector<NormalizedLandmarkList>)
# NOTE: there will not be an output packet in the LANDMARKS stream for this
@@ -54,12 +58,22 @@ node {
}
# Drops the incoming image if FaceLandmarkGpu was able to identify face presence
# in the previous image. Otherwise, passes the incoming image through to trigger
# a new round of face detection in FaceDetectionFrontGpu.
# in the previous image and skipping face detection is enabled. Otherwise,
# passes the incoming image through to trigger a new round of face detection
# in FaceDetectionFrontGpu.
node {
calculator: "LogicCalculator"
options: {
[mediapipe.LogicCalculatorOptions.ext] { op: AND }
}
input_side_packet: "can_skip_detection"
input_stream: "prev_has_enough_faces"
output_stream: "skip_detection"
}
node {
calculator: "GateCalculator"
input_stream: "image"
input_stream: "DISALLOW:prev_has_enough_faces"
input_stream: "DISALLOW:skip_detection"
output_stream: "gated_image"
options: {
[mediapipe.GateCalculatorOptions.ext] {
@@ -67,6 +81,12 @@ node {
}
}
}
node {
calculator: "GateCalculator"
input_stream: "prev_face_rects_from_landmarks"
input_stream: "ALLOW:skip_detection"
output_stream: "gated_prev_face_rects_from_landmarks"
}
# Detects faces.
node {
@@ -129,7 +149,7 @@ node {
# overlapping regions based on the specified min_similarity_threshold.
node {
calculator: "AssociationNormRectCalculator"
input_stream: "prev_face_rects_from_landmarks"
input_stream: "gated_prev_face_rects_from_landmarks"
input_stream: "face_rects_from_detections"
output_stream: "face_rects"
options: {
@@ -1,5 +1,5 @@
# MediaPipe graph to detect/predict face landmarks. (GPU input, and inference is
# executed on GPU.)
# MediaPipe graph to detect/predict face landmarks. (CPU input, and inference is
# executed on CPU.)
#
# It is required that "face_landmark.tflite" is available at
# "mediapipe/modules/face_landmark/face_landmark.tflite"
@@ -28,51 +28,34 @@ input_stream: "ROI:roi"
# the absence of this packet so that they don't wait for it unnecessarily.
output_stream: "LANDMARKS:face_landmarks"
# Crops the input image to the given region of interest.
node {
calculator: "ImageCroppingCalculator"
# Transforms the input image into a 192x192 tensor.
node: {
calculator: "ImageToTensorCalculator"
input_stream: "IMAGE_GPU:image"
input_stream: "NORM_RECT:roi"
output_stream: "IMAGE_GPU:face_region"
output_stream: "TENSORS:input_tensors"
options: {
[mediapipe.ImageCroppingCalculatorOptions.ext] {
border_mode: BORDER_REPLICATE
[mediapipe.ImageToTensorCalculatorOptions.ext] {
output_tensor_width: 192
output_tensor_height: 192
output_tensor_float_range {
min: 0.0
max: 1.0
}
gpu_origin: TOP_LEFT
}
}
}
# Transforms the input image on GPU to a 192x192 image. To scale the input
# image, the scale_mode option is set to FIT to preserve the aspect ratio,
# resulting in potential letterboxing in the transformed image.
node: {
calculator: "ImageTransformationCalculator"
input_stream: "IMAGE_GPU:face_region"
output_stream: "IMAGE_GPU:transformed_face_region"
options: {
[mediapipe.ImageTransformationCalculatorOptions.ext] {
output_width: 192
output_height: 192
}
}
}
# Converts the transformed input image on GPU into an image tensor stored as a
# TfLiteTensor.
node {
calculator: "TfLiteConverterCalculator"
input_stream: "IMAGE_GPU:transformed_face_region"
output_stream: "TENSORS_GPU:input_tensor"
}
# Runs a TensorFlow Lite model on GPU that takes an image tensor and outputs a
# vector of GPU tensors representing, for instance, detection boxes/keypoints
# and scores.
node {
calculator: "TfLiteInferenceCalculator"
input_stream: "TENSORS_GPU:input_tensor"
calculator: "InferenceCalculator"
input_stream: "TENSORS:input_tensors"
output_stream: "TENSORS:output_tensors"
options: {
[mediapipe.TfLiteInferenceCalculatorOptions.ext] {
[mediapipe.InferenceCalculatorOptions.ext] {
model_path: "mediapipe/modules/face_landmark/face_landmark.tflite"
}
}
@@ -80,7 +63,7 @@ node {
# Splits a vector of tensors into multiple vectors.
node {
calculator: "SplitTfLiteTensorVectorCalculator"
calculator: "SplitTensorVectorCalculator"
input_stream: "output_tensors"
output_stream: "landmark_tensors"
output_stream: "face_flag_tensor"
@@ -95,7 +78,7 @@ node {
# Converts the face-flag tensor into a float that represents the confidence
# score of face presence.
node {
calculator: "TfLiteTensorsToFloatsCalculator"
calculator: "TensorsToFloatsCalculator"
input_stream: "TENSORS:face_flag_tensor"
output_stream: "FLOAT:face_presence_score"
}
@@ -124,11 +107,11 @@ node {
# Decodes the landmark tensors into a vector of lanmarks, where the landmark
# coordinates are normalized by the size of the input image to the model.
node {
calculator: "TfLiteTensorsToLandmarksCalculator"
calculator: "TensorsToLandmarksCalculator"
input_stream: "TENSORS:ensured_landmark_tensors"
output_stream: "NORM_LANDMARKS:landmarks"
options: {
[mediapipe.TfLiteTensorsToLandmarksCalculatorOptions.ext] {
[mediapipe.TensorsToLandmarksCalculatorOptions.ext] {
num_landmarks: 468
input_image_width: 192
input_image_height: 192