今回は画像生成AI、Stable DiffusionをPythonコードから実行する際に、ネガティブプロンプトを(Negative Prompt)を指定して画像を生成する方法を解説します。
ネガティブプロンプトを使いこなすことで、よりクオリティの高い絵を生成することができますので、ぜひ活用してみてください。
また、Stable Diffusionに関する記事を以下のページで解説していますので、あわせてご覧ください。

以下のページで自然言語処理モデルGPT-3を使ったライティングツールCatchyで、Stable DiffusionのPromptを自動生成する方法について解説していますので、あわせてご覧ください。

Stable Diffusionとは
Stable Diffusion(ステーブル・ディフュージョン)は2022年8月に無償公開された描画AIです。ユーザーがテキストでキーワードを指定することで、それに応じた画像が自動生成される仕組みとなっています。
NVIDIAのGPUを搭載していれば、ユーザ自身でStable Diffusionをインストールし、ローカル環境で実行することも可能です。
(出典:wikipedia)
Stable Diffusion 2.xのセットアップ
Stable Diffusion 2.xのセットアップ方法については以下のページで解説していますので、事前に済ませておいてください。

ネガティブプロンプト(Negative Prompt)とは

画像生成系AIでどのような絵を出力して欲しいかを指示する文字列をプロンプト(Prompt)といいます。
逆に生成される絵の中から除外して欲しい要素を指示するには、ネガティブプロンプト(Negative Prompt)を指定してやることで実現できます。
画像生成AIであるStable Diffusionにも推論して画像を生成するメソッドに、ネガティブプロンプトを指定することができるインタフェースが用意されています。
今回はこのネガティブプロンプトをPythonコードでどのように実装するかを解説します。
作成したソースコード
今回は出力結果の違いを分かりやすいくするために、ケーキの画像を生成して比較するサンプルプログラムを用意しました。
フルーツの載ったケーキの画像を出力させ、そのまま実行した場合と、ネガティブプロンプトで「いちご」を指定した場合の画像を比較して見ます。
ネガティブプロンプト(Negative Prompt)を指定する方法
まずプロンプトに設定する文字列を指定する処理です。
「prompt」という変数には、描きたい絵を指示するための文字列を設定します。今回は「cake with fruit」(フルーツの載ったケーキ)を指示しました。
そして、排除したい要素として「n_prompt」という変数に「stawberry」(イチゴ)というネガティブプロンプトを指示しました。
#プロンプト(指示)
#ポジティブプロンプト
prompt = "cake with fruit" #フルーツの載ったケーキ
#ネガティブプロンプト
n_prompt = "strawberry" #いちご
推論を実行するためのメソッド「pipe」のパラメータ「negative_prompt」(第2引数)に、先ほど設定したネガティブプロンプトの変数「n_prompt」を渡します。
#推論を実行
image = pipe(prompt, negative_prompt=n_prompt, height=768, width=768).images[0]
全体のソースコード
今回、作成した全体のソースコードは以下の通りです。
from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler
import torch
from datetime import datetime
#使用するモデルを指定
model_id = "stabilityai/stable-diffusion-2"
#パイプライン作成
scheduler = EulerDiscreteScheduler.from_pretrained(model_id, subfolder="scheduler")
pipe = StableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler, revision="fp16", torch_dtype=torch.float16)
pipe = pipe.to("cuda")]
#プロンプト(指示)
#ポジティブプロンプト
prompt = "cake with fruit" #フルーツの載ったケーキ
#ネガティブプロンプト
n_prompt = "strawberry" #いちご
#生成枚数
num_images = 3
#画像を生成
for i in range(num_images):
#推論を実行
image = pipe(prompt, negative_prompt=n_prompt, height=768, width=768).images[0]
#ファイル名を生成
date = datetime.now().strftime("%Y%m%d_%H%M%S")
path = date + ".png"
#画像を保存
image.save(path)
\ Pythonを自宅で好きな時に学べる! /

実行結果
ネガティブプロンプトを設定しない場合と、設定した場合で実際にStable Diffusionが出力した画像を比較して見ます。
ネガティブプロンプトを設定していない場合
こちらがネガティブプロンプトを設定しない場合の画像です。
色とりどりのフルーツが載ったケーキが出力されました。(一部謎のフルーツも載っていますが…)

