feat: 色情图片识别(NudeNet);明暗档位改为5档(20%~100%)

This commit is contained in:
2025-06-02 21:04:38 +08:00
parent ea88f3e766
commit a914b4be74
13 changed files with 450 additions and 25 deletions
+14 -3
View File
@@ -9,7 +9,7 @@
- **非标分辨率归类**:按像素区间(每 1024px 一档)自动归入 1K ~ 19K / 普通 / 原图(原画质)目录
- **方向区分**:横屏、竖屏、等比(正方形)分开整理,GIF 单独处理
- **EXIF 旋转修正**:手机/相机竖拍的图(文件里横着存、带 EXIF 旋转标记)自动识别并转正——找到 ffmpeg 时用 ffmpeg 把像素真正转正;找不到时至少按"显示方向"(宽高对调)归类,不会再误入横屏目录
- **明暗分类**:基于 ITU-R BT.601 亮度公式分析每张图片明暗程度,暗色(亮度 < 80)像素占比为 darkScore、亮色(亮度 > 175)像素占比为 lightScore;以两者差幅判定亮暗主导,在分辨率目录下追加 `dark_N` / `mid` / `bright_N` 子目录(N 为占比四舍五入到 10% 的档位)
- **明暗分类**:基于 ITU-R BT.601 亮度公式分析每张图片明暗程度,暗色(亮度 < 80)像素占比为 darkScore、亮色(亮度 > 175)像素占比为 lightScore;以两者差幅判定亮暗主导,在分辨率目录下追加 `dark_N` / `mid` / `bright_N` 子目录(N 为占比四舍五入到 20% 的档位,20/40/60/80/100 共 5 档)
- **音频归类**:音频文件单独归入「音频」目录
- **异常兜底**:读取失败、不支持的格式自动归入「读取异常」「已忽略」目录
- **自动整理**:无需人工干预,扫描 → 分析 → 移动一次完成,跨磁盘自动降级为复制后删除
@@ -104,7 +104,7 @@ npm install && npm run dev
{uid}-图片_横屏_720P/dark_100 ← 1280×720,暗色主导
{uid}-图片_横屏_1D5KP/mid ← 1600×900,明暗均衡
{uid}-图片_横屏_1080P/bright_100 ← 1920×1080,亮色主导
{uid}-图片_横屏_2DKP/dark_70 ← 2048×1080(影院 2K)
{uid}-图片_横屏_2DKP/dark_80 ← 2048×1080(影院 2K)
{uid}-图片_竖屏_... ← 竖屏按同样规则(普通 / 1K~19K / 原图)
{uid}-图片_等比_... ← 等比(正方形)按同样规则
{uid}-图片_GIF ← 所有 GIF 图片
@@ -146,7 +146,7 @@ lightScore = 亮度 > 175 的像素占比
```
- **判定规则**:`lightScore` 高于 `darkScore` 15 个百分点以上归 `bright_N` 子目录,反之归 `dark_N` 子目录;差幅不足 15% 视为中性归 `mid`(不强制二选一),明暗名作为分辨率目录下的子目录(如 `图片_横屏_1080P/bright_20`)
- **档位命名**:N 为占比四舍五入到 10% 的档位(10~100),如 darkScore 0.70 → `dark_70`,表示占比命中 [N-5%, N+5%) 区间
- **档位命名**:N 为占比四舍五入到 20% 的档位(20~100,共 5 档),如 darkScore 0.70 → `dark_80`,表示占比命中 [N-10%, N+10%) 区间
- **透明处理**:完全透明的像素(alpha=0)不计入统计,全透明图片归 `-mid`
- **性能**:大图(>100 万像素)先等比缩放为最长边 512px 的缩略图(纯内存)再统计明暗,内存占用与耗时大幅下降;超 4000 万像素的图片直接跳过明暗分析(按中性 mid 归类)避免 OOM
@@ -163,6 +163,7 @@ lightScore = 亮度 > 175 的像素占比
│ ├── store/ # SQLite 媒体信息持久化 + 查询/统计
│ ├── service/ # 后台任务编排(扫描整理任务 + 状态/日志)
│ ├── config/ # Web 服务配置加载(application.properties)
│ ├── nsfw/ # 色情图片识别(本机 python + NudeNet 本地服务)
│ ├── api/ # HTTP 接口层(统一响应 / 媒体列表 / 统计 / 扫描触发)
│ └── digest/ # 文件 MD5 / 指纹采样
├── frontend/ # 前端工程(Vue 2 + ElementUI + Vite,dist 内嵌进程序)
@@ -181,6 +182,16 @@ lightScore = 亮度 > 175 的像素占比
- ffprobe 内嵌(Windows),运行前释放到当前目录、结束后自动删除
- EXIF 旋转转正需要 ffmpeg:配置 `ffmpeg.path` 指定路径,或让 ffmpeg 在 PATH 里;找不到 ffmpeg 时不转正像素,仍按显示方向归类。可用 `organize.rotateImages=false` 关闭
## 色情图片识别(可选)
基于本机 **Python + NudeNet** 的离线鉴黄,判为色情的图片移入 `图片_敏感_*` 分类目录(明暗子目录照常保留,如 `图片_敏感_横屏_1080P/bright_20`),便于事后人工复核。
- **开启**:`application.properties` 里设 `nsfw.enabled=true`(默认关闭)
- **依赖**:本机安装 Python(>=3.6)并 `pip install nudenet`(包自带 320n 模型,无需手动下载)
- **可调**:`nsfw.python`(python 路径,留空自动在 PATH 找)、`nsfw.threshold`(判定阈值,默认 0.5)
- **敏感类**:`FEMALE_GENITALIA_EXPOSED` / `MALE_GENITALIA_EXPOSED` / `ANUS_EXPOSED` / `FEMALE_BREAST_EXPOSED`,任一分数达标即判定
- **降级**:未装 python / nudenet 时打印警告并跳过识别,图片按普通流程整理,不影响其它功能
## License
Apache 2.0