Methodology · version 2026.08-r1

How every numberis made.

This page is the specification. If a value in a report can't be traced to a row here, that's a bug. Each report is stamped with this version and a SHA-256 fingerprint of its result.

1. Pipeline

01
Capture gatePose from the transformation matrix, distance from EXIF + IOD, expression from blendshapes, blur, exposure.
02
478 landmarksMediaPipe Face Landmarker, CPU delegate, self-hosted. Rounded to 0.01 px. Nothing leaves the browser.
03
LevelRotate so the interpupillary line is horizontal.
04
MeasureRatios of distances and angles between named landmarks. No millimetres.
05
Propagate σPer-landmark error → every distance, ratio and angle. Reported as ±1σ.
06
Comparez and percentile against the population and norms you chose.
07
SkinsRGB → CIE L*a*b*, regions from landmark hulls.
08
MorphProcrustes-aligned canonical mesh, α-blend, piecewise-affine warp.
09
WriteDeterministic templates keyed on the z-band. No language model.
Capture gate thresholds
Yaw
≤ 7° pass · ≤ 22° warn · reject
Pitch
≤ 10° · ≤ 25°
Roll
≤ 4° · ≤ 15° (corrected mathematically)
Inter-pupil px
≥ 60
Distance
warn < 70 cm
Expression
smile > 0.55 · jaw > 0.4 · blink > 0.6 → reject

Camera distance is estimated from IOD in pixels and the EXIF 35 mm-equivalent focal length assuming population-mean IOD ≈ 62 mm; below 70 cm we warn, citing Ward 2018 (≈30% nasal-base widening at 12″) and Derakhshan 2024 (12–19% midface stretch). Sharpness is the Laplacian variance of a 256 px face crop; exposure is the fraction of clipped face pixels.

2. Uncertainty

σ per landmark coordinate = 0.0396 × IOD px (Kartynnik 2019). Well-defined points (canthi, iris centres, lip midline, mouth corners, subnasale, nose tip, alar edges, lid margins) get 0.5σ; nasion and sublabiale 0.75σ; silhouette points (zygion-ish, gonion-ish, menton, mesh top, brow) the full σ.

σ(distance) = √(σa² + σb²)
σ(a / b) = (a / b) · √((σa / a)² + (σb / b)²)
σ(angle over baseline L) = σ · √2 / L
Why the intervals are the size they are

Each metric also has a floor (ci_floor) reflecting landmark-definition ambiguity (e.g. canthal tilt ±3°). Ratios of paired facial measures are positively correlated, and independence is assumed, so the intervals are conservative by construction. The published landmark error is dominated by loosely-defined cheek and forehead vertices — which is why silhouette-based metrics (jaw, face width) are Tier B and canthal metrics are Tier A.

3. Metric table

