Open AI APIでローカルにある画像を入力する方法

# はじめに

Open AIのAPI経由でローカルにある画像を入力して何かしらレスポンスが欲しいときの方法を調べたので備忘録として残しておきます。

前提としてAPIキーは既に発行してあるとします。

https://platform.openai.com/docs/guides/vision

# 方法

- 1つの画像を入力する場合
- 複数画像を入力する場合

## 1つの画像を入力する場合

ローカルにある画像を入力する場合、base64にエンコードしてAPIに投げます。

```python:
import base64
import requests

# OpenAI API Key
api_key = "YOUR_OPENAI_API_KEY"

# Function to encode the image
def encode_image(image_path):
  with open(image_path, "rb") as image_file:
    return base64.b64encode(image_file.read()).decode('utf-8')

# Path to your image
image_path = "path_to_your_image.jpg"

# Getting the base64 string
base64_image = encode_image(image_path)

headers = {
  "Content-Type": "application/json",
  "Authorization": f"Bearer {api_key}"
}

payload = {
  "model": "gpt-4o",
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "What’s in this image?"
        },
        {
          "type": "image_url",
          "image_url": {
            "url": f"data:image/jpeg;base64,{base64_image}"
          }
        }
      ]
    }
  ],
  "max_tokens": 300
}

response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)

print(response.json())

```

## 複数画像を入力する場合

Chat Completions API は、base64 エンコード形式または画像 URL の両方で複数の画像入力を取り込んで処理することができます。

```python
from openai import OpenAI

client = OpenAI()
response = client.chat.completions.create(
  model="gpt-4o",
  messages=[
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "What are in these images? Is there any difference between them?",
        },
        {
          "type": "image_url",
          "image_url": {
            "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
          },
        },
        {
          "type": "image_url",
          "image_url": {
            "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
          },
        },
      ],
    }
  ],
  max_tokens=300,
)
print(response.choices[0])
```

# 解像度について

detailパラメータでlow、high、autoの3つのオプションを選択すると画像の処理が変わります。
- low : 低解像度モードを有効にします。モデルは画像の低解像度バージョン512px x 512pxを受け取り、85トークンの予算で画像を表現します。これにより、APIはより高速なレスポンスを返すことができ、高いディテールを必要としないユースケースではより少ない入力トークンを消費します。
- high : 高解像度モードを有効にし、まずモデルが低解像度の画像（85トークンを使用）を見てから、512px x 512pxのタイルごとに170トークンを使用して詳細なクロッピングを作成します。

```python
from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
  model="gpt-4o",
  messages=[
    {
      "role": "user",
      "content": [
        {"type": "text", "text": "What’s in this image?"},
        {
          "type": "image_url",
          "image_url": {
            "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
            "detail": "high"
          },
        },
      ],
    }
  ],
  max_tokens=300,
)

print(response.choices[0].message.content)
```