Doctor Trigger

A Framework for Release-Bound Face Verification

Check whether a face online is the one you posted.

Try it

Posted faces get swapped and reposted. Doctor Trigger checks each circulating copy against the publisher's private record and tells the posted version apart from swapped or edited copies.

What is Doctor Trigger?

Photos of faces get reposted, compressed, swapped and edited as they spread online. Platforms and investigators often cannot tell which copy is the one a person actually posted, and the evidence ends up scattered across many places.

Doctor Trigger hides an invisible code in a photo before it is posted and keeps a small private record. Later, any copy can be checked against that record. The check gives a clear result and a receipt that people can review.

How it works

Hands-on

Try it yourself on real outputs of the public code.
All people shown are AI-generated.

Original vs. posted: drag to compare

Drag the slider across the photo. The left side is the original, the right side is the posted copy with the hidden code.

Posted image, carrying the hidden keyed signal
Original image, before the signal is added
OriginalPosted

Café selfie · PSNR 51.15 dB · SSIM 0.998

The hidden code is imperceptible. Each posted image carries the weak keyed signal, enrolled with the public Doctor Trigger code on a 512 px face crop, and stays at about 51 dB PSNR from its original. PSNR and SSIM are measured on the lossless PNG images; the images shown here are JPEG-compressed for size. All faces are AI-generated and do not show real people.

Demo on AI-generated faces

Four copies of each face, checked against its private record: the posted photo, a compressed repost, a face swap, and the original that was never posted.

Demo on AI-generated faces, run with the public code
Press briefing
Press briefing, posted
Posted C 0.9994 ≥ 0.9984 Gs 2.27 ≥ 0.93 Confirmed
Press briefing, jpeg repost
JPEG repost C 0.9986 ≥ 0.9984 Gs 1.34 ≥ 0.93 Confirmed
Press briefing, face swapped
Face swapped C 0.9351 < 0.9984 Gs 1.97 ≥ 0.93 Unconfirmed face changed
Press briefing, never posted
Never posted C 0.9997 ≥ 0.9984 Gs 0.00 < 0.93 Unconfirmed hidden code not found
Café selfie
Café selfie, posted
Posted C 0.9998 ≥ 0.9984 Gs 1.78 ≥ 0.93 Confirmed
Café selfie, jpeg repost
JPEG repost C 0.9993 ≥ 0.9984 Gs 1.32 ≥ 0.93 Confirmed
Café selfie, face swapped
Face swapped C 0.9535 < 0.9984 Gs 1.23 ≥ 0.93 Unconfirmed face changed
Café selfie, never posted
Never posted C 0.9997 ≥ 0.9984 Gs 0.00 < 0.93 Unconfirmed hidden code not found
Travel photo
Travel photo, posted
Posted C 0.9999 ≥ 0.9984 Gs 1.38 ≥ 0.93 Confirmed
Travel photo, jpeg repost
JPEG repost C 0.9997 ≥ 0.9984 Gs 1.06 ≥ 0.93 Confirmed
Travel photo, face swapped
Face swapped C 0.9711 < 0.9984 Gs 1.18 ≥ 0.93 Unconfirmed face changed
Travel photo, never posted
Never posted C 0.9997 ≥ 0.9984 Gs -0.00 < 0.93 Unconfirmed hidden code not found
Beauty vlog
Beauty vlog, posted
Posted C 0.9998 ≥ 0.9984 Gs 1.77 ≥ 0.93 Confirmed
Beauty vlog, jpeg repost
JPEG repost C 0.9993 ≥ 0.9984 Gs 1.15 ≥ 0.93 Confirmed
Beauty vlog, face swapped
Face swapped C 0.9379 < 0.9984 Gs 1.39 ≥ 0.93 Unconfirmed face changed
Beauty vlog, never posted
Never posted C 0.9997 ≥ 0.9984 Gs -0.00 < 0.93 Unconfirmed hidden code not found