MetricTierFormulaCI floorPrimary references
Intercanthal distance : palpebral fissure length
Eyes
Tier Adist(en_R, en_L) / mean(dist(en_R, ex_R), dist(en_L, ex_L))0.03Farkas, Hreczko, Kolar & Munro; Farkas, Katic & Forrest; Jayaratne, Deutsch, McGrath & Zwahlen; Al-Sebaei
Alar base width : intercanthal distance
Nose
Tier AalarWidth / dist(en_R, en_L)0.03Farkas, Hreczko, Kolar & Munro; Farkas, Katic & Forrest; Al-Sebaei; Ward, Ward, Fried & Paskhover
Mouth width : alar base width
Lips
Tier Adist(ch_R, ch_L) / alarWidth0.04Farkas, Hreczko, Kolar & Munro; Jayaratne, Deutsch, McGrath & Zwahlen; Farkas, Katic & Forrest
Upper : lower vermilion height
Lips
Tier Adist(ls, sto_upper) / dist(sto_lower, li)0.06Kar, Muluk, Bafaqeeh & Cingi; Farkas, Katic & Forrest
Philtrum length : chin height
Lower face
Tier Adist(sn, ls) / dist(sl, me)0.04Farkas, Katic & Forrest
Palpebral fissure height : length
Eyes
Tier Amean over eyes of dist(upperLid, lowerLid) / dist(en, ex)0.03Farkas, Katic & Forrest; Kartynnik, Ablavatski, Grishchenko & Grundmann
Morphological face height : bizygomatic width
Whole face
Tier Adist(n, me) / dist(zy_R, zy_L)0.03Farkas, Katic & Forrest; Lim, Abdul Shakor & Shaharudin
Bizygomatic width : physiognomic face height
Whole face
Tier Adist(zy_R, zy_L) / dist(tr, me)0.03Farkas, Katic & Forrest
Facial thirds
Whole face
Tier A[dist(tr,g), dist(g,sn), dist(sn,me)] / dist(tr,me)1Farkas, Hreczko, Kolar & Munro; Jayaratne, Deutsch, McGrath & Zwahlen; Al-Sebaei; Khoshab et al.
Facial fifths
Whole face
Tier A[dist(zy_R,ex_R), dist(ex_R,en_R), dist(en_R,en_L), dist(en_L,ex_L), dist(ex_L,zy_L)] / dist(zy_R,zy_L)1Farkas, Hreczko, Kolar & Munro; Jayaratne, Deutsch, McGrath & Zwahlen
Oral commissure tilt
Lips
Tier Aatan2(mean(ch.y) − sto.y, mouthWidth/2) relative to IPD line1.5Kartynnik, Ablavatski, Grishchenko & Grundmann
Canthal tilt
Eyes
Tier Bmean over eyes of atan2(en.y − ex.y, |ex.x − en.x|), after rotating so the interpupillary line is horizontal3Clinical norm: lateral canthus sits ~2–4 mm superior to the medial canthus; Kartynnik, Ablavatski, Grishchenko & Grundmann
Brow apex position
Eyes
Tier B(apex.x − en.x) / (ex.x − en.x), averaged over both brows0.06Clinical norm: lateral canthus sits ~2–4 mm superior to the medial canthus
Bigonial : bizygomatic width
Jaw
Tier Bdist(go_R, go_L) / dist(zy_R, zy_L)0.04Farkas, Katic & Forrest; Lim, Abdul Shakor & Shaharudin
Nasal index
Nose
Tier B100 × alarWidth / dist(n, sn)3Nasal index classification; Farkas, Katic & Forrest; Ward, Ward, Fried & Paskhover
Bilateral asymmetry index
Whole face
Tier Bmean_i |p_i − reflect(p_partner(i))| / IPD × 100, midline fitted through midline landmarks0.8Lee, Li, Rafiee, Jones & Shiramizu; Kartynnik, Ablavatski, Grishchenko & Grundmann
Eye–mouth distance : face length (Pallett)
Whole face
Tier Bdist(eyeLine, sto) / dist(tr, me)0.02Pallett, Link & Lee
Interpupillary distance : face width (Pallett)
Eyes
Tier Bdist(iris_R, iris_L) / dist(zy_R, zy_L)0.02Pallett, Link & Lee; Lim, Abdul Shakor & Shaharudin
Redness (a* proxy)
Skin
Skinpixel analysis
Under-eye darkness (ΔL*)
Skin
Skinpixel analysisSano & Kawabata
Local texture (pore / fine-line proxy)
Skin
Skinpixel analysis
Discrete red/dark spots (count by region)
Skin
Skinpixel analysis
Tone uniformity across regions
Skin
Skinpixel analysis
Specular highlight fraction (T-zone)
Skin
Skinpixel analysis

4. Norm provenance

Reference means and SDs are transcribed from the young-adult tables of Farkas et al. (1994; 2005 international study, 1,470 subjects, 25 groups), Jayaratne et al. 2012 (Southern Chinese, n=103, 3D), Al-Sebaei 2015 (Saudi, n=168), and metric-specific sources listed per page.

Provisional flag

Values shown with prov. have not yet been audited line-by-line against the primary printed tables. They are close, cited, and marked. The base table lives in scripts/gen-metrics.mjs.

How the pooled population is built

Ratios are derived from a single base table of linear measures so every derived value is internally consistent. The pooled population is an unweighted average across the six groups with between-group spread folded into its SD — wide by construction.

5. Why "ideal ranges" are not shown

Orbital canon · NA White
~41% fit
Thirds & orbital · S. Chinese
0% fit
Orbital · Saudi
25–29% fit
27-study review
no group fits
Sources and what we do instead

Farkas 1985; Jayaratne 2012; Al-Sebaei 2015 (92% of Saudi men have a nose wider than ICD); Khoshab 2022 (PRISMA review of 27 studies across six ethnic categories: no ethnic/gender group consistently approximates the canons or the golden ratio). Canthion reports each canon as a descriptive check with its conformity statistic — never as a target.

6. Skin

Face crop at 512 px, sRGB → approximate CIE L*a*b* (D65), regions from convex hulls of landmark groups shrunk 15–20% to avoid edges.

Definitions
  • Redness = cheek/nose a* − forehead a*
  • Under-eye = infraorbital L* − mid-cheek L*
  • Texture = mean local σ of L* in 5×5 windows
  • Spots = connected components on a*/L* thresholds, size 6–300 px, aspect < 2.5
  • Uniformity = σ of regional mean L*
  • Shine = fraction of T-zone with L* > 92 and chroma < 12

Erythema is flagged unreliable when mean cheek L* < 45 (melanin dominates a*). All values are relative to this photo's lighting.

7. Morph

Similarity Procrustes alignment of MediaPipe's canonical face mesh to the user's 468 points; target = user + α·(canonical − user); piecewise-affine warp over the official 898-triangle tesselation plus a border ring. α is user-controlled, default 0.25, labelled literally. A symmetric generic face — not a population mean.

8. Protocol grading

A
randomized controlled trial(s)
B
consistent observational + mechanism
C
one small / uncontrolled study
D
no evidence and/or documented risk

Drawn from a fixed library by deterministic triggers on the findings. Two interventions reach grade A: daily broad-spectrum sunscreen (Hughes 2013, N=903, 4.5-year RCT) and topical tretinoin (Weiss 1988 and successors). Mewing is included at grade D so the report says, in writing, why it is not recommended.

Full library (18 items)
  • A Daily broad-spectrum sunscreen — source
  • A Topical retinoid (tretinoin) — evening — source
  • B Body composition and facial adiposity — source
  • B Sleep — source
  • B Camera distance, height and lens — for photos of you — source
  • A Sun avoidance and physical shade — source
  • C Brow grooming and hair framing
  • C Facial exercise — source
  • D Mewing / orthotropics — not recommended — source
  • D Chewing gum 'for jawline' — not recommended as a strategy
  • B Antioxidant / niacinamide serum (morning, under sunscreen)
  • B Barrier-repair moisturiser
  • B In-clinic options for texture and pigmentation (chemical peels, laser resurfacing, microneedling)
  • C In-clinic options for the under-eye (tear-trough filler, lower blepharoplasty)
  • info About surgical and injectable recommendations in general — source
  • A The two things that actually keep teeth white
  • B Peroxide whitening (strips, trays, dentist-supervised gel)
  • B In-clinic options for tooth colour, shape and alignment

9. Determinism

CPU inference is bit-stable on the same device; landmarks are rounded to 0.01 px; all downstream math is closed-form. Each report shows a SHA-256 fingerprint of the numeric result. "Re-run" re-detects from scratch and compares. Across devices, last-decimal differences are possible; the fingerprint is a same-device guarantee.

10. Known limits

11. Changelog