Built on real images
People, poses, crops, outfits, and settings from across real life.
Cupid preview
Let us show you how. Enter the preview password to come in.
Preview sessions last 30 minutes.
The best photo-likability model
Cupid was trained from 1.6 million real-world images. Add almost any photo and see exactly where it lands.
People, poses, crops, outfits, and settings from across real life.
Portraits, profiles, full-body shots, and scene-led photos can all work.
One clear percentile, followed by a short read on what made it land.
A closer look at the face, eyes, body, and backgrounds that carried these images.
These examples show which part of each photo carried the strongest signal.

Face
100.0th area-matched percentile
Positive attribution share 56.2% · region area 2.9%

Face
100.0th area-matched percentile
Positive attribution share 53.5% · region area 4.7%

Eyes
100.0th area-matched percentile
Positive attribution share 6.0% · region area 1.0%

Eyes
100.0th area-matched percentile
Positive attribution share 4.8% · region area 0.7%

Body
100.0th area-matched percentile
Positive attribution share 87.8% · region area 48.0%

Body
98.1th area-matched percentile
Positive attribution share 86.9% · region area 43.0%

Background
100.0th area-matched percentile
Positive attribution share 71.9% · region area 54.3%

Background
98.1th area-matched percentile
Positive attribution share 70.4% · region area 54.6%
These describe what drew attention in the image, not anyone’s worth or attractiveness.
Use Cupid to compare visual creative, understand what draws attention, and choose stronger images before you publish.
Compare campaign images early and focus production on the strongest direction.
Help social, brand, and growth teams choose images with clearer audience appeal.
See which parts of an image carry the most weight, then turn that into a repeatable creative playbook.
For pilots, integrations, or business access, get in touch.
[email protected]Cupid was trained from 1.6 million images. Your face does not have to be visible. Add a portrait, profile, full-body shot, or scene-led photo.
Score the same crop separately with selected learned college-page embeddings. All other reference-context fields remain fixed.
Drop a photo here, or pick one from your device.
Your photo is scored and discarded. Nothing is saved.
The live scorer runs on a single machine which is not running right now. The recording below shows the same path a live upload takes.
Ensemble spread —.
Get a quick read, or ask Cupid to go deeper.
Writing your notes…
Integrated gradients over the patch tokens, cross-checked against the mirrored image, two independent baselines, and a token-occlusion probe — the same procedure behind the validated examples above. Takes about half a minute.
Running token occlusion and integrated gradients…
The same photograph, rescored as if posted by each account. These compare contexts against each other — they are not percentiles within any college.
Add up to 20. Cupid scores every one, ranks the set, and only writes notes for your winners.
Drop your photo set here
JPEG, PNG, or WebP. Up to 20 photos.
Your photos are scored, used for this result, and discarded. Nothing is saved.
Cupid is ranking every photo before it writes a single note.
The full research notes, model math, tester materials, and calibration context live here.
Produced partway through training, from an earlier model than the one scoring on this page. Development diagnostics, not finished output.
The scorer maps frozen DINOv3 patch representations and structured posting context to a scalar estimate of log engagement. The following defines the 512-pixel configuration used by each member of the demonstrated ensemble.
After channel normalization, the image is passed through a frozen DINOv3 encoder. The classification and register tokens are discarded. The scoring head receives only the 1,024 spatial patch embeddings:
The cached classification token is not used by the scoring head.
Six scalar covariates are log-transformed, standardized, and assigned learned feature-specific values when missing:
The transformed scalars are encoded by a 6–32–32 MLP. Its output is concatenated with learned embeddings for page, gender, carousel position, carousel length, and person count, together with source-quality covariates and missingness indicators. A final affine projection produces the conditioning vector
Each pooling block contains separate adaptive normalization modules for its query, patch sequence, and feed-forward input. For , LayerNorm is evaluated independently at every sequence position over the 768 feature coordinates:
Context is converted to a featurewise scale and offset and broadcast across sequence positions:
Each modulation is a 128-to-1,536 affine map. Its parameters are zero-initialized, so AdaLN initially reduces exactly to non-affine LayerNorm.
A learned query is expanded across the batch. In each of two blocks, 12 heads of width 64 compare this singleton query with all patch positions. For head h,
Here and . Softmax is taken over the 1,024 patch positions.
The 12 head outputs are concatenated and affinely projected. Attention-weight dropout is applied during training. The resulting vector is added to the unmodulated residual query:
The attention residual is independently modulated and passed through a 768–3,072–768 feed-forward network with GELU and hidden-state dropout:
Both blocks attend to the original frozen patch matrix X. The second block therefore revisits every patch using the query state produced by the first block.
After the second block, the length-one query axis is removed. No additional normalization or activation precedes the image-path output:
The context-only branch contains no image information. Both outputs are unrestricted real-valued scalars.
At inference, nuisance covariates are fixed to a shared reference context. Three fold checkpoints evaluate the upright and horizontally reflected image. Each of the six scores is standardized against its checkpoint-specific held-out distribution before aggregation:
The empirical distribution is the held-out calibration population for gender reference g. The displayed ensemble spread is the range of the six member percentiles; it is not a confidence interval.
One image-only head may be selected in place of the ensemble. It receives the same frozen patch matrix X and a learned gender embedding at the teacher's context width, and nothing else: no page, no follower count, no carousel slot. The reference context is not removed but inherited, because the quantity it was trained to predict is a five-fold teacher's reference-context score. This successor was trained on 879,868 images, compared with 63,882 for the earlier student.
Writing for that teacher score, training standardizes it within gender and the student predicts the standardized target under a Gaussian likelihood whose variance floor is the teacher's own inter-checkpoint spread:
A label the five teacher checkpoints disagree about is a label the student is not penalised for missing. The predicted uncertainty is an internal quantity and is never reported as a statement about the photograph.
At inference the target standardization is inverted, which places the student back on the ensemble's axis, and the same empirical distribution supplies the percentile:
The student has no calibration population of its own, and an estimate is less dispersed than the quantity it estimates, so its percentiles sit closer to the median than the ensemble's for the same photograph. That compression is measured on held-out first-image single-person posts and reported with every student score. It is an experimental comparison, not the deployed model.
Regional attribution is computed on the full-data student head. The frozen backbone is evaluated once, then integrated gradients differentiates the scalar student mean hg only with respect to its 1,024 patch tokens. For orientation a in upright or mirrored, patch position p, and embedding coordinate d, the baseline is the position-wise mean over 3,993 baseline photographs:
Upright tokens use the upright baseline and mirrored tokens use the mirrored baseline. Two additional baseline pairs are built from a deterministic 2,056 / 1,937 split and are used only for the stability check. For K midpoint samples, the straight-line path is:
The gradient is averaged along that path, multiplied coordinate-wise by the token displacement, then summed over the 768 embedding coordinates. This produces one signed attribution per spatial patch:
The midpoint sum starts at 32 steps and doubles to 64 and then 128 when the relative completeness residual is above 10−3. The residual is reported for every request:
The student emits a standardized mean. To match the displayed score units, each orientation's attribution is multiplied by the gender-specific target scale σg and by one half for the two-view mean. The mirrored map is flipped back into the upright patch frame before addition:
This is an additive decomposition of the upright/mirrored score mean relative to the paired baseline mean. The same composition is repeated for each deterministic half-baseline.
The 512-pixel crop is a 32 by 32 patch grid. Patch membership uses the patch centre, not box overlap, so every patch belongs to exactly one region. Face is the face box, body is the person box minus face, and background is outside the person box:
Signed attribution measures the region's net contribution. Positive attribution share asks what fraction of all upward contribution lies inside the region. Region area is the fraction of the 1,024 patches assigned to it:
If the denominator of qr is zero, the implementation returns zero. Live uploads expose face, body, and background. The frozen gallery also contains an eyes region, but live eye masks are omitted because the serving detector does not retain landmarks.
Token occlusion is an independent intervention. For region r, its upright tokens are replaced by the upright baseline and the mirrored region is replaced by the mirrored baseline. The score drop is measured in the same displayed units:
A positive Δr means the displayed score falls when the region is replaced. To prevent a large region from winning merely because it covers more patches, qr is compared only with frozen examples in the same equal-frequency area stratum. If that stratum contains values v1 through vn, the live upload is inserted using this midrank:
A region is published as validated only when the main, upright-only, mirrored-only, and both half-baseline percentiles are all at least 75, while both signed attribution and the occlusion score drop are positive:
This gate is why a high regional percentile alone is not presented as a validated explanation. It must survive orientation, baseline choice, signed direction, and a separate token-removal intervention.
Predicted engagement for this photograph posted solo, as the thumbnail, by a standardized account — with page reach, follower count, posting history, carousel position and source compression all held fixed.
That fixing is the whole point. Left free, a score mostly measures how many followers an account has. Pinning them to the same value for every image means what varies between two scores is the photograph.
It predicts how a population responded to an image. It is not a measure of attractiveness or of a person's worth. And one number is not the whole answer: the six ensemble members typically span 39 percentile points, which is why the band is shown at the same weight as the estimate.