Doctor Trigger at a glance. Each face is enrolled with the public code, then the verifier reads four copies against the private record. The posted face and its JPEG repost pass both checks. A face swap of the posted image fails spectral agreement C; the never-posted original still looks like the same face but carries no hidden code, so key projection Gs fails. Thresholds are the 1% quantiles over 144 benign copies (JPEG q85/q90, 0.75× resize) of 48 AI-generated faces. All faces are AI-generated and do not show real people; this demo is not part of the paper's benchmark.

Pick what reached the checker and see which answer comes back, and why.

Interactive explainer

Try the verification logic

Choose what reached the verifier. Both checks use thresholds calibrated for the benign transformations the system is intended to tolerate.

Supported benign copy. A released face after a benign transformation covered by calibration. Only once benign processing is pushed well past that calibrated range would the release signal or face-consistency score drop below threshold.
Face consistency
Matches the enrolled spectral reference.
Pass
Release signal
The enrolled key is present in the circulating copy.
Pass
Verifier response
Confirmed

The face is consistent with the publisher's enrolled release.

Video

Download MP4 All people shown are AI-generated.

In depth

For researchers

The full method, results and code.

Doctor Trigger lets publishers add an invisible keyed signal to each face before release and keep a private record, so they can later check whether a circulating face is still the version they published, or a swapped or edited copy.

Abstract

Face swapping and generative editing enable realistic facial manipulation, while online redistribution complicates publisher oversight of circulating face images. Existing approaches establish provenance, detect manipulation, recover embedded watermarks, verify image integrity, or disrupt unauthorized face manipulation. These capabilities do not necessarily establish consistency with a specific publisher-enrolled release, limiting the evidence available for verification and human review. To address this gap, we introduce Doctor Trigger, a framework for verifying circulating faces against private publisher-held release records. Before publication, the publisher embeds a weak keyed Fourier-phase signal in each face while preserving visual fidelity and stores its spectral reference. Afterward, verification compares the circulating face with that reference and uses key projection to measure retention of the release-specific signal. Therefore, relation and key evidence jointly help publishers identify suspicious copies for review, potentially reducing the circulation of manipulated images. Experimental results across FF++, DFDC, and Celeb-DF show that spectral agreement separates tested face swaps and generative manipulations from enrolled releases, while the keyed signal distinguishes published versions from their unreleased originals under the evaluated key-preserving benign transformations. Doctor Trigger complements provenance metadata with release-specific face verification and record-linked evidence for further assessment.

51.2dB
PSNR of the released image: visually near-identical
≥0.99
face-swap detection AUC within & across datasets
0%
unreleased originals accepted by key projection
5.9ms
relation-only check, in memory

Motivation

Face swaps and generative edits are now realistic, and published faces get reposted, compressed and resized as they circulate. A publisher needs to answer one question: is this circulating face still the version we released?

Provenance metadata can be stripped along the way, and image-only detectors do not check a face against a specific release. Doctor Trigger lets the publisher keep a private record of each release and verify circulating copies against it.

Examples from the benchmark datasets
Original vs released image with amplified mid-band residual; template agreement passes for release and JPEG, fails for face re-rendering.
The same steps on a benchmark face. Left: a weak keyed signal is added before publication, and the released face looks virtually the same as the original. Right: the circulating copy is compared with the stored record. A JPEG copy passes (CB = 1.000); a re-rendered face fails (0.930 < 0.997).
Invisible release signal

A secret per-face key slightly shifts the Fourier phase. The released face stays visually near-identical (51.2 dB PSNR).

Two complementary checks

Face consistency catches swaps and edits. Release signal tells the published version apart from its unreleased original.

Human in the loop

Confirmed copies pass routinely. Unconfirmed ones go to a reviewer. Unavailable means inputs are missing.

Method

Two stages. The publisher enrolls each face before release. Later, a requester, such as a person or platform, submits a circulating copy to the publisher's verifier and gets a status back.

Two-stage publisher-side verification: enrollment and release, then verification and handling.
Workflow. Private records stay with the publisher (orange). Credentials and verification status form the public layer (teal).
Enroll

Before release, a secret per-face key slightly shifts the Fourier phase on a mid-frequency ring. The publisher keeps a private record: the spectral reference, the key and the thresholds.

Verify

A requester submits a circulating copy. Spectral agreement asks whether it is still the enrolled face; key projection asks whether the release signal is still there.

