Screening User-Supplied Video for Sexual Content Before Processing
A two-classifier, human-reviewed gate and 50 days of production data
By Vedansh Chauhan (Zoupyu) · ORCID 0009-0003-8885-6566
Published · DOI 10.5281/zenodo.23880340 · CC BY 4.0
Updated
What did we find?
On real user video, an automated NSFW screen is wrong far more often than it is right: about 1.5% of the flags a human reviewed were real violations. We ran a two-classifier, human-reviewed gate on every job submitted to Zoupyu for 50 days and recorded every decision. The key findings:
- Over 50 days the gate ran 3,369 screens on 1,599 jobs and scored 88,822 video frames.
- Of the 130 flagged real-traffic jobs a human reviewed, 2 were violations and 128 were false positives: about 1.5% of flags were correct.
- Both confirmed violations were direct uploads. No YouTube, Twitch or Google Drive job was a violation.
- Four of the first six false holds were caused by a single frame. One high-scoring frame is noise in video.
- A second, independently trained classifier overturned 126 flags with a clear margin, and none of the jobs it allowed has been found to be a violation.
- False positives came from ordinary video: children’s cartoons, sport, music videos, gaming and challenge videos.
The study at a glance
| Data window | 13 September – 2 November 2026 (50 days) |
|---|---|
| Screens / jobs / frames | 3,369 screens · 1,599 jobs · 88,822 frames |
| Sources screened | YouTube 89.4% · uploads 6.0% · Twitch 3.5% · Google Drive 1.0% |
| Primary classifier | Falconsai/nsfw_image_detection (ViT, quantized ONNX, CPU) |
| Second opinion | Marqo/nsfw-image-detection-384 (ICIJ ONNX export), threshold 0.4 |
| Decision rule | Block: ≥ 2 frames ≥ 0.90 and ≥ 15% of frames. Review: any frame ≥ 0.80 |
| Flag precision (reviewed) | 2 of 130 ≈ 1.5% |
| Unreadable screens | 35 (1.0%), all retried, none passed unscreened |
| Cost per screen | Source screen 30.8 s · clip screens 13.5 s (CPU, no third party) |
| Stored per screen | Scores and timestamps only, never images |
How does Zoupyu screen videos for sexual content?
Every video is screened before anything is made from it, at up to three points: the source as soon as it arrives (or after transcription for YouTube and Twitch links), the draft moments before the user sees them, and each clip before it is rendered. A held job produces no clip, and the user’s credit is refunded.
Each sampled frame is scored by an open-weights image classifier. A frame counts only if a second, independently trained classifier agrees. A job is blocked only when at least two frames score 0.90 or more and they make up at least 15% of the frames scored; any other counted frame at 0.80 or more sends the job to a human. If fewer than 70% of frames can be read, the gate does not decide and the job waits: an outage of the screen never becomes a way around it. Scores and timestamps are stored; images never are.
How accurate is automated NSFW detection on real video?
Precise enough to catch explicit uploads, but far too noisy to act on alone. Of 3,369 screens, 95.9% passed. Of the 177 real-traffic jobs that drew a flag, humans reviewed 130: 2 were violations and 128 were false positives.
| Decision | Screens | Share |
|---|---|---|
| Pass | 3,230 | 95.9% |
| Review | 93 | 2.8% |
| Blocked | 11 | 0.3% |
| Incomplete (too few frames readable) | 35 | 1.0% |
The primary model is usually very sure a video is safe: the median top score on passed screens was 0.0019. But 126 passed screens (3.9%) still held a frame it scored 0.80 or higher, which the second model or the source checks then allowed.
What causes false positives in NSFW video screening?
Ordinary video. The jobs a human cleared included six children’s cartoons and nursery rhymes, sport (football, wrestling, a combat-sport bout), music videos, a fashion show, film and TV excerpts, game trailers and gameplay, food videos, and large-budget challenge and streamer videos. 75% of cleared jobs were flagged on one or two frames.
Our working explanation, which we have not tested, is that video frames fall outside these models’ training data: motion blur, transitions, skin-toned close-ups, saturated animation and compression artefacts.
Does a second classifier reduce false positives?
Yes. The second model overturned the primary’s flag in 126 screens. The frames it vetoed scored at most 0.398 on it, against a line of 0.4, and the frames it agreed on scored at least 0.403, so the two models’ disagreements were clear, not borderline. Humans later reviewed 68 jobs it allowed and cleared all 68.
It is not proof on its own: in one case both models flagged frames of a fully clothed podcast about the adult film industry. Only a human could tell.
Can you trust YouTube’s age restriction as a moderation signal?
As evidence, yes; as clearance, no. A YouTube video that the platform reports as public, not age-restricted, widely viewed and not brand new is recorded but not stopped when it draws a flag. That allowed 39 jobs; humans cleared every one they reviewed. But “not age-restricted” is YouTube’s policy, not yours, and a policy that also covers suggestive content needs a human to look at a sample.
Which open NSFW model should you use for video?
Pick the model that matches the error you can afford. Our first model, AdamCodd/vit-base-nsfw-detector, is trained to flag cleavage and bare skin; in shadow mode it would have blocked an AI-generated meme with revealing outfits and nothing explicit, so we replaced it the same day. Falconsai/nsfw_image_detection is far more precise but misses much mildly suggestive content. Accuracy by severity, from Freepik’s model card:
| Level | Freepik | Falconsai | AdamCodd |
|---|---|---|---|
| High (explicit) | 99.54% | 97.92% | 98.62% |
| Medium | 97.02% | 78.54% | 91.65% |
| Low (mildly suggestive) | 98.31% | 31.25% | 89.66% |
| Neutral | 99.87% | 99.27% | 98.37% |
On UnsafeBench’s sexual category, the KidsNanny paper reports Falconsai at 91.15% precision but 40.70% recall. We measured detection on one explicit test video, not on real traffic, so our data cannot rule that out.
What should teams that process user video do?
- Screen before you process, at more than one point. A sparse pass over the source, then a denser pass over exactly what becomes output.
- Never decide on one frame. Require several high frames and a share of the video.
- Use two independently trained models, and let the second only veto. If the second model cannot score a frame, keep the flag.
- Fail closed, with a coverage rule. If you could not read enough of the video, you do not know what is in it.
- Ship in shadow mode first. Our first model would have paused accounts over revealing outfits. We learned that from logs, not from users.
- Pick the model for your policy. A precision-tuned model under-flags suggestive content; a restrictive one floods review.
- Store scores and timestamps, not pixels. Enough to audit a decision without holding material you must not hold.
- Remember human decisions per source. Popular videos are submitted again and again.
- Treat platform signals as evidence, not clearance. “Not age-restricted” is the platform’s policy, not yours.
- Tell the user. A silent hold reads as a broken product. Name the rule, never the scores.
What are the limits of this study?
- Recall on real traffic is unmeasured: unflagged jobs are not reviewed one by one.
- Two confirmed violations support no statistical claim about detection.
- No frames are kept, so false positives are described by video type, not by what the model saw.
- 47 flagged real-traffic jobs were never reviewed.
- About 89% of screens were public YouTube videos, mostly entertainment.
- The gate screens sexual content only, not violence or other categories.
- The author runs the service studied.
How to cite this research
Chauhan, V. (2026). Screening User-Supplied Video for Sexual Content Before Processing: A Two-Classifier, Human-Reviewed Gate and 50 Days of Production Data (Version 1.0) [Technical note]. Zenodo. https://doi.org/10.5281/zenodo.23880340
The full paper, with methods, model versions and every figure, is in the PDF. The four anonymised data files (CC BY 4.0) are on Zenodo.
Zoupyu is the clipper this gate protects
Paste a YouTube, Twitch or Google Drive link, or upload a file, and pick the moments that become clips.
About Zoupyu