Moondream 3 / 3.1 Point (Image / Video)
'look at the thing' as pixel coordinates
- model
- image
- points
- points_json
- preview
- performance_json
Pointing is the weirdly underrated Moondream skill. You tell the model to find something - "top left corner of the mug", "the door handle" - and instead of a caption it returns an exact pixel coordinate. It's not a bounding box and it's not a mask; it's a single (x, y) location in the source image. That's surprisingly useful: it powers the detection boxes (a box is two points, after all), it feeds robots and UI automation, and it's the building block for the pack's segment node. Point is the node that exposes that skill directly.
Mechanically it's the same worker and the same pattern as the other Moondream task nodes: a model handle from the Loader, an image (still or a video frame batch), and an object description of what to point at - "person" by default, but the whole point is specificity. For video it shares the detection machinery: frame_stride controls how many frames get analyzed (1 = every frame), parallel_requests lets Photon form dynamic GPU batches (4 is the default), fps keeps timestamps honest, and max_points caps results per frame. The same measured worker FPS / end-to-end FPS / real-time-factor report comes back in performance_json so you can tune.
Outputs: points is the typed VLM_POINTS socket - pixel-coordinate points, including detection centers, in the pack's versioned JSON schema. points_json is the same thing as a plain string for saving or sending to an API. preview is an IMAGE with the points drawn on, which is how you'll sanity-check "did it actually find the thing" at a glance. And performance_json for the timing report.
Where it gets genuinely powerful is downstream. VLM_POINTS feeds the pack's spatial pipeline - the segment node accepts points as optional references, the detections-to-points utility turns detection centers into points, and any point can be turned into a Comfy coordinate or crop. If you've ever wanted "click on the thing, no really, at these exact pixels" logic inside a workflow, this is the node that gives it to you.
Installing it
Standard pack install - ComfyUI Manager (search "ComfyUI VLM nodes") or clone + requirements.txt - then the isolated Moondream runtime:
runtime="ComfyUI/models/LLavacheckpoints/moondream31-runtime"
uv venv "$runtime/.venv" --python 3.12
uv pip install --python "$runtime/.venv/bin/python" \
-r ComfyUI/custom_nodes/ComfyUI_VLM_nodes/requirements-moondream31.txt
Accept the Moondream Model License on the loader, model downloads on first run. NVIDIA Ampere-or-newer or Apple Silicon only for local Photon.
Common issues
- The point is on the wrong thing → the
objectprompt is doing all the work; "handle of the red mug" gets you a far better point than "mug". Vague prompts give vague points. - Video pointing drifts → if the target moves, per-frame pointing can jump around. Raise
frame_strideif you only need a coarse track, or feed the points into the pack's track-aware utilities for temporal smoothing. - Point lands off-image → this is the classic small-VLM failure; check the
previewoutput, and if it's persistent, make the object description more precise or crop the region of interest first. - Both image and video connected → video batch wins; the still image is ignored for video inference.
One thing to know going in: pointing is fast, but it's not as robust as a dedicated detector for corner cases. For "where is the thing, roughly" it's great. For mission-critical per-frame accuracy on a fast-moving scene, you'll want to verify against the preview and probably pair it with the detection or segment nodes.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MOONDREAM31_MODEL | — | |
| image | IMAGE | — | |
| object | STRING | person | — |
| fps | FLOAT | 30.0000.001–1000 | — |
| frame_stride | INT | 11–100000 | 1 analyzes every frame; 2 analyzes every other frame. |
| parallel_requests | INT | 41–32 | Concurrent frame requests let Photon form dynamic GPU batches. |
| unload_after | BOOLEAN | false | — |
| max_points | INT | 1001–1000 | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| points | VLM_POINTS | — |
| points_json | STRING | — |
| preview | IMAGE | — |
| performance_json | STRING | — |