All postsBlog · July 13, 2026

AI Photo Quality: How We Catch Broken Anatomy

Untolds Editorial10 min read

Broken hands are 46% of the flaws we catalog, and only 46%. How we built a gate that catches 40.6% of anatomy defects, and the 3 borrowed tools that failed.

She types that she is on her way out, then sends a photo from the mirror. It is a good photo, until you notice the hand on the doorframe has six fingers. Everyone knows this one, and that is exactly what makes it a trap. Fixing AI photo quality is not fixing hands. It is fixing every part of a body a model can get wrong, and the parts nobody has a punchline for are the ones that quietly ship.

Charlotte, mid-thread
Free gift
+3

She's already texting back.

Make your account here and this 6-piece set from Charlotte is yours, free.

Try 3 days free

So we built a gate: an automated check that scores every generated image and throws away broken ones before they reach the chat. It catches 40.6% of them, which is better than anything else we tested and is nowhere near all of them, and this post is the honest engineering story of getting it there: the three borrowed tools that failed us, the numbers, and the stage we ended up deleting. That last part is the one we did not see coming. The version that finally worked was not the one where we added another safeguard. It was the one where we removed the safeguard we had been leaning on.

Key Takeaways

  • The gate checks the whole body, not one part. Hands are the most common failure, at 46% of every defect we have labeled, which still leaves a 54% majority everywhere else.
  • It catches 40.6% of broken images at 97% specificity, with a cross-validated AUC of 0.859. The pretrained off-the-shelf detector we started from caught 0% of the same non-hand defects.
  • It beats the borrowed general-purpose model it replaced, which scored 34.6% recall at the same 97% specificity on the same images, and it does so in under a second instead of roughly 35 seconds.
  • It runs precision-first: when it rejects a photo, it is almost always right to, and a rejected photo is regenerated rather than delivered.

Why does AI photo quality break on anatomy?

Anatomy failure refers to the class of defects where a generated image renders part of a body with the wrong count, the wrong joints, or the wrong topology. Six fingers is one instance. So is an arm that gains a bend it has no joint for, a knee with no joint in it at all, a leg that changes thickness halfway down. It is not blur or noise. Everything in the photo is sharp. It is just wrong.

The cause is structural. Peter Bentley, a computer scientist at University College London, explained it plainly to the BBC: image models learn what things look like statistically, not how they are built (BBC Science Focus). A model has no skeleton in its head. Nobody told it an elbow is a hinge with one axis, or that arms attach in specific places. It has only ever seen pixels that tend to appear near other pixels. That works beautifully for texture, light, and faces, and it breaks down wherever the right answer depends on a structure the model was never given.

A model has no skeleton in its head. It has only ever seen pixels that tend to appear near other pixels.

Hands are the loudest version of that failure, for reasons computer vision has documented for years: high degrees of freedom, heavy self-occlusion, and near-identical fingers make hands hard even for systems built specifically to track them (Sensors, 2019, via NIH). Those same properties, in milder form, are why limbs break too. Joints have degrees of freedom. Limbs occlude each other. A body in an unusual pose is the same problem in a larger, more forgiving form.

And the damage is out of all proportion to the size of the flaw, because a person is the one object every viewer is an expert on. You do not need to know what is wrong with the arm to know that something is. One bad joint undoes the work that makes her photos feel like hers in the first place.

Which body parts actually break?

Before building anything, we labeled the failures. Every image the pipeline produced that a human judged broken got a box drawn around the part that was wrong. The distribution of those boxes is what decided the design.

Where broken anatomy shows upHandsthe single largest region, and still under half46%Armsjoints bending the wrong way, fused forearms18%Legsoften knee and ankle topology17%Feet and otherthe long tail of smaller regions9%Torsorarer, and very visible when it happens8%Facesbecause modern models are simply good at faces3%
Untolds, share of human-drawn defect boxes by body region, July 2026. Figures are rounded and do not sum to exactly 100.

Read that carefully, because it is easy to read backwards. Hands are the largest single bar and hands are still a minority: 54% of the defects we catalog are somewhere else on the body. Faces, at 3%, are close to solved, which is not where most people expect the difficulty to sit.

