DEV Community

Cover image for How to Use ControlNet With a Reproducible Structure Manifest
Voor AI
Voor AI

Posted on

How to Use ControlNet With a Reproducible Structure Manifest

ControlNet works best when the reference image is treated as an explicit structural input, not as vague inspiration. Pick one control signal, record what geometry must survive, generate, and compare the output against a small manifest.

Choose the right control signal

Use Canny when hard outlines and object placement matter. Use Depth when camera perspective and front-to-back relationships matter more than every edge. Mixing both concepts in one undocumented prompt makes failures hard to diagnose.

The current Voor ControlNet form has a required Prompt, a Control Image upload, and a visible Generate button. Its own guidance distinguishes geometry-first ControlNet from identity/texture-first image-to-image work. The public form does not expose a numeric credit estimate before sign-in, so verify the live estimate before generating.

Define a structure manifest

{
  "controlType": "canny",
  "mustPreserve": [
    "camera_angle",
    "product_outline",
    "handle_position",
    "ground_contact"
  ],
  "mayChange": [
    "material",
    "color_palette",
    "background",
    "lighting"
  ],
  "forbidden": [
    "extra_handles",
    "floating_shadow",
    "cropped_product"
  ]
}
Enter fullscreen mode Exit fullscreen mode

This manifest becomes both the prompt plan and the review plan.

Build the prompt from changeable layers

Keep the reference camera angle, outer product silhouette, handle position,
and ground contact. Change the material to matte cobalt ceramic, use a warm
studio gradient background, soft key light from upper left, realistic contact
shadow. No extra handles, no floating object, no crop.
Enter fullscreen mode Exit fullscreen mode

Open the ControlNet generator, upload a clean reference, and start with one control type. A source with a single readable subject will produce a more useful edge or depth map than a cluttered scene.

Voor ControlNet workspace showing the prompt field, control image upload, and Generate action

Add a deterministic validator

The image review is visual, but the decision rules can still be deterministic:

const required = new Set([
  "camera_angle",
  "product_outline",
  "handle_position",
  "ground_contact",
]);

export function validateReview(review) {
  const seen = new Set(review.preserved ?? []);
  const missing = [...required].filter((key) => !seen.has(key));
  const forbidden = review.failures ?? [];

  return {
    ok: missing.length === 0 && forbidden.length === 0,
    missing,
    forbidden,
  };
}

const review = {
  preserved: [
    "camera_angle",
    "product_outline",
    "handle_position",
    "ground_contact",
  ],
  failures: [],
};

console.log(validateReview(review));
Enter fullscreen mode Exit fullscreen mode

This is intentionally simple. It prevents “looks good” from replacing the requirements.

Review in a fixed order

  1. Compare the camera angle.
  2. Compare the outer silhouette.
  3. Check intersections and repeated lines.
  4. Inspect small geometry: fingers, handles, labels, hinges.
  5. Check the contact shadow.
  6. Only then score material and lighting.

Troubleshooting

Too rigid: simplify the reference or reduce conflicting prompt detail.

Too much drift: use a cleaner source and name fewer allowed changes.

Canny preserves clutter: crop the source or switch to Depth.

Depth loses product edges: return to Canny for the geometry-critical pass.

The model copies source texture: state the new material and palette explicitly.

Technical limits

ControlNet can preserve the broad map while breaking local geometry. It does not guarantee identity, readable labels, valid hands, physical safety, or pixel-perfect correspondence. Model behavior and credit estimates can change; record the live settings with each approved output.

When your manifest is ready, run one controlled pass and validate it before changing a second layer.

Top comments (0)