Diffusionで画像を一度に複数生成する方法をご紹介します。これで、複数の候補から気に入った画像を選べるようになります。記事では、これまでは一度に1つの画像を生成していました。今回の方法を使うと1つのプロンプトから違う画像を複数生成できます。複数のプロンプトで一斉に画像を作成することもできます。複数の候補から選べるようになるので、気に入った画像を生成しやすくなります。Colabを利用しますが、多くの画像を生成しようとすると、どうしても無料版だとメモリが足りなくなります。そこで、今回はとりあえず複数生成の方法だけを理解するために、無料版でできる範囲で試します(それでも、割り当てが少ないときはメモリが不足することがあります)。生成できる画像を増やしたい場合は、有料版の採用を検討することになります。ようになくてもアクセスできるようになりました。[2023.03.21]コード修正:以前の記事でdiffusersとtrasformersのバージョンを固定したのに伴い、コードの一部を修正しました(パイプライン実行時にautocastするようにしました)。複数生成する方法は、プロンプトが「1つ」か「複数」の違いにより、以下の2通りがあります。1つのプロンプトで複数の画像を生成する複数のプロンプトで画像を一斉に生成する1つ目の方法は、1つのプロンプトから異なる画像を複数生成します。2つ目の方法は、複数のプロンプトをリストで指定して、それぞれの画像を一斉に生成します。)を実行するときの設定を変えるだけで可能です。以下で実際に試してみましょう。以前の記事では、以下のコードを用いて1つのプロンプト(prompt)から「ゴーギャン風の富士山」を1つ生成しました。generator=generator).images[0]...このコードをプロンプトはこのままで2つの画像を生成するように改良してみましょう。それには、以下のようにpipe()の引数にnum_images_per_prompt=2を追加します。末尾の[0]を除いて、生成された複数の画像が変数imagesに代入されるようにします。num_images_per_prompt=2).images上記のコードを実行すると以下のように2つの異なるゴーギャン風の富士山が生成されます。いうライブラリを利用しています。torchvisionを用いて画像を並べて表示する方法は以下の記事を参照してください。複数の画像をグリッド状に整列して表示する方法をご紹介します。Diffusionで生成した複数の画像を見比べるときなどに便利な方法です。Colabの無料版を利用しているため、GPUの割り当てメモリ量に限りがあるので、2つだけ生成しています。2つの違う画像が生成されたのか?ここで1つ疑問が浮かびます。プロンプトが同じであり、seedも固定しているのに、違う画像が生成されるのでしょうか。それは、生成時に入力される初期のノイズが異なるからです。StableDiffusionPipelineでは、生成する画像の個数分だけノイズをランダムに作成しておき、初期のノイズとして1つずつ入力します。そのため、一度に生成された複数の画像は、すべて異なる画像になります。後述する方法で初期のノイズを固定すれば、画像は同じになります。次に複数のプロンプトを指定する方法を説明します。Gogh」の2つのプロンプトを用意しておきます。方法は、以下のように2つのプロンプトをリストにして、pipe()の引数に指定するだけです。pipe()の引数には「1つの文字列」だけでなく「文字列のリスト」を渡すこともができるのです。generator=generator).imagesコードを実行すると以下のように「ゴーギャン風」と「ゴッホ風」の2つの富士山を生成できたのを確認できます。上記の2つの画像を見比べて、違和感を感じないでしょうか。「ゴーギャン風」と「ゴッホ風」の違いはわかりますが、富士山の位置や手前の背景が異なりそもそも対象としている富士山が違うように感じると思います。この違いは、前述した初期のノイズが異なるために生じています。そこで、ここでは初期のノイズを固定する方法を説明します。それには、以下のようにtorch.randn()で初期のノイズnoiseを自分で作成しておき、torch.cat()で2つ分の配列にして、pipe()を実行するときにキーワード引数latentsに指定します。latents=noise).images上のコードを実行すると、以下のようにゴッホ風の富士山の画像が変わったのがわかります。これであれば、2つの画像は同じ富士山を対象にしているとみることができます。既存の画像をテキストで修正するimage-to-image(img2img)の変換でも、上記と同様に2つの方法で複数生成を実行できます。今回は画像をテキストで修正する記事で実行した以下の「ひまわりの写真をゴッホ風にする変換」を例に、複数のプロンプトを指定する方法を試してみましょう。この変換を行うには、まずパイプラインを作成しておき、以下のようにプロンプトに1つの文字列を指定して実行しました。generator=generator).images[0]...ここのパイプラインの引数には、前述のStableDiffusionPipelineと同様に文字列のリストも指定できるようになっています。すると、一度に複数のプロンプトを指定した変換が可能になります。そこで、前回の記事の「5.画像変換の実行」のコードを以下のように書き換えて実行します。pipe()の引数には、4つのプロンプトの文字列をリストにしたprompts変数を指定しています。generator=generator).images上記のコードを実行すると、以下のようにゴッホ風、ルノワール風、モネ風、ゴーギャン風に変換された4つの画像が表示されます。タイトルを付けて表示するには上記のコードでは、torchvisionを利用して、複数の画像を並べて表示しています。シンプルなコードで表示できて便利なのですが、画像の数が増えるとタイトルを付けたい場合もでてきます。そこで、ここではMatplotlibを用いてタイトルを付けて表示する方法をご紹介します。以下のようにグリッド(今回は2行x2列)に配置して、それぞれにset_title()でタイトルを表示します。j].set_title(prompts[n])plt.tight_layout()plt.show()上記のコードを実行すると以下のようにプロンプトをタイトルにして表示できます。今回はmaptlotlib.pyplotのsubplotsを用いましたが、以下の記事のようにImageGridクラスを用いることもできます。複数の画像をグリッド状に整列して表示する方法をご紹介します。Diffusionで生成した複数の画像を見比べるときなどに便利な方法です。UnlimitedでPythonを学習する3つのコツ仕事自動化におすすめの本Pythonの初歩からステップを踏みながら仕事自動化のプログラミングを学べます。弊社の中嶋が執筆しました。手書きのためのコード用ノート手書きでコーティングするためのノートをアマゾンで販売しています。ガンマソフト株式会社ガンマソフトについてお問い合わせ利用規約プライバシーポリシ。