見出し画像

DreamBooth見本ソースの説明


1.install dreambooth

#@title #**install dreambooth**

%pip install torch==1.13.1
%pip install xformers==0.0.16

!wget -q https://github.com/ShivamShrirao/diffusers/raw/main/examples/dreambooth/train_dreambooth.py
!wget -q https://github.com/ShivamShrirao/diffusers/raw/main/scripts/convert_diffusers_to_original_stable_diffusion.py

%pip install -qq git+https://github.com/ShivamShrirao/diffusers
%pip install -q -U --pre triton
%pip install -q accelerate transformers ftfy bitsandbytes==0.35.0 gradio natsort safetensors xformers==0.0.16

このソースコードは、Python環境に新しいライブラリと依存関係をインストールし、特定のファイルをダウンロードするための一連のコマンドを実行しています。以下は各行の説明です:

  1. #@title #**install dreambooth**:
    この行は、コードセルのタイトルとして表示されるコメントですが、コードの実行には直接影響しません。

  2. %pip install torch==1.13.1:
    pip を使用して、特定のバージョン(1.13.1)のPyTorchライブラリをインストールします。

  3. %pip install xformers==0.0.16:
    pip を使用して、特定のバージョン(0.0.16)の xformers ライブラリをインストールします。

  4. !wget -q https://github.com/ShivamShrirao/diffusers/raw/main/examples/dreambooth/train_dreambooth.py:
    wget コマンドを使用して、指定されたURLからファイル train_dreambooth.py をダウンロードします。-q オプションは、ダウンロード中の出力を抑制します。

  5. !wget -q https://github.com/ShivamShrirao/diffusers/raw/main/scripts/convert_diffusers_to_original_stable_diffusion.py:
    同様に、指定されたURLからファイル convert_diffusers_to_original_stable_diffusion.py をダウンロードします。

  6. %pip install -qq git+https://github.com/ShivamShrirao/diffusers:
    git リポジトリからライブラリ diffusers をインストールします。-qq オプションは出力を抑制します。

  7. %pip install -q -U --pre triton:
    triton ライブラリをインストールします。-q オプションは出力を抑制し、-U オプションはライブラリを最新のバージョンに更新します。

  8. %pip install -q accelerate transformers ftfy bitsandbytes==0.35.0 gradio natsort safetensors xformers==0.0.16:
    複数のライブラリをインストールします。これには acceleratetransformersftfybitsandbytes(バージョン0.35.0)、gradionatsortsafetensors、および再度 xformers の特定バージョンが含まれています。

このコードは、必要なライブラリとファイルをインストールおよびダウンロードするための手順を示しています。これらのステップは、特定のプロジェクトや環境に依存し、必要なライブラリやファイルを事前にセットアップするために使用されます。

2.login to HuggingFace

#@title #**login to HuggingFace**

#@markdown You need to accept the model license before downloading or using the Stable Diffusion weights. Please, visit the [model card](https://huggingface.co/CompVis/stable-diffusion-v1-4), read the license and tick the checkbox if you agree. You have to be a registered user in 🤗 Hugging Face Hub, and you'll also need to use an access token for the code to work.
from huggingface_hub import notebook_login
!git config --global credential.helper store
notebook_login()

このソースコードは、Hugging Face Hubにログインするための手順を提供しています。Hugging Face Hubは、モデルやデータセットなどの機械学習アセットを共有し、ダウンロードするためのプラットフォームです。以下はコードの説明です:

  1. #@title #**login to HuggingFace**:
    この行は、コードセルのタイトルとして表示されるコメントですが、コードの実行には直接影響しません。

  2. #@markdown:
    このコメントは、Markdown形式の説明文を示します。この場合、Hugging Faceモデルのライセンスに同意する必要があり、ライセンスを確認するためのURL(モデルカードへのリンク)が提供されています。

  3. from huggingface_hub import notebook_login:
    Hugging Face Hubのノートブックログイン関数をインポートします。

  4. !git config --global credential.helper store:
    Gitのクレデンシャルヘルパーを設定し、Git認証情報を永続的に保存します。

  5. notebook_login():
    Hugging Face Hubにノートブックからログインします。この操作にはアクセス許可が必要で、ユーザーがHugging Face Hubに登録し、アクセストークンを使用していることを前提としています。ログインに成功した場合、ノートブックはHugging Face Hubからモデルデータなどをダウンロードできるようになります。