So what should you build from a distribution like that? Not a hand detector. A hand detector was exactly the wrong thing to build. It would have sailed more than half of our real defects straight into the chat, and every one of those images would have been sharp, well lit, correctly framed, and quietly wrong.

Here is what that looks like. These are three real images the gate rejected, with the region it flagged boxed in red. Nobody ever saw them in a chat.

A woman shaping a bowl on a pottery wheel. The boxed hand has six fingers.Six fingers
A woman sitting on a bed in a slip dress. The boxed region shows a third arm growing from her shoulder up into her hair.A third arm, off the same shoulder
A woman sitting on a bed looking at her phone. The boxed region shows a third shin and foot branching out of her knee.A third leg, sprouting from the knee
Three images the quality gate caught and threw away. The box is the region it flagged. The first is the failure everyone knows about. The second and third are the kind nobody has a name for, and they are the majority.

Look at the second and third for a moment longer than feels comfortable. Each is a whole extra limb, and the model has attached each one to a real joint: the arm grows off her shoulder, the leg branches out of her knee. That is what makes them insidious. A limb floating free in the frame would read as garbage instantly. These are grafted onto plausible anatomy, in perfect focus, correctly lit, casting the right shadows, so your eye accepts them for a second before it starts to object. Neither is funny. Neither has a name. And if we had built the gate everyone builds, the one that goes looking for bad hands, both of these would have arrived in somebody's chat.

What we tried first, and why it failed

The obvious move is to build nothing and borrow a detector that already exists.

We tested several off-the-shelf artifact detectors, one after another, purpose-built and well regarded, each with a published benchmark it did well on. Run against our images at the specificity we need, they did not merely underperform. The best of them did not fire at all: it flagged none of the non-hand defects we put in front of it, not one broken arm or warped leg that a human had already marked. A detector that scores well on its own benchmark and scores zero on your pictures is not a detector you tuned wrong. It is a detector that is not looking at your problem.

The same brittleness is well documented in the neighboring problem of telling AI images apart from real ones: a 2024 preprint measured detectors falling from roughly 97% accuracy on the generator they were trained against to between 17% and 27% on generators they had never seen (arXiv, 2024). That is a different task from spotting a broken elbow, so we take it as a warning rather than a proof. But the warning matched what we were seeing on our own screens, and the mechanism is the same one: a borrowed detector has not learned what a broken body looks like, it has learned the particular images it was shown, and those were somebody else's images, not ours.

Next we tried a hand-tracking model, which failed twice over. The narrow failure is that a hand tracker only answers questions about hands, so by construction it is blind to 54% of our defects. It could not see a backwards elbow if you circled it in red. The subtler failure is that it was not reliable even on hands: a tracker exists to find a hand and fit a skeleton to it, and it is remarkably willing to do exactly that. Show it a mangled six-fingered claw and it returns a tidy five-finger skeleton, because fitting a plausible hand to ambiguous pixels is its entire job. The tool was optimistic by design, and we needed something pessimistic that looked at the whole body.

Then we stood up a big general-purpose model and asked it, image by image, whether the anatomy was correct. That one genuinely worked, and it is the one that became the problem. Scored against human labels, it caught 34.6% of broken images at 97% specificity. Respectable, and enough to ship behind. It also took roughly 35 seconds per image, which in a live chat is not a check, it is a stall.

How does the quality gate work now?

So we trained our own. A quality gate is an automated check that sits between the model that makes an image and the person who would receive it: it scores the image, decides pass or fail, and discards what fails. Ours is a single model, trained on our own pictures, the ones we labeled broken and the ones we approved. It is not a hand model or a set of per-part checks stapled together. It looks at a whole person and answers one question. Broken anatomy is broken anatomy, wherever it turns up.

Cross-validated it reaches an AUC of 0.859, and scored against the same human labels it catches 40.6% of broken images at 97% specificity, against the borrowed fallback's 34.6%. (The chart further down tracks how it got there.)

For a long time both of those models ran, and that is the part worth telling. Ours started life as only the first stage: a fast filter up front, with the slow general-purpose model kept behind it as a fallback for every image the first stage was unsure about. That hedge is the natural design, and it is a trap. The cases you are least confident about are exactly the ones that then take the longest, so the worst latency lands on the hardest images, which are the ones a person is waiting on. The fallback was not a backstop. It was a 35-second tax we paid whenever the gate got nervous.

