Topaz Upscale
Topaz Upscale — bigger pixels, without giving the model permission to invent
- image
- provider
- image
The upscaling argument in this community is usually two people doing different jobs and shouting past each other. One wants more pixels, the other wants invented detail; the first is a scaler, the second is generation. Topaz Upscale is squarely the first. It's the conservative Topaz line - Standard V2, Low Resolution V2, High Fidelity V2, CGI, Text Refine - the family you point at a photo, a product shot, or an illustration you like and don't want reinterpreted.
Reach for it when local ESRGAN output looks over-sharpened, when the source is a phone photo with mild noise, when you're making something printable, or when the subject is text or line art and you don't want a diffusion pass hallucinating letterforms. Nothing runs locally: the node sends your image to the Topaz Image API and hands you back a tensor, so VRAM isn't a factor and the cost is per call.
How it works
One input image in, one image out. The pack submits the file to Topaz, polls the task until it finishes, decodes the result, and returns it as an IMAGE batch - the same type every other node in ComfyUI takes, so you can wire it into a Save node, a preview, or another pass. Configuring the connection (key, endpoint, task ceiling) is the job of the separate Provider: Topaz Labs node; leave the provider input empty and it uses the official key from api_key.json or TOPAZ_API_KEY.
The inputs that matter
model- the version, and picking one reveals that model's own sliders below it (sharpening, noise reduction, compression fix on the V2 models; an enhancement strength on Text Refine). Defaults are sensible, which is why most people never touch them.Text Refineis the interesting one: it's built for glyphs, screenshots and UI, where a general upscaler smears edges.scale_factor- 1 to 16, in 0.1 steps. That fine-grained step is a nice touch; 1.5x prints fine and 16x on a 4000px source will produce a file that chokes a browser. Used only whenoutput_widthandoutput_heightare 0.output_width/output_height- set exact dimensions instead of a factor. These are advanced for a reason: fix one, leave the other at 0, and you're asking the service to do the arithmetic.crop_to_fill- when the requested dimensions change the aspect ratio, this crops instead of letterboxing. Leave it off for documents and layout work.face_enhancement(auto/true/false),face_enhancement_strength,face_enhancement_creativity- strength and creativity both default to-1, which is the pack's "use the model's own default" sentinel, not a value. This is Topaz's answer to the oldest complaint about upscaling: every generative rung rewrites faces. Here you're steering how hard the face pass goes rather than hoping.subject_detection-auto, or restrict processing toAll,Foreground,Background. Useful when the background is fine and you only care about the subject, or the reverse.output_format- png by default;jpeg,tiffandwebpare there for delivery.extra- a JSON object merged into the request for parameters the pack hasn't surfaced as widgets yet. This is the escape hatch, not a requirement.retry_count- total attempts on failure, so 1 means no retry at all.
Output: a single image. Wire it to anything that takes IMAGE - a Save node, a preview, or a local detail pass afterwards.
Installing
ComfyUI Manager, search the pack title; or:
cd ComfyUI/custom_nodes
git clone https://github.com/yogurt7771/ComfyUI-YogurtNodes.git
cd ComfyUI-YogurtNodes && pip install -r requirements.txt
Restart, and look under YogurtNodes/LLM/Upscale. Runtime display names carry a " (Yogurt Nodes)" suffix. Key file:
# custom_nodes/ComfyUI-YogurtNodes/yogurt_nodes/llm/api_key.json
{ "topaz": "your-topaz-api-key" }
Where people get burned
Upscaling first and fixing later is the classic mistake, and it costs you on a paid API: get faces, hands and composition right at native resolution, then upscale. Above 4x on a large source, raise task_timeout on the provider node rather than cranking retry_count - you'll pay for the same job twice otherwise.
Two things this node is not. It isn't a video upscaler: run it frame by frame and fine repeating texture shimmers, because consecutive frames resolve detail differently - that's the defining failure of the job, not a settings problem. And it isn't a restoration model, which is what the pack's generative sibling is for. Point this one at images that are already good and want to be larger; for compressed, soft or genuinely damaged sources, the generative pass is the one that has anything to add.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Image to process. | |
| model | COMBO | Model version; the inputs below change with the selected model. | |
| scale_factor | FLOAT | 2.01–16 | Upscale factor, used when output_width and output_height are 0. |
| output_width | INT | 00–32000 | Exact width; 0 uses scale_factor. |
| output_height | INT | 00–32000 | Exact height; 0 uses scale_factor. |
| crop_to_fill | BOOLEAN | false | Crop instead of letterboxing on ratio change. |
| output_format | COMBO | png | Returned file format. |
| face_enhancement | COMBO | auto | Enhance faces. |
| face_enhancement_strength | FLOAT | -1.00-1–1 | Face sharpness relative to background. -1 uses the model default. |
| face_enhancement_creativity | FLOAT | -1.00-1–1 | Face enhancement creativity. -1 uses the model default. |
| subject_detection | COMBO | auto | Which subjects to process. |
| extra | STRING | Optional JSON object merged into the request (for parameters not exposed as inputs). | |
| retry_count | INT | 11–10 | Total attempts on failure. |
| provideropt | YOGURT_LLM_PROVIDER | Provider node. When unconnected, the official API is used with keys from api_key.json or environment variables. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |