Facial maps

One map says what each part is. The other says what the parts form together.

They are two different documents, and confusing them is the most common mistake about facial reading. The first is the dictionary of facial movement; the second is the grammar that combines those movements. Here they sit side by side — and beside each one is what FROID's engine actually computes from it.

Clinical use notice: FROID performs no automated diagnosis and classifies no emotions. What the facial reading produces is a signal to support clinical listening, to be interpreted by the responsible professional alongside the session context — never in isolation.

The distinction

Two maps, two different questions

Both show the same face and use the same numbers — AU1, AU4, AU12. But they answer questions that do not substitute for each other.

Map 1 · Vocabulary

Complete map of the facial action units (FACS)

Question it answers: what is each possible facial movement, on its own?

Each Action Unit (AU) is a named muscle or muscle group with an observable movement and nothing more. AU4 is the lowering of the brows (corrugator, procerus). AU12 is the upward pull of the lip corners (zygomaticus major). These are dictionary entries: none of them means an emotion, just as no single word is a sentence.

See the map and the 16 AUs FROID computes →

Map 2 · Composition

Map of facial expressions and emotional matrices

Question it answers: which AU combinations does the FACS literature associate with each emotion and each dissonance?

Here the dictionary entries become sentences. AU6+AU12 is the Duchenne smile; AU23+AU24 is the lip compression of contained hostility; AU1+AU2+AU5 is the startle signature of fear. This is the grammar — and any reading comes from it, because the combination carries meaning the single part does not.

See the map and the 6 combinations FROID cross-references →

How the two fit together inside FROID. They act at different moments of the same second. First the face is converted into AU intensities — the vocabulary stage. Then the engine looks, among the active AUs, for the combinations it knows how to read — the composition stage. Together, the two stages produce at most a mark of dissonance in one of the 12 Perception Zones. At no point does FROID emit an emotion label — see What these maps do not claim.

Map 1 · The unit-by-unit explainer

What each action unit means

The Facial Action Coding System, by Paul Ekman and Wallace Friesen, decomposes facial movement into anatomical units. The map below is the full catalogue of those units — including the ones FROID does not compute. Click to enlarge.

Complete map of the facial action units (FACS): AU1 through AU28 located on a face, with the muscle responsible and the movement description for each, grouped by anatomical region.
Complete map of the facial action units (FACS). Reference catalogue of facial movement — 27 Action Units and their anatomical regions. It is a FACS document, not a product screen.

How an AU becomes a number inside FROID

The patient's browser runs the MediaPipe FaceLandmarker model (ARKit) on the local video and produces 52 blendshape coefficients — values from 0 to 1 describing facial deformations. Only those 52 numbers travel: no image, no video frame, and no facial landmark leaves the clinician's equipment.

On the server, each Action Unit is the simple mean of the blendshapes that compose it. When an AU has a left and a right counterpart, both sides are averaged to give the bilateral intensity. An AU counts as active from 0.30 upward.

The 16 Action Units FROID computes, and the blendshapes that compose each one.
AUFACS nameMuscleMovementBlendshapes that compose it
AU1Inner Brow RaiserFrontalis (pars medialis)Raising of the inner browsbrowInnerUp
AU2Outer Brow RaiserFrontalis (pars lateralis)Raising of the outer browsbrowOuterUpLeft · browOuterUpRight
AU4Brow LowererCorrugator, Depressor supercilii, ProcerusLowering and drawing together of the browsbrowDownLeft · browDownRight
AU5Upper Lid RaiserLevator palpebrae superiorisRaising of the upper eyelid, exposing the scleraeyeWideLeft · eyeWideRight
AU6Cheek RaiserOrbicularis oculi (pars orbitalis)Raising of the cheeks and crow's feetcheekSquintLeft · cheekSquintRight
AU7Lid TightenerOrbicularis oculi (pars palpebralis)Tightening of the eyelidseyeSquintLeft · eyeSquintRight
AU9Nose WrinklerLevator labii sup. alaeque nasiWrinkling of the nose and raising of the nostril wingsnoseSneerLeft · noseSneerRight
AU10Upper Lip RaiserLevator labii superiorisRaising of the upper lipmouthUpperUpLeft · mouthUpperUpRight
AU12Lip Corner PullerZygomaticus majorUpward pull of the lip corners (smile)mouthSmileLeft · mouthSmileRight
AU14DimplerBuccinatorLip corners drawn inward (dimples)mouthDimpleLeft · mouthDimpleRight
AU15Lip Corner DepressorDepressor anguli orisLowering of the lip cornersmouthFrownLeft · mouthFrownRight
AU17Chin RaiserMentalisRaising of the chin skinmouthShrugLower · mouthShrugUpper
AU20Lip StretcherRisorius + PlatysmaHorizontal stretching of the lipsmouthStretchLeft · mouthStretchRight
AU23Lip TightenerOrbicularis orisNarrowing and tensing of the lipsmouthRollLower · mouthRollUpper
AU24Lip PressorOrbicularis orisPressing of the lips against each othermouthPressLeft · mouthPressRight
AU26Jaw DropMasseter relaxationDropping of the jawjawOpen
Where the map goes beyond the engine