Then the first stage passed the second. On the same images, at the same 97% specificity, our model caught 40.6% of the broken ones against the fallback's 34.6%. The stage we had kept as insurance was now the weaker judge, and it was still charging 35 seconds a photo to say so.

To be precise about what that does and does not prove: two detectors with different blind spots can still be worth more together than either alone, and a slower second opinion can earn its keep by catching what the first one misses. We could have kept it on those grounds. We did not, because 35 seconds is not a second opinion in a live chat, it is a person watching a typing indicator and deciding to close the app. The deletion is a latency decision that our model's accuracy made easy, not the other way around. So we deleted it. There is one model now, and it decides.

What does the gate actually reject?

A gate is a trade, and the trade is worth stating plainly rather than hiding behind one flattering number. Every check that throws away broken photos will sometimes throw away a good one, and the two errors do not cost the same.

What it meansWhere we run it
SpecificityHow often a good photo passes untouched99%
PrecisionWhen the gate rejects a photo, how often it was right to89%
RecallHow much of the broken output it catchesTraded away for the two above
LatencyWhat the check costs per imageUnder a second

Those first two numbers are the ones we optimize, and the third is what they cost. At 99% specificity roughly one good photo in a hundred is discarded and quietly remade, and when the gate does reject something it is right to about nine times in ten. Recall is what pays for that. We could catch more broken images tomorrow by lowering the bar, and we would also start throwing away photos that were fine.

That trade is not obvious, so here is the reasoning. A missed defect costs you one bad photo. An over-eager gate costs you the photo you asked for, silently, over and over, and a chat where her camera keeps mysteriously failing is its own kind of broken. Between a system that occasionally lets something through and one that constantly interrupts, we would rather build the first and put our effort further upstream, into not generating the defect at all.

The mechanics around it are simple:

  • Every generated image is scored before it is ever attached to a message.
  • A failing image is discarded, and the shot is regenerated once, with a simplified pose.
  • If that retry also fails, the photo is dropped rather than delivered. She moves on and talks about something else.
  • Rejected images are kept and labeled. Every failure becomes training data for the next version.

That third bullet is the one most systems get wrong. There is no third attempt that shrugs and delivers the broken shot anyway: when the gate catches a defect, that image does not reach you. What the gate does not catch is a different matter, and we say so in the FAQ below rather than pretend the number is 100%.

What actually moved the needle?

Here is the honest version of the climb, version by version.

How the gate improved: recall at 97% specificity, by versionPretrained detectorthe off-the-shelf model, untouched: our starting point0%Frozen-feature probeits features reused, but scored by a layer we trained21%First trained scorerthe first version trained on our own labels28%Tuned scorersame data, better tuning: the smallest jump on the chart30.1%Improved backbonepasses the retired fallback's 34.6% here35.6%Current modelwhat runs today40.6%
Untolds, cross-validated recall at 97% specificity across successive versions of the gate. The retired fallback scored 34.6%. July 2026.

Resist the temptation to read that as a clean ablation, because it is not one, and we would be flattering ourselves to present it as one. Each version changed both the data and the way the model represents an image, so no single bar isolates a cause. What the trajectory shows is the two working together: labels alone, scored by a weak representation, stall in the twenties, and a better representation with nothing to learn from would have stalled at zero.

That first pair of bars is the clearest thing on the chart. The same off-the-shelf model that caught nothing at 0% becomes a 21% detector the moment we stop asking it for a verdict and instead reuse its raw features under a scoring layer trained on our images. The model was never useless. Its judgment was, because its judgment was formed on somebody else's pictures.

The tuning step is the other honest lesson, in the opposite direction. Going from 28% to 30.1% is the payoff from a careful sweep of the knobs, and it is the smallest jump on the chart. Whenever we were tempted to tune our way out of a problem, that is roughly what it bought us.

We also learned that label quality outranks label volume, the hard way. At one point we grew the labeled set by roughly 40% and recall got worse, because the new boxes were drawn almost twice as large on average, and a sloppy box teaches the model that half the photo is the problem. Tightening them recovered it. More data helped only once the data was good.

