ArtificialGuyBR

Home / Blog / Fixing things

Fix AI Hands: Why They Fail and the Real ControlNet Workflow

Viral Civitai hand-fix embeddings don't exist. Real workflow: ControlNet OpenPose detection + targeted inpainting.

6 sources cited Fixing things

TL;DR


The Embeddings You Read About Don't Exist

Two popular Civitai articles from late 2023 claim specific negative embeddings force Stable Diffusion and SDXL to generate perfect hands. One article promotes 5-funny-looking-fingers:2 with a "99% perfect hands in SD" claim. The other recommends physical-defects:2, unhealthy-deformed-joints:2, unhealthy-hands:2 with a "fails only 1 in 20 images" statistic.

Neither embedding exists. Direct queries to the Civitai API for "funny-looking-fingers", "physical-defects", "unhealthy-hands", and "unhealthy-deformed-joints" all return empty result sets. The articles' authors appear to have invented these embedding names and their associated performance metrics.

This matters because thousands of users have likely wasted time searching for embeddings that were never published. The actual solutions require a different approach entirely.


Why AI Hands Fail in the First Place

Understanding the root cause tells you why no single prompt token or embedding can "fix" hands.

FactorWhy It Breaks Hand Generation
Anatomical complexity27 bones, 30+ muscles, 21 keypoints per hand with precise proportional relationships
Perspective variationExtreme foreshortening, self-occlusion, and viewpoint changes alter apparent finger lengths
Cloth interactionHands frequently grasp fabric, creating ambiguous boundaries between skin and material
Training data biasDatasets overrepresent certain poses (open palm, fist) and underrepresent complex gestures
Model architecture limitsDiffusion models lack explicit 3D anatomical priors; they learn statistical correlations from 2D projections

SDXL improved overall coherence over SD 1.5 but introduced new hand artifacts — users report "half-finger truncation" and "octopus-like finger multiplication" at higher resolutions. These aren't embedding failures; they're fundamental limitations of 2D diffusion on 3D structures.


The Real Workflow: ControlNet + Inpainting

The production approach combines hand detection with targeted regeneration. This isn't a one-click fix — it's a repeatable pipeline.

Step 1: Detect Hands with ControlNet OpenPose

ControlNet includes a dedicated hand detector (annotator/openpose/hand.py) that outputs 21 keypoints per hand. The model loads hand_pose_model.pth from Hugging Face and runs multi-scale inference (0.5×, 1×, 1.5×, 2×) with Gaussian peak refinement.

from ControlNet import OpenposeDetector
detector = OpenposeDetector()
canvas, result = detector(oriImg, hand=True)
# result contains hand keypoints: [{x, y}, ...] × 21 per hand

Detection accuracy: ~85–90% in controlled conditions (clear hand visibility, good lighting). Drops significantly with occlusion, motion blur, or unusual poses.

Step 2: Generate Precise Masks from Keypoints

Convert the 21 keypoints into tight bounding boxes, then expand by 15–20% to include wrist context. The Stable Diffusion web UI inpainting tab accepts these masks directly — white regions get regenerated, black regions stay untouched.

Mask ModeWhen to Use
Inpaint maskedReplace only the hand region (default)
Inpaint not maskedRegenerate everything except the hand (rare)
Only masked (resize)Upscale just the hand region for higher detail

The "Only masked" option is critical — it renders the hand at the full model resolution (e.g., 1024×1024 for SDXL) regardless of its size in the source image.

Step 3: Inpaint with a Dedicated Hand Prompt

Use the inpainting tab with these settings:

ParameterRecommended Value
ModelSDXL base + refiner, or SD 1.5 inpainting checkpoint
Denoising strength0.65–0.85 (higher = more change, lower = more faithful)
Masked contentlatent noise or original
SamplerEuler a / DPM++ 2M Karras
Steps30–50

Prompt template:

5 distinct fingers, realistic human hand anatomy, correct proportions, natural skin texture, visible knuckles, proper fingernails, [pose description], sharp focus, subsurface scattering

Negative prompt (actual tokens that exist):

deformed fingers, extra fingers, missing fingers, fused fingers, mutated hands, poorly drawn hands, claw, talon, webbed fingers, blurry, low quality

