Nodes/ꘇ Genereti/ꘇ mediapipe.stream
ComfyUI Node

ꘇ mediapipe.stream

Pose, hands and face, running in your browser

By languel·Created about a month ago·Updated 3 days ago· 1
ꘇ mediapipe.stream
  • image
  • image
  • observations
  • overlay
◄streambody►
◄taskpose►
◄max_fps15.00►
◄tasksholistic►
◄features►

MediaPipe inside ComfyUI usually means a ControlNet preprocessor: landmarks in, OpenPose skeleton out, sampler. This is not that. mediapipe.stream is a live provider - you point it at a browser image source, explicitly download and start it, and it publishes landmark observations onto a named global stream for other nodes to read at interactive rates. It outputs a clean image, a separate diagnostic overlay, and a structured DAT of everything it found.

It's the hub of the Perception category in ꘇ Genereti (languel/genereti, by Liuboto, MIT, super-alpha). The KB's MediaPipe panel is relevant background here - it's the Apache 2.0 alternative people reach for precisely because InsightFace's pretrained models are non-commercial - and this pack uses the same library for a different purpose. Not detection for generation. Live interaction.

What it runs, and where

The inference is WASM CPU in your browser, using the pinned MediaPipe Tasks Vision runtime (0.10.32, including SIMD and non-SIMD variants, ~22.65 MB shared). There's no Python MediaPipe package in requirements.txt and no cloud inference; the pack is explicit about "no media upload" and the asset routes are loopback-only. GPU execution is not claimed.

The assets download only when you ask: ↓ downloads the selected model and the shared runtime, ↑ loads, ▶ starts. Everything is pinned by size and SHA-256 in a catalogue, and the models land in Comfy's models/genereti/browser-perception rather than inside the package. Sizes, including runtime: about 28.4 MB for pose, 30.5 MB for hands, 26.4 MB for face, 22.9 MB for segmentation, ~13.7 MB for the holistic bundle on top of the shared runtime.

The fields

image is the source - a live IMAGE from a 2D stream, Livecode, or a separately started webcam capture. A live image preview can sit in between.

stream is the name you publish under (default body). It's the namespace every reader uses, one provider owns each name, and at most 16 names register in a workflow. Keep it short and memorable; you'll be typing it into other nodes.

task is a combo: pose, hands, face, segment. tasks is a separate STRING field defaulting to holistic, and this is the interesting one - holistic runs a coordinated pose+face+left/right-hand graph on the same untouched frame, so gestures like finger-to-nose don't have to join two detectors' completion times. The pack notes that independent models remain available for narrower pipelines, and that holistic is a bundle, so measure it rather than assuming it matches single-task performance.

max_fps (default 15, range 1–60) caps inference rate, bounded by measured processing time. features is an empty-by-default string for feature selection; in the 0.1.4 interface selection lives in perception.features, and the old provider selection fields are ignored.

Outputs: image is the clean analyzed frame; overlay is a separate diagnostic image (there's a toggle, and it doesn't alter either output or filter the stream - a genuinely good decision); observations is the structured DAT, including source ID/geometry, coordinate convention, model version, backend, completion time, result age and stage timings. DAT tells you which source frame a slower inference actually belongs to.

Lifecycle controls worth knowing

Ⅱ releases input subscriptions, invalidates observations, and holds the last preview - the loaded model stays resident so you can resume. × terminates the worker and frees its resources. ↺ clears a scene/history revision without starting capture. Changing task requires another explicit load. Sources are capped at 1024 px per side; oversize input asks you to resize upstream.

Sample warm inference times from the author's verification on one Mac: ~11 ms segmentation, ~19 ms pose, ~32 ms hands, ~16 ms face - explicitly not a classroom-device benchmark, but a useful order of magnitude.

Install

Manager → search "Genereti" → install ꘇ Genereti → restart ComfyUI → refresh the browser page. Manual:

git clone https://github.com/languel/genereti.git custom_nodes/genereti
./.venv/bin/python -m pip install -r custom_nodes/genereti/requirements.txt

Requirements are light (comfyui-frontend-package>=1.53.6); the perception assets are the optional separate download described above. ComfyUI 0.38.2+, Python 3.11+, modern browser. Start from the bundled ꘇ-Optional-MediaPipe-Streams demo under Workflows → Genereti.

Gotchas

Starting nothing is the default, twice over. Opening or queueing a graph never opens a camera, never starts capture, never downloads a model. And subscribing a reader doesn't start the provider. Three explicit presses: download, load, start.

Queue raises, by design. The provider's execute path tells you MediaPipe runs in the active browser and to capture a snapshot for queued processing. There is no headless fallback - "a worker error unloads and requires explicit reload."

Camera is a separate node. This provider consumes images; ꘇ Webcam Capture (or the screen capture node, or a media stream) supplies them. The pack's verification notes flag that physical webcam start/stop still needed a manual test on real hardware, so check permissions on your own machine.

Landmarks are coordinates, not identity. Coordinates are unmirrored normalized image coordinates, x right, y down - a source that intentionally mirrors its pixels is responsible for its own interpretation.

CategoryGenereti / Perception

Inputs (6)

NameTypeDefaultDescription
imageIMAGE—
streamSTRINGbody—
taskCOMBOpose4 options: pose, hands, face, segment
max_fpsFLOAT15.001–60—
tasksSTRINGholistic—
featuresSTRING—

Outputs (3)

NameTypeDescription
imageIMAGE—
observationsGENERETI_DAT—
overlayIMAGE—