OpenAI Cookbook examples : DALL-E : DALL·E で 画像を生成して編集する方法 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 08/03/2023
* 本ページは、OpenAI Cookbook レポジトリの以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
OpenAI Cookbook : DALL-E : DALL·E で 画像を生成して編集する方法
このノートブックは OpenAI の DALL·E 画像 API エンドポイントを使用する方法を示します。
3 つの API エンドポイントがあります :
- 生成 (Generations) : 入力キャプションに基づいて 1 つまたは複数の画像を生成します。
- 編集 (Edits) : 既存の画像を編集または拡張します。
- バリエーション (Variations) : 入力画像のバリエーションを生成します。
セットアップ
- 必要なパッケージのインポート
- 貴方の OpenAI API キーをインポートします : 端末で export OPENAI_API_KEY=”your API key” を実行することでこれを行なうことができます。
- 画像をセーブするディレクトリを設定します。
# imports
import openai # OpenAI Python library to make API calls
import requests # used to download images
import os # used to access filepaths
from PIL import Image # used to print and edit images
# set API key
openai.api_key = os.environ.get("OPENAI_API_KEY")
# set a directory to save DALL·E images to
image_dir_name = "images"
image_dir = os.path.join(os.curdir, image_dir_name)
# create the directory if it doesn't yet exist
if not os.path.isdir(image_dir):
os.mkdir(image_dir)
# print the directory to save to
print(f"{image_dir=}")
image_dir='./images'
生成
生成 API エンドポイントはテキストプロンプトに基づいて画像を作成します。
必須入力 :
- prompt (str): 望む画像 (s) のテキスト説明。最大長は 1000 文字です。
オプション入力 :
- n (int): 生成する画像の数。1 と 10 の間である必要があります。デフォルトは 1 です。
- size (str): 生成される画像のサイズ。”256×256″, “512×512” または “1024×1024” のいずれかである必要があります。画像が小さいほど高速です。デフォルトは “1024×1024” です。
- response_format (str): 生成画像が返されるフォーマット。”url” または “b64_json” である必要があります。デフォルトは “url” です。
- user (str): エンドユーザを表す一意の識別子、これは OpenAI が不正行為を監視して検出するのに役立ちます。Learn more.
# create an image
# set the prompt
prompt = "A cyberpunk monkey hacker dreaming of a beautiful bunch of bananas, digital art"
# call the OpenAI API
generation_response = openai.Image.create(
prompt=prompt,
n=1,
size="1024x1024",
response_format="url",
)
# print response
print(generation_response)
{ "created": 1667611641, "data": [ { "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-l89177bnhkme4a44292n5r3j/user-dS3DiwfhpogyYlat6i42W0QF/img-SFJhix3AV4bmPFvqYRJDkssp.png?st=2022-11-05T00%3A27%3A21Z&se=2022-11-05T02%3A27%3A21Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-11-05T01%3A27%3A21Z&ske=2022-11-06T01%3A27%3A21Z&sks=b&skv=2021-08-06&sig=0ZHl38v5UTFjA7V5Oshu8M58uHI5itEfvo2PX0aO6kA%3D" } ] }
Note: If you get this error – AttributeError: module ‘openai’ has no attribute ‘Image’ – you’ll need to upgrade your OpenAI package to the latest version. You can do this by running pip install openai –upgrade in your terminal.
# save the image
generated_image_name = "generated_image.png" # any name you like; the filetype should be .png
generated_image_filepath = os.path.join(image_dir, generated_image_name)
generated_image_url = generation_response["data"][0]["url"] # extract image URL from response
generated_image = requests.get(generated_image_url).content # download the image
with open(generated_image_filepath, "wb") as image_file:
image_file.write(generated_image) # write the image to the file
# print the image
print(generated_image_filepath)
display(Image.open(generated_image_filepath))
./images/generated_image.png
バリエーション
バリエーション・エンドポイントは入力画像に類似した新しい画像 (バリエーション) を生成します。
ここでは上で生成された画像のバリエーションを生成します。
必須入力 :
- image (str): バリエーションのために基底として使用する画像。正当な PNG ファイル, 4MB 未満、そして正方形である必要があります。
オプション入力 :
- n (int): 生成する画像の数。1 と 10 の間である必要があります。デフォルトは 1 です。
- size (str): 生成される画像のサイズ。”256×256″, “512×512” または “1024×1024” のいずれかである必要があります。画像が小さいほど高速です。デフォルトは “1024×1024” です。
- response_format (str): 生成画像が返されるフォーマット。”url” または “b64_json” である必要があります。デフォルトは “url” です。
- user (str): エンドユーザを表す一意の識別子、これは OpenAI が不正行為を監視して検出するのに役立ちます。Learn more.
# create variations
# call the OpenAI API, using `create_variation` rather than `create`
variation_response = openai.Image.create_variation(
image=generated_image, # generated_image is the image generated above
n=2,
size="1024x1024",
response_format="url",
)
# print response
print(variation_response)
{ "created": 1667611666, "data": [ { "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-l89177bnhkme4a44292n5r3j/user-dS3DiwfhpogyYlat6i42W0QF/img-7HTTBl2k9l4Ir4BTHXnJvFz9.png?st=2022-11-05T00%3A27%3A46Z&se=2022-11-05T02%3A27%3A46Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-11-04T01%3A50%3A22Z&ske=2022-11-05T01%3A50%3A22Z&sks=b&skv=2021-08-06&sig=QlcKhn427bOAQobM8CmpEf3K90OiumP5jOQwkJpcH6Y%3D" }, { "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-l89177bnhkme4a44292n5r3j/user-dS3DiwfhpogyYlat6i42W0QF/img-KGKrKGzlsXN0INxaeII2t8XG.png?st=2022-11-05T00%3A27%3A46Z&se=2022-11-05T02%3A27%3A46Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-11-04T01%3A50%3A22Z&ske=2022-11-05T01%3A50%3A22Z&sks=b&skv=2021-08-06&sig=RbPoAwXMVfdPxKF40ZjVjlclrnzaQZS%2BxzhgkEcYhOk%3D" } ] }
# save the images
variation_urls = [datum["url"] for datum in variation_response["data"]] # extract URLs
variation_images = [requests.get(url).content for url in variation_urls] # download images
variation_image_names = [f"variation_image_{i}.png" for i in range(len(variation_images))] # create names
variation_image_filepaths = [os.path.join(image_dir, name) for name in variation_image_names] # create filepaths
for image, filepath in zip(variation_images, variation_image_filepaths): # loop through the variations
with open(filepath, "wb") as image_file: # open the file
image_file.write(image) # write the image to the file
# print the original image
print(generated_image_filepath)
display(Image.open(generated_image_filepath))
# print the new variations
for variation_image_filepaths in variation_image_filepaths:
print(variation_image_filepaths)
display(Image.open(variation_image_filepaths))
./images/generated_image.png
./images/variation_image_0.png
./images/variation_image_1.png
編集
編集エンドポイントは DALL·E を使用して既存の画像の指定された部分を生成します。3 つの入力が必要です : 編集する画像、再生成される部分を指定するマスク、そして望まれる画像を説明するプロンプト。
必須入力 :
- image (str): 編集する画像。正当な PNG ファイル, 4MB 未満、そして正方形である必要があります。
- mask (str): 追加の画像で、その完全に透明な領域 (例えばそこではアルファはゼロ) が画像が編集されるべき場所を示しています。正当な PNG ファイル, 4MB 未満、そして画像と同じサイズを持つ必要があります。
- prompt (str): 望む画像 (s) のテキスト説明。最大長は 1000 文字です。
オプション入力 :
- n (int): 生成する画像の数。1 と 10 の間である必要があります。デフォルトは 1 です。
- size (str): 生成される画像のサイズ。”256×256″, “512×512” または “1024×1024” のいずれかである必要があります。画像が小さいほど高速です。デフォルトは “1024×1024” です。
- response_format (str): 生成画像が返されるフォーマット。”url” または “b64_json” である必要があります。デフォルトは “url” です。
- user (str): エンドユーザを表す一意の識別子、これは OpenAI が不正行為を監視して検出するのに役立ちます。Learn more.
編集領域の設定
編集は画像のどの部分を再生成するか指定する「マスク」が必要です。アルファ 0 (透明) のピクセルがすべて再生成されます。以下のコードは下半分が透明な 1024×1024 マスクを作成します。
# create a mask
width = 1024
height = 1024
mask = Image.new("RGBA", (width, height), (0, 0, 0, 1)) # create an opaque image mask
# set the bottom half to be transparent
for x in range(width):
for y in range(height // 2, height): # only loop over the bottom half of the mask
# set alpha (A) to zero to turn pixel transparent
alpha = 0
mask.putpixel((x, y), (0, 0, 0, alpha))
# save the mask
mask_name = "bottom_half_mask.png"
mask_filepath = os.path.join(image_dir, mask_name)
mask.save(mask_filepath)
編集の実行
次に画像、キャプションとマスクを API に供給して画像への編集の 5 サンプルを取得します。
# edit an image
# call the OpenAI API
edit_response = openai.Image.create_edit(
image=open(generated_image_filepath, "rb"), # from the generation section
mask=open(mask_filepath, "rb"), # from right above
prompt=prompt, # from the generation section
n=1,
size="1024x1024",
response_format="url",
)
# print response
print(edit_response)
{ "created": 1667611683, "data": [ { "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-l89177bnhkme4a44292n5r3j/user-dS3DiwfhpogyYlat6i42W0QF/img-F5XQFFBLrN7LdXuG5CkQJpxr.png?st=2022-11-05T00%3A28%3A03Z&se=2022-11-05T02%3A28%3A03Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-11-04T02%3A06%3A29Z&ske=2022-11-05T02%3A06%3A29Z&sks=b&skv=2021-08-06&sig=2UhH%2BkKdvDVoRcgWJhmNFVzpvLzBAZpnA/tU80Zc8M0%3D" } ] }
# save the image
edited_image_name = "edited_image.png" # any name you like; the filetype should be .png
edited_image_filepath = os.path.join(image_dir, edited_image_name)
edited_image_url = edit_response["data"][0]["url"] # extract image URL from response
edited_image = requests.get(edited_image_url).content # download the image
with open(edited_image_filepath, "wb") as image_file:
image_file.write(edited_image) # write the image to the file
# print the original image
print(generated_image_filepath)
display(Image.open(generated_image_filepath))
# print edited image
print(edited_image_filepath)
display(Image.open(edited_image_filepath))
./images/generated_image.png
./images/edited_image.png
以上