Decide & route

Confirmed only when both checks pass. Otherwise Unconfirmed and flagged for review, or Unavailable if the record or inputs are missing.

1Enroll: add a weak keyed signal

A key derived from a master seed and the sample ID picks a signed pattern on a mid-frequency ring of the Fourier spectrum. The phase at those frequencies is shifted by a tiny amount, then a fidelity gate lowers the strength until the release meets the fidelity targets.

The publisher keeps a private record: the spectral reference, the key and the thresholds. The original image is not needed later.

phase shift 0.0071–0.0235 radPSNR ≥ 35 dBSSIM ≥ 0.98
Enrollment pipeline: RGB FFT, ring selection, keyed phase shift, IFFT, blend, fidelity gate.

2Verify: two checks against the record

Spectral agreement C compares the query's phase with the stored template: is this still the enrolled face?

Key projection Gs projects the phase change onto the enrolled key: is the release signal still there? An ideal release scores about 1, the unreleased original 0, and wrong keys cancel out on average.

3Decide and route

A query is Confirmed only when both checks pass thresholds calibrated on benign processing (at most 1% benign rejection). Otherwise it is Unconfirmed and flagged for review, or Unavailable if the record or inputs are missing.

no trained model neededoptional learned record model
Verification: read the private record, verify face consistency and release signal, decide and route.
Verification. (a) Read the private record. (b) Check face consistency and the release signal, directly or with an optional record model. (c) Route the query. An optional image-only detector adds a separate review flag.

Results

7,366 real faces from FF++, DFDC and Celeb-DF. Each is verified as the genuine release and as a SimSwap face swap against the same record.

Face check

Catches face swaps on every dataset.

How well each method separates a face-swapped copy from the genuine release. 1.00 means always right; 0.50 is a coin flip.

0.50 · coin flip1.00 · perfect
FF++Celeb-DFDFDC
Doctor Trigger (direct)1.000.990.99
LIDMark1.000.740.84
FaceSigns1.000.700.70
StegaStamp0.910.570.52
SepMark0.690.500.50
KAD-Net0.540.500.50
WAM0.500.500.50
VINE-R0.500.500.50
Show table, including cross-dataset transfer
Per-datasetFrom FF++ →From DFDC →
MethodFF++CDFDFDCCDFDFDCCDFFF++
StegaStamp0.910.570.520.590.540.560.80
FaceSigns†1.000.700.70————
SepMark†0.690.500.50————
WAM†0.500.500.50————
KAD-Net†0.540.500.50————
VINE-R†0.500.500.50————
LIDMark1.000.740.840.900.740.920.98
Ours, image-only Sdf0.990.981.000.680.760.930.95
Ours, direct spectral 1 − CB1.000.990.990.990.990.991.00
Ours, record model Sfake1.001.001.000.981.000.971.00

†: fixed public weights; —: no dataset-specific training.

Also 1.000 AUC on StarGAN, UniFace, InSwapper and SD inpainting (FF++; the paper marks this comparison as exploratory).

Examples from the benchmark datasets
Released images, JPEG copies and re-rendered faces from FF++ and Celeb-DF with their sub-band template agreement.
Benchmark examples (FF++, Celeb-DF). Released images and their JPEG copies pass the template check; re-rendered faces fail it. Green and red borders mark acceptance and rejection.
Release check

Tells the published version apart from its original.

The original photo looks virtually the same as the release, so similarity checks accept it. Only the release carries the keyed signal.

≈ 99%
of originals accepted by similarity checks
  • Similarity to original (H)99.25%
  • Similarity to template (C)99.25%
  • Image similarity (SSIM)99.5%
  • Face identity (ArcFace)99.25%
0%
of originals accepted by the key

99.5% of JPEG-compressed releases still pass, and all tested wrong keys are rejected.

Thresholds calibrated on JPEG copies.

Key sign pattern over the frequency ring, keyed displacement, template, query residual, and sign agreement with the correct and a wrong key.
What the key sees, on one FF++ face. (a) The key expands into a sign pattern over the frequency ring. (d) A benign copy's phase residual looks like noise, but its signs follow the key: 82% of bins agree with the correct key (e), against 49%, chance, with a wrong key (f).
Hands-on

