图片—文本数据清洗:完整操作与指标手册
1. 工具范围和运行环境
本工具处理本地图片与可选文本,完成导入、规范化测量、分布统计、分辨率/质量筛选、去重和独立导出。源文件不修改、不删除。保留/拒绝/重复/错误的判断通过输出清单表达。
Python 3.10+;Windows 与 Linux;基础处理不需要 GPU。先下载仓库,以下以安装目录为例:
D:\projects\multimodal_training
Windows 首次安装需要建立 .venv,完成后进入项目目录使用:
cd D:\projects\multimodal_training
.\.venv\Scripts\python.exe -m image_cleaner --help
新机器首次安装:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e .
Linux 对应安装与命令前缀:
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 文件夹:适合直接批量导入
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:
{"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 重映射。
.\.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 全量分布统计
.\.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。统计配置关闭尺寸/质量/文本可选阈值和去重,成功处理的静态图片全部保留;损坏、超过容量限制、动画/多页等仍作为错误记录。
查看报告:
Start-Process -FilePath "runs/statistics/curated/report.html"
report.json 适合程序读取,report.html 包含无外部依赖的分布图。先检查分辨率、宽高比、噪声与清晰度分布,再确定规则。
3.2 保留 256p 及以上的图片
.\.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 | 保留 | 拒绝 | 拒绝 |
其他选择:
# 仅保留 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 分辨率与其他筛选一起执行
使用配置文件可同时加入宽高比、质量、文本条件或去重:
.\.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 导出标准化图片与文本
.\.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 一键流程
已经明确目标时可以直接执行:
.\.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。
# 在项目根目录执行。先运行 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、质量、文本条件取交集;不会裁剪或缩放图片。
配置文件新增字段示例:
{
"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、文本非空,并开启默认去重 |
以下为可自定义的完整字段表,数值是默认值,不是推荐质量阈值:
{
"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. 多机分片流程
先创建全局固定清单:
.\.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、相同代码和配置分发到节点。每台机器都必须能访问对应原图,可以使用不同本地根目录。
分别在两台机器执行:
# 节点 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。
协调节点先汇总统计,然后按分辨率条件筛选:
.\.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 |
导出完成状态、计数及身份校验 |
分析续跑:
.\.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
导出续跑:
.\.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 到新目录,旧分析分片仍可复用。
.\.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
单元与集成测试:
.\.venv\Scripts\python.exe -m unittest discover -s tests -v
测试包括包含边界的短边下限、精确宽高、255/256/257 边界、EXIF 后方向、配置覆盖、禁用尺寸条件、规则交集、无原图重复筛选,以及既有多进程/跨分片去重与导出测试。
未包含 CLIP 图文语义对齐、VLM 事实核验、审美模型、OCR、水印分类器、语义 embedding 去重或训练模型性能评测。当前技术质量指标无法判断图片里的描述是否事实正确。