BMAB Subframe Hand Detailer
GroundingDINO-precision hand fixes
- bind
- image
- lora
- BMAB bind
- image
- annotation
This is the more precise sibling of BMAB Simple Hand Detailer, and the two extra parameters here - box_threshold and text_threshold - are the giveaway that this node is grounded by GroundingDINO rather than a plain crop. Where Simple just grabs a fixed-size region around wherever it thinks a hand is, Subframe uses text-grounded object detection to locate the hand more precisely first, then crops a "subframe" around that grounded region before redrawing it. More setup, but a tighter, better-anchored crop going into the resample.
What box_threshold and text_threshold actually control
These are GroundingDINO's own confidence knobs, not a BMAB invention:
box_threshold(default 0.35) - how confident the detector needs to be that a given bounding box actually contains something, before it counts as a hit. Lower it if hands are being missed entirely; raise it if you're getting false-positive detections on things that aren't hands.text_threshold(default 0.25) - how well the detected region needs to match the text description ("hand," implicitly) to be accepted. Same trade-off in the other direction: too low and it grounds on the wrong thing, too high and real hands get rejected for not matching precisely enough.
Real-world reports from BMAB users confirm this is also the fragile part of the pipeline - a mismatched transformers package version breaks GroundingDINO's box_threshold argument outright and the detector fails to load at all, which shows up as an unrelated-looking Python error rather than anything pointing at these two fields. If detection just isn't happening, checking your transformers version is worth doing before you spend time tuning thresholds that never get reached.
The other inputs
squeeze (disable/enable) is unique to this node - enabling it normalizes the cropped subframe's aspect ratio before sampling (squeezing it toward square-ish) and un-squeezes it back on the way out, which can help the model resolve hand geometry when the natural crop is an awkward long, thin rectangle. Everything else follows the pattern from Simple Hand Detailer: steps, cfg_scale, sampler_name, scheduler mirror your main sampler (with "Use same sampler"/"Use same scheduler" as the default inherit-from-bind option); denoise (default 0.45) controls redraw strength; padding and dilation control crop context and mask growth; width/height (default 512 each) set the working resolution for the resample. Optional image and lora inputs work the same way too.
Outputs are bind, image, and annotation - that last one shows you exactly what got grounded and detailed, which matters more here than on the Simple variant, since a bad GroundingDINO match is a silent failure mode you'll only catch by looking at the annotation.
Installing it
ComfyUI Manager: search comfyui_bmab, install, restart. By hand:
cd ComfyUI/custom_nodes
git clone https://github.com/portu-sim/comfyui_bmab.git
cd comfyui_bmab
pip install -r requirements.txt
Per the README, GroundingDINO itself needs no separate install as long as you're on transformers v4.40.0 or newer - it ships GroundingDINO support natively. You'll also want comfyui_controlnet_aux and ComfyUI_IPAdapter_plus installed alongside comfyui_bmab, following the same clone-and-pip-install steps.
Where people get stuck
Beyond the transformers version mismatch above, the second-most-common issue is a detection that grounds on the wrong region - usually fixed by nudging text_threshold up a bit rather than down, since a loose text match is what lets GroundingDINO latch onto something hand-adjacent instead of the hand itself. If Subframe keeps giving you trouble and you don't need the precision, Simple Hand Detailer solves the same problem with none of GroundingDINO's failure modes.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| bind | BMAB bind | — | |
| steps | INT | 200–10000 | — |
| cfg_scale | FLOAT | 8.00–100 | — |
| sampler_name | COMBO | 45 options: Use same sampler, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 | |
| scheduler | COMBO | 10 options: Use same scheduler, simple, sgm_uniform, karras, exponential, ddim_uniform, +4 | |
| denoise | FLOAT | 0.450–1 | — |
| padding | INT | 328–128 | — |
| dilation | INT | 44–32 | — |
| width | INT | 512256–2048 | — |
| height | INT | 512256–2048 | — |
| squeeze | COMBO | 2 options: disable, enable | |
| box_threshold | FLOAT | 0.350–1 | — |
| text_threshold | FLOAT | 0.250–1 | — |
| imageopt | IMAGE | — | |
| loraopt | BMAB lora | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| BMAB bind | BMAB bind | — |
| image | IMAGE | — |
| annotation | IMAGE | — |