見出し画像

Open AI「GPT-4 Turbo with Vision」使ってみた

概要

GPT-4 Turbo with Visionとは

GPT-4 Turbo with Vision は、OpenAI によって開発された
大規模マルチモーダル モデル (LMM) であり、
画像を分析し、それらに関する質問に対するテキスト応答を提供できます。
自然言語処理とビジュアル解釈の両方が組み込まれています。
GPT-4 Turbo with Vision モデルでは、画像に
何が存在するかに関する一般的な質問に回答します。
--
 引用:
GPT-4 Turbo with Vision モデルを使用する方法 - Azure OpenAI Service | Microsoft Learn

今回は、PythonでGPT-4 Turbo with VisionのAPI(gpt-4-vision-preview)を
使用して、テキストを取得していきます。
ただ使うだけではつまらないので、APIに画像と一緒に送るプロンプトを
工夫することで、出力がどのように変化するのかまとめていきます。

テーマ決め


最終的に情報の粒度や出力を一定にして出力テキストを
プログラムで加工しやすい形にしたいため、テーマを絞ってから進めます

使用画像

「いらすとや」さんの画像を使用してどんなテーマにしたら面白そうな出力が得られそうか試してみます。

東京タワー
具合が悪そうな人
桶に入った寿司

初期プロンプト

まずは簡素なプロンプトでテキストで特徴を出力してもらいます。
使用プロンプト: 
  画像の特徴を箇条書きで出力してください。

出力テキスト

東京タワーのイラスト

- エッフェル塔を模したイラスト
- 赤と白の色で構成されている
- 幾何学模様が含まれている
- シンプルなデザイン
- 塔の上部にはアンテナのような構造がある
- 三角形の形状が基調となっている
- 白い部分は塔の展望台を表している可能性がある
- 背景は透明または白色

具合が悪そうな人のイラスト

- アニメーションスタイルのキャラクター
- キャラクターはマスクをしている
- キャラクターは病気や不調を示している表情をしている
- キャラクターは青い服を着ている
- 白い枕に寄りかかっている
- 背景は白く、シンプル
- キャラクターの髪は黒く、乱れているように見える
- キャラクターの手が一つ前に出ていて、不快感を示しているかのように見える

桶に入った寿司のイラスト

- 寿司のイラスト
- 丸い皿に盛られた様々なネタの寿司
- 寿司ネタにはマグロ、サーモン、いくらなどが見られる
- 皿の縁には花の模様が描かれている
- 色彩は鮮やかで、食欲をそそる配色
- 寿司の上には緑色の葉(しその葉かもしれない)が挟まれている
- イラストのスタイルはシンプルでカートゥーン風

寿司の出力が、ネタ、個数、種類数、薬味等の付属品、皿の色・模様 など、様々な要素を出力してくれそうなので、テーマは「握り寿司」でいきたいと思います。

出力目標

出力してほしい情報

  • ネタの種類
    まぐろ、サーモン、いくら等ネタの種類の列挙
    それぞれの個数
    合計数

  • その他のおかずや付属物
    ワサビ、つま、卵焼き、ガリ、しそ等の付属物の列挙
    それぞれの配置


  • 何に盛り付けられているか
    色や模様

出力フォーマット

  • JSON形式

出力してほしい情報をjson形式で出力することを目標に進めていきます。

また、目標とは別に、エビ・いくら・まぐろ等、一般的にわかりやすそうなネタの個数、お寿司の合計個数、付属物の正解率、イラストを使用した場合と写真を使用した場合の差は何かあるかも併せてみていきます。

使用する画像

寿司下駄に乗った寿司
桶に入った寿司
白皿に乗った寿司
白い花柄の入った茶色い皿に乗った寿司

出力される情報の改善

目的


目標で上げたような情報を出力させる

使用プロンプト

これは握り寿司の画像です。
画像から読み取れる以下の情報を出力してください。

1. ネタの種類とその個数を列挙
2. 寿司の個数の合計
3. ガリ、ワサビ、厚焼き玉子などの付属物が存在している場合はその名前と配置を列挙
4. 盛り付けられている皿の種類、色、装飾に関する情報

