CV DNN Pick Output
Getting the right tensor out of a multi-output ONNX model
- outputs
- output
- index
Why you'd reach for this
CV DNN Forward returns one array. CV DNN Forward All returns every unconnected output of the net, in a list. That's great for a YOLO seg model, which emits a detection head and a prototype map, and less great if you then have to remember which list position is which.
That's this node: one output in, one output out, chosen by index, by layer name, or - the part that actually saves you - by shape. It's plumbing, and it lives in the plumbing layer of a graph, where the whole point is that nothing downstream has to care that the model had four outputs.
How it works
Seven modes:
- by index - uses the
indexwidget, 0-based, in the orderForward Allreports. - first / last - the ends of the list.
- by name - matches the
namewidget against theoutput_namesstring you wire in fromForward All. Exact match first, then a substring match, so"proto"will find"proto_0". If nothing matches it raises and lists the names it did see. - 3-D detection head - first tensor with 3 dimensions, i.e. the
(1, N, C)head. - 4-D prototype map - first 4-D tensor that is not a
(..., 1, 4)box tensor. - 4-D map (highest resolution) - the 4-D output with the largest
H*W.
That last one exists because of a real behaviour worth knowing: getUnconnectedOutLayersNames() is not in a stable order. The pack's own comment records measuring RAFT list ['12007', '12006'] on the default engine and the reverse on the classic engine - so by index or last on a multi-scale model can silently hand you a different tensor depending on which engine you picked. If a model returns the same field at two resolutions, use this mode or pick by name.
Both outputs are useful: output is the array, index is the position it came from, which is how you find out where a name- or shape-based pick actually landed.
Inputs and outputs that matter
- outputs - the list from
CV DNN Forward All. An empty list raises immediately with a message telling you to check the blob, which is a nicer failure than three nodes of silence. - mode + index - the common case. Set
modetoby indexand count, or avoid counting entirely with a shape mode. - output_names + name - the robust case. Wire the
output_namesSTRING out ofForward Alland name the layer you want; order stops mattering. - output → straight into the matching decoder (
CV YOLO Detect Decode,CV YOLO Seg Masks,CV Class Scores Decode), or intoInspect CV Datawhen you have no idea what the model just did.
Chain one picker per output you need. Two pickers, two decoders, same Forward All - that's the whole pattern.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/bmad4ever/comfyui_cv
pip install "opencv-contrib-python-headless~=5.0.0.93"
Python ≥ 3.12 and a recent ComfyUI (V3 API), or install "ComfyUI CV" through ComfyUI Manager. The model files live under ComfyUI/models/onnx and are not bundled - model_sources.txt in the repo root has the URLs and licenses.
Common issues
- "found no matching output among N outputs" - the error prints every output shape it saw. Read that; it's the fastest diagnosis in the whole pack. Usually it's the wrong engine, so the net exposed one output instead of four.
by namefails -output_namesisn't wired. The node can't guess the names off the arrays themselves.- Detections decode into nonsense - you picked the prototype map with the detection head's decoder, or vice versa. Check the picked
indexoutput against the shape you expect: a head is(1, N, C), a proto map is(1, C, H, W). - Wrong resolution map after switching engines - the layer ordering moved, as described above. Name-pick or use the highest-resolution heuristic.
- Contrib wheels. This pack needs the contrib OpenCV build; installing a plain
opencv-pythonover it silently empties the contrib submodules.tools/repair_opencv_contrib.py --check/--applyfixes that.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| outputs | NPARRAY | The 'outputs' list from 'CV DNN Forward All'. | |
| mode | COMBO | by index | How to pick: 'by index' uses the index widget; 'by name' matches the name widget against the connected output_names; the shape heuristics pick the first output with that number of dimensions, except '4-D map (highest resolution)', which picks the 4-D output with the largest H*W (the full-res flow of a multi-scale model, whatever order the engine lists the layers in); 'first'/'last' pick the ends. |
| index | INT | 00–63 | Position to pick when mode = 'by index' (0-based, matching the output_names order). |
| output_namesopt | STRING | The 'output_names' STRING from 'CV DNN Forward All' (needed for mode = 'by name'). | |
| nameopt | STRING | Layer name to pick when mode = 'by name'. Exact match first, then substring match. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| output | NPARRAY | The picked output array. |
| index | INT | The position the array was picked from (useful when a name or shape heuristic did the picking). |