Image Picker (SEGS)
Label your detected segments by clicking them, mid-workflow
- images
- segs
- IMAGES
- IMAGES
- SEGS
If you've ever run a detection → detailer pipeline, you know the wall it hits: your detector finds segments, but they all come back with a generic label like face or body, and your SEGS Filter (label) nodes can't tell an eye from a hand without you renaming things by hand. LiebsPickerSEGS is the sibling of the Liebs-Picker image picker that turns that relabeling step into clicking. It pauses your workflow, shows you the detected segments as clickable masks (or bounding boxes when there's no mask), and every click cycles the label on that segment. When you proceed, you get the images and the relabeled SEGS back.
It's from the same pack as LiebsPicker - same install, same pause-the-run trick, same modal. This variant just adds a SEGS layer on top, and it's the node the author is most proud of: the whole pitch, straight from the r/comfyui announcement, is "pass SEGS in, change the labels, then use SEGS Filter (label) to extract the segments into detailer flows." That's a real workflow, and it's exactly the pairing the pack is built around.
How it works
Mechanically it's LiebsPicker with extras. Images still get saved to temp and shipped to the browser, and the node still blocks on a websocket round-trip until you've made your picks. But before that, it walks every SEGS input, extracts each segment's bounding box and a rendered crop of its mask, and bundles up a list of candidate labels for each one. The frontend draws those masks over the images; your clicks send back both the chosen images and the new label per segment. On the Python side those labels get written back into the SEGS with a namedtuple swap, so the output SEGS are real, downstream-compatible segments - just with your labels on them.
One hard rule baked into the code: the number of SEGS inputs must equal the number of images, or it raises "Number of segs must match number of images." Feed it one SEGS per image, matching order.
The inputs that matter
- images (required) - the batch. segs (optional) - the SEGS to overlay, one per image. These two are the whole point of the node.
- segs_labels - your comma-separated label vocabulary, e.g.
mean_face,nice_face,mean_body,nice_body. This is what clicking cycles through. - segs_label_mode -
any,matching_prefix, ormatching_suffix. The last two auto-filter the vocabulary to labels sharing a prefix/suffix with the segment's existing label. Withmatching_suffixand a segment labeledface, onlymean_face,nice_face(plusfaceitself) are offered. Genuinely useful when you have a big vocabulary and don't want to click past a dozen irrelevant options. - locked + selected - set
selectedtoallandlockedon, and you get a label-only modal: every image passes through, you're just relabeling segments. Great for a pure annotation pass. - segs_on - whether the overlays are visible the moment the modal opens (default
true;Alt+` toggles them if you need the clean view).
Outputs are IMAGES (stacked batch), IMAGES (list), and SEGS (a list, one relabeled SEGS per selected image). That third output is what you wire into SEGS Filter (label) from ComfyUI Impact Pack, then on to a Detailer - the same detect-crop-refine machinery ltdrdata's pack is famous for, now aimed at whatever region you actually wanted refined.
Installing it
Identical to the base picker:
cd ComfyUI/custom_nodes
git clone https://github.com/marklieberman/ComfyUI-Liebs-Picker
# restart ComfyUI
Or ComfyUI Manager → search "Liebs-Picker". No extra dependencies, no model files. But the node is only useful if you have something producing SEGS - which practically means ComfyUI Impact Pack (for MASK to SEGS, SEGS Assign (label), and SEGS Filter (label)) or a SAM-based detector like comfyui_segment_anything. That's a separate install with real models to download; the picker itself stays dependency-free.
Where people get burned
- Count mismatch. One SEGS per image, in order, or the node refuses to run. It's a hard error, and it's the most common stumble.
- Label mode with no matches. If your
segs_labelsdon't share a prefix/suffix with the segment's existing label,matching_prefix/matching_suffixleave you with an empty vocabulary and a confusing click target. The segment's own label gets appended as a fallback, but design your vocabulary so the base names align. - SEGS output is a list. Downstream nodes expecting a single flat SEGS object will look at a list and complain; unwrap it or loop over it if your filter node wants one at a time.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| selectedopt | STRING | none | Comma-separated list of image indexes to select, 'all', or 'none' |
| lockedopt | BOOLEAN | false | Prevent selected images from being changed |
| segsopt | SEGS | SEGS to display over the images | |
| segs_labelsopt | STRING | Comma-separated list of possible labels for segments | |
| segs_label_modeopt | COMBO | Apply segs_labels to segments automatically | |
| segs_onopt | BOOLEAN | true | Display SEGS by default when modal opens |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| IMAGES | IMAGE | — |
| IMAGES | IMAGE | — |
| SEGS | SEGS | — |