乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

stable-diffusion

今回はGoogle Colabで
stable diffusionを便利に使うテクニック
についてです。

解説動画はこちら



前回は
Google Colabでstable diffusionを使う方法を
紹介しました。
stable diffusionをGoogleColabで使ってみる


今回は
もう少し使い勝手を良くするための
テクニックを紹介していきます。


まず最初は
モデルのロードの高速化です

GoogleColabで
stable-diffusionを使うには
最初にセットアップとして
色々読み込みをしないといけません。


初回のセットアップ部分のコード
(要アクセストークン)
#@title 事前セットアップ
 
# 必要なライブラリのインストール
!pip install diffusers==0.2.4 transformers scipy ftfy
 
# アクセス・トークンを設定
token = ""#@param {type:"string"}

# パイプラインを構築
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=token)
pipe.to("cuda")

初回はモデルのダウンロードなどが行われるため
この読み込みがかなり時間が掛かります。

この部分を高速化するために
モデルをpickleで保存してみましょう。



Googleドライブのマウント

モデルを保存するには
Googleドライブのマウントをしておく
必要があります

フォルダマークから「ドライブのマウント」
をクリックしてマウントしておきましょう。


モデルの保存

import pickle
import shutil
import os

model_name = 'sd_model.pkl'
with open(model_name , mode='wb') as f:
    pickle.dump(pipe, f)

save_dir = 'drive/MyDrive/stable-diffusion-v1-4/'
os.makedirs(save_dir, exist_ok=True)
save_path = save_dir + model_name
shutil.copyfile(model_name, save_path)

これでGoogleドライブに保存されます。

次回以降はこのドライブに保存された
モデルをロードすることで高速化できます。



モデルのロード
# 必要なライブラリのインストール
!pip install diffusers==0.2.4 transformers scipy ftfy

# パイプラインを構築
from diffusers import StableDiffusionPipeline

model_name = 'sd_model.pkl'
save_dir = 'drive/MyDrive/stable-diffusion-v1-4/'
save_path = save_dir + model_name
with open(save_path, mode='rb') as f:
    pipe = pickle.load(f)
2回目以降はこのコードで
Googleドライブからモデルを
読み込み出来ると思います。

stable-diffusionを使えるようになるまでが
少し高速化されます。



画像作成(1枚)
#@title 画像を生成する
 
# 画像生成
prompt = "" #@param {type:"string"}
img = pipe(prompt)["sample"][0]

# 画像の保存
img_name = prompt.replace(' ','_')
img_path = img_name + '.png'
img.save(img_path)

# 画像の表示
from IPython.display import Image,display
display(Image(img_path))

テキストを入力すると
1枚だけ画像が生成されます。

同じテキストの画像は1回ごとに
上書きされて消えてしまうので
何枚も作成する場合は
少し使い勝手が悪いです。



画像作成(フォルダ内に複数枚数)
#@title 画像を生成する
import os

# 画像生成
prompt = "" #@param {type:"string"}
times = 3 #@param {type:"integer"}
save_dir = 'drive/MyDrive/stable-diffusion-v1-4/sd_img/'

for i in range(times):
  img = pipe(prompt)["sample"][0]

  # 画像の保存
  txts = prompt.split(' ')
  img_name = prompt.replace(' ','_')
  if len(txts)>=4:
    dir_path = '_'.join(txts[0:2]) + '_-_' +  '_'.join(txts[-2:])
  else:
    dir_path = prompt.replace(' ','_')

  # 保存ディレクトリの作成
  img_save_dir = save_dir + dir_path
  os.makedirs(img_save_dir, exist_ok=True)
  
  img_path = img_save_dir + '/' + img_name + '_{0:02}.png'.format(i)
  img.save(img_path)

ということで
複数枚を一気に作成するようにしてみましょう。

こちらのコードでGoogleドライブ内に
画像が保存されるようになります。

timesの部分で回数指定ができるので
変えることで複数枚を一気に作成できます。

作成した画像を全部見るのは次のコードです。

# 画像の表示(保存ディレクトリ内の画像全部)
from IPython.display import Image,display
import glob
for path in glob.glob(img_save_dir + "/*.png"):
  print(path.split('/')[-1])
  display(Image(path,retina=True))

これでまとめてフォルダ内の画像を表示できます。


画風に加える文字列(プロンプト)の生成補助

stable-diffusionでは様々な画風を
指定することができますが
指定するには、コマンドが必要です。

コマンドを覚えるのは大変なので
指定するプロンプトに
画風を加える補助をしてくれる
サイトがあります。

promptoMANIA

こちらでプロンプトを英文で打ち込みます。
スクリーンショット 2022-09-10 17.38.12

