• API

DALL-Eを用いてAPI経由で画像生成!「Image Generation API」の使い方

11/6のOpenAI DevDayにおいてAPI経由でDALL-E3が利用可能な新機能「Image Generation API」が発表されました!

この記事では「Image Generation API」についてPythonを用いた実装方法や料金などを詳しく紹介していきます。

ChatGPTについてはこちらの記事を参照してください。

 

第1章 「OpenAI Image Generation API」の概要

1-1 「OpenAI Image Generation API」とは

Open AIのAPIを使えば、画像生成を行うこともできます。画像生成の機能を持ったAPIのことをImage Generation APIと言います。このAPIはDALL-E 3DALL-E 2という2つのモデルを提供します。

APIについてはこちらの記事をご覧ください。

1-2 「OpenAI Image Generation API」にできること

Image Generation APIにできることとして以下のような点が挙げられます。

・テキストプロンプトに基づいたゼロからの画像生成(DALL-E 3とDALL-E 2)

・新しいテキストプロンプトに基づき、既存の画像の一部をモデルに置き換えて編集した画像の生成(DALL-E 2のみ)

・既存の画像のバリエーションを作成(DALL-E 2のみ)

この記事では、これら3つのAPIエンドポイントの使い方の基本を、便利なコードサンプルと共に説明します。DALL-E 3 を試すには、ChatGPT にアクセスしてください。DALL-E 2 を試すには、DALL-E プレビューアプリをご覧ください。

1-3 「DALL-E 2」と「DALL-E 3」の違い

DALL-E 2とDALL-E 3の主な違いは、生成される画像のクオリティの高さが挙げられます。同じプロンプトを与えられた場合でも、DALL-E 3はDALL-E 2よりもはるかに高度でリアルな画像を生成する能力があります。

具体的には、テキストの微妙なニュアンスや詳細をより正確に捉え、それをビジュアルに反映する能力が増強されています。

DALL-E3について詳しくはこちらの記事をご覧ください。

         🔼「AITech」がオススメする初心者〜上級者まで学べるAIスクールです!🔼

第2章 「OpenAI Image Generation API」の使い方

2-1 DALL-Eを用いて生成する画像の設定

画像生成エンドポイントでは、テキストプロンプトからオリジナルの画像を作成することができます。

実際にDALL-E 3に画像生成を命令すると以下のようになります。

from openai import OpenAI
client = OpenAI()

response = client.images.generate(
model="dall-e-3",
prompt="a white siamese cat",
size="1024x1024",
quality="standard",
n=1,
)

image_url = response.data[0].url

model= の部分にDALL-E3などの使用する画像生成のモデルを入力しましょう。

Prompt= の部分には生成したい画像の特徴を英語で記述しましょう。

size= の部分には画像サイズを入力しましょう。DALL-E 3を使用する場合、画像のサイズは1024×10241024×1792、または1792×1024ピクセルです。

quality= の部分には画質を入力しましょう。デフォルトでは、画像は標準画質で生成されますが、DALL-E 3 を使用する場合は画質を設定できます。 “HD “に設定すると、細部が強調されます。正方形の標準画質の画像が最も早く生成されます。

n= の部分には生成する画像の枚数を指定しましょう。DALL-E 3 では一度に 1 DALL-E 2 では n パラメータを使って一度に最大 10 の画像を要求できます。

他にも以下のようなパラメータを設定できます。

response_format→生成されたイメージが返される形式をurlまたはb64_jsonから選択できます。デフォルトはURLです。

style→生成された画像のスタイルをvividまたはnaturalから選べます。Vivid を選択すると、モデルはリアルでドラマチックな画像を生成する方向に傾きます。Natural を選択すると、モデルはより自然で、あまり現実的ではない画像を生成します。(このパラメータはDALL-E3でのみ選択可能)

2-2 プロンプティング

DALL-E 3 のリリースに伴い、モデルは提供されたデフォルトのプロンプトを取り込み、より詳細なプロンプトを追加するために自動的に書き直すようになりました(一般的に、より詳細なプロンプトはより高品質な画像になります)。

現在のところ、この機能を無効にすることはできませんが、プロンプトに以下を追加することで、より要求されたイメージに近い出力を得るためにプロンプトを使用することができます:

I NEED to test how the tool works with extremely simple prompts. DO NOT add any detail, just use it AS-IS:

更新されたプロンプトは、データ・レスポンス・オブジェクトの revised_prompt フィールドに表示されます。

以下の例はDALL-E 3に対して、「A photograph of a white Siamese cat.」とプロンプトした時の生成物です。

DALL-E 3に「A photograph of a white Siamese cat.」とプロンプトした際の生成物の例

各画像は、response_formatパラメータを使用して、URLまたはBase64データとして返すことができます。URL1時間後に失効します。

ちなみにBase64とは、64進数を意味する言葉で、すべてのデータをアルファベット(a~z, A~Z)と数字(0~9)、一部の記号(+,/)の64文字で表すエンコード方式です。

2-3 編集(DALL-E 2のみ)