もう1枚同じ条件で出力してみました。こちらもイチゴとブルーベリーのようなフルーツが載ったケーキです。

ネガティブプロンプトで「いちご」を設定した場合
続いてこちらがネガティブプロンプトで「いちご」を指定した場合に出力された画像です。
得体のしれないフルーツが混じってはいますが、明らかにいちごらしき赤いフルーツは消えました。

同じ条件でもう1枚、ブルーベリーとパイン?のようなフルーツが載っているケーキが出力されました。
いちごと思われるフルーツは確認できません。

以上のように、ネガティブプロンプトがうまく機能していることが確認できました。

Stable Diffusionのローカル環境
Stable Diffusionを使用する際にGoogle ColaboratoryやWebサービスを利用されている方も多いかと思います。しかし、最近Google Colabの無料での使用範囲が大きく制限されたり、Webサービスでは月額費用がかかったりします。
欲しいイラストを生成するにはかなりの回数をトライする必要があるため、これらの制約に縛られることなく使用できるローカル環境を構築するのがおすすめです。
ローカルのPCに搭載するグラフィックボード
ローカルマシンで実行する上で重要になってくるのがグラフィックボードです。
Stable Diffusionでイラストを生成するために実行される推論処理を、グラフィックボード上のGPUを使って大幅に高速化することができます。
トライする回数が増えれば品質の高いイラストが生成される可能性が上がりますので、グラフィックボードは重要です。Stable Diffusionで使用するためのGPUは2022年に新たにNVIDIAから発売されたRTX4000シリーズのGPUとVRAM12GB以上のものがおすすめです。最近は半導体不足も一服したこともあり、新しい製品ながら価格が下がりつつあります。
エントリーモデルのGPU
予算を安く抑えたい方向けにはRTX4070を搭載したグラフィックボードがおすすめです。
予算に余裕がある方向け ミドル~ハイエンド
予算に余裕がある方向けにおすすめのRTX 4080、ビデオメモリ16GB以上搭載のモデルです。
大サイズの画像を高速に生成したい方向けのハイエンドGPU、RTX 4090 ビデオメモリ24GB搭載モデルです。
予算とパフォーマンスに合わせて選んでみてください。
画像生成AIについて学ぶ
動画学習プラットフォームUdemyでは、画像生成AIで高品質なイラストを生成する方法や、AIの内部で使われているアルゴリズムについて学べる講座が用意されています。
Udemyは講座単体で購入できるため安価で(セール時1500円くらいから購入できます)、PCが無くてもスマホでいつでもどこでも手軽に学習できます。
画像生成AIの使い方を学ぶ
Stable DiffusionやMidjourneyの使い方や活用方法を勉強したい方には、以下の講座がおすすめです。

画像生成AIの仕組みを学ぶ
画像生成AIの仕組みについて学びたい方には、以下の講座がおすすめです。
画像生成AIで使用される変分オートエンコーダやGANのアーキテクチャを理解することで、よりクオリティの高いイラストを生成することができます。

UdemyのStable Diffusionなど、AIアート関連の講座は海外のものも多いですが、ブラウザのリアルタイム翻訳機能を使うことで日本語字幕付きで視聴できます。
Udemyの海外講座の字幕を日本語化する方法
まとめ
今回はStable DiffusionをPythonコードで実行する際に、ネガティブプロンプトを指定する方法について解説してみました。ネガティブプロンプトを使うことでより描画の自由度がアップすると思いますので、ぜひ試行錯誤してみてください。
また、プロンプトをGTP-3で自動生成する方法も以下のページで解説していますので、あわせてご覧ください。

また、以下の記事で効率的にPythonのプログラミングスキルを学べるプログラミングスクールの選び方について解説しています。最近ではほとんどのスクールがオンラインで授業を受けられるようになり、仕事をしながらでも自宅で自分のペースで学習できるようになりました。
スキルアップや副業にぜひ活用してみてください。

スクールではなく、自分でPythonを習得したい方には、いつでもどこでも学べる動画学習プラットフォームのUdemyがおすすめです。
講座単位で購入できるため、スクールに比べ非常に安価(セール時1200円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。

それでは、また次の記事でお会いしましょう。