このコードは、Hugging Face Hubからモデルデータをダウンロードするために必要なログイン手順を提供しています。ユーザーがHugging Face Hubで提供されているモデルを使用する前に、ライセンスに同意し、ログインする必要があります。

3.setting folder

#@title #**setting folder**

# define function
import os
import shutil
def reset_folder(path):
    if os.path.isdir(path):
      shutil.rmtree(path)
    os.makedirs(path,exist_ok=True)

import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import os
import glob
def display_pic(folder):
    fig = plt.figure(figsize=(30, 60))
    files = sorted(glob.glob(folder+'/*.jpg'))
    for i, file in enumerate(files):
        img = Image.open(file)
        images = np.asarray(img)
        ax = fig.add_subplot(10, 5, i+1, xticks=[], yticks=[])
        image_plt = np.array(images)
        ax.imshow(image_plt)
        name = os.path.basename(file)
        ax.set_xlabel(name, fontsize=30)
        fig.tight_layout()
    plt.show()
    plt.close()

# setting
MODEL_NAME = "CompVis/stable-diffusion-v1-4"

INSTANCE = "kasumiarimura" #@param {type:"string"}
INSTANCE_DIR = "/content/data/"+INSTANCE
reset_folder(INSTANCE_DIR)

CLASS = "portrait" #@param {type:"string"}
CLASS_DIR = "/content/data/"+CLASS
reset_folder(CLASS_DIR)

OUTPUT_DIR = "/content/stable_diffusion_weights/" + INSTANCE
reset_folder(OUTPUT_DIR)


concepts_list = [
    {
        "instance_prompt":      INSTANCE,
        "class_prompt":         CLASS,
        "instance_data_dir":     INSTANCE_DIR,
        "class_data_dir":        CLASS_DIR
    },
]

# `class_data_dir` contains regularization images
import json
import os
for c in concepts_list:
    os.makedirs(c["instance_data_dir"], exist_ok=True)

with open("concepts_list.json", "w") as f:
    json.dump(concepts_list, f, indent=4)

このソースコードは、特定のフォルダとディレクトリを設定し、画像表示のための関数を定義しています。以下はコードの詳細な説明です:

  1. #@title #**setting folder**:
    この行は、コードセルのタイトルとして表示されるコメントですが、コードの実行には直接影響しません。

  2. import os:
    Pythonのosモジュールをインポートして、ファイルやディレクトリの操作を行います。

  3. import shutil:
    Pythonのshutilモジュールをインポートして、ファイルやディレクトリのコピー、削除などを行います。

  4. def reset_folder(path):
    reset_folder という名前の関数を定義します。この関数は、指定されたディレクトリパス path をクリア(既存のファイルやディレクトリを削除)し、新しいディレクトリを作成します。既存のデータをクリアするために使用されます。

  5. import matplotlib.pyplot as plt:
    matplotlib ライブラリから pyplot モジュールをインポートし、画像のプロットに使用します。

  6. from PIL import Image:
    Python Imaging Library(PIL)から Image クラスをインポートし、画像の操作を行います。

  7. import numpy as np:
    NumPyライブラリをインポートし、数値データの操作に使用します。

  8. import glob:
    ファイルパターンにマッチするファイルの一覧を取得するために glob モジュールをインポートします。

  9. def display_pic(folder):
    display_pic という名前の関数を定義します。この関数は、指定されたディレクトリ内の画像を表示するために使用されます。

  10. # setting: ここからは設定のセクションです。以下の設定を行います:

    • MODEL_NAME: 使用するモデルの名前(Hugging Faceモデルハブ内のモデル名)を指定します。

    • INSTANCE: "kasumiarimura" という文字列型のパラメータを指定します。

    • INSTANCE_DIR: "kasumiarimura" という名前のディレクトリを作成するパスを指定します。

    • CLASS: "portrait" という文字列型のパラメータを指定します。

    • CLASS_DIR: "portrait" という名前のディレクトリを作成するパスを指定します。

    • OUTPUT_DIR: 出力データを格納するためのディレクトリパスを指定します。

  11. concepts_list: 一連のコンセプト情報をリストとして定義します。各コンセプトは以下の情報を含みます:

    • "instance_prompt": INSTANCE の値

    • "class_prompt": CLASS の値

    • "instance_data_dir": INSTANCE_DIR の値

    • "class_data_dir": CLASS_DIR の値

  12. import json: JSONフォーマットのデータを操作するために json モジュールをインポートします。

  13. ディレクトリの作成: concepts_list に含まれる各コンセプトのディレクトリを作成します。

  14. JSONファイルの作成: concepts_list の情報を含む JSON ファイル "concepts_list.json" を作成します。

