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

1. はじめに

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

Imagegen 画像生成

Google Imagen は、テキストの説明からリアルでクリエイティブな画像を生成できる Google の強力な大規模言語モデルです。Vertex AI の Imagen を使用すると、ユーザーの想像力を高品質のビジュアル アセットに変換する次世代の AI プロダクトを数秒で構築できます。テキストからの画像生成に加えて、テキスト プロンプト、画像キャプション、ビジュアル Q&A、件名とテキストによる画像編集もサポートしています。スタイルベースの画像モデルのチューニング」へようこそ。

プロンプトの生成

Imagen を使用して画像を作成するには、画像の説明テキスト(プロンプト)を指定する必要があります。この説明を使用して画像が生成されます。ただし、写真のようにリアルな高品質な画像を生成するには、プロンプトの専門知識が必要です。また、小売や製造など、特定のビジネス分野に関連する画像を生成する場合は、ドメインに依存することもあります。Text Bison モデルに一連のキーワードを指定すると、プロンプトを簡単に設計できます。

全体的なアプローチは次のようになります。

fbb3826592b2816d.png

Gradio の UI

Gradio はオープンソースの Python ライブラリです。これを使用すると、機械学習モデル、任意の API、さらには任意の Python 関数用に、使いやすくカスタマイズ可能な UI コンポーネントを数行のコードで素早く作成できます。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, green, 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 モデルによって生成されたプロンプトを使用します。

© 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 = "歪んだ顔と目立たない顔"

generate_images_list = image_generation(user_prompt,negative_prompt)

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

generated_images_list[0].show()

出力 -

db04a6bfdd78693b.jpeg

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

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

Ⰳ with gr.Blocks() のデモ:

#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")

gr.Row() を使用します。

    btn = gr.Button("Submit")

gr.Row() を使用します。

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

btn.click(fn=prompt_generation, inputs=[ペルソナ, シグナル,テーマ, フォトモディファイア, 品質_modifiers, 他の_desc], outputs = returned_prompts)

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

このプロジェクトでは、柔軟性と複雑性を高めるために、ブロックを使用してアプリケーションを作成します。

アプリケーションにデータが流れますブロックに加え、複数の 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 アプリケーションをデプロイできました。