Files
kenaito-media-picker/x20260829.md
T

3.7 KiB
Raw Blame History

2026-08-29:图像类型分类 + 双鉴黄 方案

目标

区分 真人 / 动漫 / 风景 三类图片,分别落不同目录;真人、动漫各用一套本地离线鉴黄, 命中的敏感图按分值档落到对应目录。全程本地运行,不依赖在线大模型。

分类定义

类型 含义 敏感判定
真人 真实照片且含人物 NudeNet(现用,照片训练)
动漫 二次元/插画/3D 渲染 wd14/danbooru 动漫鉴黄
风景 真实照片无人物(纯场景) 一般不做

模型选型(全部本地 ONNX)

阶段 模型 说明
真人 vs 动漫 dghs-imgutils anime_real 二分类,输出 real/anime 概率
真人 vs 风景 真人检测器 检测到人脸/人物 → 真人,否则风景
真人鉴黄 NudeNet(已有 lib/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 鉴黄
                              ├─ 正常 → 图片_真人_方向_清晰度/明暗
                              └─ 敏感 → 图片_敏感_真人_<分值档>

落地改动点

  1. internal/nsfw/server.py:升级为「类型判定 + 双鉴黄」服务,/detect 返回 {subject, isAnime, nsfwScore, nsfwType}(或拆多个接口)
  2. internal/classify:新增 subject 维度,拼目录名 图片_<subject>_方向_清晰度/明暗 与 图片_敏感_<subject>_<分值档>
  3. internal/organize:probe 阶段收集 subject + 分值,分流到对应目录
  4. internal/store + 前端:媒体库加「真人/动漫/风景」筛选;色情识别页面标注类型与分值
  5. lib/:新增 imgutils 各模型 + 真人检测器模型(离线分发,同 320n.onnx 思路, 首次联网下载进 lib)

确认点(待用户拍板)

  1. 「真人」判定标准:检测到人脸就算(RetinaFace,轻量),还是要检测到整个人 (YOLO person)?宠物/静物照片归哪类(风景 or 单独「其他」)?
  2. 动漫风景(二次元场景图)归「动漫」还是「风景」?(默认归「动漫」)
  3. 目录结构:普通图保持 图片_<类型>_方向_清晰度/明暗;敏感图用 图片_敏感_<类型>_<分值档>(分值档沿用 20/40/60/80/100 五档)。还是敏感图也要保留方向/明暗?
  4. 动漫鉴黄阈值/等级:questionable(擦边)和 explicit(露骨)都算敏感,还是只有 explicit 算?
  5. 离线模型体积:imgutils 各模型 + YOLO 合计约几十到几百 MB(wd14 动漫鉴黄模型较大), 需首次联网下载进 lib/ 再分发——接受吗?还是改用更小的动漫鉴黄模型(精度略降)?