nsfw_data_scraper
自动化采集5类NSFW图像数据,配合FastAI训练90%+准确率的内容审核分类器
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
自动化采集5类NSFW图像数据,配合FastAI训练90%+准确率的内容审核分类器
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
大多数 AI 爱好者在尝试验证一个图像分类想法时,最先遇到的障碍往往不是模型本身,而是数据——从哪里获取足够多的图片?如何确保标注质量?每类样本数量如何平衡?这些问题足以让一个满怀热情的初学者在第一天就陷入泥潭。
NSFW Data Scraper 正是为解决这个痛点而生的开源工具。它由开发者 alex000kim 创建,提供了一套完整的 Shell 脚本流水线,能够自动从 Reddit 等平台批量爬取图片,并按类别整理为可直接用于训练的 train/test 数据集。配合配套的 train_model.ipynb,你可以在数小时内拥有一个五分类准确率超过 91% 的 NSFW 内容审核模型。GitHub 斩获 12559 stars,足以说明它在 AI 社区的受欢迎程度。
内容审核是互联网平台最核心的风控能力之一。无论是社交媒体、视频平台还是电商网站,都需要用 AI 自动识别用户上传的图片是否包含不适当内容。传统的审核方式依赖人工逐一审查,不仅成本高昂,而且响应速度无法应对海量 UGC 内容。
用 AI 替代人工审核,就需要先训练一个分类模型。而训练模型的前提是有足够规模的标注数据。在 2019 年前后,开源社区对高质量 NSFW 训练数据集的需求非常迫切,但公开可用的数据集要么规模太小、要么标注不精确、要么存在版权问题。alex000kim 的这个项目正是瞄准了这个空白——用自动化方式,以 Reddit 等平台的公开社区资源为数据源,快速构建大规模、多类别的图像训练集。
这个项目的方法论后来被大量研究者和独立开发者借鉴,成为内容审核领域数据采集的一个经典范式。
整个工具的核心是一套 6 步 Shell 脚本流水线,逻辑清晰,分工明确:
第 1 步(1_get_urls_.sh):使用 Ripme 爬虫框架(基于 Java),从 Reddit 的各个子版块(subreddits)批量获取图片 URL。Ripme 支持多个平台的专辑下载,脚本只需指定目标版块名称即可。输出为文本文件,每行一个 URL。作者已经预先跑完这步,数据保存在 raw_data 目录,普通用户无需重复执行。
第 2 步(2_download_from_urls_.sh):读取第 1 步生成的 URL 列表,实际下载图片文件。配置了 60 秒超时、最大 100MB 文件限制,自动跳过 404 错误,5 个并发线程加速。
第 3-4 步(可选):补充下载动漫风格图片(Danbooru2018 数据集)和日常物品图片(Caltech256 数据集),增加 neutral 和 drawings 类别的样本多样性。
第 5 步(5_create_train_.sh):将所有下载的 .jpg/.jpeg 文件复制到 data/train 目录,同时使用 ImageMagick 检测并删除损坏图片。
第 6 步(6_create_test_.sh):从训练集中随机抽取每类 2000 张图片作为测试集,剩余进入训练集,生成标准的 train/test 划分结构。
最终输出的目录结构如下:
data/
train/ porn/ hentai/ sexy/ neutral/ drawings/
test/ porn/ hentai/ sexy/ neutral/ drawings/
数据准备好了,接下来是训练环节。项目提供了 train_model.ipynb Jupyter Notebook,使用 FastAI v1 框架配合 ResNet34 预训练模型进行迁移学习。FastAI 的 API 设计非常友好,几行代码即可完成数据加载、模型微调和评估:
from fastai.vision import *
path = Path('data')
# 创建 ImageDataBunch,自动识别子目录作为类别标签
data = ImageDataBunch.from_folder(path, ds_tfms=get_transforms(), size=224)
# 使用预训练的 ResNet34,fine-tune 最后几层
learn = cnn_learner(data, models.resnet34, metrics=accuracy)
learn.fit_one_cycle(4)
ResNet34 本身已在 ImageNet 上预训练,具备强大的图像特征提取能力。在 NSFW 数据集上微调后,五分类准确率可达 91% 以上,混淆矩阵显示 porn/hentai/sexy 三类的互相误判率相对较高(这是合理的,因为三者视觉特征本身有重叠),neutral 和 drawings 分类效果较好。
项目提供了 Dockerfile,基于 Ubuntu 18.04 镜像,安装了 Java(JRE)、wget、rsync 和 ImageMagick,将整个工作目录复制到容器内,配置好 Ripme 的 rip.properties 文件。构建容器后,可以直接在容器内执行 runall.sh 跑完整流水线。
但需要注意几个部署限制:
整个项目的技术栈非常"轻量级"但实用:
架构整体偏向"工具链串联"模式——各个组件各自成熟稳定,通过 Shell 脚本串联起来,适合技术用户快速搭建实验环境。
这个项目的影响力和争议性几乎同样显著:
数据偏见问题:Reddit 用户群体本身有特定的人口统计学特征,爬取的数据会继承这种偏见。用这样的数据训练的模型在跨文化场景下效果可能不稳定。
道德与法律灰区:NSFW 内容采集和使用的法律边界因国家和地区而异。项目明确面向"训练 NSFW 图像分类器",这意味着其应用场景天然涉及敏感内容,存在被滥用于非正当目的的风险。
项目已停止维护:README 最近更新停留在数年前,Ripme 的 Reddit API 支持可能已因 Reddit API 政策变化而失效,Dockerfile 用的 Ubuntu 18.04 也已停止支持。如果要复用其思路,建议更新爬虫方案(如使用 PRAW)或迁移到更新的技术栈。
尽管存在种种争议,NSFW Data Scraper 在 AI 开源生态中的地位不容忽视。它展示了两个重要范式:
它之后,开源社区涌现了大量类似的数据采集工具,分别面向医疗影像、卫星遥感、自动驾驶等垂直领域。可以说,这个项目不仅解决了一个具体问题,更代表了一种快速构建 AI 训练数据的工程哲学。
适合人群:有一定技术基础的研究者和开发者,希望快速构建内容审核或图像分类模型基线。
不适合人群:非技术用户、无命令行使用经验者、需要商业级数据合规保障的生产环境。