Stable DiffusionでNSFWフィルターをスマートに回避する方法

機械学習

「Stable DiffusionのNSFWフィルターに引っかかってしまう・・・」
「Potential NSFW contentというメッセージが出て、黒い画像が作成される・・・」

このような場合には、この記事の内容が参考になります。
この記事では、Stable DiffusionのNSFWフィルターをスマートに回避する方法を解説しています。

本記事の内容

  • NSFWフィルターに引っかかった場合
  • NSFWフィルターをスマートに回避する方法

それでは、上記に沿って解説していきます。

NSFWフィルターに引っかかった場合

NSFWについては、次の記事で解説しています。

Stable DiffusionでNSFWフィルターに引っかかった場合、次のような結果となります。

コンソールには、次のように表示されます。
このメッセージが示すのは、エラーというわけではありません。

Potential NSFW content was detected in one or more images. A black image will be returned instead. Try again with a different prompt and/or seed.

そして、作成される画像は次のように真っ黒な画像です。

この結果を回避するための方法を上記の記事で紹介しています。
ただ、その方法はかなり強引です。

もともと、強引な方法とは承知でした。
ある程度の副作用は仕方がないとしていました。

しかし、このたびスマートな回避方法を見つけました。
その方法について、以下で説明します。

以上、NSFWフィルターに引っかかった場合を説明しました。
次は、NSFWフィルターをスマートに回避する方法を説明します。

NSFWフィルターをスマートに回避する方法

NSFWフィルターをスマートに回避してみましょう。
ここでの検証を試すためには、Stable Diffusionが動くことが前提となります。

まずは、NSFWフィルターにわざと引っかかってみましょう。
次のようなコードでフィルターに引っかかるはずです。

import torch
from diffusers import StableDiffusionPipeline
from torch import autocast

MODEL_ID = "CompVis/stable-diffusion-v1-4"
DEVICE = "cuda"
YOUR_TOKEN = "コピーしたアクセストークン" 

pipe = StableDiffusionPipeline.from_pretrained(MODEL_ID, revision="fp16", torch_dtype=torch.float16,
                                               use_auth_token=YOUR_TOKEN)
pipe.to(DEVICE)

prompt = "NSFWなワード" 


with autocast(DEVICE):
    image = pipe(prompt, guidance_scale=7.5)["sample"][0]
    image.save("test.png")

NSFWなワードは、各自で適当に記入してください。

prompt = "NSFWなワード"

次の記事で紹介しているサイトには、NSFWなワードで溢れています。

無事(?)にNSFWフィルターに引っかかったら、次のようにコードを変更しましょう。

prompt = "NSFWなワード"

# ====ここから====
def null_safety(images, **kwargs):
    return images, False


pipe.safety_checker = null_safety
# ====ここまで====

with autocast(DEVICE):
    image = pipe(prompt, guidance_scale=7.5)["sample"][0]
    image.save("test.png")

変更したら、コードを実行します。
どうでしょうか?

「Potential NSFW content ~」というメッセージが表示されないようになっています。
そして、NSFWな画像が作成されているはずです。

以上、NSFWフィルターをスマートに回避する方法を説明しました。

タイトルとURLをコピーしました