The catalogue has 27 units. FROID computes 16.

The remaining 11 appear on the map and are not computed: AU8, AU11, AU13, AU16, AU18, AU19, AU21, AU22, AU25, AU27, and AU28. Neither are the Action Descriptors (AD) — gaze direction, blink, head tilt and rotation. The reason is the same in every case: MediaPipe's 52-blendshape set exposes no coefficient corresponding to those units with sufficient fidelity, and deriving them by approximation would produce a number where no measurement took place.

Four of the 16 computed — AU9, AU17, AU20, and AU26 — are measured every frame and today enter no composition rule. They exist in the computation and have no reader yet. It is recorded here because the alternative would be for this page to suggest that every computed AU takes part in the reading, and it does not.

Map 2 · The composition explainer

How the units combine — and which combinations FROID cross-references

A single AU sustains no reading. What sustains one is co-occurrence: which units appear together, at what intensity, and whether they appear on both sides of the face or on only one. Click to enlarge.

Map of facial expressions and emotional matrices: seven universal emotions with the Action Unit combinations that compose them, and four patterns of subconscious dissonance.
Map of facial expressions and emotional matrices. A FACS reference chart: the AU combinations the literature associates with each universal emotion and with dissonance patterns. It is a reference chart, not the engine's output — what FROID cross-references today is in the table below.

What FROID cross-references during a session

At each facial reading, the engine checks the active AUs against six composition rules. Every rule that fires marks facial dissonance in one of the 12 Perception Zones and writes, on the professional's screen, which AUs fired it and what that pattern describes. Dissonance has a precise meaning here: the face contradicting or masking the affect — the co-occurrence of units that should not be together.

ZoneRequired combinationPattern FROID records
Zone 3 AU15 and AU12 Masked sadness — depression of the lip corners under an effort to smile: negative affect covered over. Zone 3 — Sadness vs. Inner Peace
Zone 6 AU14 active with asymmetry ≥ 0.25, or AU10 active with an asymmetric smile (AU12) ≥ 0.25 Contempt — unilateral facial expression: masked affective distancing. It is the engine's only reading that depends on one side of the face differing from the other. Zone 6 — Conditional vs. Unconditional Love
Zone 7 AU12 and (AU23 or AU24) Aversion suppression — a social smile laid over involuntary lip compression: the face masks hostility. Zone 7 — Anger vs. Acceptance of Change
Zone 8 AU1 and AU2 and AU5 Contained fear — the brow-and-eyelid startle signature during controlled speech. Zone 8 — Fear and Overload vs. Accountability
Zone 9 AU23 and AU24 and global expressivity < 0.20 Expressive suppression — pressed, tense lips on a flattened face: holding back what would be said. Zone 9 — Suppressed Emotional Expression vs. Adequate Self-Expression
Zone 12 AU4 and AU7 Internal conflict — contracted brows with tensed eyelids: incongruence between speech and state. Zone 12 — Conflicting vs. Congruent Beliefs and Actions

"Active" means intensity ≥ 0.30. The global expressivity in Zone 9 is the mean intensity of AU1, AU2, AU5, AU6, AU12, and AU15 — the emotional AUs. AU26 (jaw drop) is deliberately excluded from that mean because it is driven by speech, not emotion: including it inflated expressivity during talking and masked restraint exactly when it matters most.

Facial engine constants

AU_ACTIVE_THRESHOLD = 0.30 # minimum intensity to count as "active" AU_ASYMMETRY_THRESHOLD = 0.25 # |left − right| for unilateral global expressivity = mean(AU1, AU2, AU5, AU6, AU12, AU15)

Both thresholds are FROID product parameters, chosen as a conservative presence band over the 0–1 scale of ARKit blendshapes — they are not constants published in the FACS literature. Treat them as calibratable engineering heuristics.

Rule intensity and tie-breaking

The intensity assigned to a dissonance is the minimum among the AUs that compose it (the weakest one bounds the evidence); in Zone 6, the maximum between AU14 and AU10. When two rules compete for the same zone in the same frame, the higher intensity prevails — a zone holds one pattern only. The intensity is internal: it serves that prioritization and is not published in the payload, which exposes the active AUs, the pattern text, and the provenance.

Only measurement gets in

facs_source = "real_facs" if AUs exist facs_source = "sem_apuracao" if no face was measured

No blendshapes, no AU; no AU, no facial dissonance — and the facial fields come out null with the provenance declared. There is no simulated mode: the generator was removed on 2026-09-03, and absence of measurement never becomes a number.

Implementation in froid-server/froid_facs.py (conversion and rules) and froid-dashboard/src/lib/froid-face.ts (browser capture).

The full chain

From face to reading, with no hidden step

Seven steps separate the patient's face from a mark on the professional's panel. None of them invents a value: where no measurement occurred, the chain stops and declares that it stopped.

