MIDLINETry your photo ↗

PHOTO EXPERIMENT / 20 OCTOBER 2026

Check face symmetry.
Change the input. See what moves.

One base photo. Nine conditions. Three runs each. The baseline scored 98.0; across all conditions the overall score ranged from 97.5 to 98.1.

Mirroring changed the overall score from 98.0 to 97.9, while the mouth score changed from 97.1 to 95.3. A small overall difference can hide a larger feature difference in this image.

Check your own photo ↗

These are observations from one photo, not accuracy estimates, beauty ratings or population thresholds.

Original NASA astronaut portrait used as the single base photoBaseline · 98.0
The exact same portrait mirrored horizontallyMirrored · 97.9
Same source image; only the horizontal flip differs in this pair. Portrait: NASA, via scikit-image.

THE EXPERIMENT IN THREE FIGURES

Read the total. Then read the features.

Bar chart showing all nine observed overall scores from zero to one hundred
Figure 1. Overall scores on a full 0–100 scale. All three repeats of each condition matched at one decimal.
Original and mirrored scores for five features with their point differences
Figure 2. Feature differences after mirroring. Change = mirrored displayed score minus original displayed score.
Method summary: one base photo, nine conditions, three repeats and no population claims
Figure 3. Study design and scope. Repeats do not increase the number of independent people.

What changed, and by how much?

All three repeats within every condition returned the same displayed overall and feature scores, rounded to one decimal. Repeating a file in this session was stable; changing its pixels was not score-invariant.

  • Rotation: −10° returned 97.9; +10° returned 98.1, versus 98.0 at baseline.
  • JPEG quality settings 90, 50 and 20 returned 97.9, 97.7 and 97.5 respectively. These are encoder settings, not compression percentages.
  • Removing 26 or 51 pixels from each edge, without resizing, returned 97.6 and 97.9 respectively.
  • Horizontal mirroring returned 97.9. Mouth changed by −1.8 score points: 95.3 − 97.1.

The overall observed span is 0.6 score points: max(98.0, 97.9, 98.1, 97.9, 97.7, 97.5, 97.6, 97.9, 97.9) − min(the same nine values). Inputs come from the three-repeat tables below. Differences use displayed rounded scores.

Baseline

Overall score in bold; five feature scores underneath. All values are displayed scores out of 100.
Input conditionRun 1Run 2Run 3
Original decoded RGB pixels, lossless PNG, 512 x 512
Input image
98.0Eyes 98.0 · Eyebrows 98.2 · Nose 98.2 · Mouth 97.1 · Jaw 98.698.0Eyes 98.0 · Eyebrows 98.2 · Nose 98.2 · Mouth 97.1 · Jaw 98.698.0Eyes 98.0 · Eyebrows 98.2 · Nose 98.2 · Mouth 97.1 · Jaw 98.6

Rotation

Overall score in bold; five feature scores underneath. All values are displayed scores out of 100.
Input conditionRun 1Run 2Run 3
-10 degrees image-plane rotation; Pillow bicubic; fixed 512 x 512 canvas; white fill
Input image
97.9Eyes 97.6 · Eyebrows 97.0 · Nose 98.2 · Mouth 98.7 · Jaw 97.997.9Eyes 97.6 · Eyebrows 97.0 · Nose 98.2 · Mouth 98.7 · Jaw 97.997.9Eyes 97.6 · Eyebrows 97.0 · Nose 98.2 · Mouth 98.7 · Jaw 97.9
+10 degrees image-plane rotation; Pillow bicubic; fixed 512 x 512 canvas; white fill
Input image
98.1Eyes 99.1 · Eyebrows 98.9 · Nose 97.8 · Mouth 96.2 · Jaw 98.498.1Eyes 99.1 · Eyebrows 98.9 · Nose 97.8 · Mouth 96.2 · Jaw 98.498.1Eyes 99.1 · Eyebrows 98.9 · Nose 97.8 · Mouth 96.2 · Jaw 98.4

JPEG encoding

Overall score in bold; five feature scores underneath. All values are displayed scores out of 100.
Input conditionRun 1Run 2Run 3
JPEG quality=90; subsampling=2; 512 x 512; no resize
Input image
97.9Eyes 98.1 · Eyebrows 98.3 · Nose 98.2 · Mouth 96.5 · Jaw 98.297.9Eyes 98.1 · Eyebrows 98.3 · Nose 98.2 · Mouth 96.5 · Jaw 98.297.9Eyes 98.1 · Eyebrows 98.3 · Nose 98.2 · Mouth 96.5 · Jaw 98.2
JPEG quality=50; subsampling=2; 512 x 512; no resize
Input image
97.7Eyes 97.7 · Eyebrows 97.8 · Nose 98.5 · Mouth 96.7 · Jaw 97.697.7Eyes 97.7 · Eyebrows 97.8 · Nose 98.5 · Mouth 96.7 · Jaw 97.697.7Eyes 97.7 · Eyebrows 97.8 · Nose 98.5 · Mouth 96.7 · Jaw 97.6
JPEG quality=20; subsampling=2; 512 x 512; no resize
Input image
97.5Eyes 98.6 · Eyebrows 98.7 · Nose 97.1 · Mouth 96.4 · Jaw 96.997.5Eyes 98.6 · Eyebrows 98.7 · Nose 97.1 · Mouth 96.4 · Jaw 96.997.5Eyes 98.6 · Eyebrows 98.7 · Nose 97.1 · Mouth 96.4 · Jaw 96.9

Crop

Overall score in bold; five feature scores underneath. All values are displayed scores out of 100.
Input conditionRun 1Run 2Run 3
Centered crop box=(26, 26, 486, 486); no resize; lossless PNG
Input image
97.6Eyes 97.5 · Eyebrows 98.1 · Nose 98.3 · Mouth 96.3 · Jaw 97.697.6Eyes 97.5 · Eyebrows 98.1 · Nose 98.3 · Mouth 96.3 · Jaw 97.697.6Eyes 97.5 · Eyebrows 98.1 · Nose 98.3 · Mouth 96.3 · Jaw 97.6
Centered crop box=(51, 51, 461, 461); no resize; lossless PNG
Input image
97.9Eyes 98.0 · Eyebrows 98.1 · Nose 98.5 · Mouth 96.1 · Jaw 98.697.9Eyes 98.0 · Eyebrows 98.1 · Nose 98.5 · Mouth 96.1 · Jaw 98.697.9Eyes 98.0 · Eyebrows 98.1 · Nose 98.5 · Mouth 96.1 · Jaw 98.6

Horizontal flip

Overall score in bold; five feature scores underneath. All values are displayed scores out of 100.
Input conditionRun 1Run 2Run 3
Horizontal reflection only; lossless PNG; 512 x 512
Input image
97.9Eyes 98.8 · Eyebrows 99.5 · Nose 98.2 · Mouth 95.3 · Jaw 97.797.9Eyes 98.8 · Eyebrows 99.5 · Nose 98.2 · Mouth 95.3 · Jaw 97.797.9Eyes 98.8 · Eyebrows 99.5 · Nose 98.2 · Mouth 95.3 · Jaw 97.7

Reproduce the inputs and the measurement

We used one public-domain NASA portrait of astronaut Eileen Collins from scikit-image’s astronaut dataset. Original source file. There is one person and one base photo; the 27 runs are repeated measurements, not 27 independent samples.

Python with Pillow 12.3.0 decoded the original into RGB. The baseline is a lossless 512 × 512 PNG. Rotations use bicubic resampling, a fixed 512 × 512 canvas, no expansion and white fill. Positive rotation is counterclockwise. JPEG uses chroma subsampling 2, optimize=False, with no resize. Crops use pixel boxes (26,26,486,486) and (51,51,461,461), yielding 460 × 460 and 410 × 410 files. The flip changes only left/right orientation.

We uploaded each exact file three times through the production tool on 20 October 2026, in one desktop Chromium in-app browser session on Windows. The detector was reused between runs. Each upload completed with “Analysis complete.” We recorded the rendered overall and five feature scores, not invented landmarks or a replacement calculation.

The tool uses MediaPipe Tasks Vision 0.10.32, Face Landmarker float16 revision 1, IMAGE mode and CPU WebAssembly. Its published geometric scoring method reflects landmark pairs about a fitted midline and averages five feature scores equally. It is not clinically validated.

Exact files, hashes and observation log

Input manifest and SHA-256 hashes · All 27 recorded observations · Input-generation script

Original source SHA-256: 88431cd9653ccd539741b555fb0a46b61558b301d4110412b5bc28b5e3ea6cb5

Measured app.js SHA-256: 77d72d141ecbc422846807d6e6ceadc79aaca23720ff0b30572434223b7bd835

To regenerate, place the original file at qa/astronaut.png in a project folder and run the supplied script from qa/. The script writes variants to qa/experiment-2026-10-20/. Upload each file separately three times to the tool and compare the displayed values. Other browser/model versions may differ.

WATCH THE EXPERIMENT

The same evidence, explained.

English synthetic narration. The measurements come from our recorded browser runs; the narration does not add new findings.

Read the complete video transcript

This is My Face Symmetry. We tested one public domain astronaut portrait under nine input conditions, three times each. The original scored ninety eight point zero. Across all conditions, overall scores ranged from ninety seven point five to ninety eight point one. Rotation, JPEG encoding, cropping, and a horizontal flip changed the input pixels. Every value shown here comes from an actual run of our browser tool. These are scores out of one hundred, not probabilities.

Look beyond the overall number. Mirroring changed the overall score from ninety eight point zero to ninety seven point nine. But the mouth score changed from ninety seven point one to ninety five point three: a difference of minus one point eight score points. The eyebrows moved from ninety eight point two to ninety nine point five. A small total change can hide larger feature changes in this photo. It does not tell us why the model moved those points.

This experiment has one person and one base photo. Twenty seven repeated measurements are not twenty seven independent people. Each condition returned matching displayed values across its three runs in one browser session. That does not establish a universal normal range, clinical accuracy, beauty, or cross device equivalence. The full inputs, settings, file hashes, and observation tables are at my face symmetry dot com, slash check dash face dash symmetry. The narration is synthetic; the experiment data is real.

DIRECT ANSWERS

Questions this experiment can answer

Did the same file return the same score?

Yes, at the displayed one-decimal precision, in these three repeats per file within one session. We have not yet tested whether reloading or changing browsers changes repeatability.

Does a mirrored photo give the same result?

Not for this measured input: the total changed from 98.0 to 97.9, and the mouth score from 97.1 to 95.3. That is an observation about this file and implementation, not a rule for every face.

Does a small overall change mean every feature stayed stable?

No in this example: the mirrored total moved by −0.1 points (97.9 − 98.0) while the mouth moved by −1.8 points (95.3 − 97.1). The five feature scores provide context that the average hides.

What this experiment can tell you

For this photo and this implementation, input processing affected some feature scores more than the overall score. Keep the exact input file and compare feature scores alongside the total when repeating your own measurement.

This is not a test of changes in a real face. Image-plane rotation does not simulate turning a head in three dimensions. Cropping also changes the detector’s relative view of the face; rotation includes resampling and canvas fill. We cannot isolate the model’s internal cause from these outputs.

One portrait cannot establish typical error, an acceptable rotation angle, an asymmetry threshold, cross-device equivalence or a relationship between symmetry and attractiveness. Identical one-decimal repeats do not establish identical underlying coordinates.

Return to the on-device photo test.