GPT-4o/DALL·E 3 APIで画像を統合する方法を探る
やること
前回の続きです。
前回は、GPT-4o API を経由してDALL·E 3で画像を生成しました。
今回は、複数の画像を入力し、それらの画像の説明を出力してからDALL·E 3で画像を統合する作業を行います。
流れ
GPT-4o API に複数の画像を送信し、その画像の説明を取得します。その説明をDALL·E 3に送信し、画像の統合を行います。
前提
- Azure Open AI ServiceにDalle-E 3およびGPT-4oがデプロイ済みであること
- python:3.10.12
- openai:1.30.3
- 今回以下の画像2枚をinputする。
画像名:test00.png,test01.pngとする
手順
- 以下のコードを実行する
import openai
import base64
import os
import requests
import json
from openai import AzureOpenAI
client = AzureOpenAI(
api_version="2023-05-15", # 固定
api_key="<key>",
azure_endpoint="<endpoint>"
)
# Open the image file and encode it as a base64 string
def encode_image(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode("utf-8")
image_paths = ["./test00.png", "./test01.png"] # ファイルパスをリストにする
base64_images = [encode_image(image_path) for image_path in image_paths]
image_descriptions = []
# Get descriptions for each image
for base64_image in base64_images:
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": [
{"type": "text", "text": "Describe this image:"},
{"type": "image_url", "image_url": {
"url": f"data:image/png;base64,{base64_image}"}
}
]}
],
temperature=0.0,
)
gpt_response = response.choices[0].message.content
image_descriptions.append(gpt_response)
print("Image descriptions:", image_descriptions)
# Combine the descriptions into a single prompt
combined_descriptions = "以下の画像の説明を元に画像を統合してください。" + " ".join(image_descriptions)
# Use the combined descriptions to generate an image with DALL-E 3
dalle_client = AzureOpenAI(
api_version="2024-02-01", # 固定
api_key="<key>",
azure_endpoint="<endpoint>"
)
result = dalle_client.images.generate(
model="Dalle3",
prompt=f"あなたは、デザイナーです。{combined_descriptions}",
n=1
)
json_response = json.loads(result.model_dump_json())
image_url = json_response["data"][0]["url"]
generated_image = requests.get(image_url).content
# 画像を保存するディレクトリを設定
image_dir = os.path.join(os.curdir, 'images')
# ディレクトリが存在しない場合、作成する
if not os.path.isdir(image_dir):
os.mkdir(image_dir)
# 生成された画像を保存
image_path = os.path.join(image_dir, 'generated_image.png')
with open(image_path, "wb") as image_file:
image_file.write(generated_image)
print(f"Image saved to {image_path}")
- 出力された画像を確認する
ログ
Image descriptions: ['The image is a logo featuring a stylized design. It consists of a circular shape with swirling blue elements that form a vortex-like pattern. Inside the blue swirl, there is a yellow sphere. Below the circular design, the word "Headwaters" is written, with the letter "H" in orange and the rest of the letters in gray. The overall design gives a dynamic and fluid impression, possibly representing water or movement.', 'The image shows a humanoid robot with a white exterior. The background includes a wooden wall and some green foliage, suggesting an indoor setting. The robot has a sleek, modern design with smooth surfaces and appears to be part of a technological or futuristic environment.']
Image saved to .\images\generated_image.png
- 何度か実行してみる
かっこいい
↑と系統が似ている
雰囲気が変わった
まとめ
GPT-4oPIに複数の画像を送信し、画像の説明を取得しました。その説明をDALL·E 3に送信し、画像の統合を行いました。
入力が画像の情報であるため、厳密に言えば統合とは異なるかもしれませんが、発想の転換には良さそうです。
Discussion
メチャクチャかっこいいw