How We Verify Output Quality
If a passport photo is rejected, you lose money and time. So we ran our own pipeline through an end-to-end validation against the official specs published by five government authorities. This page documents what we measured, how we measured it, and what we found.
We picked the five countries because they account for the majority of our users: the United States, France, the United Kingdom, Germany, and Canada.
What we test
For each spec, we take a photo through our full pipeline (background removal, auto-crop, white composite, JPEG export at 300 DPI), then run an independent script that measures the output against the official specification. The script does not trust our own code — it re-detects the face from scratch using Google’s MediaPipe Face Landmarker and computes geometry from those landmarks.
Seven checks per output:
| Check | What it measures |
|---|---|
| Pixel dimensions | Exact width and height in pixels (e.g., 600×600 for US, 531×708 for UK) |
| DPI metadata | Output is tagged at 300 DPI for print correctness |
| Background uniformity | Four corners (40×40 px each) sampled; mean RGB ≥ 245, max channel std ≤ 8 |
| Face detection | A face is actually present in the output |
| Head height ratio | Head-top to chin distance, as a percentage of frame height, falls inside the official spec band |
| Eye-line position | Vertical position of the eye line from the bottom of the frame, as a percentage of frame height, falls inside the official spec band |
| Centering | Horizontal midpoint of the face is within 5% of the frame center |
We use three synthetic faces (generated by thispersondoesnotexist.com, no real people involved) so the test is reproducible and contains no personal data.
Results, by country
🇺🇸 United States — Passport (2×2 in / 600×600 px)
check_circle3/3 PASSSpec source: U.S. Department of State — Photo Requirements. Head height target 50–69%, eye line 56–69% from bottom.


🇹🇷 France — Passport / National ID (35×45 mm / 531×708 px)
check_circle3/3 PASSSpec source: service-public.fr — ID Photo Standards. Head height target 44–59%, eye line 50–64% from bottom.


🇬🇧 United Kingdom — Passport (35×45 mm / 531×708 px)
check_circle3/3 PASSSpec source: GOV.UK — Rules for Digital Photos. Head height target 44–59% (29–34 mm of the 45 mm photo), eye line 50–64% from bottom.


🇩🇪 Germany — Passport / Personalausweis (35×45 mm / 531×708 px)
check_circle3/3 PASSSpec source: Bundesdruckerei — Photo Template. Head height target 44–59%, eye line 50–64% from bottom.


🇨🇦 Canada — Passport (50×70 mm / 591×827 px)
check_circle3/3 PASSSpec source: Government of Canada — Photo Specifications. Head height target 46–57% (31–36 mm), eye line 52–64% from bottom.


Summary
Across 5 countries and 3 reference faces, all 105 individual checks passed: dimensions, DPI, background uniformity, face detection, head height, eye position, and centering. The output of our pipeline matches the published government spec on every measurable axis we tested.
Limitations — what we don’t test
Honesty matters more than marketing copy here. Things our QC does not guarantee:
- Photographic conditions you control. We can’t fix poor lighting, motion blur, low resolution, glare on glasses, or shadows on the face after the fact. Garbage in, garbage out.
- Subjective expression rules. “Neutral expression,” “mouth closed,” “eyes open and looking at camera” are evaluated by reviewers, not by us.
- Final acceptance. Government officials make the final call. Even a photo that meets every published numerical requirement can be rejected on subjective grounds.
- Country-specific quirks beyond the five we tested. The compliance checker covers more countries, but only the five above have been put through this end-to-end validation.
Bottom line: If you upload a clear, well-lit photo, our tool will produce output that meets the published numerical specs for the country you select — we’ve tested that directly. We can’t guarantee acceptance, because that decision belongs to the government. We can guarantee that the failure modes we control for are actually controlled.
How to reproduce this
The validation script (qc_validator.py) is independent of the production pipeline and runs the seven checks above against any output image. We re-run it on each pipeline change. The next scheduled QC pass is monthly.
Found a problem? Email hello@passportphotohq.com — we’ll investigate.