3.7 KiB
3.7 KiB
2026-08-29:图像类型分类 + 双鉴黄 方案
目标
区分 真人 / 动漫 / 风景 三类图片,分别落不同目录;真人、动漫各用一套本地离线鉴黄, 命中的敏感图按分值档落到对应目录。全程本地运行,不依赖在线大模型。
分类定义
| 类型 | 含义 | 敏感判定 |
|---|---|---|
| 真人 | 真实照片且含人物 | NudeNet(现用,照片训练) |
| 动漫 | 二次元/插画/3D 渲染 | wd14/danbooru 动漫鉴黄 |
| 风景 | 真实照片无人物(纯场景) | 一般不做 |
模型选型(全部本地 ONNX)
| 阶段 | 模型 | 说明 |
|---|---|---|
| 真人 vs 动漫 | dghs-imgutils anime_real |
二分类,输出 real/anime 概率 |
| 真人 vs 风景 | 真人检测器 | 检测到人脸/人物 → 真人,否则风景 |
| 真人鉴黄 | NudeNet(已有 lib/human_nwfs/320n.onnx) |
保持现状 |
| 动漫鉴黄 | dghs-imgutils anime_rating / nsfw_pred |
danbooru 评级:safe/questionable/explicit 分数 |
dghs-imgutils(pip install dghs-imgutils)一个包覆盖「真人/动漫判定」+「动漫鉴黄」+「动漫分类」, 纯 ONNX、CPU、离线,与现有 NudeNet 同栈。- 「真人 vs 风景」需真人检测器,可选:
- YOLOv8n person(COCO,约 6MB):检测整个人,更符合「真人」语义
- RetinaFace 人脸(约 1.6MB):只认脸,快但漏掉没脸的人物照
判定流程
图片 → ① anime_real 判定
├─ 动漫 → ② 动漫鉴黄(anime_rating/nsfw_pred) → 分值
│ ├─ 正常 → 图片_动漫_方向_清晰度/明暗
│ └─ 敏感 → 图片_敏感_动漫_<分值档>
└─ 真人 → ③ 真人检测器
├─ 无人物 → 风景 → 图片_风景_方向_清晰度/明暗
└─ 有人物 → ④ NudeNet 鉴黄
├─ 正常 → 图片_真人_方向_清晰度/明暗
└─ 敏感 → 图片_敏感_真人_<分值档>
落地改动点
internal/nsfw/server.py:升级为「类型判定 + 双鉴黄」服务,/detect返回{subject, isAnime, nsfwScore, nsfwType}(或拆多个接口)internal/classify:新增 subject 维度,拼目录名图片_<subject>_方向_清晰度/明暗与图片_敏感_<subject>_<分值档>internal/organize:probe 阶段收集 subject + 分值,分流到对应目录internal/store+ 前端:媒体库加「真人/动漫/风景」筛选;色情识别页面标注类型与分值lib/:新增 imgutils 各模型 + 真人检测器模型(离线分发,同320n.onnx思路, 首次联网下载进 lib)
确认点(待用户拍板)
- 「真人」判定标准:检测到人脸就算(RetinaFace,轻量),还是要检测到整个人 (YOLO person)?宠物/静物照片归哪类(风景 or 单独「其他」)?
- 动漫风景(二次元场景图)归「动漫」还是「风景」?(默认归「动漫」)
- 目录结构:普通图保持
图片_<类型>_方向_清晰度/明暗;敏感图用图片_敏感_<类型>_<分值档>(分值档沿用 20/40/60/80/100 五档)。还是敏感图也要保留方向/明暗? - 动漫鉴黄阈值/等级:
questionable(擦边)和explicit(露骨)都算敏感,还是只有explicit算? - 离线模型体积:imgutils 各模型 + YOLO 合计约几十到几百 MB(wd14 动漫鉴黄模型较大),
需首次联网下载进
lib/再分发——接受吗?还是改用更小的动漫鉴黄模型(精度略降)?