生成 AI - キーワードからの画像生成

1. はじめに

最終更新日: 2023 年 10 月 12 日

Imagegen 画像生成

Google Imagen は、テキストの説明からリアルでクリエイティブな画像を生成できる、Google の強力な大規模言語モデルです。Vertex AI の Imagen を使用すると、ユーザーは、ユーザーの想像力を高品質のビジュアル アセットに変換する次世代の AI プロダクトを数秒で構築できます。テキストからの画像生成に加えて、テキスト プロンプトによる画像編集、画像キャプション、視覚的な質問応答、被写体とスタイルに基づく画像モデルのチューニングもサポートしています。

プロンプト生成

Imagen を使用して画像を作成するには、プロンプトと呼ばれる画像のテキスト記述を指定する必要があります。このプロンプトを使用して画像が生成されます。ただし、高品質で写実的な画像を生成するには、プロンプトの専門知識が必要です。小売業や製造業などの特定のビジネス ドメインに関連する画像を生成する場合は、ドメインに依存する可能性もあります。プロンプトを設計する簡単な方法は、Text Bison モデルに一連のキーワードを指定することです。

全体的なアプローチは次のとおりです。

fbb3826592b2816d.png

Gradio UI

Gradio は、カスタマイズに対応した使いやすい UI コンポーネントをすばやく作成できるオープンソースの Python ライブラリです。ML モデルや API 用の UI はもちろん、数行のコーディングで任意の Python 関数を追加することも可能です。Gradio GUI を Jupyter ノートブックに直接統合したり、リンクとして他のユーザーと共有したりできます。Gradio は、テキスト、画像、動画、音声など、さまざまなメディアタイプをサポートしています。また、入力フィールド、ボタン、スライダー、プルダウン メニューなど、多くのビルド済み UI コンポーネントも提供します。

作成するアプリの概要

この Codelab では、次の機能を備えた Gradio アプリをデプロイします。

  • キーワードやフレーズを使用してテキスト プロンプトを生成します。生成されたプロンプトは手動で編集することもできます。
  • UI で生成されたプロンプトから画像を生成します。

学習内容

  • text-bison モデルでゼロショット学習と少数ショット学習をプログラムで使用して、画像生成用の Imagen 固有のプロンプトを生成する方法。
  • API とプロンプトを使用して Imagen モデルで画像を生成する方法。
  • Vertex AI Workbench ノートブックから Gradio アプリケーションを構築、デプロイ、テストする方法。

必要なもの

  • GCP プロジェクトへのアクセス権(例: Cloud-llm-preview4)
  • Vertex AI Workbench を作成する権限
  • Vertex AI API が有効になっています。
  • Gradio のネットワーキング要件: ノートブック インスタンスのパブリック URL へのアクセス

2. 設定方法

ノートブックを作成する

  • プロジェクトにログインする
  • 左側のナビゲーション メニューから [ワークベンチ] に移動する
  • [ユーザー管理のノートブック] で、デフォルトのオプションを使用して新しいノートブックを作成します。
  • インスタンスがプロビジョニングされたら、[JUPYTERLAB を開く] をクリックします。

注: ノートブックが停止状態の場合、ノートブックの起動に数分かかることがあります。

コードを取得する

コードファイルはこちらにあります。このノートブックは、環境にインポートしてそのまま実行できます(プロジェクトの詳細を変更する場合を除く)。

3. コードを実行する

必要な依存関係とライブラリをインストール/インポートする

  • Gradio アプリをインストールする
  • Text-Bison と画像生成用の Vertex AI API をインポートします。
  • 他の必要なライブラリをすべてインポートします。

Text-Bison を使用したプロンプト生成

キーワードやフレーズを含むユーザー入力を使用します。たとえば、生成する画像の要件を説明する文の作成に使用できるキーワードやフレーズのカンマ区切りリストなどです。

例 - 人物、被写体、背景、照明などの説明。

プロンプトを生成する関数は次のとおりです。

def prompt_generation(persona,signal,theme, lighting, quality, extra_desc):

model = TextGenerationModel.from_pretrained("text-bison")

response_few_shot = model.predict(

    few_shot_prompt,

    **parameters

)

response_single_shot = model.predict(

    prompt,

    **parameters

)

少数ショット プロンプトとゼロショット プロンプト

ゼロショット プロンプトは、モデルにテキストの生成元となるコンテキストや例を与えないテキスト生成手法です。モデルは独自の知識に基づいて一貫性のある有益なテキストを生成する必要があるため、これは難しい場合があります。

ただし、ゼロショット プロンプトは、モデルが既存の例に制約されないため、非常にクリエイティブなものになることもあります。

