Accuracy and methodology
We publish what we measure, with the test set size and confidence intervals, and we do not publish a single "accuracy" number: a binary accuracy hides exactly the cases a moderation team cares about.
The model
A multi-head vision transformer (ViT-B/16, SigLIP pre-training, 384 px input, letterboxed, horizontal-flip test-time augmentation). Heads predict "level ≥ 1", "level ≥ 2", "level ≥ 3", "adult object" and "art". Each head is calibrated so that its tuned threshold maps to a score of 50; the level is the highest level whose score is above 50, and ordinal clamping guarantees P(≥3) ≤ P(≥2) ≤ P(≥1).
The levels
| Level | Name | Definition |
|---|---|---|
| 0 | Everyday | Regular, fully clothed content. Always allowed. |
| 1 | Revealing | Swimwear, lingerie and outfits that show more skin. |
| 2 | Implied Nudity | Unclothed, with intimate areas covered or out of view. |
| 3 | Explicit | Visible intimate areas. |
Labelling rules that make results predictable: pose, camera angle, framing, facial expression, innuendo, tight clothes and cleavage never raise the level on their own. When a labeller is torn between two levels, the lower one wins, so the model is conservative by construction.
Published metrics
Model version pending, trained pending, evaluated on a frozen test split of 0 images that never touched training.
| Metric | Value | 95% CI |
|---|---|---|
| Model score (mAP over level ≥2, level ≥3, adult object, safe) | pending | pending |
| Level accuracy (exact level, 4 classes) | pending | pending |
| Recall at 98% precision, level ≥3 | pending | pending |
| Recall at 95% precision, level ≥2 | pending | pending |
| Everyday images flagged at level ≥1 (false positive rate) | pending | pending |
Numbers are exported from the labler evaluation of the production model before launch (ml/evaluate.py: paired bootstrap, 95% intervals). This placeholder must be replaced before the page goes live.
Known limitations
- Small or low-resolution subjects and heavy crops lower confidence; scores near 50 mean "unsure".
- Statues, paintings and stylised art are flagged as
artso you can decide; the level itself is judged the same way as for photos. - Medical, breastfeeding and educational context is not recognised as such.
- Text-only images and memes with embedded text are scored on what is visible, not on what is written.
- Long videos are sampled (up to 32 frames); a brief flash can be missed.
- No age estimation of any kind. The API is not a tool for detecting child sexual abuse material; use hash-matching programmes for that.
- Fairness slices across skin tone and body type are not yet published; this page will carry them when they are.
Reproduce it
Benchmarking with your own data is allowed and encouraged (see the acceptable use policy). The free tier is enough for a few hundred images; send disagreement sets to support@sfwapi.dev and we will look at them.