# 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) input_stream: "LANDMARKS:multi_face_landmarks" # Regions of interest calculated based on palm detections. # (std::vector) input_stream: "NORM_RECTS:rects" # Detected palms. (std::vector) 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" }