このコードは、特定のフォルダ構造を設定し、データの保存および表示に必要な関数を定義します。また、コンセプト情報を収集して JSON ファイルに保存する準備を行います。

4.upload pics

#@title #**upload pics**
import os
from google.colab import files
import shutil
import gdown

sample_pics = True #@param {type:"boolean"}
if sample_pics:
  gdown.download('https://drive.google.com/uc?id=1NqdBzYndW5mAm21MlOC6uP6gH61lWWZ5', 'kasumi.zip', quiet=False)
  ! unzip -d $INSTANCE_DIR kasumi.zip
else:
  uploaded = files.upload()
  for filename in uploaded.keys():
      dst_path = os.path.join(INSTANCE_DIR, filename)
      shutil.move(filename, dst_path)

%matplotlib inline
display_pic(INSTANCE_DIR)

このソースコードは、画像をアップロードして特定のディレクトリに配置するための手順を提供します。以下はコードの詳細な説明です:

  1. #@title #**upload pics**: この行は、コードセルのタイトルとして表示されるコメントですが、コードの実行には直接影響しません。

  2. import os: Pythonのosモジュールをインポートして、ファイルやディレクトリの操作を行います。

  3. from google.colab import files: Google Colabからファイルアップロードを可能にするために、files モジュールをインポートします。

  4. import shutil: ファイルの操作に使用する shutil モジュールをインポートします。

  5. import gdown: Google Driveからファイルをダウンロードするための gdown モジュールをインポートします。

  6. sample_pics: ブール型のパラメータで、サンプル画像をアップロードするかどうかを指定します。このパラメータはコードセルのユーザーによって設定できます。

  7. if sample_pics:: sample_pics パラメータが True の場合、サンプル画像をアップロードする処理を実行します。

  8. gdown.download(...): gdown を使用して、Google Driveから指定のファイル(IDが指定されたファイル)をダウンロードし、ローカルファイル "kasumi.zip" に保存します。quiet=False オプションにより、ダウンロードの進捗状況が表示されます。

  9. ! unzip -d $INSTANCE_DIR kasumi.zip: unzip コマンドを使用して、"kasumi.zip" アーカイブを $INSTANCE_DIR ディレクトリに解凍します。

  10. else:: sample_pics パラメータが False の場合、ユーザーによってアップロードされた画像を処理します。

  11. uploaded = files.upload(): ユーザーによってアップロードされたファイルを受け入れ、アップロードされたファイルの情報を uploaded 変数に格納します。

  12. for filename in uploaded.keys():: アップロードされたファイルの情報をループで処理します。

  13. dst_path = os.path.join(INSTANCE_DIR, filename): アップロードされたファイルの移動先のパスを構築します。

  14. shutil.move(filename, dst_path): アップロードされたファイルを移動先のパスに移動します。

  15. %matplotlib inline: インラインでMatplotlibのプロットを表示するためのマジックコマンドを設定します。

  16. display_pic(INSTANCE_DIR): display_pic 関数を呼び出し、INSTANCE_DIR 内の画像を表示します。

このコードは、ユーザーが提供した画像を特定のディレクトリにアップロードし、その画像を表示するための手順を提供します。サンプル画像を使用するか、ユーザーによってアップロードされた画像を使用するかは、sample_pics パラメータによって制御されます。

5.train

