Nodes/DOGMA Nodes/DOGMA Local Repair Masks v14 — Objects Only
ComfyUI Node

DOGMA Local Repair Masks v14 — Objects Only

Keep the local repair pass off your sky, grass and storefronts

By axior·Created 4 months ago·Updated 3 days ago· 1
DOGMA Local Repair Masks v14 — Objects Only
  • mask_1
  • mask_2
  • mask_3
  • mask_4
  • mask_5
  • mask_6
  • mask_1
  • mask_2
  • mask_3
  • mask_4
  • mask_5
  • mask_6
  • summary
category_1
category_2
category_3
category_4
category_5
category_6

DOGMALocalRepairMasksV14 is a bouncer. Six masks and six categories go in; nearly the same six masks come out, except the ones for broad surfaces and readable text have been replaced by solid black. The subtitle on the node says it plainly: Objects Only.

Why you'd want half your masks deleted

The pack's whole architecture is a two-tier restoration: a global pass that rebuilds the image coherently, and local passes that fix discrete things the global pass missed. Local passes are good at cars, people, benches, animals - things with countable identity you can tell a model to preserve. They're bad at sky, road, water, grass and facades, which aren't objects so much as fields of value, and catastrophic on signage and lettering, where a "fix" turns a street sign into plausible nonsense.

So this node classifies each incoming category and zeroes out the ones the local pass shouldn't touch:

  • kept - anything in the vehicles family (car, bus, truck, van, motorcycle, bicycle), people, roadway and sidewalk pedestrians, street furniture (traffic lights, lamp posts, poles, bollards, benches), animals, and anything unclassifiable that falls through to "other"
  • blanked - architecture and anything matching signage vocabulary (shop signs, billboards, rooftop signs, large lettering), plus the surface families: road, vegetation, water, sky
  • a category of none is blanked too

Those zeroed masks don't error downstream. A zero mask means the inpaint pass has nothing selected, so that crop becomes a no-op and the region is left to the global refiner and whatever preservation logic you've built. That's the design - not a filter you tune, a division of labour.

What's actually happening to your mask

Two mechanical details worth knowing before you wire it.

Six slots: mask_1mask_6 paired with category_1category_6, all required. The matching is positional - mask 4 is judged by category 4 - so if your planner emits its slots in a different order than your masker, you're silently gating the wrong regions. Wire them in the same order, every time.

Then each mask gets flattened: if it arrives as a batch, it's reduced to one plane with a max over the batch dimension, cast to float and clamped to 0–1. So a multi-instance batch mask becomes a single union before it's passed along. The outputs are mask_1mask_6 plus a summary string that literally lists what got through (LOCAL KLEIN ACTIVE: cars [vehicles], …) and what got withheld (GLOBAL/PRESERVE ONLY: …). Read that string when a region you expected to be repaired comes back untouched.

Inputs and outputs

Six MASK inputs, six STRING category inputs, six MASK outputs, one STRING output. That's it. No threshold, no dilate, no strength - the decisions live in the category strings.

Install

ComfyUI Manager → search DOGMA Nodes, or:

cd ComfyUI/custom_nodes
git clone https://github.com/axior/ComfyUI-DOGMA-Nodes

Restart. The pack has no pip dependencies (its requirements.txt is a comment saying so) and ships no weights - you supply the Klein checkpoint and whatever produced the masks.

Where it bites

The category names are matched by substring, and the vocabulary was written for the author's own planner. "car" matches, but "automobiles" also matches because it's in the list - while a category you invented like "vintage sedans, chrome detail" may not, and will land in the "other" bucket and get a local pass you didn't intend. If you're generating categories with your own VLM prompt, keep them close to the canonical names.

Second, the reduction to a single plane per slot means instance-level handling is gone by the time you get here. If you needed three separate people processed as three crops, that had to happen before this node, in whichever clustering node made the masks.

Third, this is a v14-era node sitting in a pack that also ships v43 and v56.4 families. It still works - it's a category lookup and a zero - but if you're running the newer scene planner, check that its category strings hit this node's vocabulary before you trust the summary line.

CategoryDOGMA/Semantic Detailer

Inputs (12)

NameTypeDefaultDescription
mask_1MASK
category_1STRING
mask_2MASK
category_2STRING
mask_3MASK
category_3STRING
mask_4MASK
category_4STRING
mask_5MASK
category_5STRING
mask_6MASK
category_6STRING

Outputs (7)

NameTypeDescription
mask_1MASK
mask_2MASK
mask_3MASK
mask_4MASK
mask_5MASK
mask_6MASK
summarySTRING