NSFWPY 🔥 (nsfwpy-onnx v1.1.2)
High-performance, CPU-optimized Python NSFW image safety classification library powered by state-of-the-art Vision Transformer (ViT) models from Falcons AI and the ONNX Community using ONNX Runtime.
Classify static images (JPEG, PNG, WEBP) and Animated WebP / GIF / APNG formats into 5 canonical NSFW safety categories (Drawing, Hentai, Neutral, Porn, Sexy).
🌟 Key Features
- 🐍 Python 3.14 Native: Fully compatible with Python 3.10+ and Python 3.14.
- 🎞️ Animated WebP & GIF Support: Keyframe sampling and frame-aggregated safety classification for Animated WebP, GIF, and APNG formats.
- ⚡ CPU Optimized: Powered by
onnxruntimetuned for multi-threaded CPU execution with graph optimization. - 📦 HuggingFace Auto-Download: Automatically downloads missing ONNX models from Hugging Face (
expertskb/nsfwpy). - 🪶 Ultra Lightweight: Minimal dependencies (
numpy,pillow,onnxruntime,click). No heavy web servers required. - 🛠️ CLI Tool Included: Classify images directly from your terminal.
⚡ Why nsfwpy-onnx is Superior to Legacy Classifiers
| Feature / Metric | nsfwpy-onnx 🔥 |
Legacy CNN Classifiers (MobileNet/Inception) 🐢 | Heavy PyTorch / TensorFlow Libs 📦 |
|---|---|---|---|
| Model Architecture | Modern Vision Transformer (ViT) | Legacy MobileNet V2 / Inception V3 (CNN) | Older MobileNet V2 |
| Accuracy & False Positives | High (Understands visual context) | Medium (High false positives on drawings/art) | Medium |
| Framework Overhead | Light C++ ONNX Runtime (~150MB RAM) | Heavy TensorFlow / TFJS-Node (500MB+ RAM) | Heavy PyTorch / TensorFlow |
Startup Preloading (nsfwpy.preload()) |
✅ Pre-warmed CPU execution & graph | ❌ Manual warmup script required | ❌ Cold start delays on first request |
| Animated WebP & GIF | ✅ Built-in keyframe sampling & scanning | ❌ Requires manual frame splitting | ❌ Static images only |
| System Cache & Recovery | ✅ Full Cross-Platform (Linux, Windows, macOS, Android/Termux, iOS/Tablet) + auto-recovery | ❌ Basic local cache | ❌ Manual download required |
🖥️ Cross-Platform System Model Caching
nsfwpy automatically detects host OS and environment permissions to cache models in optimal system directories:
- Linux / Servers:
/etc/nsfwpy/modelsor/var/cache/nsfwpy/models - Windows:
C:\nsfwpy\modelsorC:\ProgramData\nsfwpy\models - macOS:
/Library/Caches/nsfwpy/modelsor~/Library/Caches/nsfwpy/models - Android / Termux / Mobile:
/sdcard/.nsfwpy/modelsor$PREFIX/tmp/nsfwpy/models - iOS / iPadOS / Tablets:
~/Documents/.nsfwpy/models - Automatic Fallback:
~/.nsfwpy/models(if running as a non-root standard user without system write access)
📊 Performance & Preload Benchmarks
Tested on CPU (Intel/AMD multi-thread execution):
import nsfwpy
# Warm up model graph and CPU execution pools at app startup
nsfwpy.preload()
| Benchmark Metric | Latency / Throughput | Description |
|---|---|---|
Preload & Warmup (nsfwpy.preload()) |
~370 ms | Downloads/loads model & compiles ONNX graph |
| Warmed-Up Inference Latency | ~270 ms / image | Instant classification with zero cold-start delay |
| Batch Processing Throughput | ~4.5 - 5.0 imgs/sec | High-throughput batch classification on CPU |
| Remote WebP Single Frame (HTTP + Inf) | ~700 ms | Network fetch + image decode + ONNX inference |
| Remote WebP Full Animation (10 keyframes) | ~2.3s | Complete frame-aggregated animation safety scan |
📥 Installation
Install directly from PyPI:
pip install nsfwpy-onnx
Or install from GitHub:
git clone https://github.com/expertskb/nsfwpy-onnx.git
cd nsfwpy-onnx
python3.14 -m venv .venv
source .venv/bin/activate
pip install -e .
🚀 Quick Usage
1. Python Library Usage
import nsfwpy
# Load default quantized ViT model (auto-downloads if missing)
model = nsfwpy.load_model()
# Classify static image or animated WebP / GIF
results = model.classify("sample.jpg", top_k=5)
print(results)
# Output:
# [
# {'className': 'Neutral', 'probability': 0.9850},
# {'className': 'Porn', 'probability': 0.0150}
# ]
# Batch image classification
batch_results = model.classify_batch(["img1.jpg", "anim2.gif"])
2. Command Line Interface (CLI)
# Classify a local image file or URL using default nsfw_vit_quantized model
nsfwpy classify path/to/image.jpg
# Output formatted JSON
nsfwpy classify sample.jpg --json-out
# Choose full precision nsfw_vit model
nsfwpy classify sample.jpg --model nsfw_vit
🧠 Supported Models
Powered by onnx-community/nsfw_image_detection-ONNX:
| Model Name | Format | Precision | Size | Description |
|---|---|---|---|---|
nsfw_vit_quantized (Default) / nsfw_vit_int8 |
INT8 | 8-bit Quantized | ~87 MB | Default model: Best balance of speed, size, and accuracy |
nsfw_vit |
FP32 | Full Precision | ~343 MB | Original high-precision model (highest accuracy) |
nsfw_vit_fp16 |
FP16 | Half Precision | ~172 MB | 2x faster, 50% smaller |
nsfw_vit_q4 |
Q4 | 4-bit Quantized | ~56 MB | Ultra-lightweight for constrained memory |
nsfw_vit_q4f16 |
Q4F16 | Mixed 4/16-bit | ~50 MB | Smallest model size |
nsfw_vit_bnb4 |
BNB4 | BitsAndBytes 4-bit | ~51 MB | BitsAndBytes 4-bit quantized |
nsfw_vit_uint8 |
UINT8 | Unsigned 8-bit | ~87 MB | Optimized for CPU hardware with uint8 support |
📂 Example Scripts Index
Professional production-ready scripts are included under examples/:
examples/01_basic_classification.py: Local image classification.examples/02_url_classification.py: Remote image URL classification.examples/03_batch_classification.py: High-throughput batch benchmarking.examples/04_pil_and_bytes_classification.py: In-memory PIL and bytes buffer processing.examples/05_custom_model_and_threading.py: Model backbones & ONNX CPU thread tuning.examples/06_animated_webp_gif_classification.py: Animated WebP & GIF frame-aggregated classification.
Run any example using:
python examples/01_basic_classification.py
🙏 Credits & Acknowledgments
Special thanks to the open-source AI community and model creators:
- Falcons AI (
falconsai): Creators of the high-accuracy Vision Transformer (ViT) modelfalconsai/nsfw_image_detectionused as the core engine. - ONNX Community (
onnx-community): For converting, quantizing, and hosting the ONNX model suite atonnx-community/nsfw_image_detection-ONNX.
📜 License
MIT License
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nsfwpy_onnx-1.1.2.tar.gz.
File metadata
- Download URL: nsfwpy_onnx-1.1.2.tar.gz
- Upload date:
- Size: 16.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a6d5bd91d640257cf04ce16fe3d6f2d568cd5b3b3089e9f5f90a0ced0dfd8823
|
|
| MD5 |
475ecb9140d9b5c233180d8e49883dff
|
|
| BLAKE2b-256 |
ba20ff94c8108ecfdd45e68376066cef180cf04e928cde5ccf6619971b99f420
|
File details
Details for the file nsfwpy_onnx-1.1.2-py3-none-any.whl.
File metadata
- Download URL: nsfwpy_onnx-1.1.2-py3-none-any.whl
- Upload date:
- Size: 14.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5dd6ffe8f9ffa1a6274aa730cabb1763bbabc3a68d4391450464465ea6dfc4ff
|
|
| MD5 |
fddbb5cebff1248d355464dccced9d7a
|
|
| BLAKE2b-256 |
8a256eed94255684ac579f69856e22c04863f0d459adf5e86371d271fc352617
|