#@title #**train** (takes 20〜30minutes)

from accelerate.utils import write_basic_config
write_basic_config()

#train_dreambooth.py
!accelerate launch train_dreambooth.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \
  --output_dir=$OUTPUT_DIR \
  --revision="fp16" \
  --with_prior_preservation --prior_loss_weight=1.0 \
  --seed=1337 \
  --resolution=512 \
  --train_batch_size=1 \
  --train_text_encoder \
  --mixed_precision="fp16" \
  --use_8bit_adam \
  --gradient_accumulation_steps=1 \
  --learning_rate=1e-6 \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --num_class_images=50 \
  --sample_batch_size=4 \
  --max_train_steps=800 \
  --save_interval=10000 \
  --save_sample_prompt=$CLASS \
  --concepts_list="concepts_list.json"

このソースコードは、トレーニングプロセスを実行するためのコマンドを提供しています。以下はコードの詳細な説明です:

  1. #@title #**train** (takes 20〜30minutes): この行は、コードセルのタイトルとして表示されるコメントですが、コードの実行には直接影響しません。また、トレーニングにかかる時間の見積もりが表示されています。

  2. from accelerate.utils import write_basic_config: accelerate ライブラリから write_basic_config 関数をインポートします。

  3. write_basic_config(): write_basic_config 関数を呼び出し、accelerate ライブラリの基本的な設定を書き込みます。これにより、トレーニングの効率性が向上します。

  4. !accelerate launch train_dreambooth.py ...: accelerate ライブラリの launch コマンドを使用して、指定された Python スクリプト train_dreambooth.py を実行します。このコマンドは、以下の多くのオプションを使用してトレーニングプロセスを設定します。各オプションの説明は以下の通りです:

    • --pretrained_model_name_or_path=$MODEL_NAME: モデルの事前学習済みのパスまたは名前を指定します。このパラメータは変数 $MODEL_NAME の値に基づいています。

    • --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse": 別のモデル stabilityai/sd-vae-ft-mse の事前学習済みのパスまたは名前を指定します。

    • --output_dir=$OUTPUT_DIR: 学習済みモデルやログファイルなどの出力先ディレクトリを指定します。このパラメータは変数 $OUTPUT_DIR の値に基づいています。

    • その他のオプション: 学習バッチサイズ、学習率、スケジューラ、データセットの設定など、トレーニングプロセスのさまざまなパラメータを指定します。

このコードは、指定されたオプションで train_dreambooth.py スクリプトを実行し、モデルのトレーニングを行います。トレーニングの詳細なプロセスは、train_dreambooth.py スクリプト内で定義されているでしょう。

6.make pipe for generating images

#@title #**make pipe for generating images**

# Specify the weights directory to use (leave blank for latest)
WEIGHTS_DIR = ""
if WEIGHTS_DIR == "":
    from natsort import natsorted
    from glob import glob
    import os
    WEIGHTS_DIR = natsorted(glob(OUTPUT_DIR.rstrip(os.sep)+"/*"))[-1]

# Inference
import torch
from torch import autocast
from diffusers import StableDiffusionPipeline, DDIMScheduler
from IPython.display import display

model_path = WEIGHTS_DIR             # If you want to use previously trained model saved in gdrive, replace this with the full path of model in gdrive

pipe = StableDiffusionPipeline.from_pretrained(model_path, safety_checker=None, torch_dtype=torch.float16).to("cuda")
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config)
pipe.enable_xformers_memory_efficient_attention()

g_cuda = None

# seed setting
g_cuda = torch.Generator(device='cuda')
seed = 52362 #@param {type:"number"}
g_cuda.manual_seed(seed)#@title #**make pipe for generating images**

# Specify the weights directory to use (leave blank for latest)
WEIGHTS_DIR = ""
if WEIGHTS_DIR == "":
    from natsort import natsorted
    from glob import glob
    import os
    WEIGHTS_DIR = natsorted(glob(OUTPUT_DIR.rstrip(os.sep)+"/*"))[-1]

# Inference
import torch
from torch import autocast
from diffusers import StableDiffusionPipeline, DDIMScheduler
from IPython.display import display