ただし、以下の点に注意してください 
1. 画像から読み取れる情報のみを出力すること
2. 抽象的な表現は使わず、具体的な表現、具体的な数値のみを出力すること
3. 指定された情報以外のテキストは出力しないこと
4. 認識、確認できなかった項目は何も出力しないこと
(存在しない旨も出力しない)

出力テキスト

(正解)などは筆者が追加したメモ

寿司下駄に乗った寿司

1. ネタの種類とその個数: 
   - いくら(鮭の卵): 1個 (正解) 
   - たまご(厚焼き玉子): 1個 
   - まぐろ(赤身): 2個 (正解) 
   - いか(烏賊): 1個 
   - サーモン: 2個 
   - えび(海老): 1個 (正解) 
   - かっぱ巻き(きゅうりの巻物): 2個 
   - 鉄火巻き(まぐろの巻物): 2個 
   - ねぎとろ巻き(まぐろとネギの巻物): 2個
2. 寿司の個数の合計: 12個 (正解)
3. 付属物: 見当たらない (不正解)
4. 皿の種類、色、装飾: 木製の寿司皿、茶色、装飾は特に見当たらない

桶に入った寿司

1. ネタの種類とその個数: 
   - エビ: 2個 (正解) 
   - マグロ: 2個 (不正解) 
   - サーモン: 2個 
   - イクラ: 1個 (不正解) 
   - ウニ: 1個 
   - 白身魚: 2個 
   - 玉子焼き: 1個 
   - その他見分けがつかないネタ: 3個
2. 寿司の個数の合計: 14個 (不正解)
3. 付属物: 認識できません。(不正解)
4. 皿の種類、色、装飾: 皿は黒色で、金色の花模様が装飾されています。

白皿に乗った寿司

1. ネタの種類とその個数: 
   - マグロ: 2個 
      (別のものをマグロと勘違いしているだけなのでとりあえず正解) 
   - タイ: 2個 
   - サーモン: 1個 
   - イカ: 1個 
   - エビ: 1個 (正解) 
   - いくら(魚卵): 1個 (正解) 
2. 寿司の個数の合計: 8個 (正解)
3. 付属物:
  - ガリ(しょうがの甘酢漬け): 1箇所に配置 (正解)
4. 皿の情報: 白色の正方形の皿、金色の縁飾り

白の花柄の入った茶色いに乗った寿司

1. ネタの種類とその個数: 
   - マグロ: 1個 (正解) 
   - イカ: 1個 
   - エビ: 1個 (正解) 
   - タイ: 1個 
   - ほたて: 1個 
(いくら0で正解) 
2. 寿司の個数の合計: 5個 (不正解) 
(付属0で不正解) 
3. 皿の種類、色、装飾: 
   - 皿は茶色で、表面には花のような模様が装飾されています。

正解率

寿司下駄に乗った寿司のイラスト: 80%
桶に入った寿司のイラスト: 30%
白皿に乗った寿司の写真: 100%
白の花柄の入った茶色いに乗った寿司の写真: 60%

考察

全て正解することはできていないですが、
ある程度ほしい情報を出力してくれていますね。
イラストと画像とで若干写真の方が正解率がよさそうですが、
そこまで精度に差はないようにも感じます。

今回の目的は、完全に正解させることではないので次の目標である、
jsonフォーマットへの統一を進めていきます。

出力テキストのフォーマットの統一

目的

出力テキストのフォーマットをjson形式で統一する

使用プロンプト

これは握り寿司の画像です。 
画像から読み取れる以下の情報を出力してください。 
1. ネタの種類とその個数を列挙 
2. 寿司の個数の合計 
3. ガリ、ワサビ、厚焼き玉子などの付属物が存在している場合はその名前と配置を列挙 
4. 盛り付けられている皿の種類、色、装飾に関する情報 