1 · Capture

52 coefficients, in the browser

The model runs locally on the patient's video and produces the blendshapes. Only the coefficients are sent — image and video never leave the equipment.

2 · Vocabulary

52 blendshapes → 16 AUs

Simple mean per AU, left and right sides averaged, asymmetry kept separately for AU12 and AU14.

3 · Presence

Which AUs are active

Intensity ≥ 0.30. Below that the AU exists as a number and does not count as present — the threshold is there to discard involuntary micro-movement.

4 · Composition

The six rules

Active AUs are checked against the six combinations. Each firing marks facial dissonance in a Perception Zone.

5 · Cross with the voice

A multiplier of 2.5

In a marked zone, that zone's acoustic deviation is multiplied by 2.5. This is where — and only where — face and voice meet: the face does not generate a reading on its own, it weights the vocal reading.

6 · Temporal confirmation

2 of the last 3 cycles

A single-cycle spike does not become a record. Dissonance is only given as confirmed when it holds across 2 of the last 3 analysis cycles.

7 · What reaches the screen. For each marked zone, the professional receives the AUs that fired the rule and the pattern sentence ("a social smile laid over involuntary lip compression"), along with the provenance of the measurement. The full vector of 16 AU intensities is not displayed on any screen today — it is computed and travels in the payload, but no panel component renders it. Saying otherwise would promise a screen that does not exist.

The facial multiplier (M_fac), in the form that runs in production

zone_deviation = (vocal_energy − baseline) / baseline M_fac = 2.5 if facial dissonance in the zone, else 1.0 zone_score = zone_deviation × M_fac

Binary form — there is no continuous form implemented. The 2.5 value is a FROID product parameter, not derived from a published study.

Why the pure vocal deviation is kept apart

The dissonance engine receives the deviation without M_fac. Without that separation, a single facial event would fire both the facial marker and the extreme-zone marker at once — double-counting one signal, correlated by construction, inflating the confidence of the alert.

Capture cadence

The facial reading runs at about 3 frames per second by default (minimum interval of 150 ms). It is a cadence chosen so as not to compete with audio processing or with the video call, and it bounds what is observable: see What these maps do not claim.

Multiplier in froid-server/froid_core.py → calculate_multimodal_deviation(). Temporal confirmation in froid-server/froid_dissonance.py. The assembly of IDM and IPM is in Technology, Step 5.

The boundary

What these maps do not claim

A reference map shows what FACS describes. It is not an inventory of what this software does. Where the two diverge, what stands is what is written here.

Does not do

It does not classify emotion

The composition map lists seven universal emotions. FROID emits none of them as a result. There is no "happiness", "surprise", or "disgust" output anywhere in the product. What comes out is a dissonance mark per zone, with the AUs that produced it. The happiness, surprise, and disgust matrices are on the chart as FACS reference and have no corresponding rule in the engine.

Does not do

It does not model onset, apex, and offset

The three temporal phases of an expression — start, peak, and end — are a mature methodology in computer vision, and FROID does not implement them. There is no Markov model, no apex confidence, no AU duration. Each frame is evaluated on its own; the system's only temporal memory is the confirmation of dissonance across 2 of the last 3 cycles.

Does not do

It does not detect microexpressions

A microexpression lasts between 1/25 and 1/5 of a second. FROID's facial capture runs at about 3 frames per second — most of a microexpression fits between two frames. The cadence is an engineering choice, and this is its consequence: microexpressions are not an object of measurement in this system.

Does not do

It does not detect lying

Dissonance is the co-occurrence of facial units that rarely travel together, crossed with the acoustic deviation of the same zone. It is a signal for the professional to look at, not a verdict on sincerity. The classic Duchenne smile hypothesis (AU6 absent = forced smile) is contested by recent research — see Science, Pillar 4.

An honest reading of the chart

The chart's four dissonances, and what exists in the engine

The composition map highlights four patterns of subconscious dissonance. Set against the six implemented rules:

  • False smile / false calm (AU12 without AU6) — not implemented. The engine does not test for the absence of AU6.
  • Contained anger (AU23 + AU24) — implemented in Zone 9, with one condition the chart does not show: the face must also be globally flattened (expressivity < 0.20).
  • Masked sadness (AU1 + AU4 + AU15) — implemented in Zone 3 with a different composition: AU15 with AU12, that is, fallen corners under an effort to smile.
  • Absolute clinical risk (AU15 + AU20) — not implemented. AU20 is computed and no rule reads it.

The divergence is published rather than corrected in the figure because the chart is a FACS document with value of its own as a reference. What must not happen is a reader leaving here believing that each box on the map corresponds to a behavior of the software.

No face, no facial reading — and that is stated. If the camera is off, the model fails to load, or the browser does not support it, capture does not start and the system declares no measurement: the facial fields stay null, and both the screen and the report say no measurement took place. Absence of measurement never becomes zero, and zero is never presented as a measurement. See Ethics and Limits and Security.
See the full engine in Technology Glossary of terms