model_path = WEIGHTS_DIR             # If you want to use previously trained model saved in gdrive, replace this with the full path of model in gdrive

pipe = StableDiffusionPipeline.from_pretrained(model_path, safety_checker=None, torch_dtype=torch.float16).to("cuda")
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config)
pipe.enable_xformers_memory_efficient_attention()

g_cuda = None

# seed setting
g_cuda = torch.Generator(device='cuda')
seed = 52362 #@param {type:"number"}
g_cuda.manual_seed(seed)

このソースコードは、画像生成のためのパイプラインを設定し、モデルの重みを指定して、画像生成の準備を行う手順を提供しています。以下はコードの詳細な説明です:

  1. #@title #**make pipe for generating images**: この行は、コードセルのタイトルとして表示されるコメントですが、コードの実行には直接影響しません。

  2. WEIGHTS_DIR = "": WEIGHTS_DIR という変数を定義し、モデルの重みが保存されているディレクトリのパスを格納します。初期値として空文字列が設定されています。

  3. if WEIGHTS_DIR == "":: もし WEIGHTS_DIR が空文字列である場合、新しい値を計算するロジックが続きます。

  4. from natsort import natsorted: natsorted 関数をインポートして、自然な順序でディレクトリ内のファイルをソートします。

  5. from glob import glob: glob 関数をインポートして、ワイルドカードを使用してディレクトリ内のファイルを取得します。

  6. import os: Pythonのosモジュールをインポートして、ファイルやディレクトリの操作を行います。

  7. WEIGHTS_DIR = natsorted(glob(OUTPUT_DIR.rstrip(os.sep)+"/*"))[-1]: OUTPUT_DIR から最新のモデルの重みディレクトリパスを取得します。glob 関数はディレクトリ内のすべてのファイルのリストを取得し、natsorted 関数で自然な順序でソートされたリストから最新のファイルを選択します。

  8. import torch: PyTorchライブラリをインポートします。

  9. from torch import autocast: PyTorchの autocast をインポートして、浮動小数点数演算を16ビット精度で実行するためのコンテキストマネージャを提供します。

  10. from diffusers import StableDiffusionPipeline, DDIMScheduler: 画像生成のためのパイプラインとスケジューラを提供する StableDiffusionPipeline および DDIMScheduler をインポートします。

  11. from IPython.display import display: IPythonの display 関数をインポートして、画像の表示に使用します。

  12. model_path = WEIGHTS_DIR: model_path という変数に、モデルの重みディレクトリパスを格納します。

  13. pipe = StableDiffusionPipeline.from_pretrained(model_path, safety_checker=None, torch_dtype=torch.float16).to("cuda"): 事前学習済みのモデルを読み込み、StableDiffusionPipeline を初期化します。また、16ビット浮動小数点数 (torch.float16) で演算を行うように設定します。

  14. pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config): パイプラインのスケジューラを設定します。

  15. pipe.enable_xformers_memory_efficient_attention(): パイプラインでメモリ効率の高い注意機構を有効にします。

  16. g_cuda = None: g_cuda という変数を初期化します。

  17. g_cuda = torch.Generator(device='cuda'): CUDAデバイスで使用する乱数生成器を作成し、g_cuda に格納します。

  18. seed = 52362: 乱数生成器のシードを設定します。この値は変数 seed から取得されています。

このコードは、画像生成のためのパイプラインを設定し、モデルの重みを指定して、画像生成の準備を行います。モデルがトレーニング済みである必要があり、それに基づいて画像生成を行うことができます。

7.manual generat images

#@title #**manual generat images**

reset_folder('images')

# prompt
prompt = "kasumiarimura portrait" #@param {type:"string"}
negative_prompt = "\u6C34\u7740" #@param {type:"string"}

# other setting
num_samples = 10
guidance_scale = 7.5
num_inference_steps = 50
height = 512
width = 512

with autocast("cuda"), torch.inference_mode():
    images = pipe(
        prompt,
        height=height,
        width=width,
        negative_prompt=negative_prompt,
        num_images_per_prompt=num_samples,
        num_inference_steps=num_inference_steps,
        guidance_scale=guidance_scale,
        generator=g_cuda
    ).images