少数ショット プロンプトは、モデルに少数の例を与えてテキストを生成するテキスト生成手法です。モデルが生成する内容についてある程度のガイダンスがあるため、ゼロショット プロンプトよりも簡単です。ただし、少数ショット プロンプトは、モデルが提供された例に類似したテキストしか生成できないため、制限される可能性もあります。

以下は、少数ショット プロンプトとゼロショット プロンプトのサンプルコードです。

**# コードで使用される少数ショット プロンプト**

few_shot_prompt = f"""あなたは画像生成モデルのプロンプト作成の専門家です。提供されたフレーズとキーワードを使用して、それらを連結し、リアルな詳細を追加して、画像の生成に使用できる論理的で意味のあるプロンプトを生成します。

input: people, gardening, house garden, colorful plants, Real, HD image, Photo.

output: A Photo of people gardening in a house garden landscape with few coloured flowering plants. Realistic FULL HD Images, Elegant and natural facial and eye features taken by professional photographer

input: plumber, faucet, kitchen, high quality, natural lighting, Photo

output: A Photo of a plumber fixing a faucet in the kitchen. High quality image with natural indoor lighting.

input: house and garden, halloween, warm lighting, high quality image, Sketch

output: A Sketch of Beautiful House and Garden with Halloween Decorations. Warm lighting, High Quality, 4K photograph taken by professional photographer from front.

input: nice living room, warm lighting,Professional Photographer from far, Photo

output: A photo of a Well designed Living Room. Warm lighting, High Quality, 4K photograph taken by Professional Photographer from far

input: {params_list_str}

output:

"""

# コードで使用されるゼロショット プロンプト

