97 lines
3.1 KiB
Plaintext
97 lines
3.1 KiB
Plaintext
|
# MediaPipe face mesh rendering subgraph.
|
||
|
|
||
|
type: "FaceRendererCpu"
|
||
|
|
||
|
# CPU image. (ImageFrame)
|
||
|
input_stream: "IMAGE:input_image"
|
||
|
# Collection of detected/predicted faces, each represented as a list of
|
||
|
# landmarks. (std::vector<NormalizedLandmarkList>)
|
||
|
input_stream: "LANDMARKS:multi_face_landmarks"
|
||
|
# Regions of interest calculated based on palm detections.
|
||
|
# (std::vector<NormalizedRect>)
|
||
|
input_stream: "NORM_RECTS:rects"
|
||
|
# Detected palms. (std::vector<Detection>)
|
||
|
input_stream: "DETECTIONS:detections"
|
||
|
|
||
|
# CPU image with rendered data. (ImageFrame)
|
||
|
output_stream: "IMAGE:output_image"
|
||
|
|
||
|
node {
|
||
|
calculator: "ImagePropertiesCalculator"
|
||
|
input_stream: "IMAGE:input_image"
|
||
|
output_stream: "SIZE:image_size"
|
||
|
}
|
||
|
|
||
|
# Converts detections to drawing primitives for annotation overlay.
|
||
|
node {
|
||
|
calculator: "DetectionsToRenderDataCalculator"
|
||
|
input_stream: "DETECTIONS:detections"
|
||
|
output_stream: "RENDER_DATA:detections_render_data"
|
||
|
node_options: {
|
||
|
[type.googleapis.com/mediapipe.DetectionsToRenderDataCalculatorOptions] {
|
||
|
thickness: 4.0
|
||
|
color { r: 0 g: 255 b: 0 }
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# Outputs each element of multi_face_landmarks at a fake timestamp for the rest
|
||
|
# of the graph to process. At the end of the loop, outputs the BATCH_END
|
||
|
# timestamp for downstream calculators to inform them that all elements in the
|
||
|
# vector have been processed.
|
||
|
node {
|
||
|
calculator: "BeginLoopNormalizedLandmarkListVectorCalculator"
|
||
|
input_stream: "ITERABLE:multi_face_landmarks"
|
||
|
output_stream: "ITEM:face_landmarks"
|
||
|
output_stream: "BATCH_END:landmark_timestamp"
|
||
|
}
|
||
|
|
||
|
# Converts landmarks to drawing primitives for annotation overlay.
|
||
|
node {
|
||
|
calculator: "FaceLandmarksToRenderDataCalculator"
|
||
|
input_stream: "NORM_LANDMARKS:face_landmarks"
|
||
|
output_stream: "RENDER_DATA:landmarks_render_data"
|
||
|
node_options: {
|
||
|
[type.googleapis.com/mediapipe.LandmarksToRenderDataCalculatorOptions] {
|
||
|
landmark_color { r: 255 g: 0 b: 0 }
|
||
|
connection_color { r: 0 g: 255 b: 0 }
|
||
|
thickness: 2
|
||
|
visualize_landmark_depth: false
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# Collects a RenderData object for each hand into a vector. Upon receiving the
|
||
|
# BATCH_END timestamp, outputs the vector of RenderData at the BATCH_END
|
||
|
# timestamp.
|
||
|
node {
|
||
|
calculator: "EndLoopRenderDataCalculator"
|
||
|
input_stream: "ITEM:landmarks_render_data"
|
||
|
input_stream: "BATCH_END:landmark_timestamp"
|
||
|
output_stream: "ITERABLE:multi_face_landmarks_render_data"
|
||
|
}
|
||
|
|
||
|
# Converts normalized rects to drawing primitives for annotation overlay.
|
||
|
node {
|
||
|
calculator: "RectToRenderDataCalculator"
|
||
|
input_stream: "NORM_RECTS:rects"
|
||
|
output_stream: "RENDER_DATA:rects_render_data"
|
||
|
node_options: {
|
||
|
[type.googleapis.com/mediapipe.RectToRenderDataCalculatorOptions] {
|
||
|
filled: false
|
||
|
color { r: 255 g: 0 b: 0 }
|
||
|
thickness: 4.0
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# Draws annotations and overlays them on top of the input images.
|
||
|
node {
|
||
|
calculator: "AnnotationOverlayCalculator"
|
||
|
input_stream: "IMAGE:input_image"
|
||
|
input_stream: "detections_render_data"
|
||
|
input_stream: "VECTOR:0:multi_face_landmarks_render_data"
|
||
|
input_stream: "rects_render_data"
|
||
|
output_stream: "IMAGE:output_image"
|
||
|
}
|