GPT4 Turbo with Vision で様々な画像データの分析

本記事は日本オラクルが運営する下記Meetupで発表予定の内容になります。発表までに今後、内容は予告なく変更される可能性があることをあらかじめご了承ください。

https://oracle-code-tokyo-dev.connpass.com/event/307174/

本記事は下記記事の補足記事となります。

https://qiita.com/ksonoda/items/28586434904c26ec465b



# GPT4 Turbo with Vision
OpenAIの新しいマルチモーダル大規模言語モデル GPT4-Vを様々な画像データとプロンプトで試してみる。マルチモーダルAIとしては、下図の通り、

- 入力：テキストデータ、画像データ
- 出力：テキストデータ

となるパターンで、使っているモデルはGPT4 Turbo with Vision(gpt-4-vision-preview)。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/62724605-e89f-6d29-d099-d7bd481caf01.png)



# 画像キャプション

入力画像：風景画
入力テキスト：画像の説明(画像データのキャプション)を求めるテキスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/a9638c48-1843-069f-2a4e-546dfabf9fda.png)

```python
from openai import OpenAI

# openai clientの定義
client = OpenAI()
response = client.chat.completions.create(
    # Muti-modal LLM を定義
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                # 入力プロンプトとなるテキストデータ
                {"type": "text", "text": "この画像には何が描かれていますか？"},
                {
                    "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,
)

```

出力結果：かなり正確に描写できていることが分かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/47004d31-0da1-1962-3dcc-3c9bfb8f6517.png)





# 著名な物体(絵画)の名称の特定

入力画像：著名な絵画
入力テキスト：絵画の名前を求めるテキスト


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/e3f108d5-aab4-2848-c529-bebfe756e34b.png)

```python
response7 = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この画像の絵画の名前はなんですか？"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://upload.wikimedia.org/wikipedia/commons/0/08/Leonardo_da_Vinci_%281452-1519%29_-_The_Last_Supper_%281495-1498%29.jpg",
                    },
                },
            ],
        }
    ],
    max_tokens=300,
)

print(response7.choices[0])
```

出力結果：問題なく正解。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/a68e5c58-ed71-290e-df68-39af509b69c8.png)









# 画像データ内の物体の位置を特定

入力画像：3DのCG画像
入力テキスト：指定の物体の位置を求めるテキスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/b51590f5-332f-fde9-40c5-4921bea75541.png)

```python
response = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "画像内の球体の配置と割り振られている番号を教えてください。"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://upload.wikimedia.org/wikipedia/commons/4/4d/SolidShapes.png",
                    },
                },
            ],
        }
    ],
    max_tokens=300,
)

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

出力結果：問題なく正解

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/03fabe6a-e28a-9ae9-23f6-41371f836988.png)







# 著名な物体の特定

入力画像：都市の画像
入力テキスト：画像内での物体(建物)の配置と、建物の名称の特定を求めるテキスト


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/cf2907c9-4c53-1d29-ed10-3c2dbfcbcecd.png)

```python
response = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この画像の中で一番高い建物の配置とその建物の名前を教えてください。"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://upload.wikimedia.org/wikipedia/commons/b/b2/Skyscrapers_Shinjuku_2007_rev.jpg",
                    },
                },
            ],
        }
    ],
    max_tokens=300,
)

print(response2.choices[0])
```

出力結果：正確に特定できていることが分かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/69f0ad7f-4479-b24e-5e21-696a2238a3fa.png)




























# Face Detection

入力画像：人物の集合写真
入力テキスト：画像内の顔認識と人数のカウントを求めるテキスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/d9ee79f6-02d1-0616-1f2a-1cb1e942afbf.png)

```python
response5 = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この画像には何人の人物が映っていますか？"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://upload.wikimedia.org/wikipedia/commons/f/f7/Fumio_Kishida_Cabinet_20211004.jpg",
                    },
                },
            ],
        }
    ],
    max_tokens=300,
)

print(response5.choices[0])
```

出力結果：問題なく正解

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/25d4b03f-e890-6017-a8b9-19377005fe36.png)








# 性別の特定

入力画像：人物の集合写真
入力テキスト：性別の識別と人数のカウントを求めるテキスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/d9ee79f6-02d1-0616-1f2a-1cb1e942afbf.png)


```python
response = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この画像に女性は何人いますか？"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://upload.wikimedia.org/wikipedia/commons/f/f7/Fumio_Kishida_Cabinet_20211004.jpg",
                    },
                },
            ],
        }
    ],
    max_tokens=300,
)

