ComfyUI Node
Sign Detailer
Re-renders each detected text region with the text proposed upstream. glyph_guidance typesets the target text, warps it onto the sign's real quad and composites it into the crop before sampling. This is what makes the lettering come out readable — leave it on unless you are deliberately testing the raw model. Use a text-capable checkpoint (Qwen-Image, Ideogram, Krea 2). Turbo and SDXL-class models cannot render legible words and will just produce different gibberish. denoise defaults high (0.85): at low denoise the original garbled strokes bleed through. With glyph_guidance on, glyph_denoise takes over and can be much lower.
Sign Detailer
- images
- sign_data
- model
- clip
- vae
- positive_base
- negative
- sign_options
- dd_options
- images
- refined_crops
- glyph_preview
- report
◄seed0►
◄steps8►
◄denoise0.85►
◄sampler_nameer_sde►
◄schedulersimple►
◄auto_resolutiontrue►
◄target_width1024►
◄target_height1024►
◄max_upscale8.0►
◄glyph_guidanceinit►
◄glyph_font<auto>►
◄glyph_denoise0.55►
◄glyph_strength1.00►
◄glyph_fitauto►
◄glyph_cylinder0.00►
◄glyph_match_source_sizetrue►
◄glyph_preserve_surfacetrue►
◄glyph_surface_restyle0.35►
◄glyph_autocolortrue►
◄glyph_plate_color►
◄glyph_ink_color►
◄min_legible_px0►
◄too_small_policysoften►
◄cluster_modeshared_seed►
◄verify_afteroff►
◄verify_similarity0.60►
◄max_attempts2►
◄mask_expand_pixels4►
◄mask_blend_pixels16►
◄detail_daemon_enabledfalse►
◄detail_amount0.00►
CategoryFVM Tools/Text
Inputs (40)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | The image batch the selector scanned | |
| sign_data | SIGN_DATA | Regions with proposals, from Sign Text Proposer | |
| model | MODEL | Use a text-capable model — Qwen-Image, Ideogram, Krea 2 | |
| clip | CLIP | — | |
| vae | VAE | — | |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 81–100 | 8 is the verified value for Krea 2 Turbo, which is distilled — more steps over-cook it. Non-distilled models (Krea 2 Raw, Qwen-Image) want 15-25. |
| denoise | FLOAT | 0.850–1 | Used when glyph guidance is off. High on purpose: the old garbled strokes survive anything below ~0.7. |
| sampler_name | COMBO | er_sde | er_sde is the verified pairing for Krea 2. Without an explicit default ComfyUI would pick euler, which is not what these settings were measured against. |
| scheduler | COMBO | simple | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| auto_resolution | BOOLEAN | true | Shape the sampling resolution like the region instead of using target_width x target_height literally. Those two then only set the pixel BUDGET, so VRAM use stays the same. A fixed square wastes most of that budget on a wide sign: the crop is expanded to 1:1 first, leaving the lettering in a thin band. Measured on a 550x95 sign — square 1024 gives the text 1.9x upscale, the same budget at the region's own aspect gives 4.5x. |
| target_width | INT | 102464–4096 | With auto_resolution on this is half of the pixel budget, not a literal width. |
| target_height | INT | 102464–4096 | With auto_resolution on this is half of the pixel budget, not a literal height. |
| max_upscale | FLOAT | 8.01–32 | Caps how far a small region is blown up before sampling. Beyond this the model hallucinates detail that breaks on stitch-back. |
| glyph_guidance | COMBO | init | init: typeset text composited into the crop, sampled at glyph_denoise init_strong: same, but 0.15 lower denoise — maximum letter fidelity, less freedom to match the sign's material and lighting off: prompt-only, needs a genuinely text-capable model |
| glyph_font | COMBO | <auto> | Typeface for the rendered text. <auto> follows the model's font hint. |
| glyph_denoise | FLOAT | 0.550–1 | Denoise when glyph guidance is on. Lower keeps the letterforms exact, higher blends better into the surface. Measured on Krea 2 Turbo (8 steps, cfg 1, er_sde/simple): 0.35 clean text, but the surface stays flat and characterless 0.55 best - sharp text AND real material (enamel, screws, wear) 0.65 a second ghost copy of the word appears behind the first 0.70+ the sign is reinvented: warped, extra hardware, text faded Stay at or below 0.60. |
| glyph_strength | FLOAT | 1.000–1 | Opacity of the typeset layer before sampling. Keep at 1.0: measured, even 0.95 leaves the ORIGINAL garbled lettering clearly readable underneath, and the sampler then has it in the init latent. Lower this only to deliberately carry over the old surface shading. |
| glyph_fit | COMBO | auto | How the typeset text is fitted onto the region. auto: measures how badly a four-corner fit misses the outline and switches to the column-wise fit when it does perspective: four corners — correct for flat signs, gives the text a vanishing line when the sign is angled away contour: follows the mask's top and bottom edge column by column — for curved labels, folded fabric, torn paper. A flat plane cannot describe those, so the text would otherwise sit dead straight on a bowed surface. |
| glyph_cylinder | FLOAT | 0.000–1 | Extra horizontal compression towards the sides, the way lettering wrapped around a bottle or can foreshortens away from the viewer. Only applies to the contour fit. Try 0.4-0.6 for bottle labels, 0 for anything flat. |
| glyph_match_source_size | BOOLEAN | true | Set the replacement text at the size the surface already used, instead of scaling it to fill the region. Filling the box is right for a headline sign and wrong for everything else. A wine label carries one large number over three lines of small print — scaled to the box it becomes a poster, and long words no longer fit and get cut off at the edge. The size is measured from the existing strokes, so it adapts per region. It is a cap, not a fixed size: longer replacement text still shrinks to fit. |
| glyph_preserve_surface | BOOLEAN | true | Replace only the lettering, not the whole region. Painting the full masked area with the plate colour erases everything the surface had, and the sampler must then invent it back from a flat fill. On real photographs that turned a bordered enamel oval into a plain white disc, and a curved shop-window inscription into a pasted-on banner covering the glass. On: only the old strokes and the new ones are covered. Parts that run into the region's edge — frames, rims, painted borders — are recognised as structure and left alone. Off: the old full-area behaviour. |
| glyph_surface_restyle | FLOAT | 0.350–1 | How much of the denoise the surface AROUND the lettering gets, as a fraction. The lettering itself always gets all of it. This is what makes a second pass over the same sign safe. At 1.0 the whole plate is re-rendered every time, so three passes means three generations of drift — measured on a navy enamel sign, the plate walked to dark grey and the border broke up. 0.0 the surface is untouched — most faithful for repeat edits 0.35 default — enough for a flat synthetic plate to gain material 1.0 the old behaviour Only applies with glyph_preserve_surface on. |
| glyph_autocolor | BOOLEAN | true | Sample ink and plate colour from the original sign so the replacement keeps its scheme. |
| glyph_plate_color | STRING | Force the SURFACE colour of the typeset layer. Empty = use the colour sampled from the original. Accepts '#ffe680', 'ffe680', '#fe8' or '255,230,128'. Use this when you want a different surface than the one in the picture — a yellow post-it, a white plate, a green road sign — and describe that surface in the Sign Options prompt_suffix too. | |
| glyph_ink_color | STRING | Force the LETTER colour of the typeset layer. Empty = sampled. Same formats as the plate colour. | |
| min_legible_px | INT | 00–128 | Smallest capital height, in pixels, the replacement lettering is typeset at. A floor under glyph_match_source_size, not a gate: a region that cannot carry the word that large still gets it, only smaller. 0 = off.\n\nWithout it the new text is bound to the size of the OLD text, and on a defocused label the old text measures 4-6px - so a word was set at 4-5px on a surface that would carry three times that.\n\nOff by default. It demonstrably sharpens single words (RIESLING came back clean where it had read IESLIN/SLIN), but a full suite run could not show a gain: larger type in pass A shifts the region layout the selector finds in pass B, which moves words onto other surfaces. Opt in per job, do not switch on blind. |
| too_small_policy | COMBO | soften | Regions the selector flagged below its size gate.\nsoften: re-render as out-of-focus text - but measured, this invents fresh sharp pseudo-lettering instead of blurring what is there\nskip: leave untouched\nrender: try anyway\nerase: empty the text band and rebuild the surface from its own edge, writing nothing back - no sampler pass runs over the region at all, so there is nothing left that could invent lettering. Take it for a surface too small to carry a readable word: a blank surface is the only outcome a census cannot read words into.\n\nsoften is NOT a safe fallback, and this is measured. At denoise 0.35 the pass does not erase the lettering already there, so the model repaints it as its own invention - sharp, transcribable pseudo-text rather than blur. Caught on the wine shelf as TOKL CUBA ANY RODA, TEGLING AVYAT, BUTORT DOATRKR. A census counts that as gibberish, and it is right to: anything legible enough to transcribe is legible fantasy writing. |
| cluster_mode | COMBO | shared_seed | shared_seed renders every member of a cluster with the same seed and prompt, so a shelf of identical bottles stays identical. |
| verify_after | COMBO | off | ocr: read the result back and retry with a new seed if the text did not land. Needs an OCR backend; without one it silently stays off. |
| verify_similarity | FLOAT | 0.600–1 | Minimum similarity between the read-back text and the target. |
| max_attempts | INT | 21–5 | Render attempts per region when verification fails. |
| mask_expand_pixels | INT | 40–64 | Small expansion helps cover anti-aliased edges of the old lettering. |
| mask_blend_pixels | INT | 160–128 | Lower than for faces — a hard-edged sign should not fade into its surroundings. |
| detail_daemon_enabled | BOOLEAN | false | Usually off for text: extra detail turns clean strokes noisy. |
| detail_amount | FLOAT | 0.00-5–5 | — |
| positive_baseopt | CONDITIONING | Fallback conditioning when a region has no text | |
| negativeopt | CONDITIONING | Overrides the negative prompt from Sign Options | |
| sign_optionsopt | SIGN_OPTIONS | Per-class overrides and advanced settings | |
| dd_optionsopt | DD_OPTIONS | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| refined_crops | IMAGE | — |
| glyph_preview | IMAGE | — |
| report | STRING | — |