フォーマットは以下のjson形式で出力してください 
```json
{
  'ネタ': { 
    'ネタの種類': 個数, 
    …
  },
'寿司の合計': 実際の個数,
'付属物': {
    '付属物の名称': '位置関係',
    ...
  },
  '皿': ['皿の種類', '色', '装飾などを個別に列挙', ...]
}
```
ただし、以下の点に注意してください
1. 画像から読み取れる情報のみを出力すること
2. 抽象的な表現は使わず、具体的な表現、具体的な数値のみを出力すること
3. 指定された情報/フォーマット以外のテキストは出力しないこと
4. 認識、確認できなかった項目は何も出力しないこと
(存在しない、確認できない等も出力しない)

出力テキスト

寿司下駄に乗った寿司のイラスト

```json
{
  ""ネタ"": {
    ""いくら"": 1,(正解)
    ""玉子焼き"": 1,
    ""サーモン"": 2,
    ""マグロ"": 2,(正解)
    ""白身魚"": 1,
    ""エビ"": 1,(正解)
    ""ホタテ"": 1,
    ""ウニ"": 1,
    ""ネギトロ巻き"": 1
  },
  ""寿司の合計"": 11,(不正解)
  ""付属物"": {},(不正解)
  """": [""木製の皿"", ""茶色""]
}		
```		

桶に入った寿司のイラスト


```json		
{		
  ""ネタ"": {		
    ""エビ"": 2,(正解)
	""イクラ"": 1,(不正解)
	""ウニ"": 1,
	""サーモン"": 2,
	""マグロ"": 2,(不正解)
	""白身魚"": 2,
	""煮穴子"": 1,
	""玉子焼き"": 1
  },		
  ""寿司の合計"": 12,(不正解)
  ""付属物"": {},(不正解)
  """": [""丸皿"", """", ""花模様""]		
}		
```

白皿に乗った寿司の写真

```json		
{
  ""ネタ"": {
    ""マグロ"": 1,(正解)
	""イカ"": 2,
	""サーモン"": 1,
	""ホタテ"": 1,
	""エビ"": 1,(正解)
	""イクラ"": 1(正解)
  },
  ""寿司の合計"": 9,(不正解)
  ""付属物"": {
	""ガリ"": ""寿司の右側""(正解)
  },		
  """": [""四角形"", """", ""金色の縁取り""]		
}		
```

白の花柄の入った茶色いに乗った寿司皿

```json	
{
  ""ネタ"": {
    ""マグロ"": 1,(正解)
    ""イカ"": 1,
    ""エビ"": 1,(正解)
    ""タイ"": 1,
    ""ハマチ"": 1
    (いくら0で正解)
  },
  ""寿司の合計"": 5,(不正解)
  ""付属物"": {
    ""シソの葉"": ""寿司の下に敷かれている""(正解)
  },
  """": [""焼き物の皿"", ""茶色"", ""花の模様""]
}
```

正解率

寿司下駄に乗った寿司のイラスト: 60%
桶に入った寿司のイラスト: 30%
白皿に乗った寿司の写真: 80%
白の花柄の入った茶色いに乗った寿司の写真: 80%

考察

フォーマットは加工すれば使えそうな程度のjson形式で統一出来ました。
このフォーマットで統一するようにしてから気づきましたが、イラストの
寿司より写真の寿司方が、付属物の認識精度が高いように感じます。

まとめ

プロンプトを段階的に工夫することで、統一された粒度・フォーマットで、統一されたの出力を実現できることがわかりました。
また、写真を使用した場合と、イラストを使用した場合とで寿司のネタの
正解率は、若干写真の方が高そうですが、ガリやなどの付属物に関しては
違いが出やすいことがわかりました。
皿の色や装飾に関する情報はいい具合に出力されましたが、寿司桶や寿司下駄といった皿の名称まで言及できなかった点が少し残念に感じますね。

最後に

最後まで読んで頂き誠にありがとうございました。
今回の記事が皆さんの理解や学習にお役立ていただけたら幸いです。
新しいトピックやリクエストがあれば、ぜひコメントを頂けると
嬉しく思います。
今後も役立つような技術ブログを公開していけたらと思いますので、
フォローしていただけると幸いです。