次に下の方にスクロールすると
画風を選ぶことができます。
スクリーンショット 2022-09-10 17.38.40


画風のサンプルが画像で表示されるので
これを参考にしながら作成したい画風をクリックします。

サイトの上部にプロンプトが作成されるので
コピーできるようになります。

スクリーンショット 2022-09-10 17.38.47

これをstable-diffusionに貼り付ければ
その画風で作成することができます。



作成した画像のダウンロード
# ダウンロードしたいフォルダを zip 圧縮する
!zip -r /content/download.zip drive/MyDrive/stable-diffusion-v1-4/sd_img/

# 圧縮した zip ファイルをダウンロードする
from google.colab import files
files.download("/content/download.zip")

こちらのコードで画像をまとめてダウンロードできます。
Googleドライブに保存されてはいるので
そちらからもまとめてダウンロードは出来るので
あまり使う機会は少ないかもしれませんが
Google Colab上から画像のダウンロードをするのは
このコードを使えば出来ます。


今回は少しだけstable-diffusionを使うのが
便利になるテクニックを紹介しました。

他にも紹介しきれないほどの
機能を有しているので
また機会があれば
色々紹介していきたいと思います。

それでは。

今回はテキストから画像を自動生成する
stable-diffusionをGoogle Colabで試してみました

解説動画はこちら






さて、こちら
最近公開されたようなのですが
テキストから画像を生成してくれるという
優れものです

使えるようにするには
少しコツがいるので手順を紹介します。

デモサイト



コードを動かすために必要な作業

1.Hugging Faceのアカウント作成(要メールアドレス)

最初はhuggingfaceというサイトのアカウントが必要です
SignUpからメアドとパスワードで登録しましょう。


2.来たメールで認証確認

登録したらメールが来ると思うので
リンクをクリックして認証確認をします。


3.stable-diffusionのModel cardの使用申請をする
申請先

次にこのライブラリを使うためには
Model cardというものの使用許可がいるため
申請をする必要があります。

リンクにアクセスして
チェックを入れて
Access repositoryをクリックします。


4.Access Tokenを取得

その後、Tokenの作成画面に遷移し
「New token」をクリックして
適当な名前で「token」を作成します。
スクリーンショット 2022-08-27 14.34.32

出来上がったら、コピーボタンがあるので
それをコピーします。



ここからはGoogle Colabの設定です。

5.Google Colabのランタイムの変更

CPUでは動かないので、ランタイムを設定変更します。

「ランタイム」から「ランタイムタイプの変更」
スクリーンショット 2022-08-27 15.45.44
ハードウェアアクセラレーターを
「None」から「GPU」へ変更します。



6.Access Tokenをコードに入力して実行する

最後に次のコードをコピペして
Tokenを打ち込んで実行します。

そうするとコード類のセットアップが走り
2-3分すると終わります。

#@title 事前セットアップ
 
# 必要なライブラリのインストール
!pip install diffusers==0.2.4 transformers scipy ftfy
 
# アクセス・トークンを設定
token = ""#@param {type:"string"}

# パイプラインを構築
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=token)
pipe.to("cuda")



あとは下記のコードをコピペして
英文のテキストを入力して画像を生成しましょう。
#@title 画像を生成する
 
# 画像生成
prompt = "A small cabin on top of a snowy mountain in the style of Disney, artstation" #@param {type:"string"}
img = pipe(prompt)["sample"][0]
 
# 画像の保存
img_name = prompt.replace(' ','_')
img_path = img_name + '.png'
img.save(img_path)

# 画像の表示
from IPython.display import Image,display
display(Image(img_path))

画像は画像保存で指定したパスに
保存されます。

画像作成時のポイントとして
・英文でないとダメです
・画風(スタイル)を指定できます


今回使用した英文の例です

A high tech solarpunk utopia in the Amazon rainforest

A pikachu fine dining with a view to the Eiffel Tower

A mecha robot in a favela in expressionist style

an insect robot preparing a delicious meal

A small cabin on top of a snowy mountain in the style of Disney, artstation

A_high_tech_solarpunk_utopia_in_the_Amazon_rainforest
A_pikachu_fine_dining_with_a_view_to_the_Eiffel_Tower
A_mecha_robot_in_a_favela_in_expressionist_style

結構それなりに、いい感じに出来ていると思います。

画像の生成には30秒ほどかかり
Google ColabのGPU使用は
無料版だと12時間ほどかと思うので
結構な枚数は作成できるんじゃないかと思います。

ちょっとしたイラストなんかは
自動で生成出来てしまいますね。

やりたい方は試してみてくださいね
それでは。

このページのトップヘ