LLMはテキスト生成だけではありません。テキストの説明から画像を生成することも可能です。画像というモダリティを活用することで、医療技術、建築、観光、ゲーム開発など、さまざまな分野で非常に役立ちます。この章では、最も人気のある画像生成モデルであるDALL-EとMidjourneyについて見ていきます。
このレッスンでは、以下の内容を扱います。
- 画像生成とは何か、なぜ役立つのか
- DALL-EとMidjourneyとは何か、それらがどのように動作するのか
- 画像生成アプリをどのように作るか
このレッスンを終えた後、あなたは以下のことができるようになります。
- 画像生成アプリケーションを構築できる
- メタプロンプトでアプリケーションの境界を定義できる
- DALL-EとMidjourneyを使いこなせる
画像生成アプリケーションは、生成AIの可能性を探る素晴らしい方法です。例えば、以下のような用途があります。
-
画像編集や合成:さまざまな用途のために画像を生成できます。例えば画像編集や画像合成などです。
-
多様な業界での応用:医療技術、観光、ゲーム開発など、さまざまな業界向けの画像生成にも活用できます。
このレッスンでは、引き続き私たちのスタートアップ「Edu4All」を題材に進めます。生徒たちは自分たちの課題のために画像を作成します。どんな画像を作るかは生徒次第ですが、自分の童話のイラストを描いたり、新しいキャラクターを作ったり、アイデアやコンセプトを視覚化するのに役立てたりできます。
例えば、クラスで記念碑について学んでいる場合、Edu4Allの生徒たちは次のような画像を生成できます。
このようなプロンプトを使って
「朝日が差し込むエッフェル塔のそばにいる犬」
DALL-EとMidjourneyは、最も人気のある画像生成モデルの2つで、プロンプトを使って画像を生成できます。
まずはDALL-Eから見ていきましょう。DALL-Eはテキストの説明から画像を生成する生成AIモデルです。
-
CLIPは、画像やテキストから数値表現(埋め込み)を生成するモデルです。
-
Diffused attentionは、埋め込みから画像を生成するモデルです。DALL-Eは画像とテキストのデータセットで学習されており、テキストの説明から画像を生成できます。例えば、帽子をかぶった猫や、モヒカンの犬の画像を生成することができます。
MidjourneyもDALL-Eと同様に、テキストプロンプトから画像を生成します。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の「Deployments」セクションで確認できます。
-
上記のライブラリを 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()
画像を生成するコードをもう少し詳しく見てみましょう。
```python
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を使った例です。
```python
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のみでサポートされています
Temperatureは、生成AIモデルの出力のランダム性を制御するパラメータです。0から1の値で、0は決定的、1はランダムな出力になります。デフォルト値は0.7です。
Temperatureの働きを例で見てみましょう。同じプロンプトを2回実行します。
プロンプト:「馬に乗ったウサギが、霧のかかった水仙の咲く草原でペロペロキャンディを持っている」
同じプロンプトをもう一度実行してみると、同じ画像にはなりません。
ご覧の通り、画像は似ていますが全く同じではありません。今度はtemperatureの値を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枚の画像を見ると、1枚目はウサギ、2枚目は馬が目立っており、かなり違いがあります。
そこで、コードを変更してtemperatureを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モデルの出力をコントロールするためのテキストプロンプトで、通常のプロンプトの前に配置されます。アプリケーション内でプロンプト入力とメタプロンプト入力を1つのテキストプロンプトにまとめて使います。
メタプロンプトの一例は以下の通りです。
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)このレッスンを終えたら、ジェネレーティブAI学習コレクションで、ジェネレーティブAIの知識をさらに深めましょう!
次はレッスン10へ進み、ローコードでAIアプリケーションを構築する方法を学びます。
免責事項:
本書類はAI翻訳サービス Co-op Translator を使用して翻訳されています。正確性には努めておりますが、自動翻訳には誤りや不正確な表現が含まれる場合があります。原文(元の言語の文書)が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用によって生じたいかなる誤解や誤認についても、当方は責任を負いかねます。








