关掉 Stable Diffusion 的 NSFW 过滤器 (2026)
Stable Diffusion 的 NSFW 过滤器老把正常图涂黑。讲清它为什么误伤、各个栈怎么关、以及法律红线到底在哪。

摘要
- 它是什么:NSFW block 就是 Stable Diffusion 的 safety checker 觉得你的输出是露骨内容,把图换成一整块黑方块。它是台误伤机器,不是裸露检测器。
- 最快修(diffusers):加载 pipeline 时传
safety_checker=None和requires_safety_checker=False。改一处,黑方块就没了。 - A1111 / ComfyUI:两者默认都不跑这个过滤器。还在那儿出黑图?那是 Colab notebook 的包装或 NaN 报错,不是 safety checker。
- 黑图但没有 NSFW 提示? 那是另一个 bug。是 FP16 显卡上的 VAE NaN。启动加
--no-half-vae。 - 动手关之前:权重在你本地,你自己说了算。但许可证依然禁止违法、非自愿、CSAM 这类输出。这条线不会动。
你敲了个人畜无害的提示词,等着出图,结果拿到一块黑方块。Stable Diffusion 判定你的图是 NSFW。下面讲清为什么老这样、怎么在你自己机器上把它关掉、以及真正的边界在哪。
Stable Diffusion 里的「NSFW block」是什么意思?
意思是内置的 safety checker 把你生成的图打分为露骨,在你看到之前就换成了黑图。模型本身跑得好好的。图也确实生成了。然后一个独立的分类器去看那些像素,判定它越线,把结果抹黑。你通常会看到类似「Potential NSFW content was detected in one or more images. A black image will be returned instead.」的提示。
关键在这。这个 checker 是在生成之后、外挂上去的,不是揉进模型里的。所以关掉它是改配置,不是重训。也正因如此,它才那么容易被误触。这个分类器根本不知道你要的是什么。它只看吐出来的那些像素。
你的黑图,是过滤器还是 NaN 报错?
动手关任何东西之前,先搞清你拿到的到底是哪种黑图,因为这俩的修法完全不同。大家总把它们混为一谈,然后在一个 safety checker 根本没管的 bug 上去「关 safety checker」。
两个特征把它们区分开:
- safety checker 拦截:控制台或界面里有 NSFW 警告。提示明确写着检测到 NSFW 内容。这种靠关掉 checker 来修。
- VAE NaN 黑图:完全没有 NSFW 字样,有时会报
NansException: A tensor with all NaNs was produced in VAE。这是一次数学失败,不是内容判断。有些显卡搞不定半精度(FP16),数值溢出成 NaN,解码出来就是黑的。
| 症状 | 真正成因 | 修法 |
|---|---|---|
| 黑图 + "NSFW detected" | safety checker 误伤 | 关掉 checker |
| 黑图,没有 NSFW 字样 | VAE 里的 FP16 NaN | 启动加 --no-half-vae |
| 只在老卡上黑(16xx) | 不原生支持 FP16 | 加 --no-half --no-half-vae |
| 只在 SDXL 上黑 | 采样器精度 | 加 --upcast-sampling |