for i, img in enumerate(images):
    img.save('images/'+str(i).zfill(4)+'.jpg')
    display(img)

このソースコードは、手動で画像を生成するための手順を提供します。以下はコードの詳細な説明です:

  1. #@title #**manual generate images**: この行は、コードセルのタイトルとして表示されるコメントですが、コードの実行には直接影響しません。

  2. reset_folder('images'): 'images' ディレクトリを初期化します。新しい画像を保存するためのディレクトリを作成し、既存の画像を削除します。

  3. prompt: 画像生成のためのプロンプト(指示)を指定するための文字列パラメータです。prompt 変数には "kasumiarimura portrait" などのプロンプトを指定します。

  4. negative_prompt: ネガティブなプロンプトを指定するための文字列パラメータです。ネガティブなプロンプトは、画像生成プロセスに対して特定の制約を課すために使用されます。この例では "\u6C34\u7740" などのネガティブなプロンプトを指定します。

  5. num_samples: 生成する画像の数を指定します。この例では 10 枚の画像を生成します。

  6. guidance_scale: ガイダンスのスケールを指定します。ガイダンスは画像生成プロセスに影響を与えるパラメータで、このパラメータを調整することで生成される画像の特性が変化します。

  7. num_inference_steps: 推論ステップの数を指定します。この値は画像生成の反復回数を制御します。

  8. height および width: 生成する画像の高さと幅を指定します。この例では 512x512 ピクセルの画像を生成します。

  9. with autocast("cuda"), torch.inference_mode():: 16ビット精度 (cuda) での自動型変換を有効にし、PyTorchの推論モードを有効にします。これにより、画像生成の計算が高速化されます。

  10. images = pipe(...).images: pipe パイプラインを使用して画像を生成し、images 変数に格納します。生成する画像の数、プロンプト、ガイダンススケール、サイズなどが指定されています。

  11. for i, img in enumerate(images):: 生成された各画像をループで処理します。

  12. img.save('images/'+str(i).zfill(4)+'.jpg'): 生成された画像を 'images' ディレクトリに保存します。ファイル名は "0000.jpg"、"0001.jpg" などの形式で表現されます。

  13. display(img): 生成された画像を表示します。

このコードは、指定されたプロンプトとパラメータに基づいて、指定された数の画像を生成し、それらの画像を 'images' ディレクトリに保存および表示します。画像生成はモデルによって行われ、プロンプトとガイダンススケールなどのパラメータによって制御されます。

8.Download images

#@title #**Download images**
from google.colab import files

if os.path.isfile('data.zip'):
  os.remove('data.zip')

! zip -r data.zip images
files.download('data.zip')

このソースコードは、生成された画像をZIPアーカイブとしてパッケージ化し、ダウンロードするための手順を提供します。以下はコードの詳細な説明です:

  1. #@title #**Download images**: この行は、コードセルのタイトルとして表示されるコメントですが、コードの実行には直接影響しません。

  2. from google.colab import files: Google Colabからファイルダウンロードを可能にするために、files モジュールをインポートします。

  3. if os.path.isfile('data.zip'):: もしカレントディレクトリに 'data.zip' という名前のファイルが既に存在する場合、それを削除する処理を実行します。これは新しいアーカイブファイルを作成する前に、既存のファイルをクリアするためのものです。

  4. ! zip -r data.zip images: zip コマンドを使用して、'images' ディレクトリ内のすべてのファイルとサブディレクトリを含む 'data.zip' という名前のZIPアーカイブを作成します。

  5. files.download('data.zip'): files モジュールの download 関数を使用して、作成したZIPアーカイブ 'data.zip' をダウンロードします。ユーザーにファイルのダウンロードダイアログが表示されます。

このコードは、生成された画像をZIPアーカイブとしてパッケージ化し、ユーザーにダウンロードするための手順を提供します。ダウンロードされるZIPアーカイブには 'images' ディレクトリ内のすべての画像が含まれます。

9.auto generat images

#@title #**auto generat images**

