Stable Diffusion をGoogle Colab で使ってみる


Stability AI のStable Diffusion をGoogle のColaboratory で使ってみます。

Stable Diffusion は現時点でtxt2img(Text-To-Image)とimg2img(Image-To-Image)の2つのモードが扱えます。

将来的には使えるメディアはaudioやvideoにも拡張されるそうです(そうだろうなぁ、という気はします)。

ここでは、Colab でStable Diffusion を扱うための要件をクリアしたあとで、txt2img(Text-To-Image)とimg2img(Image-To-Image)の2つのモードをやってみます。

 

参照するのはHugging Face が公開しているコード、Diffusers です。

ColabでStable Diffusionを使うにはGoogle のアカウントとHugging Face のアカウントとアクセストークンの3つが必要です。

1/3〜3/3でこの3つの要件をクリアした後で、Stable Diffusionの2つのモードを試してみます。

 

Text-To-Image

Imafe-To-Image

 

 


1/3 Google アカウント作成

以下にアクセスしてください(GMail アドレスをお持ちの場合は不要)

Google アカウントの作成

このアカウントでColab を開きます。

 


2/3 Hugging Face アカウント作成

Hugging Faceで公開されているStable Diffusionのページにアクセス

stable-diffusion-v-1-4-original

Stable Diffusionのライセンスに関する確認事項です。
まぁ適当に読んで「Access repository」をクリック。

 

 

 

 

 

 

 

 

 

Hugging Faceのログイン画面が表示されます、初回の場合は「Sign UP」をクリック

 

 

 

 

 

 

 

 

 

 

 

登録したいメールアドレスとパスワードを入力して「Next」をクリック

 

ユーザー名とフルネームを入力してからチェックを入れ、「Create Account」をクリック

 

 

 

 

 

 

 

 

 

 

 

 

登録したメールアドレス宛てに確認メールが届くので、本文内のURLをクリック

 

 

 

 

 

 

 

 

 

「Your email address has been verified successfully」と表示されれば、Hugging Faceのアカウント作成は完了

 

 

 

 

 

 

 

再度Stable Diffusionのページにアクセスして、ライセンスに同意するチェックを入れてから「Access repository」をクリック

 

 

 

 

 

 

 

 

 

 


3/3 アクセストークン取得

Stable Diffusionのページにアクセス

stable-diffusion-v-1-4-original

画面右上の円形のアイコンをクリックしてから「Settings」をクリック

 

 

 

 

 

 

 

 

 

 

アカウントの設定画面が開いたら「Access Tokens」を選択

 

 

 

 

 

 

 

 

 

 

トークンの発行画面が表示されたら覚えやすい名前を入力して「Generate a token」をクリック

トークンが発行されたら、showをクリックして伏せられた文字を表示してコピーしておきます。

 

 

 

 

 

 

 

 

 

 

 


Colab を開いてText-To-Image をやってみる

 

Colab にアクセス

Google アカウントでログイン

 

 

 

 

 

 

 

 

 

「編集」をクリックしてから「ノートブックの設定」をクリック

 

 

 

 

 

 

 

 

 

GPU を選択して保存

 

 

 

 

 

 

 

 

 

 

 

 

ファイルー>ノートブックを新規作成

コードは「セル」に記述して実行しますが、セルは自動では表示されません。いちいち「+ コード」をクリックして追加表示し、実行はセルの左端のアイコンをクリックします。

例えば、以下を実行すれば、現在のスタッツやどんなGPUが割当てられているのか確認できます。

ここでは、Tesla T4 がアサインされていますが、運がよければA100が割当てられるかも…..。

 

 

 

 

 

 

 

 

 

 

Stable Diffusionをインストール

 

Hugging Face にログインします。

Token を聞いてくるので、上記(3/4)でコピーしておいたものをペーストしてlogin

 

 

 

 

 

以下のようなメッセージが出ればログイン完了

 

 

 

 

以下のコマンドを実行

StableDiffusionPipeline は、わずか数行のコードでテキストから画像を生成するために使用できるエンド ツー エンドの推論パイプラインです。

以下ではGoogle Colab で Stable Diffusion をfloat16 精度で実行するようにしています。

可能な限り最高の精度を確保したい場合は、メモリ使用量が高くなりますが、 revision="fp16"torch_dtype=torch.float16 を削除してください。

各種ファイルがダウンロードされます。

 

 

 

 

 

 

 

終了後以下を実行

パイプラインをGPU に移動して、推論を高速化します。