没有 NSFW 警告?那就别再看那些「怎么关过滤器」的攻略了。你的问题是精度,--no-half-vae 能修掉绝大多数 VAE NaN 的情况,代价大约是慢 5 到 10 个百分点。去关一个从没触发过的 safety checker,啥也修不了,还白搭一下午。
为什么正常提示词也会被判 NSFW?
因为它压根不检测裸露。它量的是和隐藏概念的相似度,而一大堆无害的图会碰巧落在这些概念附近。这个 checker 底层就是 CLIP。它把你的输出过一遍 CLIP 的 ViT-L/14 图像编码器拿到一个 embedding,再把这个 embedding 和 17 个固定向量比对,每个向量代表一个「敏感概念」。只要和其中任意一个的余弦相似度超过阈值,图就被涂黑。
那 17 个概念向量是故意藏起来的,免得有人逆向。副作用就是你看不见自己踩到了哪个。风景、分形、肖像、一盘食物,任何 embedding 飘到那些向量附近的,都会被标记。CompVis 的 issue 追踪里,有开发者报告提示词「star」被拦。另一个人栽在「riding horse」上。还有人半开玩笑地写:「大概我的电脑本身就 not safe for work 吧。」
所以这不是什么精准的道德判断。它是一次生硬的距离比对,配着一个固定阈值,还调得偏向多拦。对很多实际工作来说,误伤远多于真拦。
怎么在 Stable Diffusion 里关掉 NSFW 过滤器?
找到你那个栈对应的段落,因为「Stable Diffusion」指的是三四种很不一样的软件,而默认跑这个过滤器的只有一个。
Diffusers(Python)
就是它默认把 checker 开着。加载 pipeline 时传 safety_checker=None,再把 requires_safety_checker=False 设上,顺带压掉后续那条警告:
from diffusers import StableDiffusionPipeline
import torch
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
safety_checker=None,
requires_safety_checker=False,
torch_dtype=torch.float16,
)pipeline 建好之后也能改:pipe.safety_checker = None。想保留这个钩子但让它永不拦截?换成一个直接放行、报告什么都没标记的函数:
pipe.safety_checker = lambda images, **kwargs: (images, [False] * len(images))结果一样,日志里也不会被那条警告刷屏。那段 safety_checker 源码很短,想看它到底干了啥可以点进去。
AUTOMATIC1111 / Forge
好消息:两者默认都不跑 diffusers 的 safety checker。如果你偏偏在 A1111 或 Forge 里出 NSFW 黑图,常见元凶是某个 Colab notebook 把过滤器又打回去了,或者某个扩展。在 notebook 单元格里搜 safety_checker 或 check_safety 函数,注释掉它。正常的本地安装里根本没东西可关,因为它从没开过。
ComfyUI
同理:默认不带安全过滤器。原装的 ComfyUI 工作流不会因为内容把你的图涂黑。如果你的会,那是某个自定义节点加的。删掉那个节点,或者查一下你是通过什么包装启动的。
改 model_index.json
如果某个 checkpoint 不管你代码怎么写都要加载一个 checker,打开它的 model_index.json,把 "requires_safety_checker" 设为 false,并删掉 safety_checker 那一项。这样那个模块压根不会加载。对付那种自带过滤器配置的下载模型很好用。
不想一刀切?那就调它,别删它。
直接关掉 checker 是最常见的做法。但它不是唯一的做法,而且在共享或公开部署里,它不是聪明的做法。三个折中选项:
- 检测并处理,别涂黑。 pipeline 可以返回每张图的 NSFW 标志,而不是默默把图抹黑。留着标志、去掉拦截,被标记的图你自己去路由或记日志。
- 换成 Safe Stable Diffusion。 它不给你黑方块,而是把生成往最近的非露骨图上引导。你既留住了能用的输出,又保住了护栏。
- 抬高阈值,别移除它。 如果你能改 checker,把阈值放松能减少误伤,同时还接得住明显的东西。多点活,但比全有全无少太多意外。
自己 GPU 上的单人项目,safety_checker=None 没问题。但凡是用户能碰到的,留个护栏。一个没有过滤器的公开端点,是你以后会后悔的隐患。
关掉 safety checker,到底合不合法?
关掉它是允许的。关掉之后你拿它生成什么,才是真正边界所在,而这些边界不会因为过滤器没了就消失。Stable Diffusion 走的是 CreativeML Open RAIL-M 许可证。它给你很大的权利,对你的输出不主张任何权益,并把责任压在你身上。但它带着有牙齿的用途限制。
许可证明确禁止用这个模型去生产或传播违法或有害内容。不许 CSAM。不许非自愿的私密影像。不许把真人做成用来欺骗或伤害的 deepfake。这些不是过滤器设置。它们在世界上大多数地方就是法律,而「我把 safety checker 关了」在任何地方都不是抗辩理由。
所以说句实在的框架。在你自己的硬件上、跑你下载来的权重,你有权配置自己的工具,为真实工作关掉一个过度误伤的过滤器,是合理的。生成违法内容不合理,不管过滤器开没开。把这两件事分开,你就站得住脚。
如果你用的是托管 API,而不是本地呢?
那过滤器就不归你关了,而这正是全部区别所在。当你调用一个托管的图像端点,是供应商在跑模型、在他们那侧执行自己的内容策略。没有什么 safety_checker=None 供你传。你要么接受他们的规则,要么本地自己跑。
这个取舍值得直说。本地 Stable Diffusion 给你完全的控制权,包括 safety checker,代价是一块 GPU、驱动配置、以及你自己的内容审核。像 Velokey 的图像端点这类托管 API 省掉了配置、给你一把 key 打通多个模型,但你是在供应商的内容策略之内,不是之外。指望网关能帮你绕开内容规则?它不会,任何号称能的,都是等着爆的合规问题。要便利和规模就选托管,要控制权就选本地。如果你在权衡图像 API,我们那篇 ChatGPT 图片限额拆解 和 Qwen-Image 2.0 笔记 讲了托管生成实际的成本和上限,Seedream 5.0 Pro 则是更高端的一个选项。撞上的是完全不同的另一类 AI 报错?我们那篇 ChatGPT error in message stream 修复 是这篇的姊妹篇。
常见问题
怎么在 Stable Diffusion 里移除 NSFW 过滤器?
看你用哪个栈。在 diffusers 库里,加载 pipeline 时带上 safety_checker=None 和 requires_safety_checker=False。在 AUTOMATIC1111、Forge 和 ComfyUI 里通常没东西可移除,因为它们默认不跑这个 checker。如果你还是出黑图,那是某个 notebook 包装或自定义节点把过滤器加回去了。
为什么正常提示词也会让 Stable Diffusion 返回黑图?
两种可能。要么是 safety checker 误把你的图判成 NSFW,你会看到 NSFW 警告;要么是 VAE 在半精度显卡上产生了 NaN,没有警告、有时会报 NansException。前者靠关 checker 修,后者靠启动加 --no-half-vae 修。
ComfyUI 有 NSFW 过滤器吗?
默认没有。原装 ComfyUI 安装不会因为内容拦你的图。如果你的会出带 NSFW 提示的黑方块,那是某个自定义节点或你在跑的某个外部包装加了 safety checker。删掉那个节点,拦截就停了。
我人畜无害的提示词为什么被判 NSFW?
因为这个 checker 量的是和隐藏概念向量的视觉相似度,不是真的裸露。无害的图有时会碰巧落在那些向量附近。被报告过的误伤里,有「star」「riding horse」这种再温和不过的提示词。这个过滤器天生就偏向多拦,所以误伤很常见。
关掉 safety checker 违反许可证吗?
不违反。CreativeML Open RAIL-M 许可证允许你配置自己的本地工具,包括关掉 checker。它真正禁止的是输出:违法、非自愿或有害内容,不管过滤器开没开都禁止。你要为你生成的东西负责,而不是为 checker 的开关状态负责。
怎么让日志里不再刷 safety_checker 警告?
加载 pipeline 时把 requires_safety_checker=False 和 safety_checker=None 一起设上。想保留这个属性?换成一个返回图像和一个全 False 标志列表的 dummy 函数。两种都能压掉 diffusers 每次调用都打的那条重复警告。