# prompt bank
#p0 = 'XXX profile picture by margaret keane, dynamic pose, intricate, futuristic, fantasy, elegant, by stanley artgerm lau, greg rutkowski, thomas kindkade, alphonse mucha, loish, norman rockwell'
p1 = 'Realistic detailed face portrait of a beautiful futuristic italian renaissance queen in opulent alien glass armor by alphonse mucha, XXX, ayami kojima, amano, greg hildebrandt, and mark brooks, female, feminine, art nouveau, ornate italian renaissance cyberpunk, iridescent venetian blown glass, neo - gothic, gothic, character concept design'
p2 = 'Photo of a gorgeous XXX in the style of stefan kostic, realistic, sharp focus, 8 k high definition, insanely detailed, intricate, elegant, art by david cronenberg and stanley lau and artgerm'
p3 = 'Photo of a gorgeous female in the style of stefan kostic, XXX, realistic, half body shot, sharp focus, 8 k high definition, insanely detailed, intricate, elegant, art by stanley lau and artgerm, extreme blur cherry blossoms background'
p4 = 'God and goddess, XXX, white hair, long hair, gorgeous, amazing, elegant, intricate, highly detailed, digital painting, artstation, concept art, sharp focus, illustration, art by artgerm and greg rutkowski and alphonse mucha'
p5 = 'Portrait of a military engineer woman with short white hair, XXX, wearing overalls, medium shot, portrait, concept art, natural lighting, illustration, full color, highly detailed, photorealistic, by greg rutkowski, artstation'
#p0 = 'close up portrait Photography, of a  Starwars DarkVador king of the universe, an attractive, 80 degree view, art by Sergio Lopez , Natalie Shau, James Jean and Salvador Dali'
p0 = 'A beautiful redhead female pop artist all red sleek futuristic outfit, with huge headpiece center piece, clean makeup, with depth of field, fantastical edgy and regal themed outfit, captured in vivid colors, embodying the essence of fantasy, minimalist, film grain'
bank = [p0, p1, p2, p3, p4, p5] # , p6, p7

reset_folder('images')

# prompt
name = INSTANCE+' '+CLASS
prompt_bank_No = 4 #@param {type:"slider", min:0, max:5, step:1}
incantation = bank[prompt_bank_No]
prompt = incantation.replace('XXX', name)
print('prompt = ', prompt)
negative_prompt = ""

# other setting
num_samples = 10
guidance_scale = 7.5
num_inference_steps = 50
height = 512
width = 512

with autocast("cuda"), torch.inference_mode():
    images = pipe(
        prompt,
        height=height,
        width=width,
        negative_prompt=negative_prompt,
        num_images_per_prompt=num_samples,
        num_inference_steps=num_inference_steps,
        guidance_scale=guidance_scale,
        generator=g_cuda
    ).images

for i, img in enumerate(images):
    img.save('images/'+str(i).zfill(4)+'.jpg')
    display(img)

このソースコードは、画像生成を自動化するための手順を提供します。特定のプロンプトから画像を生成し、その画像を表示することが目的です。以下はコードの詳細な説明です:

  1. #@title #**auto generate images**: この行は、コードセルのタイトルとして表示されるコメントですが、コードの実行には直接影響しません。

  2. # prompt bank: プロンプト(生成指示)のバンク(リスト)が定義されています。各プロンプトは異なる生成要件を示し、ユーザーはこれらのプロンプトから選択できます。

  3. bank = [p0, p1, p2, p3, p4, p5]: プロンプトのリスト bank に上記で定義されたプロンプトが含まれています。

  4. reset_folder('images'): 'images' ディレクトリを初期化します。新しい画像を保存するためのディレクトリを作成し、既存の画像を削除します。

  5. name = INSTANCE+' '+CLASS: INSTANCECLASS 変数から生成される名前を設定します。この名前はプロンプト内に挿入されます。

  6. prompt_bank_No: プロンプトバンクから使用するプロンプトの番号を指定するためのスライダー入力フィールドです。ユーザーは 0 から 5 の範囲内でプロンプトを選択できます。

  7. incantation = bank[prompt_bank_No]: 選択したプロンプトバンクの中から選ばれたプロンプトを取得します。

  8. prompt = incantation.replace('XXX', name): プロンプト内の 'XXX' 文字列を name に置き換え、最終的なプロンプトを作成します。

  9. negative_prompt = "": ネガティブなプロンプトを空文字列として設定します。

  10. num_samples: 生成する画像の数を指定します。

  11. guidance_scale: ガイダンスのスケールを指定します。ガイダンスは画像生成プロセスに影響を与えるパラメータで、このパラメータを調整することで生成される画像の特性が変化します。

  12. num_inference_steps: 推論ステップの数を指定します。この値は画像生成の反復回数を制御します。

  13. height および width: 生成する画像の高さと幅を指定します。

  14. with autocast("cuda"), torch.inference_mode():: 16ビット精度 (cuda) での自動型変換を有効にし、PyTorchの推論モードを有効にします。

  15. images = pipe(...).images: pipe パイプラインを使用して画像を生成し、images 変数に格納します。生成する画像の数、プロンプト、ガイダンススケール、サイズなどが指定されています。

  16. for i, img in enumerate(images):: 生成された各画像をループで処理します。

  17. img.save('images/'+str(i).zfill(4)+'.jpg'): 生成された画像を 'images' ディレクトリに保存します。ファイル名は "0000.jpg"、"0001.jpg" などの形式で表現されます。

  18. display(img): 生成された画像を表示します。