print(response6.choices[0])
```

出力結果：惜しいが、不正解。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/f0891557-2fcf-0a55-3fed-f97fc490ca74.png)








# 画像データ内の個人の特定

入力画像：著名人物の画像
入力テキスト：人物の特定を求めるテキスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/9283c196-9b33-ca52-69b5-02f02bd61c95.png)

```python
response4 = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この画像の人物は誰ですか？"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://upload.wikimedia.org/wikipedia/commons/6/6f/Fumio_Kishida_20211005.jpg",
                    },
                },
            ],
        }
    ],
    max_tokens=300,
)

print(response4.choices[0])

```

出力結果：仕様としてサポートしていない模様。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/c1f2c00e-7a6b-a551-6d05-ab7198141010.png)








# 画像データ内の物体の計算

入力画像：紙幣の画像
入力テキスト：画像内での物体の把握とそれに基づいた計算結果を求めるテキスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/02509ba8-6ff3-9830-5a9e-f04742074bdb.png)

```python
# 画像データに移っているものの計算

response3 = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この画像のお金は合計で幾らになりますか？"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://upload.wikimedia.org/wikipedia/commons/6/64/USDnotes.png",
                    },
                },
            ],
        }
    ],
    max_tokens=300,
)

print(response3.choices[0])
```

出力結果：問題なく正解

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/d25e8370-5d31-fdf3-a50c-85869e2206a7.png)









# 図と文章の問題の解法

入力画像：図と文章から構成される物理の問題
入力テキスト：問題の答えを求めるテキスト


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/ab9ece6e-f208-7a5e-516e-2f5a7e8fa887.png)



```python
response2 = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "画像の中の問題を解いてください。"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://camo.qiitausercontent.com/6dc0c520b307dea35ce543dee8856ddf213f8975/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3130393236302f65653665373536642d313661612d623638632d353730622d3661663533393861623062662e706e67",
                    },
                },
            ],
        }
    ],
    max_tokens=1000,
)

print(response2.choices[0])
```

出力結果：正解

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/6be95408-39fb-065e-9bce-964848e5a49c.png)


※出力では「v は \( \\sqrt{\\frac{k}{m}} d \) で与えられます。」となっており、これは下記の数式となり正解している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/ccd718f3-ae49-18c8-04aa-3e6af9eeecc0.png)



















# チャートの説明

入力画像：箱ひげ図の画像
入力テキスト：仮定の条件と、それに沿ったチャートの説明を求めるテキスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/19a8f1e1-a523-0a12-dfa6-117d5188ddf6.png)

```python
response8 = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この画像はワインの品質データを分析したボックスプロットです。この図を説明してください。"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://camo.qiitausercontent.com/e57f96c124065c58ec4059fb31aff4f8f423ec30/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3130393236302f66336534373662642d323135372d643031662d313062342d3230373165663666383666622e706e67",
                    },
                },
            ],
        }
    ],
    max_tokens=600,
)

print(response8.choices[0])
```


# チャートの分析

入力画像：箱ひげ図の画像
入力テキスト：仮定の条件と、機械学習の分類問題として解きやすいかどうかの説明を求めるテキスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/10bd50aa-e315-f4db-e28a-080e08df97fc.png)


```python
response8 = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この画像はワインの品質データを分析したボックスプロットです。この図から分類問題として解きやすいかどうかを説明してください。"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://camo.qiitausercontent.com/e57f96c124065c58ec4059fb31aff4f8f423ec30/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3130393236302f66336534373662642d323135372d643031662d313062342d3230373165663666383666622e706e67",
                    },
                },
            ],
        }
    ],
    max_tokens=600,
)

print(response8.choices[0])
```

出力結果：正確に判断されている。特に「best」は他の2つのカテゴリと被りがほとんどありません。これは「best」のワインを分類する際に高い精度が得られることを示唆しています。」というくだり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109260/2f62eabe-5b28-20e0-c963-6c3931082f97.png)




# text-to-speechによる音声出力

OpenAIのモデルtts-1(text-to-speech)を使ったテキストデータから音声データへの変換

```python
text = response.choices[0].message.content

response = client.audio.speech.create(
    model='tts-1',
    voice='alloy',
    input=text
)
response.stream_to_file('./speech.mp3')
```

# 大規模言語モデル関連のその他の記事

https://qiita.com/ksonoda/items/ba6d7b913fc744db3d79

https://qiita.com/ksonoda/items/b767cbd283e379303178

https://qiita.com/ksonoda/items/b9fd3e709aeae79629ff

https://qiita.com/ksonoda/items/6b06b789ac0d0d102598

https://qiita.com/ksonoda/items/60ccc2a4fde15906654a