mediapipe-rs/mediapipe/modules/iris_landmark/iris_landmark_cpu.pbtxt
2022-06-11 12:25:48 -07:00

157 lines
4.8 KiB
Plaintext

# MediaPipe subgraph to calculate iris landmarks and eye contour landmarks for
# a single eye. (CPU input, and inference is executed on CPU.)
#
# It is required that "iris_landmark.tflite" is available at
# "mediapipe/modules/iris_landmark/iris_landmark.tflite"
# path during execution.
#
# EXAMPLE:
# node {
# calculator: "IrisLandmarkCpu"
# input_stream: "IMAGE:image"
# input_stream: "ROI:eye_roi"
# input_stream: "IS_RIGHT_EYE:is_right_eye"
# output_stream: "EYE_CONTOUR_LANDMARKS:eye_contour_landmarks"
# output_stream: "IRIS_LANDMARKS:iris_landmarks"
# }
type: "IrisLandmarkCpu"
# CPU image. (ImageFrame)
input_stream: "IMAGE:image"
# ROI (region of interest) within the given image where an eye is located.
# (NormalizedRect)
input_stream: "ROI:roi"
# Is right eye. (bool)
# (Model is trained to detect left eye landmarks only, hence for right eye,
# flipping is required to immitate left eye.)
input_stream: "IS_RIGHT_EYE:is_right_eye"
# 71 refined normalized eye contour landmarks. (NormalizedLandmarkList)
output_stream: "EYE_CONTOUR_LANDMARKS:projected_eye_landmarks"
# 5 normalized iris landmarks. (NormalizedLandmarkList)
output_stream: "IRIS_LANDMARKS:projected_iris_landmarks"
node {
calculator: "ImageCroppingCalculator"
input_stream: "IMAGE:image"
input_stream: "NORM_RECT:roi"
output_stream: "IMAGE:eye_image"
options: {
[mediapipe.ImageCroppingCalculatorOptions.ext] {
border_mode: BORDER_REPLICATE
}
}
}
node {
calculator: "ImageTransformationCalculator"
input_stream: "IMAGE:eye_image"
input_stream: "FLIP_HORIZONTALLY:is_right_eye"
output_stream: "IMAGE:transformed_eye_image"
output_stream: "LETTERBOX_PADDING:eye_letterbox_padding"
options: {
[mediapipe.ImageTransformationCalculatorOptions.ext] {
output_width: 64
output_height: 64
scale_mode: FIT
}
}
}
# Converts the transformed input image on CPU into an image tensor stored as a
# TfLiteTensor.
node {
calculator: "TfLiteConverterCalculator"
input_stream: "IMAGE:transformed_eye_image"
output_stream: "TENSORS:image_tensor"
options: {
[mediapipe.TfLiteConverterCalculatorOptions.ext] {
zero_center: false
}
}
}
# 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:image_tensor"
output_stream: "TENSORS:output_tensors"
options: {
[mediapipe.TfLiteInferenceCalculatorOptions.ext] {
model_path: "mediapipe/modules/iris_landmark/iris_landmark.tflite"
delegate { xnnpack {} }
}
}
}
# Splits a vector of TFLite tensors to multiple vectors according to the ranges
# specified in option.
node {
calculator: "SplitTfLiteTensorVectorCalculator"
input_stream: "output_tensors"
output_stream: "eye_landmarks_tensor"
output_stream: "iris_landmarks_tensor"
options: {
[mediapipe.SplitVectorCalculatorOptions.ext] {
ranges: { begin: 0 end: 1 }
ranges: { begin: 1 end: 2 }
}
}
}
# Decodes the landmark tensors into a vector of landmarks, where the landmark
# coordinates are normalized by the size of the input image to the model.
node {
calculator: "TfLiteTensorsToLandmarksCalculator"
input_stream: "TENSORS:iris_landmarks_tensor"
input_stream: "FLIP_HORIZONTALLY:is_right_eye"
output_stream: "NORM_LANDMARKS:iris_landmarks"
options: {
[mediapipe.TfLiteTensorsToLandmarksCalculatorOptions.ext] {
num_landmarks: 5
input_image_width: 64
input_image_height: 64
}
}
}
# Decodes the landmark tensors into a vector of landmarks, where the landmark
# coordinates are normalized by the size of the input image to the model.
node {
calculator: "TfLiteTensorsToLandmarksCalculator"
input_stream: "TENSORS:eye_landmarks_tensor"
input_stream: "FLIP_HORIZONTALLY:is_right_eye"
output_stream: "NORM_LANDMARKS:eye_landmarks"
options: {
[mediapipe.TfLiteTensorsToLandmarksCalculatorOptions.ext] {
num_landmarks: 71
input_image_width: 64
input_image_height: 64
}
}
}
node {
calculator: "LandmarkLetterboxRemovalCalculator"
input_stream: "LANDMARKS:0:iris_landmarks"
input_stream: "LANDMARKS:1:eye_landmarks"
input_stream: "LETTERBOX_PADDING:eye_letterbox_padding"
output_stream: "LANDMARKS:0:padded_iris_landmarks"
output_stream: "LANDMARKS:1:padded_eye_landmarks"
}
# Projects the landmarks from the cropped face image to the corresponding
# locations on the full image before cropping (input to the graph).
node {
calculator: "LandmarkProjectionCalculator"
input_stream: "NORM_LANDMARKS:0:padded_iris_landmarks"
input_stream: "NORM_LANDMARKS:1:padded_eye_landmarks"
input_stream: "NORM_RECT:roi"
output_stream: "NORM_LANDMARKS:0:projected_iris_landmarks"
output_stream: "NORM_LANDMARKS:1:projected_eye_landmarks"
}