GPT4 turbo with visionでパワポの抽象的な画像の理解ができるかどうか

# 概要
仕事や勉強で、抽象的な画像がいっぱい出てくると思います。（例えば、時系列関係や因果関係を矢印等を使って、解説するための図など。）

既存の画像認識技術では、こういった抽象的な画像を理解することは不得手でした。
写真に写っている猫や人物、障害物を認識するなどは得意でも、矢印と矢印で結ばれている時系列関係を表した抽象的な画像の解釈は苦手です。

今回は、2023年11月に発表された、『GPT4 turbo with Vision』を使って、抽象的な画像の理解ができるのかどうかを実験したので、その内容を共有します。

**結論から言えば、できそうです。**


**【記事の構成】**
- ①試してみた結果
- ②作成したプグラム
- ③今後、検証すべきこと
- まとめ


# ①試してみた結果

戦略とはどういうものかを説明するための、画像を使ってみました。結果はしっかりと解説してもらうことができました。

下に記載していますが、プロンプトも難しいことはせずに単純なものでもかなり正確に理解して、説明することができました。

▼読み込ませた画像
![ppt_image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687015/285a45a7-02e5-b927-80d0-1c07d125d9f5.png)

▼結果
```plaintext
画像には、経営戦略のコンポーネントを示す図が描かれています。この図には、二つの丸い図形と一つの長方形の図形があります。丸い図形には「現状」と「目標」の二つの文字が書かれており、これは企業の現在の状態と達成したい将来の状態を意味しています。両者の間に矢印があり、これは企業が現状から目標に向かって移行する過程を意味しています。

一方、長方形の図形には「施策」と書かれており、これは目標達成のために実施する具体的な行動計画や戦略を指しています。施策から現状と目標を結ぶ黄色の矢印があり、これは施策が現状と目標の間をつなぐ重要な役割を果たしていることを示しています。

総合すると、この図は企業がどのように戦略的な計画を立て、現在の状態から望ましい将来の状態に移行するかのプロセスを図式化したものです。現状を正確に理解し、目標を明確に設定した上で、それを達成するための具体的な施策を策定して実行していくことが重要とされています。

```

▼与えたプロンプト
```plaintext
経営戦略について解説した画像です。これの意味を分かりやすく解説してください。

```

# ②作成したプログラム

[全文はGithubへアップロードしています。](https://github.com/KENTAROSZK/gpt4turbo_captioning)

## ライブラリのインポート
```python
import base64
import requests

```

## API キーの設定
```python
# 定数定義

# OpenAI API Key
API_KEY = "sk-" # 自分のOpenAI API キーを入れてください。

```

## 画像をGPT4turboで読み込ませるために変換させる関数

GPT 4 turbo with Visionでは、2つの方法で画像をインプットさせることができます。

- ① 画像を保存しているURLをインプットする
- ② エンコード（変換）した画像をインプットする

今回は、②の方法で画像をインプットさせています。


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

```

## GPT 4 turbo with Visionをコールして、画像の解釈をさせる

OpenAI APIを呼び出す場合、GPT 4 turbo with Vision以外のモデルでは、OpenAI社が提供している ```openai```というライブラリを使ってChatGPTを利用できますが、画像を扱う、GPT 4 Turbo with Visionだけは、ライブラリでは利用することができないため、APIを直接呼び出す形で利用するしかありません（24年1月時点）。

そのため、```requests```というライブラリを使ってOpenAI社が用意しているAPIに直接画像とプロンプトをインプットしています。


```python

def call_gpt(image_path: str):
    # 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-4-vision-preview",
    "messages": [
        {
        "role": "user",
        "content": [
            {
            "type": "text",
            "text": "経営戦略について解説した画像です。これの意味を分かりやすく解説してください。"
            },
            {
            "type": "image_url",
            "image_url": {
                "url": f"data:image/jpeg;base64,{base64_image}"
            }
            }
        ]
        }
    ],
    "max_tokens": 1500
    ,"seed" : 42
    }

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

    return response

```

## 動かす

↑のところまでで定義した関数を使って、実際に画像を読み込ませてみます。

```python
# 画像を保存しているパスを指定してください
image_path = "./ppt_image1.png"

# GPT4 turbo with Visionを呼び出します。
response = call_gpt(image_path)

# responseの中からGPTの回答（プロンプトに対するGPTの回答）部分だけを抽出します
result = response.json()["choices"][0]["message"]["content"]

# 表示させます
print(result)

```


## 結果
↑でもすでに掲載していますが、コードを実行すると結果は次のような結果が返ってきます。
（※ChatGPTは、ランダムに回答を作り出すため、結果は異なることがあります）

```plaintext
画像には、経営戦略のコンポーネントを示す図が描かれています。この図には、二つの丸い図形と一つの長方形の図形があります。丸い図形には「現状」と「目標」の二つの文字が書かれており、これは企業の現在の状態と達成したい将来の状態を意味しています。両者の間に矢印があり、これは企業が現状から目標に向かって移行する過程を意味しています。

一方、長方形の図形には「施策」と書かれており、これは目標達成のために実施する具体的な行動計画や戦略を指しています。施策から現状と目標を結ぶ黄色の矢印があり、これは施策が現状と目標の間をつなぐ重要な役割を果たしていることを示しています。

総合すると、この図は企業がどのように戦略的な計画を立て、現在の状態から望ましい将来の状態に移行するかのプロセスを図式化したものです。現状を正確に理解し、目標を明確に設定した上で、それを達成するための具体的な施策を策定して実行していくことが重要とされています。

```

戦略について描かれていることと、その説明のためのオブジェクト（円とか四角、矢印）の関係性を理解し、説明できていることがわかります。


# ③今後、検証すべきこと
今回は比較的上手にGPT4 turbo with Visionが画像の意図を解釈してくれました。しかし、今回はたまたまGPT 4 turbo with Visionがうまく画像の解釈をしてくれただけの可能性があります。

そのため、実用に足るのかどうかを判断するために、次のような点を今後検証していく必要があると思います。

- ① GPT 4 Turbo with Visionが解釈を苦手とする画像があるのかどうか？（GPT4 Turbo with Visionが得意/苦手とする画像があるのかどうか、その傾向は見つけられるかどうか？）
- ② パワポでありがちな、タイトルやリード文と画像の組み合わせ、があったときにそれを正確に解釈することができるのか？



# まとめ
今回は、GPT4 Turbo with Visionを使って、パワポっぽい画像の解釈を試させてみました。結果は非常にうまくいったと思います。ただ、今回実験してみた画像は1個だけなので、本当にうまくいくのかを上記したように検証していく必要があると思います。