プロンプトで画像生成用テキストを発行して画像生成

autocastを使用すると、半精度を使用するため、推論がより高速に実行されます。

「a photograph of an astronaut riding a horse (馬にまたがった宇宙飛行士の写真)」という要求です。

 

こんな画像が生成されました。

 

 

 

 

 

 

 

 

 

 


Appendix1 

Text-To-Image でパラメータををいじってみる

以下のmanual_seed値で画像を生成

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

num_inference_stepsは50がデフォですが15に落としてみます。

これで、画像生成の速度があがりますが、描画のための情報量が減るので、描画精度は落ちます。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

複数画像生成

複数画像生成−2

 

正方形じゃない画像を生成

Stable Diffuse の生成する画像はデフォルトでは512×512の正方画像です。

これをheight および width 引数を使用してデフォルトをオーバーライドして横長な画像を生成してみます。

ただし適切な画像サイズを選択するための推奨事項が3つあります。

1: 「高さ」と「幅」が両方とも「8」の倍数であること

2 : 512 を下回ると、画質が低下する可能性があること

3: 両方向に 512 を超えると、イメージ領域が繰り返されること (グローバル コヒーレンスが失われる)

したがって、正方形でない画像を作成する最善の方法は、一方の次元で「512」を使用し、もう一方の次元でそれより大きい値を使用すること…だそうです。

 

 

 

 

 

以下のパラメータを使った場合はセッションが変わっても同じ画像が生成されました。

パイプラインにランダム シードを渡すことができます。 同じシードを使用するたびに、同じ画像結果が得られます。

seed値を変えれば、また別の画像が生成されます。


 

 

 

 

 

 

 

 

 

 

 

 

 


Colab を開いてImage-To-Image をやってみる

Image-To-Image もText-To-Image 同様にプロンプト・テキストを使うのですが違いは何かというと、Text-To-Imageのプロンプト・テキストは画像生成を直接指示するものなのに対して、Image-To-Imageのプロンプト・テキストはImage の変性を指示するということです。

やってみましょう。

Colab にアクセス

Google アカウントでログイン

GPUなどをチェック

 

セットアップ

 

 

 

 

 

 

Hugging Faceにログイン

再度、上記のアクセストークンを使ってログインします。

 

必要なファイルを取得

 

StableDiffusionImg2ImgPipelineのクラスを定義

 

 

 

preprocess 定義

 

実行

debugがTrue になっているので、セルの左のアイコンは回転したままです。このままでも問題ないですが、気持ち悪いとお感じならFalseに変更してください。ただし、問題が起きても何も言ってくれません。

 

ImageTo-ImageではプロンプトのテキストでImage をどう処理するか指示します。

建物の写真をimageとして、プロンプトで人物をはめ込んで、映画の一場面のような画像を作ってみます。

朱色の領域にimegeをドロップ、赤色のフィールドにプロンプト・テキストを入れてRunします。

青色のスライダー(strength)はプロンプトテキストのImageに対する影響度です。

 

 

 

 

 

 

 

 

こんなimage を使ってみます(青山にあった同潤会アパートのモノクロ写真)

 

 

 

 

 

 

 

 

 

このImageを以下のテキストを使って加工します。

プロンプト

a lady by apartment house

こんな感じ

雰囲気のみ残して、別の場面になっています。そして、この写真のすごいところはよく見ると細部は破綻しているのに、全体の整合性はとれているというところです。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ポートレートを使って、スタイルを変えてみます。

モジリアニ風に描かれた柴犬に加工。

左のイメージの背景が非常に気になります。深層学習モデルはなんでこんな背景を描いたんでしょう?

また、このimg2imgを使えば簡単なラフ画像から、詳細なグラフィックを生成することもできるそうです。

この方のブログ参照

手順を参考にするとこういうことが可能でした。

こんな画像をベースにします。

img2imgで画像の加工を2〜3回繰り返します。

こんな画像が生成できました。少々驚きです。

 


Appendix2

Image-To-Image ではIn-Painting も実行できます。

In-Painting というのは画像内のある領域を修正・修復するものです。

例えばこんな感じ。

これは、わんちゃんの領域のマスク画像を作っておいて、プロンプトでそこに猫を座らせています。

マスク画像はこんな感じですが、矩形で切り取ってもいいようです。

OR

 

上記、Image-To-ImageのHugging Face へのログイン後に以下を実行

コード

 

わんちゃんの代わりに少女を座らせてみます。

後ろ向いてますね。

 

 


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*