How the hidden code is found

Walk through the six steps, then try your own repost settings. The ring is a drawing of the idea; the scores below come from running the public code on the AI-generated demo faces.

1 / 6

Try a repost
Hidden code
Face

The ring is a drawing of the idea. The scores come from running the public code on the AI-generated demo faces above: each copy is resized, saved as a JPEG at the chosen quality, then checked against that face's private record. As in the paper, the pass mark is tuned separately for each kind of sharing so that about 1 in 100 normal copies is flagged. Here it is tuned on 48 other AI-generated faces, so the pass mark is simply the lowest score any of their normal copies got; the 4 demo faces are kept out of the tuning. The line under the verdict counts, for the chosen setting, how the 4 demo faces fare; over all 50 settings, 4 of their 200 normal copies are flagged (2%), a little above the 1-in-100 target because 48 tuning faces give only a rough mark. All people shown are AI-generated. Readout: template reading C vs τC and key projection Gs vs τG, both recalibrated at every (JPEG quality, resize) setting on benign copies of 48 enrolled calibration faces: one shared lower-tail quantile ≤ 1% chosen so joint calibration rejection is ≤ 1%, which with 48 faces is the calibration minimum; the wrong code is deterministic_wrong_keys(key)[0]. Steps (a)–(d) are illustrative; the 82% / 49% sign agreement in (e)–(f) is the paper's FF++ example above.

Invisible

The release looks virtually unchanged.

51.2 dB PSNR, compared with 29.9–41.4 dB for the compared watermarking methods on the same face. Across all 7,366 enrollments the average is 51.20 dB (minimum 49.3 dB) with SSIM 1.00, and it holds at 128, 256 and 512 px on all three datasets.

Same FF++ face marked by eight methods with PSNR, and 10x amplified residuals.
Residuals amplified 10× below each face. Payload and reference budgets differ across methods.
Lightweight

Verification runs on a CPU, with no model weights.

The relation check takes 5.9 ms on a CPU using the in-memory record. The compared watermark decoders run on a GPU with 68–3833 MiB of weights.

Time (ms) ↓Memory (MiB) ↓
MethodEmbedVerifyWeightsGPU
StegaStamp9.32.6208375
FaceSigns4.41.772102
SepMark12.517.8550653
WAM14.917.0360450
KAD-Net17.012.5563650
VINE-R79.310.738334569
LIDMark6.05.96893
Ours, relation check66.7‡5.9‡00
Ours, record model66.7‡149.9‡0.040

Means over 20 256² crops. ‡ Xeon Gold 6248R CPU; other methods on an A5000 GPU.

Robustness

Reliable after common sharing, with known weak spots.

Nearly all manipulations are rejected after re-encoding, screenshots, JPEG and one repost. Repeated reposting, H.264 compression and cropping weaken face-swap rejection.

Manipulation rejected ↑
ChannelFace swapReenactmentSD inpaintBenign pass ↑
Lossless re-encode100%100%100%99%
Credential stripping100%100%100%99%
Screenshot (1.25×)100%100%100%99%
JPEG q85100%100%100%99%
Social repost (0.75×, q70)98.5%100%100%99%
Repost of a repost63%100%100%99%
H.264 intra, per image11%99.5%97.5%99%
Center crop 90%6%99%81.5%99%

200 FF++ releases; cutoffs target 1% benign rejection. Selected channels shown.

BibTeX

@misc{lee2026doctortrigger,
  title  = {Doctor Trigger: A Framework for Release-Bound Face Verification},
  author = {Lee, Chia-Ming and Lin, Chia-Yu and Huang, Hung-Kai and Ku, Yi-Ting and Liang, Yu-Chen and Hsu, Chih-Chung},
  year   = {2026},
  eprint = {2610.16336},
  archivePrefix = {arXiv},
  primaryClass  = {cs.CR},
  url    = {https://arxiv.org/abs/2610.16336},
  note   = {Project page: https://ming053l.github.io/Doctor-Trigger/}
}