模型简介
模型特点
模型能力
使用案例
🚀 基于EVA的快速NSFW图像分类器
本模型是一个基于EVA架构的视觉变换器,经过微调用于NSFW内容分类。它使用100,000张合成标注图像进行训练,可检测视觉内容的四个类别(中性、低、中、高)。该模型既可以用作二元(是/否)分类器,也可以获取完整的输出概率。
🚀 快速开始
你可以通过以下几种方式快速使用本模型:
📦 安装指南
通过pip快速开始
pip install nsfw-image-detector
使用pipeline快速开始
from transformers import pipeline
from PIL import Image
# 创建分类器pipeline
classifier = pipeline(
"image-classification",
model="Freepik/nsfw_image_detector",
device=0 # 使用GPU (0) 或CPU (-1)
)
# 加载并分类图像
image = Image.open("path/to/your/image.jpg")
predictions = classifier(image)
print(predictions)
避免安装pip依赖
from transformers import AutoModelForImageClassification
import torch
from PIL import Image
from typing import List, Dict
import torch.nn.functional as F
from timm.data.transforms_factory import create_transform
from torchvision.transforms import Compose
from timm.data import resolve_data_config
from timm.models import get_pretrained_cfg
device = "cuda" if torch.cuda.is_available() else "cpu"
# 加载模型和处理器
model = AutoModelForImageClassification.from_pretrained("Freepik/nsfw_image_detector", torch_dtype = torch.bfloat16).to(device)
# 加载原始处理器(对张量更快)
cfg = get_pretrained_cfg("eva02_base_patch14_448.mim_in22k_ft_in22k_in1k")
processor: Compose = create_transform(**resolve_data_config(cfg.__dict__))
def predict_batch_values(model, processor: Compose, img_batch: List[Image.Image] | torch.Tensor) -> List[Dict[str, float]]:
"""
处理一批图像并返回每个NSFW类别的预测分数
"""
idx_to_label = {0: 'neutral', 1: 'low', 2: 'medium', 3: 'high'}
# 准备批次
inputs = torch.stack([processor(img) for img in img_batch])
output = []
with torch.inference_mode():
logits = model(inputs).logits
batch_probs = F.log_softmax(logits, dim=-1)
batch_probs = torch.exp(batch_probs).cpu()
for i in range(len(batch_probs)):
element_probs = batch_probs[i]
output_img = {}
danger_cum_sum = 0
for j in range(len(element_probs) - 1, -1, -1):
danger_cum_sum += element_probs[j]
if j == 0:
danger_cum_sum = element_probs[j]
output_img[idx_to_label[j]] = danger_cum_sum.item()
output.append(output_img)
return output
def prediction(model, processor, img_batch: List[Image.Image], class_to_predict: str, threshold: float=0.5) -> List[bool]:
"""
预测图像是否达到或超过特定的NSFW阈值
"""
if class_to_predict not in ["low", "medium", "high"]:
raise ValueError("class_to_predict必须是以下之一: low, medium, high")
if not 0 <= threshold <= 1:
raise ValueError("threshold必须在0和1之间")
output = predict_batch_values(model, processor, img_batch)
return [output[i][class_to_predict] >= threshold for i in range(len(output))]
# 示例用法
image = Image.open("path/to/your/image.jpg")
print(predict_batch_values(model, processor, [image]))
print(prediction(model, processor, [image], "medium")) # 选项: low, medium, high
💻 使用示例
基础用法
from PIL import Image
from nsfw_image_detector import NSFWDetector
import torch
# 初始化检测器
detector = NSFWDetector(dtype=torch.bfloat16, device="cuda")
# 加载并分类图像
image = Image.open("your_image")
# 检查图像是否包含中等或更高敏感度的NSFW内容
is_nsfw = detector.is_nsfw(image, "medium")
# 获取所有类别的概率分数
probabilities = detector.predict_proba(image)
print(f"是否为NSFW: {is_nsfw}")
print(f"概率: {probabilities}")
示例输出:
是否为NSFW: False
概率:
[
{<NSFWLevel.HIGH: 'high'>: 0.00372314453125,
<NSFWLevel.MEDIUM: 'medium'>: 0.1884765625,
<NSFWLevel.LOW: 'low'>: 0.234375,
<NSFWLevel.NEUTRAL: 'neutral'>: 0.765625}
]
高级用法
# 模型支持对多个图像进行高效批量处理
images = [Image.open(path) for path in ["image1.jpg", "image2.jpg", "image3.jpg"]]
predictions = classifier(images)
⚠️ 重要提示
如果打算在生产环境中使用该模型,请在使用此方法之前查看速度和内存指标部分。
💡 使用建议
- 模型以bf16进行训练,建议以bf16使用。
- 使用torch张量时,速度提升并非通过pipeline实现,避免在生产环境中使用pipeline。
- 测量在NVIDIA RTX 3090上进行,在更强大的服务器上可能会有更好的指标。
- 吞吐量会随着批量大小的增加而提高,选择批量大小时请考虑使用场景。
- 列出的优化建议可进一步提高性能。
- 在将模型用于文本到图像模型或类似场景时,特别建议使用torch张量,因为输出已经是张量格式。
✨ 主要特性
- 高精度:在内部基准测试中,该模型在准确性方面优于其他优秀的公开可用模型,如Falconsai/nsfw_image_detection和AdamCodd/vit-base-nsfw-detector。
- 细粒度分类:不仅适用于检测“高”和“中性”内容,在识别“低”和“中”级别的NSFW内容方面也表现出色。
- 在线试用:可以通过Hugging Face Space直接在浏览器中试用该模型,无需安装。
- 批量处理:支持对多个图像进行高效批量处理。
📚 详细文档
模型描述
本模型是基于EVA架构的视觉变换器,经过微调用于NSFW内容分类。它使用100,000张合成标注图像进行训练,可检测视觉内容的四个类别(中性、低、中、高)。
该模型既可以用作二元(是/否)分类器,也可以获取完整的输出概率。在内部基准测试中,它优于其他优秀的公开可用模型,如Falconsai/nsfw_image_detection或AdamCodd/vit-base-nsfw-detector,并且能够选择适合您用例的NSFW级别。
在线试用!🌐
您可以通过我们的Hugging Face Space直接在浏览器中试用该模型。上传任何图像,即可立即获得NSFW分类结果,无需任何安装。
模型性能比较
全局性能
类别 | Freepik | Falconsai | Adamcodd |
---|---|---|---|
高 | 99.54% | 97.92% | 98.62% |
中 | 97.02% | 78.54% | 91.65% |
低 | 98.31% | 31.25% | 89.66% |
中性 | 99.87% | 99.27% | 98.37% |
以下是结果的获取方式:
- 对于Falconsai和AdamCodd模型:
- 如果图像标记为“低”、“中”或“高”,且模型返回true,则预测被认为是正确的。
- 如果标记为“中性”,则正确输出应为false。
- 对于Freepik模型:
- 如果图像标记为“低”、“中”或“高”,则模型应至少返回“低”。
- 如果标记为“中性”,则正确输出应为“中性”。
结论:
- 我们的模型在准确性方面优于AdamCodd和Falconsai。在“高”和“中性”标签上进行比较是完全公平的。
- 我们的模型提供了更高的粒度。它不仅适用于检测“高”和“中性”内容,在识别“低”和“中”级别的NSFW内容方面也表现出色。
- Falconsai可能会将一些“中”和“低”级别的图像分类为非NSFW,但将其他图像标记为安全工作(SFW),这可能会导致意外结果。
- AdamCodd将“低”和“中”类别都分类为NSFW,这可能根据您的用例并不理想。此外,有10%的“低”和“中”级别的图像被认为是SFW。
按AI内容划分的准确率
我们创建了一个手动标注的数据集,并特别注意避免偏差(性别、种族等)。虽然样本量相对较小,但它为不同场景下的模型性能提供了有意义的见解,这在训练过程中对于避免偏差非常有用。
以下表格显示了不同NSFW类别和内容类型的检测准确率百分比:
AI生成内容
类别 | Freepik模型 | Falconsai模型 | Adamcodd模型 |
---|---|---|---|
高 | 100.00% | 84.00% | 92.00% |
中 | 96.15% | 69.23% | 96.00% |
低 | 100.00% | 35.71% | 92.86% |
中性 | 100.00% | 100.00% | 66.67% |
结论:
- 避免在AI生成内容中使用Falconsai,以防止预测错误。
- 我们的模型是检测AI生成内容中NSFW内容的最佳选择。
训练
- 训练数据:使用了100,000张图像进行训练。
- 训练设备:在3块NVIDIA GeForce RTX 3090上训练了3个epoch。
- 数据集划分:使用训练集和验证集进行训练。
- 去重处理:为避免训练集和验证集之间的重复和偏差,使用“openai/clip-vit-base-patch32”模型去除余弦相似度高于0.92的图像。
- 自定义损失:创建了一个自定义损失,以最小化低于真实类别的预测。例如,标记为“高”的图像被预测为“中性”的情况非常罕见(仅占0.46%)。
速度和内存指标
批量大小 | 每批平均时间 (ms) | VRAM (MB) | 优化方式 |
---|---|---|---|
1 | 28 | 540 | 使用PIL图像的BF16 |
4 | 110 | 640 | 使用PIL图像的BF16 |
16 | 412 | 1144 | 使用PIL图像的BF16 |
1 | 10 | 540 | 使用torch张量的BF16 |
4 | 33 | 640 | 使用torch张量的BF16 |
16 | 102 | 1144 | 使用torch张量的BF16 |
🔧 技术细节
模型基于EVA架构,使用了特定的训练数据和优化策略,以实现高效准确的NSFW图像分类。在训练过程中,采用了自定义损失函数,避免了数据集中的重复和偏差,提高了模型的泛化能力。同时,通过对不同批量大小和数据格式(PIL图像和torch张量)的测试,提供了详细的速度和内存指标,为用户在不同场景下的使用提供了参考。
📄 许可证
本项目采用MIT许可证 - 版权所有2025 Freepik Company S.L.
引用
如果您在研究或项目中使用此模型,请按以下方式引用:
@software{freepik2025nsfw,
title={EVA-based Fast NSFW Image Classifier},
author={Freepik Company S.L.},
year={2025},
publisher={Hugging Face},
url = {https://huggingface.co/Freepik/nsfw_image_detector},
organization = {Freepik Company S.L.}
}
致谢
本模型基于EVA架构(timm/eva02_base_patch14_448.mim_in22k_ft_in22k_in1k),相关论文如下:
EVA-02: A Visual Representation for Neon Genesis - https://arxiv.org/abs/2303.11331
@article{EVA02,
title={EVA-02: A Visual Representation for Neon Genesis},
author={Fang, Yuxin and Sun, Quan and Wang, Xinggang and Huang, Tiejun and Wang, Xinlong and Cao, Yue},
journal={arXiv preprint arXiv:2303.11331},
year={2023}
}









