LLMはテキスト生成だけではありません。テキストの説明から画像を生成することも可能です。画像をモダリティとして使用することは、医療技術、建築、観光、ゲーム開発など、さまざまな分野で非常に有用です。この章では、最も人気のある画像生成モデルであるDALL-EとMidjourneyについて見ていきます。
このレッスンでは以下を学びます:
- 画像生成とその有用性
- DALL-EとMidjourney、それらの概要と動作原理
- 画像生成アプリを構築する方法
このレッスンを完了すると、以下ができるようになります:
- 画像生成アプリケーションを構築する
- メタプロンプトを使用してアプリケーションの境界を定義する
- DALL-EとMidjourneyを操作する
画像生成アプリケーションは、生成AIの能力を探求する素晴らしい方法です。以下のような用途で使用できます:
-
画像編集と合成。画像編集や画像合成など、さまざまな用途に画像を生成できます。
-
多様な業界への応用。医療技術、観光、ゲーム開発など、さまざまな業界で画像を生成するために使用できます。
このレッスンでは、スタートアップEdu4Allと引き続き取り組みます。学生たちは自分たちの評価のために画像を作成します。どのような画像を作成するかは学生次第ですが、自分たちの童話のイラストを作成したり、新しいキャラクターを作り出したり、アイデアやコンセプトを視覚化するのに役立てることができます。
例えば、Edu4Allの学生がモニュメントについて授業で取り組んでいる場合、以下のような画像を生成することができます:
以下のようなプロンプトを使用して
"早朝の陽光の中でエッフェル塔の隣にいる犬"
DALL-EとMidjourneyは、最も人気のある画像生成モデルの2つであり、プロンプトを使用して画像を生成することができます。
まずDALL-Eについて説明します。これはテキストの説明から画像を生成する生成AIモデルです。
-
CLIPは、画像やテキストから数値表現(埋め込み)を生成するモデルです。
-
拡散注意は、埋め込みから画像を生成するモデルです。DALL-Eは画像とテキストのデータセットでトレーニングされており、テキストの説明から画像を生成することができます。例えば、DALL-Eを使用して帽子をかぶった猫やモヒカンの犬の画像を生成することができます。
MidjourneyはDALL-Eと似た方法で動作し、テキストプロンプトから画像を生成します。Midjourneyも「帽子をかぶった猫」や「モヒカンの犬」といったプロンプトを使用して画像を生成することができます。
画像提供 Wikipedia、Midjourneyによって生成された画像
まず、DALL-Eについてです。DALL-Eは、トランスフォーマーアーキテクチャに基づいた生成AIモデルで、_自己回帰型トランスフォーマー_を使用しています。
_自己回帰型トランスフォーマー_は、モデルがテキストの説明から画像を生成する方法を定義します。1ピクセルずつ生成し、生成されたピクセルを使用して次のピクセルを生成します。このプロセスはニューラルネットワークの複数の層を通じて進行し、画像が完成します。
このプロセスにより、DALL-Eは生成する画像の属性、オブジェクト、特徴などを制御します。ただし、DALL-E 2や3では生成画像の制御がさらに向上しています。
画像生成アプリケーションを構築するには何が必要でしょうか?以下のライブラリが必要です:
- python-dotenv: 秘密情報をコードから分離し、_.env_ファイルに保存するためにこのライブラリを使用することを強くお勧めします。
- openai: OpenAI APIとやり取りするために使用するライブラリです。
- pillow: Pythonで画像を操作するためのライブラリです。
- requests: HTTPリクエストを行うためのライブラリです。
まだ行っていない場合は、Microsoft Learnページの指示に従ってAzure OpenAIリソースとモデルを作成してください。モデルにはDALL-E 3を選択します。
-
以下の内容で_.env_ファイルを作成します:
AZURE_OPENAI_ENDPOINT=<your endpoint> AZURE_OPENAI_API_KEY=<your key> AZURE_OPENAI_DEPLOYMENT="dall-e-3"この情報はAzure OpenAI Foundry Portalの「デプロイメント」セクションで確認できます。
-
上記のライブラリを以下のように_requirements.txt_ファイルにまとめます:
python-dotenv openai pillow requests -
次に、仮想環境を作成し、ライブラリをインストールします:
python3 -m venv venv source venv/bin/activate pip install -r requirements.txtWindowsの場合、以下のコマンドを使用して仮想環境を作成し、アクティブ化します:
python3 -m venv venv venv\Scripts\activate.bat
-
次に、_app.py_というファイルに以下のコードを追加します:
import openai import os import requests from PIL import Image import dotenv from openai import OpenAI, AzureOpenAI # import dotenv dotenv.load_dotenv() # configure Azure OpenAI service client client = AzureOpenAI( azure_endpoint = os.environ["AZURE_OPENAI_ENDPOINT"], api_key=os.environ['AZURE_OPENAI_API_KEY'], api_version = "2024-02-01" ) try: # Create an image by using the image generation API generation_response = client.images.generate( prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils', size='1024x1024', n=1, model=os.environ['AZURE_OPENAI_DEPLOYMENT'] ) # Set the directory for the stored image image_dir = os.path.join(os.curdir, 'images') # If the directory doesn't exist, create it if not os.path.isdir(image_dir): os.mkdir(image_dir) # Initialize the image path (note the filetype should be png) image_path = os.path.join(image_dir, 'generated-image.png') # Retrieve the generated image image_url = generation_response.data[0].url # extract image URL from response generated_image = requests.get(image_url).content # download the image with open(image_path, "wb") as image_file: image_file.write(generated_image) # Display the image in the default image viewer image = Image.open(image_path) image.show() # catch exceptions except openai.InvalidRequestError as err: print(err)
このコードを説明します:
-
まず、必要なライブラリをインポートします。OpenAIライブラリ、dotenvライブラリ、requestsライブラリ、Pillowライブラリなどです。
import openai import os import requests from PIL import Image import dotenv
-
次に、_.env_ファイルから環境変数を読み込みます。
# import dotenv dotenv.load_dotenv()
-
その後、Azure OpenAIサービスクライアントを設定します。
# Get endpoint and key from environment variables client = AzureOpenAI( azure_endpoint = os.environ["AZURE_OPENAI_ENDPOINT"], api_key=os.environ['AZURE_OPENAI_API_KEY'], api_version = "2024-02-01" )
-
次に、画像を生成します:
# Create an image by using the image generation API generation_response = client.images.generate( prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils', size='1024x1024', n=1, model=os.environ['AZURE_OPENAI_DEPLOYMENT'] )
上記のコードは、生成された画像のURLを含むJSONオブジェクトを返します。このURLを使用して画像をダウンロードし、ファイルに保存することができます。
-
最後に、画像を開き、標準の画像ビューアで表示します:
image = Image.open(image_path) image.show()
画像を生成するコードを詳しく見てみましょう:
generation_response = client.images.generate(
prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils',
size='1024x1024', n=1,
model=os.environ['AZURE_OPENAI_DEPLOYMENT']
)- promptは、画像を生成するために使用されるテキストプロンプトです。この場合、プロンプトは「霧のかかった牧草地で、スイセンが咲く中、馬に乗ったウサギがキャンディを持っている」です。
- sizeは生成される画像のサイズです。この場合、1024x1024ピクセルの画像を生成しています。
- nは生成される画像の数です。この場合、2枚の画像を生成しています。
- temperatureは、生成AIモデルの出力のランダム性を制御するパラメータです。温度は0から1の間の値で、0は出力が決定的であることを意味し、1は出力がランダムであることを意味します。デフォルト値は0.7です。
画像に関してできることは他にもあり、次のセクションで説明します。
これまでにPythonで数行のコードを使用して画像を生成する方法を見てきました。しかし、画像に関してできることは他にもあります。
以下のことも可能です:
- 編集を行う。既存の画像、マスク、プロンプトを提供することで画像を変更することができます。例えば、画像の一部に何かを追加することができます。ウサギの画像を想像してみてください。ウサギに帽子を追加することができます。その方法は、画像、マスク(変更する部分を特定するもの)、そして何をするべきかを指示するテキストプロンプトを提供することです。
注意: これはDALL-E 3ではサポートされていません。
以下はGPT Imageを使用した例です:
response = client.images.edit(
model="gpt-image-1",
image=open("sunlit_lounge.png", "rb"),
mask=open("mask.png", "rb"),
prompt="A sunlit indoor lounge area with a pool containing a flamingo"
)
image_url = response.data[0].url基本画像にはプール付きのラウンジだけが含まれますが、最終的な画像にはフラミンゴが追加されます:
-
バリエーションを作成する。既存の画像を使用してバリエーションを作成することができます。バリエーションを作成するには、画像とテキストプロンプトを提供し、以下のようなコードを使用します:
response = openai.Image.create_variation( image=open("bunny-lollipop.png", "rb"), n=1, size="1024x1024" ) image_url = response['data'][0]['url']
注意: これはOpenAIでのみサポートされています。
温度は、生成AIモデルの出力のランダム性を制御するパラメータです。温度は0から1の間の値で、0は出力が決定的であることを意味し、1は出力がランダムであることを意味します。デフォルト値は0.7です。
以下のプロンプトを2回実行して、温度がどのように機能するかを見てみましょう:
プロンプト : "霧のかかった牧草地で、スイセンが咲く中、馬に乗ったウサギがキャンディを持っている"
同じプロンプトをもう一度実行してみると、同じ画像が生成されないことがわかります:
ご覧のように、画像は似ていますが、完全に同じではありません。次に、温度値を0.1に変更してみましょう:
generation_response = client.images.create(
prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils', # Enter your prompt text here
size='1024x1024',
n=2
)応答をより決定的にするために試してみましょう。生成された2つの画像から、最初の画像にはウサギがいて、2番目の画像には馬がいることがわかります。画像は大きく異なります。
そこで、コードを変更して温度を0に設定してみましょう:
generation_response = client.images.create(
prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils', # Enter your prompt text here
size='1024x1024',
n=2,
temperature=0
)このコードを実行すると、次の2つの画像が生成されます:
ここでは、画像がより似ていることが明確にわかります。
デモでは、すでにクライアント向けに画像を生成することができます。しかし、アプリケーションにいくつかの境界を設ける必要があります。
例えば、職場で安全でない画像や子供に適さない画像を生成したくありません。
これを実現するために、_メタプロンプト_を使用することができます。メタプロンプトは、生成AIモデルの出力を制御するために使用されるテキストプロンプトです。例えば、メタプロンプトを使用して出力を制御し、生成される画像が職場で安全であることや子供に適していることを保証することができます。
では、メタプロンプトはどのように機能するのでしょうか?
メタプロンプトは、生成AIモデルの出力を制御するために使用されるテキストプロンプトであり、テキストプロンプトの前に配置され、モデルの出力を制御するために使用されます。アプリケーションに埋め込まれ、モデルの出力を制御するために使用されます。プロンプト入力とメタプロンプト入力を単一のテキストプロンプトにカプセル化します。
メタプロンプトの例として、以下のようなものがあります:
You are an assistant designer that creates images for children.
The image needs to be safe for work and appropriate for children.
The image needs to be in color.
The image needs to be in landscape orientation.
The image needs to be in a 16:9 aspect ratio.
Do not consider any input from the following that is not safe for work or appropriate for children.
(Input)
では、デモでメタプロンプトをどのように使用できるか見てみましょう。
disallow_list = "swords, violence, blood, gore, nudity, sexual content, adult content, adult themes, adult language, adult humor, adult jokes, adult situations, adult"
meta_prompt =f"""You are an assistant designer that creates images for children.
The image needs to be safe for work and appropriate for children.
The image needs to be in color.
The image needs to be in landscape orientation.
The image needs to be in a 16:9 aspect ratio.
Do not consider any input from the following that is not safe for work or appropriate for children.
{disallow_list}
"""
prompt = f"{meta_prompt}
Create an image of a bunny on a horse, holding a lollipop"
# TODO add request to generate image上記のプロンプトから、生成されるすべての画像がメタプロンプトを考慮していることがわかります。
このレッスンの冒頭でEdu4Allを紹介しました。今度は学生が評価のために画像を生成できるようにしましょう。
学生たちはモニュメントを含む評価用の画像を作成します。どのモニュメントを選ぶかは学生次第です。この課題では、学生たちが創造性を発揮して、これらのモニュメントをさまざまなコンテキストに配置することが求められます。
以下は一つの可能な解決策です:
import openai
import os
import requests
from PIL import Image
import dotenv
from openai import AzureOpenAI
# import dotenv
dotenv.load_dotenv()
# Get endpoint and key from environment variables
client = AzureOpenAI(
azure_endpoint = os.environ["AZURE_OPENAI_ENDPOINT"],
api_key=os.environ['AZURE_OPENAI_API_KEY'],
api_version = "2024-02-01"
)
disallow_list = "swords, violence, blood, gore, nudity, sexual content, adult content, adult themes, adult language, adult humor, adult jokes, adult situations, adult"
meta_prompt = f"""You are an assistant designer that creates images for children.
The image needs to be safe for work and appropriate for children.
The image needs to be in color.
The image needs to be in landscape orientation.
The image needs to be in a 16:9 aspect ratio.
Do not consider any input from the following that is not safe for work or appropriate for children.
{disallow_list}
"""
prompt = f"""{meta_prompt}
Generate monument of the Arc of Triumph in Paris, France, in the evening light with a small child holding a Teddy looks on.
""""
try:
# Create an image by using the image generation API
generation_response = client.images.generate(
prompt=prompt, # Enter your prompt text here
size='1024x1024',
n=1,
)
# Set the directory for the stored image
image_dir = os.path.join(os.curdir, 'images')
# If the directory doesn't exist, create it
if not os.path.isdir(image_dir):
os.mkdir(image_dir)
# Initialize the image path (note the filetype should be png)
image_path = os.path.join(image_dir, 'generated-image.png')
# Retrieve the generated image
image_url = generation_response.data[0].url # extract image URL from response
generated_image = requests.get(image_url).content # download the image
with open(image_path, "wb") as image_file:
image_file.write(generated_image)
# Display the image in the default image viewer
image = Image.open(image_path)
image.show()
# catch exceptions
except openai.BadRequestError as err:
print(err)このレッスンを終えたら、Generative AI Learning collectionをチェックして、生成AIの知識をさらに深めてください!
次のレッスン10では、ローコードでAIアプリケーションを構築する方法について学びます。
免責事項:
この文書はAI翻訳サービスCo-op Translatorを使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があります。元の言語で記載された文書を正式な情報源としてご参照ください。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤認について、当方は一切の責任を負いません。