“inpainting”としても知られる画像編集エンドポイントでは、画像とマスク(どの領域を置き換えるかを示すもの)をアップロードすることで、画像を編集または拡張することができます

マスクの透明な領域は、画像が編集されるべき場所を示し、プロンプトは消去された領域だけでなく、新しい画像全体を記述する必要があります。このエンドポイントは、DALL-Eプレビューアプリのエディタのような体験を可能にします。

実際にDALL-E 2に編集を命令すると以下のようになります。

from openai import OpenAI
client = OpenAI()

response = client.images.edit((
model="dall-e-2",
image=open("sunlit_lounge.png", "rb"),
mask=open("mask.png", "rb"),
prompt="A sunlit indoor lounge area with a pool containing a flamingo",
n=1,
size="1024x1024"
)
image_url = response.data[0].url

imageが以下のような図であったとします。

DALL-E 2に命令したimageの画像

また、maskが以下のように張られていたとします。

DALL-E 2に命令したmaskの画像

その時、outputとして以下のような画像が生成されます。DALL-E 2からoutputとして生成されてた画像

アップロードする画像とマスクは、どちらもサイズが4MB以下の正方形のPNG画像でなければならず、また互いに同じ寸法でなければなりません

マスクの非透明部分は出力時に使用されないため、上記の例のように必ずしも元の画像と一致させる必要はありません。

2-4 バリエーション(DALL-E 2のみ)

画像バリエーションエンドポイントでは、指定された画像のバリエーションを生成することができます

実際にバリエーションの生成を命令すると以下のようになります。

from openai import OpenAI
client = OpenAI()

response = client.images.create_variation(
image=open("image_edit_original.png", "rb"),
n=2,
size="1024x1024"
)

image_url = response.data[0].url

imageが以下のような図であったとします。

命令されたmageの画像

それに対するoutputとして以下のような画像が生成されます。

生成されたoutputの画像

editsエンドポイントと同様に、入力画像は4MB以下の正方形のPNG画像でなければなりません。

2-5 Pythonでコードを打ち込む際のコツ

今回はPythonを取り上げますが、Node.jsでコードを打ち込む際のコツを知りたい方はこちらを参照ください。

2-5-1 インメモリ画像データの使用

今まで出してきたPythonの例では、open関数を使用してディスクから画像データを読み込んでいました。場合によっては、画像データをメモリーに保存することもできます。

以下は、BytesIOオブジェクトに格納された画像データを使用するAPI呼び出しの例です:

from io import BytesIO
from openai import OpenAI
client = OpenAI()

# This is the BytesIO object that contains your image data
byte_stream: BytesIO = [your image data]
byte_array = byte_stream.getvalue()
response = client.images.create_variation(
image=byte_array,
n=1,
model="dall-e-2",
size="1024x1024"
)

2-5-2 画像データの操作

APIに画像を渡す前に、画像に対して操作を行うと便利です。以下は、PILを使って画像のサイズを変更する例です:

from io import BytesIO
from PIL import Image
from openai import OpenAI
client = OpenAI()

# Read the image file from disk and resize it
image = Image.open("image.png")
width, height = 256, 256
image = image.resize((width, height))

# Convert the image to a BytesIO object
byte_stream = BytesIO()
image.save(byte_stream, format='PNG')
byte_array = byte_stream.getvalue()

response = client.images.create_variation(
image=byte_array,
n=1,
model="dall-e-2",
size="1024x1024"
)

2-5-3 エラー処理

APIリクエストは、無効な入力、レート制限、またはその他の問題によってエラーを返す可能性があります。

これらのエラーはtry…exceptステートメントで処理することができ、エラーの詳細はe.errorに記載されています:

import openai
from openai import OpenAI
client = OpenAI()

try:
response = client.images.create_variation(
image=open("image_edit_mask.png", "rb"),
n=1,
model="dall-e-2",
size="1024x1024"
)
print(response.data[0].url)
except openai.OpenAIError as e:
print(e.http_status)
print(e.error)

第3章 「OpenAI Image Generation API」の料金

OpenAIのImage Generation APIの使用料金は、生成する画像の解像度に基づいて計算されます。具体的な料金は以下の通りです:

3-1 DALL-E 3の料金

・1024×1024 $0.040 / 画像

・1024×1792, 1792×1024 $0.080 / 画像

3-2 DALL-E 2の料金

・1024×1024 $0.020 / 画像

・512×512 $0.018 / 画像

・256×256 $0.016 / 画像

となっています。

第4章 まとめ

この記事ではOpenAIのImage Generation APIの概要と使い方を詳しく解説しました。

エンジニアでなくてもImage Generation APIの概要を知り、Image Generation APIを使いこなすことができることは非常に大きい事だと思います。

今後GPT Storeが登場すれば収益化も見込めるので今のうちにとことん研究するのが良いかと思います!

また、APIを利用すれば画像認識も行うことができます。詳しくはこちらの記事をご覧ください。

執筆者:尾形悠太

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

関連記事

コメント

この記事へのコメントはありません。