このコードは、選択されたプロンプトから画像を自動生成し、それらの画像を 'images' ディレクトリに保存および表示します。画像生成はモデルによって行われ、プロンプトとガイダンススケールなどのパラメータによって制御されます。

10.Download images

#@title #**Download images**
from google.colab import files

if os.path.isfile('data.zip'):
  os.remove('data.zip')

! zip -r data.zip images
files.download('data.zip')

このソースコードは、生成された画像をZIPアーカイブとしてパッケージ化し、ダウンロードするための手順を提供します。以下はコードの詳細な説明です:

  1. #@title #**Download images**: この行は、コードセルのタイトルとして表示されるコメントですが、コードの実行には直接影響しません。

  2. from google.colab import files: Google Colabからファイルダウンロードを可能にするために、files モジュールをインポートします。

  3. if os.path.isfile('data.zip'):: もしカレントディレクトリに 'data.zip' という名前のファイルが既に存在する場合、それを削除する処理を実行します。これは新しいアーカイブファイルを作成する前に、既存のファイルをクリアするためのものです。

  4. ! zip -r data.zip images: zip コマンドを使用して、'images' ディレクトリ内のすべてのファイルとサブディレクトリを含む 'data.zip' という名前のZIPアーカイブを作成します。

  5. files.download('data.zip'): files モジュールの download 関数を使用して、作成したZIPアーカイブ 'data.zip' をダウンロードします。ユーザーにファイルのダウンロードダイアログが表示されます。

このコードは、生成された画像をZIPアーカイブとしてパッケージ化し、ユーザーにダウンロードするための手順を提供します。ダウンロードされるZIPアーカイブには 'images' ディレクトリ内のすべての画像が含まれます。

11.ドライブをマウントする

from google.colab import drive
drive.mount('/content/drive')

このソースコードは、Google Colab環境でGoogle ドライブ(Google Drive)をマウントするための手順を提供します。具体的な説明は次の通りです:

  1. from google.colab import drive: Google Colab内でGoogle ドライブにアクセスするために、drive モジュールをインポートします。このモジュールにはGoogle ドライブへのアクセスを管理するための関数やメソッドが含まれています。

  2. drive.mount('/content/drive'): drive モジュールの mount 関数を呼び出し、Google ドライブをColabの /content/drive ディレクトリにマウントします。マウントには認証プロセスが含まれ、ユーザーはGoogle アカウントにサインインしてアクセス許可を与える必要があります。

このコードを実行することで、Colabのノートブック環境からGoogle ドライブ内のファイルやディレクトリにアクセスできるようになります。ドライブが正常にマウントされると、/content/drive 内でGoogle ドライブのファイルを閲覧、読み取り、書き込みできます。これは、外部のデータやファイルをColabで使用する際に便利な手法です。


この記事が気に入ったらサポートをしてみませんか?