prompt = f"""あなたは画像生成モデルのプロンプト作成の専門家です。画像生成モデル用の意味のあるプロンプトのリストを文書作成サポートします。特に「{params_list_str}」という単語を含めてください。これらの単語をプロンプトに含め、プロンプトを意味のあるものにしてください。」」」

Imagen を使用した画像生成

ユーザー入力プロンプトとネガティブ プロンプト(省略可)を使用し、同じものをモデル(imagegeneration@002)に渡します。

def image_generation_completion(input, negative_prompt):

input_prompt = input

model = ImageGenerationModel.from_pretrained("imagegeneration@002")

response = model.generate_images(

    prompt=input_prompt,

    number_of_images=4, #kept to static value of 4

    negative_prompt=negative_prompt

)

次のコードは、ユーザー入力のプロンプトとネガティブ プロンプトから画像を生成するために含まれています。最終的なコードでは、text-bison モデルによって生成されたプロンプトを使用します。

from vertexai.preview.vision_models import ImageGenerationModel

def image_generation(input, negative_prompt):

input_prompt = input

model = ImageGenerationModel.from_pretrained("imagegeneration@002")

response = model.generate_images(

    prompt=input_prompt,

    number_of_images=4, #kept to static value of 4.. can be a max value of 8

    negative_prompt=negative_prompt

)

images = response.images

return images

user_prompt = "プロンプト: 若い女性が、たくさんの木の中から飾りのない生のクリスマス ツリーを選んで販売している。冷たい照明、高品質で詳細な画像。プロのカメラマンが遠くから撮影した。」

negative_prompt = "Distorted and unattractive faces"

generated_images_list = image_generation(user_prompt,negative_prompt)

#生成された画像のいずれかを表示

generated_images_list[0].show()

出力 -

db04a6bfdd78693b.jpeg

4. Gradio アプリをデプロイする

Gradio は、ユーザーがキーワードを入力して構造化されたプロンプトを生成できるフロントエンドに使用されます。これらのプロンプトは直接使用することも、ユーザーがさらに編集してから Imagen に渡して入力どおりの画像を生成することもできます。Gradio は、ML モデルのユーザー インターフェースを作成するために使用できる Python ライブラリです。このアプリケーションでは、ブロックを使用して、柔軟性と複雑なデータフローを追加します。Blocks は、行と列を使用してアプリケーション レイアウトの管理を提供します。

with gr.Blocks() as demo:

#Prompt Generation Part

with gr.Row():

    with gr.Column(scale=1):

        Persona = gr.Textbox(label="Persona", info = "Customer segment such as Plumber, Electrician etc.")

    with gr.Column(scale=1):

        Signals = gr.Textbox(label="Signals", info = "Main content of banner such as Faucet, Lamp etc.")

    with gr.Column(scale=1):

        Theme = gr.Textbox(label="Theme", info = "Context of the banner such as Halloween, Kitchen etc.")

with gr.Row():

    with gr.Column(scale=1):

        photo_modifiers = gr.Textbox(label="Photography Modifiers", info = "Photography specific modifiers and parameters such as Lighting(Dramatic/Natural/Warm/Cold), Camera Proximity etc.")

    with gr.Column(scale=1):

        quality_modifiers =  gr.Textbox(label="Image Quality Modifier", info = "Quality Modifiers like high-quality, beautiful, stylized. 4K, HDR, By a professional etc")

    with gr.Column(scale=1):

        other_desc =  gr.Textbox(label="Any Other Description", info = "Other Descriptions for Image such as Style (Painting/Photo/Sketch), Bakground/Foreground Context")

with gr.Row():

    btn = gr.Button("Submit")

with gr.Row():

    returned_prompts = gr.Textbox(label="Result Prompts", interactive = True)    

btn.click(fn=prompt_generation, inputs=[Persona, Signals,Theme, photo_modifiers, quality_modifiers, other_desc], outputs = returned_prompts)

ユーザーの入力と出力を処理するために、Gradio は画像、動画、スライダー、プルダウン、テキスト ボックス、ラジオなどの複数のコンポーネントを提供します。これらのコンポーネントにより、デベロッパーはユーザーからの入力を受け取り、Test-bison、Imagen、その他の ML モデルにフィードする方法を柔軟に制御できます。

このプロジェクトでは、柔軟性と複雑さを追加するために Blocks を使用してアプリケーションが作成されています。

データがアプリケーションに流れます。Blocks に加えて、複数の Gradio コンポーネントが

使用されるもの:

以下は、入力プロンプトとネガティブ プロンプトから画像を生成するために使用されるコード スニペットです。

 #画像生成部分

with gr.Row():

    with gr.Column(scale=1):

        image_prompt = gr.Textbox(label="Image Generation Prompt")

with gr.Accordion("Advanced options", open=False): #Let's hide the advanced options!

    with gr.Row():

        negative_prompt = gr.Textbox(label="Negative prompt", info = "Specify What not to Include in Image ex. Bad Quality Image")

with gr.Row():

    with gr.Column(scale=1):    

        img_btn = gr.Button("Generate Images")

with gr.Row():

    with gr.Column():

        output_image_1 = gr.Image(label = "Result Image 1", visible = False)

    with gr.Column():

        output_image_2 = gr.Image(label = "Result Image 2", visible = False)

with gr.Row():

    with gr.Column():

        output_image_3 = gr.Image(label = "Result Image 3", visible = False)

    with gr.Column():

        output_image_4 = gr.Image(label = "Result Image 4", visible = False)

returned_prompts.select(populate_image_prompt, inputs = [returned_prompts], outputs = image_prompt)

img_btn.click(fn=image_generation_completion, inputs=[image_prompt,negative_prompt], outputs = [output_image_1,output_image_2,output_image_3,output_image_4])       

Gradio アプリケーションを実行してテストするには、テキスト プロンプトを入力して [生成] ボタンをクリックします。Imagen は、プロンプトに基づいて画像を生成します。さまざまなプロンプトを試して、Imagen が生成できる画像の種類の確認をおすすめします。

以下は、Gradio アプリでのプロンプト生成のスクリーンショットです。

70331c9645b1e91b.png

以下は、Gradio アプリでの画像生成のスクリーンショットです。

a7261e8fafab7073.png

例 -

例 1 -

[左の画像] プロンプト(シンプルなキーワードをプロンプトとして使用): ボートに乗っている友人のカップル。

[右の画像] プロンプト(Text-Bison によって生成されたプロンプトを使用): 森の暗い木々に囲まれたボートで釣りをする 2 人の若い男性の写真。シャツを着てボートの上に立っている男性。自然光、高画質、プロのカメラマンが撮影した 4K 写真。

c2f5fabd10baf42.jpeg abc9b8204a9fdf7f.jpeg

例 2 -

[左の画像] プロンプト((シンプルなキーワードをプロンプトとして使用)): クリスマス ツリー

[右の画像] プロンプト(Text-Bison によって生成されたプロンプトを使用): ランプと家具のある部屋のクリスマス ツリー。ツリーはライトとオーナメントで飾られています。窓の近くに置かれており、背景には壁が見えます。プロのカメラマンが遠くから撮影した、暖色系の照明、高画質、HDR 写真。

f10cf9f52ffd92c7.jpeg cce36df7a439b309.jpeg

5. クリーンアップ

リソースをクリーンアップするには:

  • gradio アプリを停止します。
  • Workbench ノートブックを停止または削除します。

6. 完了

おめでとうございます。Google Text-Bison API と Imagen API を使用してプロンプトと画像を作成する Gradio アプリケーションを正常にデプロイできました。