These are standard negative tokens, not special embeddings. They work because they're in the model's vocabulary, not because of a secret embedding file.

Step 4: Iterate and Refine

First pass rarely produces perfect results. Typical workflow:

  1. Generate 4–8 variations at denoising 0.75
  2. Pick the best, mask remaining issues
  3. Second pass at denoising 0.55 for refinement
  4. Optional: high-res fix or ControlNet tile upscale for final detail

Negative Embeddings: What They Are and Aren't

Textual inversion (negative embeddings) does exist in Stable Diffusion. You train a small vector that represents "bad hand anatomy" by feeding the model examples of deformed hands, then use that token in negative prompts.

But:

The Civitai articles conflate this real technique with fictional embedding names and impossible performance claims.


SDXL-Specific Considerations

SDXL's dual text encoders (OpenCLIP ViT-G + CLIP ViT-L) and 1024×1024 native resolution change the hand-fixing calculus:

IssueSD 1.5SDXL
Native resolution512×5121024×1024
Hand detail at native resPoor (hands often < 64px)Usable (hands often > 128px)
Inpainting "Only masked"EssentialHelpful but less critical
Refiner modelN/AAdds detail in second pass
Common artifactMissing fingersHalf-finger truncation, extra joints

Practical tip: For SDXL, generate at 1024×1024, then inpaint hands at denoising 0.6–0.7 with the refiner enabled. The refiner's second pass often resolves the "half-finger" artifacts without extra work.


Common Errors and Fixes

SymptomLikely CauseFix
Fingers fused togetherDenoising too low, mask too tightIncrease denoising to 0.8, expand mask 20%
Extra fingers (6+)Denoising too high, prompt too vagueLower denoising to 0.55, add "5 distinct fingers"
Half-finger truncation (SDXL)Resolution mismatch, refiner disabledEnable refiner, use "Only masked" upscale
Claw-like distortionNegative prompt missing "claw/talon"Add claw, talon, webbed to negative
Skin texture looks plasticMissing texture keywordsAdd "subsurface scattering, pores, natural skin"
Wrist/arm mismatchMask doesn't include transition zoneExpand mask to include 50px of forearm

FAQ

Do I need a special embedding to fix hands? No. The embeddings named in viral Civitai articles don't exist. Standard negative tokens plus ControlNet detection + inpainting work better.

Why do my hands still look wrong after inpainting? Most common: mask too tight (cuts off wrist context) or denoising too extreme. Expand mask, lower denoising to 0.55–0.65, add "forearm visible" to prompt.

Does ControlNet hand detection work on SDXL? Yes. The detector is model-agnostic — it outputs keypoints from any RGB image. Use those keypoints to build masks for SDXL inpainting.

How many inpainting passes are normal? 2–3 passes is typical. First pass fixes gross anatomy, second refines proportions, third (optional) polishes skin detail.

Can I automate this? Yes. The sd-webui-controlnet extension includes "Inpaint Only Masked" scripts that chain detection → masking → inpainting. See automation guide.

What about Depth/Normal ControlNet for hands? Depth maps help with 3D structure but add complexity. OpenPose hand keypoints are faster and sufficient for most cases. Depth is better for full-body pose transfer.

Do LoRAs help with hands? Hand-specific LoRAs exist but are hit-or-miss. They bias toward training poses. Inpainting with a good prompt is more flexible.


Sources

SourceWhat It Contributed
Civitai Article 3373Original claim: "5-funny-looking-fingers:2" embedding, 99% perfection claim, SDXL half-finger artifact
Civitai Article 3276Original claim: "physical-defects:2, unhealthy-deformed-joints:2, unhealthy-hands:2" embeddings, 1-in-20 failure rate
ControlNet RepositoryVerified OpenPose hand detector implementation, 21-keypoint architecture, model weights on Hugging Face
ControlNet hand.pySource code for hand detection: multi-scale inference, Gaussian peak refinement, 21 keypoint output
SD WebUI Features WikiDocumented inpainting modes, masked content options, "Only masked" resize, dedicated inpainting models
SDXL Model CardSDXL architecture details: dual encoders, 1024×1024 native resolution, refiner pipeline


Image Placeholders