📝

GPT-4o/DALL·E 3 APIで画像を統合する方法を探る

2024/07/02に公開1

やること

前回の続きです。
前回は、GPT-4o API を経由してDALL·E 3で画像を生成しました。
今回は、複数の画像を入力し、それらの画像の説明を出力してからDALL·E 3で画像を統合する作業を行います。

流れ

GPT-4o API に複数の画像を送信し、その画像の説明を取得します。その説明をDALL·E 3に送信し、画像の統合を行います。

https://zenn.dev/headwaters/articles/4b7554dc743196

前提

  • Azure Open AI ServiceにDalle-E 3およびGPT-4oがデプロイ済みであること
  • python:3.10.12
  • openai:1.30.3
  • 今回以下の画像2枚をinputする。
    画像名:test00.png,test01.pngとする

手順

  1. 以下のコードを実行する
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}")

  1. 出力された画像を確認する
ログ

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

  1. 何度か実行してみる
    かっこいい

    ↑と系統が似ている

    雰囲気が変わった

まとめ

GPT-4oPIに複数の画像を送信し、画像の説明を取得しました。その説明をDALL·E 3に送信し、画像の統合を行いました。
入力が画像の情報であるため、厳密に言えば統合とは異なるかもしれませんが、発想の転換には良さそうです。

ヘッドウォータース

Discussion