HanWangTJU's picture
Publish NMM data preprocessing v0.3.0 with Chinese tutorials
cf87e14 verified
|
Raw History Blame Contribute Delete
31.7 kB
# 图片—文本数据清洗:完整操作与指标手册
## 1. 工具范围和运行环境
本工具处理本地图片与可选文本,完成导入、规范化测量、分布统计、分辨率/质量筛选、去重和独立导出。源文件不修改、不删除。保留/拒绝/重复/错误的判断通过输出清单表达。
Python 3.10+;Windows 与 Linux;基础处理不需要 GPU。先下载仓库,以下以安装目录为例:
```text
D:\projects\multimodal_training
```
Windows 首次安装需要建立 `.venv`,完成后进入项目目录使用:
```powershell
cd D:\projects\multimodal_training
.\.venv\Scripts\python.exe -m image_cleaner --help
```
新机器首次安装:
```powershell
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e .
```
Linux 对应安装与命令前缀:
```bash
python3 -m venv .venv
.venv/bin/python -m pip install -e .
.venv/bin/python -m image_cleaner --help
```
下文 Windows 命令均在项目根目录运行。Linux 将前缀改为 `.venv/bin/python` 并使用相应路径即可。每次筛选使用新的输出目录。
## 2. 输入方式
### 2.1 文件夹:适合直接批量导入
```text
D:\datasets\images\
animals\001.jpg
animals\001.txt
charts\002.png
charts\002.txt
```
递归发现 `.jpg/.jpeg/.png/.webp/.bmp/.tif/.tiff/.gif/.avif`。图片有同名 UTF-8 `.txt` 时加 `--sidecar-text`,否则只导入图片。默认不跟随目录符号链接;扩展名发现列表与实际可解码格式不同,具体解码能力取决于 Pillow。
### 2.2 JSONL:适合图文配对与多机迁移
每行至少一个字符串 `path`,可以附带 `text`、`id`、`metadata`:
```json
{"id":"original-001","path":"animals/001.jpg","text":"一只猫坐在窗边。","metadata":{"source":"dataset-a"}}
{"id":"original-002","path":"charts/002.png","text":"一个展示月份销量的柱状图。"}
```
相对路径以 `--root` 为基准;省略时以输入 JSONL 所在目录为基准。原始 ID 保存为 `source_id`,其他额外字段归入 `metadata`。同一图片允许多条不同文本记录。跨节点推荐相对路径;绝对路径不受 `--root` 重映射。
```powershell
.\.venv\Scripts\python.exe -m image_cleaner run --input "D:\datasets\pairs.jsonl" --root "D:\datasets\images" --output runs/pairs_statistics --config configs/statistics_only.json --workers 8
```
格式错误的输入 JSONL、非字符串文本或无法读取的 sidecar 会使导入报错;单张图片缺失或损坏在分析阶段记录为错误。工具不直接下载 URL 或读取压缩包内的图片。
## 3. 推荐流程:先统计,再筛选,再导出
### 3.1 全量分布统计
```powershell
.\.venv\Scripts\python.exe -m image_cleaner run --input "D:\datasets\images" --output runs/statistics --config configs/statistics_only.json --workers 8 --sidecar-text
```
只处理图片且没有文本时移除 `--sidecar-text`。统计配置关闭尺寸/质量/文本可选阈值和去重,成功处理的静态图片全部保留;损坏、超过容量限制、动画/多页等仍作为错误记录。
查看报告:
```powershell
Start-Process -FilePath "runs/statistics/curated/report.html"
```
`report.json` 适合程序读取,`report.html` 包含无外部依赖的分布图。先检查分辨率、宽高比、噪声与清晰度分布,再确定规则。
### 3.2 保留 256p 及以上的图片
```powershell
.\.venv\Scripts\python.exe -m image_cleaner filter --shards runs/statistics/shards --output runs/only_256p --resolution 256p
```
`256p` 的定义是 `min(width, height) >= 256`,表示短边大于或等于 256 像素,256 本身保留。它不表示缩放图片,与 `min_short_edge=256` 的尺寸边界相同。
| 图片尺寸(宽×高) | `256p` | `256x256` | `384x256` |
|---|---|---|---|
| 256×256 | 保留 | 保留 | 拒绝 |
| 384×256 | 保留 | 拒绝 | 保留 |
| 256×384 | 保留 | 拒绝 | 拒绝 |
| 255×384 | 拒绝 | 拒绝 | 拒绝 |
| 257×384 | 保留 | 拒绝 | 拒绝 |
| 512×512 | 保留 | 拒绝 | 拒绝 |
其他选择:
```powershell
# 仅保留 256×256。
.\.venv\Scripts\python.exe -m image_cleaner filter --shards runs/statistics/shards --output runs/only_square --resolution 256x256
# 仅保留宽 384、高 256。
.\.venv\Scripts\python.exe -m image_cleaner filter --shards runs/statistics/shards --output runs/only_landscape --resolution 384x256
# 改为短边大于或等于 512。
.\.venv\Scripts\python.exe -m image_cleaner filter --shards runs/statistics/shards --output runs/only_512p --resolution 512p
# 关闭分辨率条件。
.\.venv\Scripts\python.exe -m image_cleaner filter --shards runs/statistics/shards --output runs/all_resolutions --resolution any
```
尺寸以 EXIF 方向校正后的宽高为准:编码为 256×384、EXIF 要求旋转 90° 的图片会以 384×256 判断。色彩转换不改变尺寸;导出缩放发生在筛选之后。
`filter` 等价于 `merge`,始终从分析分片里的全部记录重新判定,不能把它的 `--shards` 指向上一轮 `curated` 目录。即使第一轮某图片被阈值或去重排除,分析结果仍在分片中,可以再次参与筛选。原图不会被重新解码;物理导出仍需要原图存在。
### 3.3 分辨率与其他筛选一起执行
使用配置文件可同时加入宽高比、质量、文本条件或去重:
```powershell
.\.venv\Scripts\python.exe -m image_cleaner filter --shards runs/statistics/shards --output runs/256p_deduplicated --config configs/audit.json --resolution 256p
```
上例额外开启去重;符合尺寸的重复记录仍会进入 `duplicate.jsonl`。如果只希望剔除短边小于 256 的图片,沿用统计配置或指定 `--config configs/above_256p.json`,其去重关闭。
配置优先级:未传 `--config` 时继承分析时的完整配置;传了 `--config` 时从该 JSON 和代码默认值构造新配置,不是对原配置做部分补丁;`--resolution` 最后覆盖分辨率字段。所有启用规则取交集。若同时设置 `min_short_edge=512` 与 `resolution=256p`,最终仍要求短边至少 512;如需允许所有大于或等于 256 的尺寸,先关闭更严格的其他尺寸规则。
阈值修改和精确分辨率筛选可以复用分析结果。`reject_animated/max_decode_pixels/metric_patch_size/alpha_background/convert_icc/text_unicode_form` 属于测量与预处理设置,改变这些设置需要重新分析。
### 3.4 导出标准化图片与文本
```powershell
.\.venv\Scripts\python.exe -m image_cleaner export --curated runs/only_256p --output runs/export_256p --workers 8
```
只导出 `kept.jsonl` 中的记录,默认 PNG、RGB、保留已匹配尺寸,不做裁剪或放大。文件放在 `images` 子目录,`exported.jsonl` 的 `path` 为导出目录下的相对路径。导出会校验源文件 SHA-256;源文件在分析后发生变化会记录失败。
`export_max_edge` 如被启用,可能改变筛选后图片尺寸;需要导出文件仍满足筛选条件时保持 `export_max_edge=null`。例如 1024×512 符合 256p 及以上,但若导出最长边限制为 384,则会缩成 384×192,输出不再满足短边至少 256 的条件。
### 3.5 一键流程
已经明确目标时可以直接执行:
```powershell
.\.venv\Scripts\python.exe -m image_cleaner run --input "D:\datasets\images" --output runs/direct_256p --config configs/above_256p.json --workers 8 --export
```
也可以在 `run` 或 `analyze` 上直接传 `--resolution`;推荐第一次先完成全量统计。
### 3.6 宽高比桶筛选
比例始终为 EXIF 方向校正后的 **宽:高**。八个固定桶为 `1:1,2:3,3:2,3:4,4:3,9:16,16:9,21:9`。竖图与横图分别选择,例如选择 `2:3` 不会自动选择 `3:2`。
```powershell
# 在项目根目录执行。先运行 3.1 的统计任务,再用缓存分片筛选。
# 严格多选:实际尺寸必须与任意一个选中桶完全同比分配。
.\.venv\Scripts\python.exe -m image_cleaner filter --shards runs/statistics/shards --output runs/aspect_strict --aspect-buckets "1:1,2:3,3:2" --aspect-mode strict
# 宽松全选:5% 偏差,也可以省略 tolerance 参数使用默认值。
.\.venv\Scripts\python.exe -m image_cleaner filter --shards runs/statistics/shards --output runs/aspect_loose --aspect-buckets all --aspect-mode loose --aspect-tolerance 0.05
# 更严格的 3% 容差,同时保留短边 >=256 的图片。
.\.venv\Scripts\python.exe -m image_cleaner filter --shards runs/statistics/shards --output runs/aspect_3percent_256 --resolution 256p --aspect-buckets "3:4,4:3,9:16,16:9" --aspect-mode loose --aspect-tolerance 0.03
# 覆盖已有配置、关闭桶条件。其他筛选条件继续生效。
.\.venv\Scripts\python.exe -m image_cleaner filter --shards runs/statistics/shards --output runs/aspect_disabled --aspect-buckets none
# 从文件夹直接运行,支持多进程。
.\.venv\Scripts\python.exe -m image_cleaner run --input "D:\datasets\images" --output runs/aspect_run --workers 8 --aspect-buckets all --aspect-mode loose
# 使用示例配置。示例关闭去重以便单独观察桶筛选效果。
.\.venv\Scripts\python.exe -m image_cleaner filter --shards runs/statistics/shards --output runs/aspect_config --config configs/aspect_loose.json
```
每次重筛选使用一个新的输出目录。`filter` 读取全部分析记录,包括此前被规则拒绝的图片;因此既能收紧也能放宽条件,不需要再次解码。解码失败的记录仍归入错误。
| 参数 | 默认值 | 含义 |
| --- | --- | --- |
| `--aspect-buckets` | 不启用,或继承配置/分片 | 英文逗号分隔多选;`all` 是八桶并集;`none` 关闭;空值或非预设桶报错 |
| `--aspect-mode` | `strict`,或继承配置/分片 | `strict` 精确匹配;`loose` 容差匹配 |
| `--aspect-tolerance` | `0.05`,或继承配置/分片 | 有限非负小数,仅宽松模式生效;`0.05` 表示 5%,`0` 表示不允许偏差 |
三个参数均支持 `analyze`、`filter`/`merge`、`run`。显式命令行参数优先于配置;未传参数保留配置值。没有传 `--config` 的 `filter` 继承分析分片配置;传入配置文件则按该文件及 Config 默认值构建整套筛选规则。
设实际比例 `r=width/height`,目标桶比例 `b`。严格模式使用整数交叉相乘:例如 `2:3` 要求 `width×3 == height×2`。宽松模式要求 `δ=max(r/b,b/r)-1 <= aspect_tolerance`,包含边界。实现使用精确分数比较。例如选 `1:1`、偏差 5% 时,`1050×1000` 和 `1000×1050` 均通过,`1051×1000` 不通过。此对称定义下允许区间为 `[b/1.05, b×1.05]`,并非普通的 `[b×0.95,b×1.05]`。
任意一个选中桶匹配即可通过。如果匹配多个桶,则只分配给偏差最小的桶;同偏差按上述固定八桶顺序选取,因此每张图片只计数一次。重复选择会合并。`all` 仍会过滤超出所有桶范围的图片。桶条件与分辨率、`min_aspect_ratio/max_aspect_ratio`、质量、文本条件取交集;不会裁剪或缩放图片。
配置文件新增字段示例:
```json
{
"aspect_buckets": ["1:1", "2:3", "3:2"],
"aspect_mode": "loose",
"aspect_tolerance": 0.05
}
```
`aspect_buckets` 也接受 `"all"`、`"none"` 或 `null`。多机仍使用第 6 节的同一 manifest 和 rank/world-size 流程;所有节点分析配置一致,收集全部分片后统一执行上面的 `filter` 命令,桶筛选无需各节点读取源图片。
## 4. 各环节指标和判定规则
### 4.1 导入、解码和容量检查
| 字段/指标 | 意义 | 判定 |
|---|---|---|
| `input_count` | 清单记录数量,包含同图多文本记录 | 不是去重后的独立图片数 |
| `original_width/original_height` | 文件编码中的原始尺寸 | 与 EXIF 校正后的尺寸分别保存 |
| `original_format/original_mode` | 解码格式和像素模式 | 用于来源与格式审计 |
| `frame_count` | 帧数或页数 | 默认 `reject_animated=true` 时,多帧/多页报处理错误 |
| `max_decode_pixels` | 单图最大解码像素数 | 默认 100,000,000;超过限制报错 |
| `error_count`、`error.jsonl` | 文件缺失、损坏、截断或处理异常 | 不进入有效分布统计与导出 |
| `processing_success_rate` | 完成整套图片处理数 ÷ 输入记录数 | 是处理成功率,不是人工质量准确率 |
### 4.2 标准化
| 字段/设置 | 行为和验证方法 |
|---|---|
| `exif_transposed` | 是否按 EXIF 方向进行转置;查看标准化宽高并抽查方向 |
| `icc_converted` | 有 ICC 且开启转换时转为 sRGB;失败记错误 |
| `alpha_flattened` | 是否存在透明通道并按 `alpha_background` 合成;默认白色 |
| `text_unicode_form` | NFC 默认;可选 NFKC 或 none;同时统一换行并去首尾/行尾空白 |
| 导出的 `width/height`、像素模式 | 检查最终尺寸与 RGB 模式;导出可选等比例缩小 |
标准化属于数据规范化,未实现模型训练的 dropout/weight decay,也不会执行默认去噪或锐化。16 位/浮点图片最终转为 8 位 RGB,本工具主要面向常规网页图像。
### 4.3 分布统计、分辨率和宽高比
| 字段 | 定义/单位 | 筛选配置 |
|---|---|---|
| `width` | EXIF 校正后的宽度,像素 | `resolution=WxH` 可精确限定 |
| `height` | EXIF 校正后的高度,像素 | `resolution=WxH` 可精确限定 |
| `short_edge` | min(width,height),像素 | `resolution=Np` 要求大于或等于 N;`min_short_edge` 为包含边界的下限 |
| `long_edge` | max(width,height),像素 | `max_long_edge` 为上限 |
| `pixels` | width×height | `min_pixels/max_pixels` |
| `aspect_ratio` | width/height | `min_aspect_ratio/max_aspect_ratio` |
| `orientations` | 横、竖、近方图数量 | 0.95≤W/H≤1.05 视为近方图;只是统计类别 |
分辨率筛选不匹配时,原因是 `resolution_mismatch`。`min_short_edge=256` 与 `resolution=256p` 均包含 256,因此 255 不合格,256 和 257 合格。`resolution_filter.mode=short_edge_gte` 与 `comparison=">="` 在报告中记录这一判定;`WxH` 仍为精确宽高匹配。
每个分布提供有效数量、缺失数量、最小值、最大值、均值、总体标准差、p1/p5/p25/p50/p75/p95/p99,以及固定桶直方图。桶为左闭右开,最后覆盖到无穷大;直方图是全量精确计数。分位数最多使用固定种子 20,000 条蓄水池样本;更大规模时 `quantiles_approximate=true`。
`before` 覆盖成功处理的全部记录,`after` 覆盖最终保留记录;不代表按独立图片去重后的来源统计。分辨率匹配数另外直接按每条记录统计,避免粗直方图桶无法区分 255/256/257 的问题。
### 4.4 图片技术质量
默认在四角和中心最多五个原生像素区域测量,区域大小最多 `metric_patch_size=256`,相同区域去重,各指标取有效区域的中位数。不会先缩图再测量;可能漏掉未采样区域的局部缺陷。
| 字段 | 计算方式、解释 | 筛选条件 |
|---|---|---|
| `blur_score` | 灰度区域上 Var(up+down+left+right−4×center),拉普拉斯方差;通常越低越模糊 | 低于 `min_blur_score` 拒绝 |
| `noise_sigma` | 在梯度最低约 30% 区域,用 3×3 高通残差计算 MAD/(0.67448975×6),像素幅度范围 0–255 | 高于 `max_noise_sigma` 拒绝 |
| `snr_proxy_db` | 每区域 20log10(灰度标准差/noise_sigma),然后取区域中位数 | 低于 `min_snr_proxy_db` 拒绝 |
| `blockiness` | 对水平/垂直 8 像素网格各相位求边界梯度与非边界梯度差;每轴取最大差,再平均并截断到非负 | 高于 `max_blockiness` 拒绝 |
| `luminance` | 灰度均值,0–255 | 当前仅记录,无直接阈值 |
| `contrast` | 灰度总体标准差 | 当前仅记录,无直接阈值 |
| `metric_patch_count` | 实际采样区域数 | 当前仅记录,方便审计 |
这些是代理指标:拉普拉斯方差可能因噪声升高,纹理会影响噪声估计,规则图案也会产生块效应分数。信噪比的“信号”采用局部亮度标准差,不是真实 SNR,也不是 PSNR。
噪声或对比度接近零时,SNR 返回 `null` 并写入 `snr_proxy_undefined`;极小图片部分指标为 `null`。缺失值不会触发对应质量阈值。报告的 `missing` 表示未得到指标值,不表示质量合格。
所有质量阈值默认 null(关闭);先按照片/截图/图表/插画等类型抽查,再设置阈值。修改 `metric_patch_size` 会改变指标分布,必须重新分析并重新校准。
### 4.5 文本筛选
| 指标/设置 | 判定 |
|---|---|
| `text_chars` | 规范化后 Python 字符数量;缺失文本按 0 统计,不是 token 数或单词数 |
| `min_text_chars` | 低于下限拒绝;设置为 1 可排除没有文字的样本 |
| `max_text_chars` | 超过上限拒绝 |
| `forbidden_text_patterns` | 任一 Python 正则表达式 `re.search` 命中即拒绝,默认区分大小写 |
例如配置 `"forbidden_text_patterns": ["(?i)buy\\s+now", "点击购买"]` 可匹配部分广告文本。这是启发式文本规则,不能判断图片与文本是否语义对应。
### 4.6 去重
质量规则通过后再进行全局去重,以避免不合格图片挤掉合格代表。
| 指标/类型 | 判定 | 配置 |
|---|---|---|
| `file_sha256`、`exact_file` | 原文件字节 SHA-256 一致 | `deduplicate=true` |
| `pixel_sha256`、`exact_pixels` | 标准化 RGB 尺寸和像素一致 | `deduplicate=true` |
| pHash 汉明距离 | 64 位低频 DCT 特征哈希差异 | 不超过 `phash_distance`,默认 4,可设 0–8 |
| dHash 汉明距离 | 64 位相邻灰度梯度特征差异 | 不超过 `dhash_distance`,默认 4,可设 0–64 |
| RGB 缩略图 RMSE | 16×16 RGB 图像 sqrt(mean((a−b)²)) | 不超过 `near_rgb_rmse`,默认 8.0 |
| 宽高比差异 | abs(log(ratio_a/ratio_b)) | 不超过 `near_aspect_log_tolerance`,默认 0.03 |
| `near_perceptual` | 上述近重复条件均满足 | `near_deduplicate=true` 且总去重开启 |
pHash 使用相对 AC 系数容差抑制极小系数,与普通 pHash 数值不完全相同。所有近重复复核是启发式,不能代替语义 embedding 去重。
默认 `duplicate_scope=image_text`:规范化文本也相同才归并,保留同图不同描述/问答;没有文本时按图片归并。`image` 会忽略文本差异。代表优先级为像素数降序、噪声升序、清晰度降序、清单序号升序,不是人工审美排序。
`duplicate.jsonl` 给出 `duplicate_of/duplicate_kind/duplicate_metrics`。近重复记录目前保存 pHash 距离和 RGB RMSE,dHash 与比例条件用于判断但未单独写入距离字段。每个重复直接匹配一个保留代表,不通过无限传递链扩大分组。
### 4.7 阶段评测指标
令 N 为输入条数、D 为处理成功条数、M 为指定分辨率匹配条数、E 为全部规则通过条数、U 为重复条数、K 为最终保留条数:
| `report.json` 字段 | 定义 |
|---|---|
| `input_count` | N |
| `error_count` | N−D |
| `stage_metrics.processing_success_count/rate` | D、D/N |
| `stage_metrics.resolution_matched_count` | M,单独按尺寸条件计算,不含其他质量限制 |
| `stage_metrics.resolution_mismatched_count` | D−M |
| `stage_metrics.resolution_pass_rate` | M/D;分辨率条件关闭时为 1(D>0) |
| `stage_metrics.rules_eligible_count/rules_pass_rate` | E=K+U、E/D |
| `rejected_count` | D−E,至少一个规则不合格 |
| `duplicate_count` | U |
| `stage_metrics.duplicate_rate_among_eligible` | U/E |
| `kept_count/stage_metrics.final_keep_rate` | K、K/N |
| `before.reasons` | 最终各原因的出现次数;一条拒绝记录可有多个原因,不可直接加总当成样本数 |
分母为零时比率为 null。比率是 0–1 的数值;乘 100 得百分比。每次完整输出满足 `N=K+rejected_count+U+error_count`。关闭去重时 U=0。
这些指标衡量清洗流程和数据组成,不是模型性能或人工标注准确率。若要评估误删/漏删,按图片类型和规则分层抽取人工审核样本,统计“被拒绝但实际可用”的比例和“保留但实际不合格”的比例。后续训练收益需要固定训练预算、随机种子与验证集做对照实验。
### 4.8 宽高比桶筛选评测指标
打开输出目录的 `report.html` 查看新增宽高比桶部分;`report.json` 提供机器可读指标,`kept.jsonl`、`rejected.jsonl` 等提供逐条结果。
| 指标/字段 | 定义与用途 |
| --- | --- |
| `stage_metrics.aspect_bucket_matched_count` | 成功解码记录中,单独满足桶条件的数量;不受其他阈值和去重影响 |
| `aspect_bucket_mismatched_count` | 成功解码数量减去桶匹配数量 |
| `aspect_bucket_pass_rate` | 桶匹配数 / 成功解码数;无成功解码记录为 null;关闭桶条件时成功解码记录全部通过 |
| `aspect_bucket_filter.counts_before` | 所有成功解码图片的匹配桶归属计数,包含因其他条件拒绝或重复的图片 |
| `aspect_bucket_filter.counts_after` | 最终 kept 图片的桶归属计数,已应用全部规则及去重 |
| `aspect_bucket_filter` 其余字段 | 是否启用、选中桶、模式、容差、尺寸计算依据、偏差公式 |
| 每条记录 `aspect_bucket` | 匹配且分配的桶;没有通过桶条件或关闭条件时为 null |
| `aspect_bucket_nearest` | 最近的选中桶,即使不通过也可用来排查;关闭条件时为 null |
| `aspect_bucket_deviation` | 到最近桶的对称相对偏差;例如 0.05 是 5%;关闭条件时为 null |
| `aspect_bucket_match` | true/false 表示通过/未通过;关闭条件时为 null |
| 拒绝原因 `aspect_bucket_mismatch` | 不满足任何选中桶;同一记录可同时包含多个拒绝原因 |
上述逐条字段针对成功解码记录;错误记录可能没有尺寸与桶字段。`counts_before` 总和等于独立桶匹配数(条件启用时),`counts_after` 总和等于最终保留数。选中但没有图片的桶也输出 0;关闭条件时桶计数字典为空。质量评测可同时检查桶通过率、各桶覆盖量、最终保留率,并人工抽查 rejected 中临界偏差图片;各桶不执行均衡采样或配额。
## 5. 配置文件和参数
项目已有:
| 配置 | 用途 |
|---|---|
| `configs/statistics_only.json` | 全量统计,关闭可选阈值与去重 |
| `configs/above_256p.json` | 短边大于或等于 256,关闭去重 |
| `configs/exact_256p.json` | 兼容旧文件名,内容与 above_256p 相同,采用大于或等于的新规则 |
| `configs/audit.json` | 无可选技术质量阈值,开启默认去重 |
| `configs/aspect_strict.json` | 严格选择 1:1、2:3、3:2,关闭去重 |
| `configs/aspect_loose.json` | 宽松选择八桶,默认容差 5%,关闭去重 |
| `configs/generation_example.json` | 示例:短边至少 512、比例 0.25–4、文本非空,并开启默认去重 |
以下为可自定义的完整字段表,数值是默认值,不是推荐质量阈值:
```json
{
"resolution": null,
"min_short_edge": null,
"max_long_edge": null,
"min_pixels": null,
"max_pixels": null,
"min_aspect_ratio": null,
"aspect_buckets": null,
"aspect_mode": "strict",
"aspect_tolerance": 0.05,
"max_aspect_ratio": null,
"min_blur_score": null,
"max_noise_sigma": null,
"min_snr_proxy_db": null,
"max_blockiness": null,
"min_text_chars": null,
"max_text_chars": null,
"forbidden_text_patterns": [],
"reject_animated": true,
"max_decode_pixels": 100000000,
"metric_patch_size": 256,
"alpha_background": [255, 255, 255],
"convert_icc": true,
"text_unicode_form": "NFC",
"deduplicate": true,
"near_deduplicate": true,
"duplicate_scope": "image_text",
"phash_distance": 4,
"dhash_distance": 4,
"near_rgb_rmse": 8.0,
"near_aspect_log_tolerance": 0.03,
"export_max_edge": null,
"export_format": "png",
"export_jpeg_quality": 95
}
```
`export_format` 可选 png/jpeg;JPEG `export_jpeg_quality` 为 1–100,采用无色度子采样,仍是有损输出。图片规范化不会自动统一为方形,固定裁剪和张量归一化由训练数据加载器执行。
`resolution` 支持 `256p`(短边>=256)、`256x256`(精确宽高)等正整数格式;大小写与首尾空白会规范化,`256×256` 也接受。`any/none/null` 关闭分辨率条件。无后缀的 `256`、`0p`、负数、逗号多个值都非法;多目标请分别筛选到不同输出目录。
各子命令参数:
| 命令 | 主要必填参数 | 可选参数 |
|---|---|---|
| `prepare` | `--input --manifest` | `--root --sidecar-text` |
| `analyze` | `--manifest --output` | `--root --config --resolution --aspect-buckets --aspect-mode --aspect-tolerance --workers --rank --world-size --resume` |
| `filter/merge` | `--shards --output` | `--config --resolution --aspect-buckets --aspect-mode --aspect-tolerance` |
| `export` | `--curated --output` | `--root --workers --resume` |
| `run` | `--input --output` | `--root --config --resolution --aspect-buckets --aspect-mode --aspect-tolerance --workers --sidecar-text --export --resume` |
`workers` 默认 min(8,CPU数量)。配置未知字段、非法类型、范围错误会报错;各子命令的 `--help` 可查看在线说明。
## 6. 多机分片流程
先创建全局固定清单:
```powershell
.\.venv\Scripts\python.exe -m image_cleaner prepare --input "D:\datasets\images" --manifest runs/distributed/input.jsonl --sidecar-text
```
将 `input.jsonl`、`input.jsonl.meta.json`、相同代码和配置分发到节点。每台机器都必须能访问对应原图,可以使用不同本地根目录。
分别在两台机器执行:
```powershell
# 节点 0
.\.venv\Scripts\python.exe -m image_cleaner analyze --manifest runs/distributed/input.jsonl --root "D:\node0\images" --output runs/distributed/shards --config configs/statistics_only.json --workers 8 --world-size 2 --rank 0
# 节点 1
.\.venv\Scripts\python.exe -m image_cleaner analyze --manifest runs/distributed/input.jsonl --root "E:\node1\images" --output runs/distributed/shards --config configs/statistics_only.json --workers 8 --world-size 2 --rank 1
```
每条清单按 `seq % world_size` 分配。每个节点本地写不同 rank 的 SQLite,任务退出后收集全部 `shard-*.sqlite` 到协调节点同一目录;不用让不同机器写同一个 SQLite。
协调节点先汇总统计,然后按分辨率条件筛选:
```powershell
.\.venv\Scripts\python.exe -m image_cleaner merge --shards runs/distributed/shards --output runs/distributed/statistics
.\.venv\Scripts\python.exe -m image_cleaner filter --shards runs/distributed/shards --output runs/distributed/only_256p --resolution 256p
```
若希望跨分片去重,在第二条命令增加 `--config configs/audit.json`。合并会验证全部 rank 完整、清单/配置/软件版本一致、序号不重复。筛选结果与使用同一清单的单机处理一致,去重代表顺序不依赖 worker 完成顺序。
这是静态分片处理,没有自动节点调度或故障迁移。分析并行,最终筛选和全局去重由一个协调节点完成;数据和索引落磁盘,没有百万级运行性能保证。大图处理的解码内存与图片尺寸有关,可降低 workers 或最大解码像素限制。
## 7. 输出、断点续跑和复核
统计 `run` 输出清单、分片数据库,以及 `curated` 报告;`filter/merge` 的报告直接在其 `--output` 目录内,**不会再额外套一层 curated**。
| 文件 | 用途 |
|---|---|
| `input.jsonl/.meta.json` | 固定输入与 SHA-256、条数、数据根目录 |
| `shard-*.sqlite` | 完整分析记录与断点检查点,是重复筛选的数据源 |
| `shard-*.jsonl` | 方便检查的分片记录 |
| `kept.jsonl` | 最终保留的路径、文本、指标 |
| `rejected.jsonl` | 各规则拒绝原因,包括 `resolution_mismatch` |
| `duplicate.jsonl` | 重复类型、代表 ID 和近重复评分 |
| `error.jsonl` | 单图处理失败及异常信息 |
| `report.json/.html` | 配置、分辨率定义、阶段指标和前后分布 |
| `exported.jsonl` | 标准化图片相对路径及文本 |
| `export_errors.jsonl` | 导出失败清单 |
| `export.meta.json` | 导出完成状态、计数及身份校验 |
分析续跑:
```powershell
.\.venv\Scripts\python.exe -m image_cleaner analyze --manifest runs/distributed/input.jsonl --root "D:\node0\images" --output runs/distributed/shards --config configs/statistics_only.json --workers 8 --world-size 2 --rank 0 --resume
```
导出续跑:
```powershell
.\.venv\Scripts\python.exe -m image_cleaner export --curated runs/only_256p --output runs/export_256p --workers 8 --resume
```
`run --resume` 要求相同输入、配置、分辨率等身份设置;修改规则应使用 `filter` 输出到新目录。分析每 100 条提交一次;已提交项跳过。清单固定后保持原始文件不变。残留锁文件只能在确认任务退出后移除。
合并/筛选暂不支持中途续跑,失败时用新输出目录重跑,不必重新分析。导出失败会记录清单并返回退出码 1;参数/文件操作等任务错误返回 2;分析阶段的个别图片错误不使整批命令失败,需检查 `error_count`。
复核建议:检查总数守恒、目标尺寸匹配率、各原因抽样、清洗前后图片类别/宽高比分布变化,以及近重复误合并。为每轮保存独立目录及配置;后续训练/验证划分应让同图及其变体落在同一侧,本工具未自动划分数据集。
## 8. 验证与功能边界
在全新示例目录运行以下命令,可复现分辨率筛选,不依赖外部数据。示例是六张合成图片和一条损坏图片;256p 及以上预期保留五张(256×256、384×256、256×384、257×384、512×512)、尺寸拒绝一张、错误一张。重复执行请复用已生成输入并为任务更换新的输出目录。旧版筛选报告不会自动改写;重新 filter 到新目录,旧分析分片仍可复用。
```powershell
.\.venv\Scripts\python.exe examples/make_resolution_demo.py
.\.venv\Scripts\python.exe -m image_cleaner run --input runs/resolution_demo_input --output runs/resolution_demo_statistics --config configs/statistics_only.json --workers 2 --sidecar-text
.\.venv\Scripts\python.exe -m image_cleaner filter --shards runs/resolution_demo_statistics/shards --output runs/resolution_demo_256p --resolution 256p
.\.venv\Scripts\python.exe -m image_cleaner export --curated runs/resolution_demo_256p --output runs/resolution_demo_export --workers 2
```
单元与集成测试:
```powershell
.\.venv\Scripts\python.exe -m unittest discover -s tests -v
```
测试包括包含边界的短边下限、精确宽高、255/256/257 边界、EXIF 后方向、配置覆盖、禁用尺寸条件、规则交集、无原图重复筛选,以及既有多进程/跨分片去重与导出测试。
未包含 CLIP 图文语义对齐、VLM 事实核验、审美模型、OCR、水印分类器、语义 embedding 去重或训练模型性能评测。当前技术质量指标无法判断图片里的描述是否事实正确。