BlogAI models
What is ControlNet? How to control the shape of an AI image
ControlNet makes an image model follow a pose, an outline or a depth map. How it works, which control image to pick, and how to use it in ComfyUI.
Esha Senior AI Developer
On this page9 sections
The short version
- A prompt describes a picture. A ControlNet hands the model a map of it (the edges, the depth or a pose skeleton) and the model builds the picture on that map.
- You make the map from a reference image with a preprocessor. Which one you pick decides what carries over: edges keep nearly everything, a pose keeps only the body.
- A ControlNet is trained for one model family, just like a LoRA. It adds to a model rather than changing it, so the same model works with or without it.
- In ComfyUI the classic node, Apply ControlNet, sits on the prompt wires. Strength, start and end decide how firmly, and for how much of the run, the model is held to the map.
Try getting a pose out of a prompt. "One hand raised to her hair, the other resting on her hip" gets you something close, then something else close, then a third variation, and none of them is the pose you had in mind. Words are good at what and who. They're bad at exactly where.
ControlNet fixes that. In the video I put it this way: a LoRA influences how the model generates, a ControlNet influences the structure it should follow. This guide shows what that means on real renders, which kind of control image to use for what, and how it's wired and tuned in ComfyUI.
What ControlNet is
ControlNet comes from a 2023 paper, Adding Conditional Control to Text-to-Image Diffusion Models, by Lvmin Zhang, Anyi Rao and Maneesh Agrawala at Stanford. It won the Marr Prize, the best paper award, at ICCV 2023, and it's the reason "follow this pose" became something an image model can actually do.
The idea is neat. The original model is locked, so nothing it knows can be damaged. Alongside it sits a trainable copy of the part of the model that reads an image, and that copy learns to read a control image, such as an edge map. The copy is connected to the model through layers that start at zero. On the first day of training they add nothing at all, so the model behaves exactly as it did before, and the guidance grows in from there as training goes on.
What you download is that extra network, as a file of its own. It doesn't change your model the way a LoRA does. It adds guidance while the model samples, for the image you're making right now.
One prompt, with and without ControlNet
Here's the difference on a real render. I gave Qwen-Image this prompt, which says nothing about a pose:
A watercolour illustration of a young woman with long dark hair, wearing a cream knitted jumper and wide light-blue jeans, in a bright room with white curtains.
Then I ran it again with a Canny ControlNet, fed the edges of a reference image. Same prompt, same seed, same everything else.


Without it, the model chose everything the prompt left open: a closer crop, arms behind her back, no plant. With it, the figure stands exactly as in the reference, down to the cropped jumper, while the paint, the colours and the soft light all come from the prompt.
The same edges work for something the reference never was:


Look at the right-hand side of the statue. The plant and the window from the reference turned up in a museum, because an edge map carries every line in the picture, not just the person. That's the most useful thing to understand about ControlNet: the control image decides what carries over, so choosing it is half the job.
The control image comes first
A ControlNet doesn't look at your photo directly. It reads one particular kind of image, and a preprocessor makes that image from your reference. Here's one reference turned into three kinds of control image:

Referencethe picture you start from

Canny edgesevery outline, background too

Depthwhat's near and what's far

Posethe body, and nothing else
Each kind keeps something different, which is how you choose between them:
| Control image | What it keeps | Good for |
|---|---|---|
| Canny, lineart | Every outline: the figure, the clothes, the background | Keeping a composition exactly, restyling an image, product shots |
| Depth | How far away everything is, but not the fine detail | Rooms, landscapes, keeping the layout and changing what's in it |
| Pose (OpenPose, DWPose) | Only the body's position: no clothes, face or background | Putting a new character or outfit into a pose you choose |
| Scribble, HED, soft edges | Rough shapes | Turning a quick sketch into a finished picture |
| Tile | The whole image, at low detail | Adding detail while upscaling, without changing the picture |
ComfyUI ships with the Canny node. For the others, install the
comfyui_controlnet_aux
node pack through the Manager: it adds preprocessors for depth, pose, lineart, scribble,
segmentation and more.
How to use ControlNet in ComfyUI
The classic setup uses two nodes: Load ControlNet Model, which loads the file
from ComfyUI/models/controlnet/, and Apply ControlNet, which does the
work. Unlike a LoRA, it doesn't touch the model wire. It sits on the prompt wires:
CONDITIONING, green is CONTROL_NET and blue is IMAGE,
the colours ComfyUI uses.
-
Get a ControlNet for your model
Download one made for the model family you're using and put it in
ComfyUI/models/controlnet/, then press R. -
Make the control image
Add Load Image for your reference, then the preprocessor that matches your ControlNet: Detect Edges (Canny) for a Canny model, a depth estimator for a depth model, and so on.
-
Put Apply ControlNet between your prompts and KSampler
Wire the positive and negative prompts into it, the ControlNet into
control_net, and the preprocessed image intoimage. Then take its two outputs to KSampler'spositiveandnegativeinputs. -
Match the shape
Give the empty latent the same aspect ratio as the reference. ComfyUI resizes the control image to fit the latent and crops from the centre when the shapes differ, so a portrait reference on a square canvas loses its top and bottom.
You can use more than one at once. Chain Apply ControlNet nodes: the prompts come out of the first and go into the second, and each one has its own ControlNet, control image and strength. Pose plus depth is a common pair, the body from one and the room from the other.
A second way in: model patches
Some newer ControlNets arrive as a model patch instead. The renders in this guide used one:
DiffSynth's Canny ControlNet for Qwen-Image. It goes in ComfyUI/models/model_patches/,
loads with Load Model Patch, and Apply Qwen Image DiffSynth
ControlNet puts it on the model wire rather than the prompt wires. The idea is the
same: a control image steering a model that stays unchanged. Here's the actual graph that made
the bronze statue:

Strength, start and end
strength is how firmly the model is held to the control image. At 1.0 it follows closely, and lower values give it more room to make its own choices. How quickly it lets go depends on the ControlNet. With this one, 0.5 still held the pose completely, and 0.25 let go of it almost entirely:




The classic Apply ControlNet node adds two more settings, start_percent and end_percent, which decide which part of the sampling run the control applies to, from 0 (the first step) to 1 (the last). The early steps settle the composition and the late ones the fine detail, so ending the control early is a common trick: at 0.6 or 0.7 the layout is already fixed, and the model finishes the detail its own way, which often looks more natural than holding it to every line until the end.
Picking a ControlNet for your model
A ControlNet is trained alongside one model family, and it only works with that family. The originals were made for Stable Diffusion 1.5, and there are now separate sets for SDXL, FLUX, Qwen-Image and others. The model family is always in the file's description, and usually in its name. Loading one made for a different family either fails outright or does nothing.
You'll also see union ControlNets, which understand several kinds of control
image in one file. ComfyUI's Set Union ControlNet Type node tells one which kind
you're giving it. Its list covers pose, depth, soft edges and scribble, Canny and lineart, normal
maps, segmentation, tile and repaint, or auto to let the model work it out.
ControlNet, LoRA or image-to-image?
All three change what comes out, and they're easy to mix up:
| What it changes | Reach for it when | |
|---|---|---|
| ControlNet | The structure of one image: where things are, how the body stands | The layout or pose has to match something exactly |
| LoRA | The model itself: a style, a character, an object, a speed-up | You want the same look or the same person in every image |
| Image-to-image | Starts from an existing picture's colours and shapes, with denoise below 1 | You want a variation of a picture rather than a new one |
They combine well. A character LoRA plus a pose ControlNet puts the same person into the pose you choose, which neither can do alone.
When ControlNet doesn't behave
- It's ignored. Check that the ControlNet matches your model family, that strength isn't near zero, and that KSampler's prompts come out of Apply ControlNet rather than straight from the text encoders.
- The wrong image is going in. A Canny ControlNet expects an edge map. Feed it the reference photo itself and it can't read it.
- It copies too much. Canny carries the background along with the subject, as the bronze statue showed. Switch to pose or depth, or lower the strength.
- The picture looks stiff or traced. Lower the strength, or end the control earlier with
end_percent. - The subject is cut off. The reference and the latent have different shapes, so the control image was cropped to fit. Match the aspect ratio.
Questions people ask
What is ControlNet in Stable Diffusion and ComfyUI?
ControlNet is an extra network that steers an image model with a control image, such as an edge map, a depth map or a pose skeleton, so the output follows that structure while the prompt decides everything else. It was introduced in 2023 by Lvmin Zhang, Anyi Rao and Maneesh Agrawala, and works alongside a model without changing it.
What is the difference between ControlNet and a LoRA?
A LoRA changes the model's weights, so it affects every image: a style, a character or an object. A ControlNet leaves the model unchanged and guides the structure of one image from a control image: the pose, the outlines or the depth. They're often used together, for example a character LoRA with a pose ControlNet.
Where do ControlNet models go in ComfyUI?
Classic ControlNet files go in ComfyUI/models/controlnet and load with the Load ControlNet Model node. Some newer ones, such as DiffSynth's ControlNets for Qwen-Image, are model patches: they go in ComfyUI/models/model_patches and load with Load Model Patch. Press R after adding a file.
Which ControlNet should I use?
It depends on what you want to keep from the reference. Canny or lineart keeps every outline, background included. Depth keeps the layout and distances. OpenPose or DWPose keeps only the body's position, so it's the one for putting a new character into a pose. Scribble turns a rough sketch into a picture, and tile adds detail when upscaling.
What strength should I use for ControlNet?
Start at 1.0 and lower it if the result looks stiff or copies too much. How quickly a ControlNet lets go varies by model: in this guide's test, a Canny ControlNet for Qwen-Image still held the pose completely at 0.5 and had almost no effect at 0.25. Ending the control early, with end_percent around 0.6 to 0.8, keeps the composition while letting the model finish the detail freely.
Do I need a preprocessor for ControlNet?
Yes, unless you already have a control image. A Canny ControlNet needs an edge map and a depth ControlNet needs a depth map, and the preprocessor makes them from your reference. ComfyUI includes a Canny node. For depth, pose, lineart and others, install the comfyui_controlnet_aux node pack from the Manager.
Does ControlNet work with FLUX?
Yes, with a ControlNet trained for FLUX. Several teams have released them, including Canny and depth models and union models that handle several kinds of control image in one file. ControlNets made for SD 1.5 or SDXL won't work on FLUX, because each one is trained for a single model family.
Can I use more than one ControlNet at once?
Yes. Chain Apply ControlNet nodes, so the prompts pass through each one in turn, each with its own ControlNet, control image and strength. Pose with depth is a common pair. Their effects add up, so lower each strength a little when you combine them.
Can I use an SD 1.5 ControlNet with SDXL or FLUX?
No. A ControlNet is trained alongside one model family and only works with that family. Download a version made for the model you're using. The family is listed in the model's description and usually in its file name.

