ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Data-Juicer 图像 NSFW 内容过滤算子 image_nsfw_filter 使用指南与源码解析

Data-Juicer 图像 NSFW 内容过滤算子 image_nsfw_filter 使用指南与源码解析 人工智能大模型数据工程数据清洗数据增强数据质检【免费下载链接】data-juicerData processing for and with foundation models! ➡️ ➡️ 项目地址https://gitcode.com/gh_mirrors/da/data-juicer点击查看免费下载导读本文围绕 Data-Juicer 的image_nsfw_filter过滤算子展开介绍其如何借助 Hugging Face 图像分类模型为样本中每张图像计算 NSFW不适宜工作场所内容分数并依据min_score/max_score阈值与any/all保留策略决定样本去留。读完本文你将掌握该算子的全部配置参数、两阶段统计-过滤执行原理、YAML 配置写法与单元测试验证方法可直接用于多模态数据清洗流水线中的内容安全过滤环节。一、算子定位与适用场景image_nsfw_filter是一个filter过滤类型算子官方标签为gpu、hf、image核心职责是Filter to keep samples whose images have nsfw scores in a specified range. 保留图像 NSFW 分数位于指定区间内的样本。该算子使用 Hugging Face 上的图像分类模型为样本中每一张图像计算 NSFW 分数再根据阈值区间决定样本保留或丢弃。分数会被缓存到样本 stats 中的image_nsfw_score字段供后续分析与二次过滤复用。在 Data-Juicer 的算子体系中它归属于图像类过滤算子在 config_all.yaml 中与image_face_count_filter、image_pair_similarity_filter、image_size_filter等并列常用于数据集的内容安全清洗——例如在训练图文模型、多模态大模型前剔除含敏感/成人内容的样本。二、工作原理与源码级解析2.1 算子注册与两阶段执行模型ImageNSFWFilter定义于 data_juicer/ops/filter/image_nsfw_filter.py通过装饰器注册到算子工厂与图像加载优化模块OP_NAME image_nsfw_filter OPERATORS.register_module(OP_NAME) LOADED_IMAGES.register_module(OP_NAME) class ImageNSFWFilter(Filter):OPERATORS.register_module使其可通过 YAML 配置中的算子名image_nsfw_filter被实例化LOADED_IMAGES.register_module使其接入 Data-Juicer 的算子融合机制Op Fusion与上游 mapper 共享已加载的图像避免重复解码。该类继承自Filter基类data_juicer/ops/base_op.py#L787。所有 Data-Juicer 过滤算子都遵循两阶段执行模型统计阶段compute_stats_single为每个样本计算统计指标此处为 NSFW 分数写入sample[Fields.stats]决策阶段process_single读取统计指标返回布尔值True保留 /False过滤。基类通过__init_subclass__禁止子类直接覆写compute_stats/process只能实现*_single或*_batched方法base_op.py#L852-L861从而统一封装了异常捕获、多进程执行与批处理适配。在default执行模式下数据流为dataset.map(op.compute_stats)后接dataset.filter(op.process)。2.2 统计阶段模型推理与分数缓存compute_stats_single的完整流程如下源码见 image_nsfw_filter.py#L66-L93def compute_stats_single(self, sample, rankNone, contextFalse): # 幂等检查stats 中已有 image_nsfw_score 则直接返回避免重复推理 if StatsKeys.image_nsfw_score in sample[Fields.stats]: return sample # 样本无图像时写入空数组并保留 if self.image_key not in sample or not sample[self.image_key]: sample[Fields.stats][StatsKeys.image_nsfw_score] np.array([], dtypenp.float64) return sample # 加载图像支持 context 共享与 bytes 键 loaded_image_keys sample[self.image_key] sample, images load_data_with_context( sample, context, loaded_image_keys, load_image, mm_bytes_keyself.image_bytes_key) # 获取模型与处理器 model, processor get_model(self.model_key, rank, self.use_cuda()) images [images[key] for key in images] inputs processor(imagesimages, return_tensorspt).to(model.device) with torch.no_grad(): outputs model(**inputs) logits outputs.logits nsfw_scores [float(scores[1]) for scores in torch.softmax(logits, dim-1)] sample[Fields.stats][StatsKeys.image_nsfw_score] nsfw_scores return sample关键实现细节幂等缓存StatsKeys.image_nsfw_score常量定义于 data_juicer/utils/constant.py#L387一旦存在于sample[Fields.stats]中该样本便跳过重复计算。这意味着多次叠加同一过滤算子或重复运行流水线时不会重复推理也便于把统计结果导出用于数据分析。空图像处理样本没有图像时写入空数组np.array([], dtypenp.float64)后续process_single对空数组默认返回True保留保证不误删无图像样本。图像加载通过load_data_with_contextload_imagedata_juicer/utils/mm_utils.py#L145统一加载支持磁盘路径与 bytes 两种数据形式并兼容 Op Fusion 的 context 共享。分数计算模型输出经torch.softmax(logits, dim-1)转为概率分布Falconsai/nsfw_image_detection这类二分类模型第 0 类为 normal、第 1 类为 nsfw因此取scores[1]作为 NSFW 分数区间为[0, 1]。推理上下文torch.no_grad()关闭梯度计算以节省显存与时间get_modeldata_juicer/utils/model_utils.py#L2311维护全局MODEL_ZOO缓存——同一进程内多个算子共享同一模型实例并按rank % cuda_device_count()分配到对应 GPU 设备。2.3 决策阶段阈值区间与保留策略process_singleimage_nsfw_filter.py#L95-L108读取缓存分数并逐图判定def process_single(self, sample, rankNone): itm_scores sample[Fields.stats][StatsKeys.image_nsfw_score] if len(itm_scores) 0: return True keep_bools np.array( [self.get_keep_boolean(itm_score, self.min_score, self.max_score) for itm_score in itm_scores]) if self.any: return keep_bools.any() else: return keep_bools.all()单图判定复用Filter.get_keep_booleanbase_op.py#L866-L874默认采用闭区间语义min_score score max_score。基类还提供三个通用开关参数默认值作用min_closed_intervalTruemin_score是否为闭区间还是max_closed_intervalTruemax_score是否为闭区间还是reversed_rangeFalse是否反转区间变为保留(-∞, min)∪(max, ∞)之外的分数打开reversed_range时基类会自动翻转两个闭区间标志从而将“保留指定区间内”变为“保留区间外”的逆语义。2.4 加速器与内存声明该算子声明了_accelerator cudaimage_nsfw_filter.py#L27并默认声明1GB内存占用kwargs[memory] 1GB见 image_nsfw_filter.py#L55。这两项信息会被 Data-Juicer 的资源调度模块如分区大小优化、多进程启动数限制读取用于在 GPU 环境下合理规划并发进程数。三、参数配置详解算子完整参数如下默认值取自 image_nsfw_filter.py#L29-L38参数名类型默认值说明hf_nsfw_modelstrFalconsai/nsfw_image_detectionHugging Face 上的 NSFW 检测模型名称trust_remote_codeboolFalse是否信任 HF 模型的远程代码min_scorefloat0.0样本 NSFW 分数下限阈值取值范围 0 到 1max_scorefloat0.5样本 NSFW 分数上限阈值取值范围 0 到 1any_or_allstrany多图样本的保留策略any任一图满足即保留或all所有图都满足才保留args-额外位置参数kwargs-额外关键字参数含 Filter 基类通用参数3.1 各参数深入说明hf_nsfw_model默认为Falconsai/nsfw_image_detection。首次运行时通过prepare_model(model_typehuggingface, ...)data_juicer/utils/model_utils.py#L2299从 Hugging Face 下载模型与处理器也可替换为任何输出二分类 logitsnormal / nsfw的兼容图像分类模型。下载与加载依赖网络可达 Hugging Face离线环境需提前本地缓存模型。trust_remote_code某些 HF 模型需要执行仓库附带的远程 Python 代码置True可加载这类自定义模型默认False仅加载纯 transformers 标准架构模型更安全。min_score/max_score构成保留区间[min_score, max_score]。默认[0.0, 0.5]表示丢弃 NSFW 分数超过 0.5 的样本实践中可结合具体模型输出分布调参——例如官方效果演示中使用非常严苛的max_score0.0005来只保留几乎完全“干净”的图像。any_or_all多图样本如一张样本含多张配图的聚合策略。构造时会对非法取值抛错if any_or_all not in [any, all]: raise ValueError(fKeep strategy [{any_or_all}] is not supported. fCan only be one of [any, all].)kwargs继承的通用参数作为Filter子类还支持基类参数如stats_export_path将 stats 导出到文件、image_key/image_bytes_key指定图像字段名默认分别为images/images_bytes、memory内存声明默认1GB等。四、保留策略any 与 all 的语义差异any默认样本中只要任意一张图像的 NSFW 分数落在[min_score, max_score]内即保留。适合“宁可错留、不可误杀”的宽松过滤。all样本中所有图像的 NSFW 分数都必须落在区间内才保留只要有一张超标即整条样本被过滤。适合内容安全要求严格的场景如儿童数据集、公开产品数据集。注意两个边界行为无图像样本默认保留len(itm_scores) 0时返回True避免误删纯文本样本区间默认是闭区间/分数恰等于阈值时视为满足条件如需开区间可用基类的min_closed_intervalFalse/max_closed_intervalFalse调整。五、效果演示以下两组演示来自算子的单元测试场景测试图像位于 tests/ops/data展示any与all两种策略下的输入输出差异。5.1 test_nsfw_filter单图样本按阈值过滤配置ImageNSFWFilter(hf_nsfw_modelFalconsai/nsfw_image_detection, max_score0.0005)输入数据3 个样本各含 1 张图像Sample 1img1.pngSample 2img2.jpgSample 3img3.jpg输出数据保留 2 个样本Sample 1img2.jpgSample 2img3.jpg解释算子过滤掉 NSFW 分数高于 0.0005 的样本只保留低于该阈值的样本。第一个样本img1.png被移除因为其图像的 NSFW 分数超过了设定的最大值。5.2 test_all多图样本的 all 策略配置ImageNSFWFilter(hf_nsfw_modelFalconsai/nsfw_image_detection, max_score0.0005, any_or_allall)输入数据2 个样本各含 2 张图像Sample 1img1.pngimg2.jpgSample 2img2.jpgimg3.jpg输出数据保留 1 个样本Sample 1img2.jpgimg3.jpg解释all策略要求样本中的所有图像都必须低于 0.0005 的 NSFW 分数才保留该样本。第一个样本被移除因为并非其所有图像都满足条件第二个样本被保留因为两张图像分数都合格。对比两组演示可清晰看出同样设置max_score0.0005单图场景下img1.png因超标被过滤而在多图场景中只要样本里混入这张超标图在all策略下整条样本就会被丢弃。六、在数据处理流程中实际使用6.1 YAML 配置写法在 Data-Juicer 的算子流水线配置中按名字image_nsfw_filter声明即可参考 config_all.yaml#L932-L936 的官方示例- image_nsfw_filter: # filter samples according to the nsfw scores of images in them hf_nsfw_model: Falconsai/nsfw_image_detection # Huggingface model name for nsfw classification max_score: 0.5 # the nsfw score threshold for samples, range from 0 to 1. Samples with nsfw score less than this threshold will be kept. any_or_all: any # keep this sample when any/all images meet the filter condition memory: 1GB # This operation (Op) utilizes deep neural network models that consume a significant amount of memory for computation, hence the systems available memory might constrain the maximum number of processes that can be launched将该段放入process:列表配合全局配置即可运行数据清洗流水线。Data-Juicer 提供 tools/process_data.py 作为数据处理入口通过--config加载如上配置后执行。6.2 与其他算子协同image_nsfw_filter常与以下算子组合使用前置image_aspect_ratio_filter、image_size_filter等先做基础形态过滤减少进入模型推理的无效图像后置image_text_matching_filter、image_aesthetics_filter等进一步做图文匹配与美学质量筛选形成“安全 → 质量”的多级清洗链分析由于 NSFW 分数被缓存于image_nsfw_scorestats 字段可通过 Data-Juicer 的分析模块data_juicer/analysis对全量数据的 NSFW 分数分布做可视化与统计辅助确定合理的max_score阈值。七、单元测试验证算子配套的单元测试位于 tests/ops/filter/test_image_nsfw_filter.py覆盖 4 个场景测试方法配置要点验证目标test_nsfw_filtermax_score0.0005单图样本中超标图被过滤test_anymax_score0.00012, any_or_allanyany 策略下部分图合格即保留test_allmax_score0.0005, any_or_allallall 策略下全部图合格才保留test_multi_processnum_proc依 CUDA 数调整多进程num_proc2下的正确性测试基座DataJuicerTestCaseBase展示了算子两阶段的标准调用方式即dataset.map(op.compute_stats, ...)后接dataset.filter(op.process, ...)test_image_nsfw_filter.py#L27-L42。测试类通过tearDownClass调用super().tearDownClass(cls.hf_nsfw_model)释放加载的 HF 模型对应free_modelsdata_juicer/utils/model_utils.py#L2336将模型移回 CPU 并清空MODEL_ZOO与 CUDA 缓存。运行前提测试需要能够访问 Hugging Face 下载Falconsai/nsfw_image_detection并最好具备 CUDA 环境_accelerator cuda无 GPU 时会退化为 CPU 推理速度较慢。八、注意事项与最佳实践GPU 与显存该算子标注cuda加速器多进程并行时 Data-Juicer 会按 CUDA 数量分配 rankrank % cuda_device_count()。在多进程下每个 worker 的推理线程会被约束见 model_utils.py#L2319-L2324避免线程过度订阅。模型下载与网络首次运行需联网拉取 HF 模型生产环境建议预先下载并配置本地缓存或更换为内网可达的模型名。阈值调优默认max_score0.5较为宽松官方演示采用 0.0005 级超低阈值。建议先跑一次并导出 stats 分布配合stats_export_path观察分数直方图后再定阈值。trust_remote_code安全仅在确认模型仓库可信时开启默认False避免执行第三方远程代码。结果可复用NSFW 分数缓存在image_nsfw_score同一数据集后续叠加其他过滤算子或二次分析时无需重复推理降低整体计算成本。相关链接算子源代码单元测试完整算子配置示例返回算子列表赞分享人工智能大模型数据工程数据清洗数据增强数据质检【免费下载链接】data-juicerData processing for and with foundation models! ➡️ ➡️ 项目地址https://gitcode.com/gh_mirrors/da/data-juicer点击查看免费下载相关推荐Data-Juicer 图像宽高比过滤算子 image_aspect_ratio_filter 完全指南Data Juicer 图像宽高比过滤算子 image_aspect_ratio_filter 完全指南 本篇文章系统讲解 Data Juicer 中的 ima人工智能大模型数据工程数据清洗数据增强数据质检Data-Juicer 图像人脸面积比率过滤算子 image_face_ratio_filter 完全指南Data Juicer 图像人脸面积比率过滤算子 image_face_ratio_filter 完全指南 本指南围绕 Data Juicer 开源数据处理库中人工智能大模型数据工程数据清洗数据增强数据质检oh-my-openagent Git Master Skill 完全指南原子提交、rebase 手术与历史考古的三合一 Git Agent 工作流oh my openagent Git Master Skill 完全指南原子提交、rebase 手术与历史考古的三合一 Git Agent 工作流 导读 G人工智能大模型数据工程数据清洗数据增强数据质检上一篇WhatCable 已知 USB-C 线缆指纹库解析data/known-cables.md 的字段语义、信任信号模式与同步工作流下一篇asyncpg性能调优内存配置创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表