Inspiration
Face-rating apps and skin-score features hand millions of people a number, and the number feels like a measurement. You cannot argue a teenager out of a number with an essay. But you can measure the number itself — with better instruments than the free apps use.
What it does
TOLERANCE takes one selfie and analyses it with Perfect Corp's YouCam engines. Then it does the thing no beauty app does: it measures the measurement.
- The capture axis. One Image-to-Video call (1 unit) turns the selfie into 81 frames of the same person — plausible generated re-captures, seconds apart. We re-run the identical Skin Analysis on identically cropped sampled frames. On our first subject, oiliness moved 16.1 raw points between captures of the same unchanged skin. Cosmetic efficacy claims are advertised at about that size.
- The relight axis. AI Photo Lighting applied to the real file — a real operator, the cleaner evidence — moves redness 8.5 raw points on its own.
- The verdict. Every metric gets an error bar and a trust label:
trustworthy / borderline / noise / saturated. Saturated matters: a redness score pinned at exactly 100.0 on all four captures looks perfectly stable and is actually an estimator that has run out of range. - The canon axis. The same immutable facial ratios (Face Attribute & Ratio Analysis) are scored against four beauty canons — each labelled anthropometric, prescriptive, or vernacular, each with a real citation. One face: 98% by the internet's Symmetry Scorecard, 45% by the Rule of Fifths. 53 points of disagreement about a face that never moved.
- The advice. Follow the metrics that hold still on your photograph; ignore single readings of the ones that don't. Which is which differs face to face — we prove that with three synthetic subjects run through an identical pipeline.
How we built it
Five YouCam endpoints, run backwards — measurement as the object of study:
| endpoint | role | units |
|---|---|---|
| AI Skin Analysis | measure | 9 |
| Face Attribute & Ratio Analysis | measure | 10 |
| AI Photo Lighting | perturb the real file | 2 |
| Image-to-Video (81 frames) | re-capture | 1 |
| Text-to-Image | mint synthetic subjects | 1 |
The economics are the insight: on this price list, measurement is expensive and generation is cheap. One unit of video buys 81 plausible captures; the money goes on re-measuring them. That asymmetry is what makes "measure the measurement" affordable.
Next.js on Vercel; the gallery is fully pre-computed so judges explore everything at zero API cost. The live lane (judge key: one real run each) keeps the API key server-side, holds uploads in request memory only, and enforces a durable spend floor by reading the real account balance before any paid call — it fails closed. 30 tests, with real captured API responses as fixtures.
The honesty contract (also on the methodology page)
- Generated frames are labelled GENERATED in the UI; the capture axis is an upper bound on capture noise (the generator lets expression drift, and we show the frame where it does).
- No percentiles anywhere — we have no population distribution and inventing one is the exact sin the project exists to expose. We report conformance and a range.
- Canons ship citations: Farkas 1985 & 2000 (revised the neoclassical canons against real anthropometry); Jayaratne et al. 2012 (PLoS ONE): 0% of the measured sample met the facial-thirds canon.
- All subjects are synthetic (YouCam Text-to-Image). No real person is scored, in the product or the video.
- No attractiveness verdict is ever emitted; a score appears only beside its contradiction.
Challenges we ran into
- The published OpenAPI bundles disagree with the live V2 API in several places (face-attr-analysis rejects the documented request envelope; sod takes a flat src_file_id). We shipped the verified shapes with comments documenting the drift.
- Generated frames rendered faces too small for Skin Analysis (
error_src_face_too_small) — and the naive fix (cropping variants differently) would have contaminated the variance we report with our own preprocessing. Every variant now goes through one identical crop-and-scale before measurement. - A metric pinned at 100.0 across all captures initially classified as "trustworthy" (zero spread). That would have been exactly the overclaim we attack — we added saturation detection instead.
- Vercel's 60s function cap can't hold the 81-frame axis, so it is pre-computed in the gallery and the live lane runs the relight axis — and says so.
Accomplishments that we're proud of
The finding is real and reproducible: which of your scores you can trust is a property of your photograph, not of the app. Oiliness is noise on all three subjects; redness runs from unusable (saturated) to trustworthy (±2.2) depending on the face. That is a genuinely useful consumer answer — and an argument nobody else in the field is making with the sponsor's own instruments.
What we learned
An estimator without an error bar is not a measurement — and the YouCam price list quietly contains everything needed to compute one.
What's next for TOLERANCE
More variants per subject (tighter bounds), landmark-gated frame sampling to reject expression drift, and genuinely re-shot photographs of consenting subjects to replace the generated proxy for capture variance.
Built With
- colorimetry
- ffmpeg
- next.js
- perfect-corp
- playwright
- react
- tailwind
- typescript
- vercel
- vitest
- youcam-api
Log in or sign up for Devpost to join the conversation.