z
zhangkx888/nsfw_image_detector
模型介绍
文件和版本
Pull Requests
讨论
分析

nsfw_image_detector 昇腾NPU部署文档

1. 模型简介

模型名称: nsfw_image_detector (Freepik/nsfw_image_detector)

模型链接: Freepik/nsfw_image_detector

模型描述: 基于 EVA-02 架构微调的 NSFW 图像四分类检测模型,在 10 万张合成标注图像上训练,可对图像内容进行 neutral(中性)/ low(低风险)/ medium(中风险)/ high(高风险)四级分类,也支持按阈值等级(low/medium/high)做 NSFW 二分类判定。在 Freepik 内部基准上,High 类别准确率 99.54%、Neutral 99.87%。

模型架构: EVA-02 (Base, patch14/448),timm 封装(TimmWrapperForImageClassification),448x448 输入

参数规模: 86.4M

相关获取地址:

  • 权重下载地址(HuggingFace):https://huggingface.co/Freepik/nsfw_image_detector
  • 在线 Demo(HuggingFace Space):https://huggingface.co/spaces/ccabrerafreepik/nsfw_image_detector
  • 技术论文(EVA-02):https://arxiv.org/abs/2303.11331

2. 验证环境

组件版本
torch2.9.0
torch-npu2.9.0.post1+gitee7ba04
transformers4.57.6
timm1.0.28
numpy2.x
Pillow12.2.0
昇腾驱动 / CANNnpu-smi 25.5.5
  • NPU:2 逻辑卡(Ascend910)
  • 模型路径:/opt/atomgit/0820/nsfw_image_detector
  • 推理设备:npu:0
  • 模型精度:bfloat16(官方推荐)

3. 环境依赖

依赖项版本要求说明
Python>= 3.10推荐 3.11
torch>= 2.1.0本验证使用 2.9.0
torch_npu>= 2.1.0昇腾 NPU 插件(随 CANN 安装)
transformers>= 4.45.0本验证使用 4.57.6
timm>= 1.0.0TimmWrapperForImageClassification 与图像预处理依赖
numpy>= 1.24.0数值计算
Pillow>= 9.0.0图像处理

安装命令:

# 使用清华源安装基础依赖
pip install torch torch_npu transformers timm numpy Pillow -i https://pypi.tuna.tsinghua.edu.cn/simple

# torch_npu 需与 CANN 版本配套,亦可从昇腾官方源安装:
# pip install torch_npu -i https://pypi.ascend.com/pypi/simple

或直接使用仓库内 requirements.txt 一键安装:

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

4. 推理步骤

4.1 环境准备

# 检查 NPU 设备
npu-smi info

4.2 运行推理

cd /opt/atomgit/0820/nsfw_image_detector

# 默认推理(内置双样例:自然风景 + 人物剪影)
python inference.py

# 检测指定本地图片
python inference.py --image ./img.jpg

# 检测指定 URL 图片
python inference.py --image_url https://example.com/image.jpg

# 自定义 NSFW 判定阈值等级(low/medium/high)
python inference.py --image ./img.jpg --threshold high

4.3 推理参数说明

参数类型默认值说明
--model_pathstr脚本所在目录模型权重目录
--imagestr-输入图片路径
--image_urlstr-输入图片 URL
--thresholdstrmediumNSFW 判定阈值等级(low/medium/high)
--devicestrauto推理设备(auto/npu:0/cuda:0/cpu)

5. 测试样例及输出结果

样例 1:内置双样例检测(自然风景 + 人物剪影)

输入:

python inference.py

输出:

[INFO] 设备类型: npu | 设备: npu:0
[INFO] 正在加载 NSFW 检测模型: /opt/atomgit/0820/nsfw_image_detector
[INFO] 模型加载成功 | 设备: npu:0 | 参数量: 86.4M | 精度: bf16
[INFO] 图像预处理: 448x448 + CLIP 归一化 (Compose)
[INFO] 待检测图像数量: 2 | 判定阈值: medium

============================================================
Running inference on NPU...
============================================================

----- 样例 1: 中性示例:自然风景 -----
  neutral  = 0.9997
  low      = 0.0001
  medium   = 0.0001
  high     = 0.0001
  最高概率类别 = neutral (0.9997)
  NSFW 累计概率 (medium+) = 0.0002
  判定结果 = SFW
  单图推理耗时 = 321.3 ms

----- 样例 2: 中性示例:人物剪影 -----
  neutral  = 0.9994
  low      = 0.0002
  medium   = 0.0002
  high     = 0.0003
  最高概率类别 = neutral (0.9994)
  NSFW 累计概率 (medium+) = 0.0005
  判定结果 = SFW
  单图推理耗时 = 10.2 ms

============================================================
Inference completed! nsfw_image_detector 在昇腾 NPU 上推理成功!
============================================================

完整运行日志(含推理期间 npu-smi info 采样及进程占用情况)见 run_npu.log。

样例 2:指定图片检测

输入:

python inference.py --image ./my_image.jpg --threshold low

输出:

[INFO] 设备类型: npu | 设备: npu:0
[图片] 本地图片: ./my_image.jpg
[INFO] 待检测图像数量: 1 | 判定阈值: low
...
----- 样例 1: 本地图片: ./my_image.jpg -----
  neutral  = <中性概率>
  low      = <低风险概率>
  medium   = <中风险概率>
  high     = <高风险概率>
  最高概率类别 = <概率最高类别>
  NSFW 累计概率 (low+) = <累计概率>
  判定结果 = NSFW / SFW
  单图推理耗时 = ~300 ms

6. 性能参考

指标数值
模型参数量86.4M
模型加载 + 权重迁移至 NPU~11 s
单图前向推理(448x448 输入,bf16)~300 ms(首图)/ ~10 ms(预热后)
NPU 显存占用(推理期间)392 MB
NPU 芯片Ascend910 / 2 逻辑卡

推理期间通过 npu-smi info 多次采样可观察到 python3 进程实际占用 NPU(进程内存 392MB,推理时 AICore 利用率最高达 13%、HBM 用量 3108MB 升至 3534MB),详见 run_npu.log。

7. 注意事项

  • 推理脚本通过 torch_npu 调用 NPU 设备(check_device() 自动优先选择 npu:0),未检测到 NPU 时回退 CPU/CUDA。
  • 模型官方推荐以 bfloat16 精度加载(训练即使用 bf16),本脚本默认 bf16。
  • 图像预处理使用 timm 的 create_transform + resolve_data_config(eva02_base_patch14_448 配置:448x448 squash resize + CLIP 归一化),与官方推理方式一致,不依赖 HF 的 image processor。
  • 模型依赖 timm 包(TimmWrapperForImageClassification 架构与预处理均需 timm >= 1.0)。
  • NSFW 判定采用官方累计概率逻辑:所选等级及更高等级的累计概率 >= 0.5 判定为 NSFW(例如 --threshold medium 时取 medium+high 之和)。
  • 内置双样例为程序化生成图像(风景/剪影),模型将其正确判定为 neutral(SFW);实际使用建议用 --image 或 --image_url 传入真实图片。