The last thing that moved the needle is not detection at all. Prompt prevention means describing a scene without ever naming the parts most likely to break. The surest way to get a bad hand out of a diffusion model is to ask for one, and the same holds for any part you make the subject of a sentence: name it and the model has to compose it front and center, at whatever scale the phrasing implies, which is precisely the job it is worst at. So we do not name them. We describe the scene, the mood, the pose, the light, and let the body follow from the pose rather than from the words. For example, rather than asking for a photo of her holding a coffee cup near her face, we describe her leaning on the kitchen counter mid-morning with coffee, and let the pose carry the rest. The body is all still there. It was simply never made the point. Detection is the safety net; prevention is the strategy, and the gate exists for the cases where the strategy does not hold.

Frequently asked questions

What is an image quality gate?

An image quality gate is an automated check that sits between the model that generates an image and the person who would receive it. It scores the image, decides pass or fail, and discards anything that fails so it is regenerated instead of delivered. On Untolds it runs on every photo, judges the whole body, and adds under a second before that photo is attached to a message.

Does the gate only look for bad hands?

No, and that is the point of it. It evaluates anatomy anywhere in the frame: arms, legs, joints, torso, hands. Hands are the most frequent failure we catalog, at 46% of labeled defects, but the other 54% are everywhere else on the body. A hands-only check would be blind to most of the catalog.

Does it catch every broken photo?

No, and we will not pretend otherwise. It catches 40.6% of them at 97% specificity, which is better than every alternative we tested and is not 100%. A gate is a net, not a wall. We tune it precision-first, so it rarely throws away a good photo, and we accept that some defects get past it. Prevention, further up the pipeline, is what keeps that number of defects small in the first place.

What happens when the gate rejects a good photo?

It is rare, by design, and the answer is nothing visible. The image is regenerated, so the only cost is a few extra seconds before the photo lands. We accept that trade deliberately: a good photo arriving late is a small tax, while a defect arriving on time is the thing that breaks the moment entirely.

Why not repair the broken part instead of regenerating?

Repairing a region in place is possible, and useful when the rest of a photo is excellent. In our experience a regenerated shot usually beats a patched one, because a broken part is often a symptom that the pose itself confused the model. Fixing the symptom leaves the cause, and the cause tends to resurface elsewhere in the frame.

What we would tell the next team

Catalog your own failures first, and read the distribution honestly rather than for the headline: ours has a famous 46% at the top and a decisive 54% underneath it, and a gate built for the headline would have missed most of the work. Train on your own images, because nobody else's detector has ever seen the pictures your model makes. Spend at least as much effort on not asking for the broken thing as on catching it afterwards. And be willing to delete a stage you added as insurance, even one that works, when it stops paying for what it costs.

The reason any of it matters is small and specific. She sends you a photo, you look at it, and nothing in it pulls you out. Not the hand, not the elbow, not the thing you could not name but would have felt. If you want to see where it landed, meet the girls and let one of them send you something.

Written and reviewed by the Untolds engineering and editorial team, who built and measured the gate described here. Every figure is measured on our own pipeline as of July 2026, and it will move as the model does: we update this post when it does. More on how we build Untolds.

Untolds Editorial

Sources

  • BBC Science Focus, Why AI-generated hands are the stuff of nightmares, explained by a scientist (Peter Bentley, University College London). Retrieved 2026-07-13. sciencefocus.com
  • Sensors (peer-reviewed, via NIH/PMC), review of hand pose estimation challenges, 2019. Retrieved 2026-07-13. pmc.ncbi.nlm.nih.gov
  • arXiv preprint, on the generalization failure of AI-image detectors across unseen generators, 2024. Retrieved 2026-07-13. arxiv.org
  • Untolds internal measurement, July 2026: defect distribution from human-drawn boxes on flagged images; detection rates are recall at 97% specificity, scored against the same human labels for every model compared.
Share this post
Ada, mid-thread
Free gift
+3

She's already texting back.

Make your account here and this 6-piece set from Ada is yours, free.

Try 3 days free
Continue reading