Nodes/ꘇ Genereti/ꘇ perception.features
ComfyUI Node

ꘇ perception.features

Pick the landmarks you actually want

By languel·Created about a month ago·Updated 3 days ago· 1
ꘇ perception.features
  • image
  • features
  • observations
  • landmarks
◄streambody►
◄featurespose.right_wrist pose.left_wrist►
◄selection_streamselected►
◄min_confidence0.40►
◄max_age_ms500.00►

Reading one landmark is easy. Choosing which landmarks matter - out of 33 pose points, 21 per hand, and 478 face vertices - is the actual work in a perception-driven patch, and doing it by typing feature paths into a text field is miserable. perception.features replaces that with a clickable body/hand/face map: click the joints you care about, and the node publishes a confidence-filtered set of channel values plus a named selection other nodes can read.

It belongs to the Perception family of ꘇ Genereti (languel/genereti, by Liuboto, MIT, super-alpha), where the whole detection layer runs in the browser on MediaPipe's WASM runtime rather than in Python. See the KB's MediaPipe panel for why MediaPipe specifically - Apache 2.0, which matters if any of this ends up in something you sell.

Inputs

stream is the global stream name to read from (default body) - the name published by mediapipe.stream. features is a space-separated list of feature paths, defaulting to pose.right_wrist pose.left_wrist; the map writes into it, and you can also type into it. selection_stream (default selected) is the name of the stream it publishes its selection under, which is a nice trick: downstream pens, event rules and readers can subscribe to "whatever I selected" without you duplicating the list. min_confidence (0.4) filters observations you don't trust. max_age_ms (500) rejects stale results.

The optional image input is worth an explicit note because it's the most misread socket on the node: it's a source underlay, not an inference source. It draws your own frame under the landmark map. The docs warn to connect the provider's clean image output - hand it the diagnostic overlay and you get doubled-up landmarks.

Outputs

features (GENERETI_CHOP) is the selected values as channels. observations (DAT) is the full structured result behind them, including the source-frame association the perception service always carries. landmarks (IMAGE) is a render of the selection - outlines, points and strokes drawn from inferred coordinates, so it's genuinely the landmarks rather than a diagram.

The map itself

Open the selection view and you choose between the combined body map, pose, a stylized face, a static canonical 478-point face reference with no connections, and left or right hand. Click points or click contour strokes; the text toggles are searchable, which is the only realistic way to find a specific face vertex. Ctrl-drag box-selects, Alt/Option-drag paints, Shift adds, Escape cancels. View transforms - zoom, pan, Fit, focus-on-selection - never change the underlying data or exported image geometry.

Selection sets can be saved, recalled, and exported/imported as portable JSON, which is the feature that turns this from a toy into something you'd actually reuse across patches. The point-size control only affects the live preview; nothing about geometry is altered by how big the dots are drawn.

Where it fits in a graph

The intended pattern, from the pack's own demo series, is 2D stream → mediapipe.stream (holistic) → perception.features, with Livecode or perception.read consuming the output. Demo 02 wires four colored pens to both wrists and both ankles over the clean source; demo 05 studies face outline, left eyebrow and outer lips. The published selection_stream is how the pens know what you picked without wiring a list of paths by hand.

If you want numbers rather than pictures, perception.read reads a single named feature; this node is for selecting a set and publishing it.

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

No Python MediaPipe pip package; the runtime and task models download on request into models/genereti/browser-perception, verified by size and SHA-256, from loopback-only routes. ComfyUI 0.38.2+, Python 3.11+, modern browser.

Gotchas

Queue raises. Feature selection is browser Live state - the node's execute path refuses and tells you to start a provider and use Live. If you want perception data in a queued render, snapshot the image first and run detection on that.

Selection is not detection. The maps, including the canonical face reference, are selection diagrams, not synthetic detector output. Live previews always use inferred coordinates, but the map drawing you click on is a schematic - adapted from a couple of other projects' geometry - so a click position is a selector, never a measurement.

Visuals and data are separate. Drawing maps, previews and the landmarks IMAGE exist so you can see what's selected. Don't wire the IMAGE where you meant to wire the CHOP, and don't read pixels to recover numeric values the features output already carries.

CategoryGenereti / Perception

Inputs (6)

NameTypeDefaultDescription
streamSTRINGbody—
featuresSTRINGpose.right_wrist pose.left_wrist—
selection_streamSTRINGselected—
min_confidenceFLOAT0.400–1—
max_age_msFLOAT500.0050–10000—
imageoptIMAGE—

Outputs (3)

NameTypeDescription
featuresGENERETI_CHOP—
observationsGENERETI_DAT—
landmarksIMAGE—