見出し画像

ChatGPTとの連携を考えてみる③

はじめに

昨年11月のOpenAI DevDayにて、前回投稿したCode Interpriterも本家API(Assistant API)のみで利用できるようになるなど、ChatGPTの機能追加が連打されました。中でもGPT-4 with vision(以降「GPT-4V」)は、遂に画像の認識も可能となり、いよいよマルチモーダルの本領が表れたと言えます。

一方、後を追うように、Googleも12月にGemini(画像認識可)を発表し、熾烈な追い上げを見せています。LLaVa-1.5など、OSSのマルチモーダル大規模言語モデル(以降「MLLM」) の動向もあり、今年も生成AIを取り巻く状況は、複雑な様相を呈することになりそうです。

今回はGPT-4VとGemini Proの画像認識について、気になった点を試してみました。どちらも現時点ではプレビュー版のため、真価の程は定かではありませんし、私が恣意的に選択した画像やプロンプトを使用した上での雑感となりますのでご了承ください。また「画像」には個人情報や企業の機密情報が含まれやすいため、試される際には十分にご注意ください。

GPT-4V

以下のAPIドキュメントに利用方法や制限などの記載があります。GPT-4の全機能が利用できる訳ではなく、回答のJSON固定化などもまだできません。モデルは「gpt-4-vision-preview」となり、2023年4月までのデータで学習されています。

モデルの安全性に関しては、SystemCardのドキュメントに記載されています。プライバシーやセキュリティへの配慮から、応答が抑制される画像もあります。

以下のレポートでは、多岐にわたるタスクの例を紹介しています。

Gemini Pro

こちらも現時点はプレビュー版で、今のところ無料で利用できます。画像だけでなく動画も入力できます。近々リリース予定とされるGemini Ultraは、いくつかのベンチマークにおいてGPT-4を凌ぐ性能と言われています。

試した環境

GPT-4V

Google Colabにて「GPT-4V」のAPIを実行して確認しました。(OpenAIのPlayGroundはまだ対応されていませんでした)
モデルには「gpt-4-vision-preview」を指定し、画像(PNG)をBASE64文字列に変換してパラメータに指定しています。

Gemini Pro

Google AI StudioのPlayGroundを利用し、モデルには「Gemini Pro Vision」を指定しています。プレビュー版の段階では、レートリミットの制限や、入力データが学習に利用される可能性がある点に留意が必要です。

試したこと

両者の画像認識力については、すでに様々な記事で紹介されています。
一方で、GPT-4Vの以下の制限事項が気になりました。

Spatial reasoning: The model struggles with tasks requiring precise spatial localization, such as identifying chess positions.

空間推理:モデルは、チェスの位置を特定するなど、正確な空間的位置決めを要求するタスクに苦労しています。(ChatGPTの翻訳結果)

OpenAIのVision APIドキュメント Limitationsより
https://platform.openai.com/docs/guides/vision

画像中のオブジェクトの位置の特定に課題があるように読み取れます。
位置の特定が曖昧であるとすると、応答文の正確性にも影響しそうです。
また、画像のどの部分を基に応答をしたかの判断の根拠を示す意味でも、物体検出、レイアウト情報の抽出といったタスクや、今後期待されるGUIナビゲーションでの利用においても、位置の特定は重要であると考えます。

そこで、非常に単純な図形のみを配置した二次元の画像を使って、GPT-4VとGemini Proでオブジェクトの位置情報の取得を確認してみました。

入力画像①

画像に含まれる各オブジェクトの領域の位置情報(画像の絶対座標)をJSON形式で表してください。

プロンプト①

GPT-4Vは、このプロンプトに対して、以下のように「オブジェクトの正確な位置情報を提供することはできません。」と応答しました。

申し訳ありませんが、画像の絶対座標を提供する機能は利用できません。
私は画像の内容を説明することはできますが、 オブジェクトの正確な位置情報をJSON形式で提供することはできません。 もし画像の内容についての質問があれば、お手伝いできるかもしれませんので、どうぞお知らせください。

応答文①(GPT-4V)

一方でGemini Proは拒否することなく、オブジェクトの座標とサイズを返しました。

{
"rectangle": {"x": 100,"y": 100,"width": 200,"height": 50},
"circle": {"x": 300,"y": 200,"radius": 50},
"triangle": {"x": 100,"y": 200,"width": 100,"height": 100}
}

応答文①(Gemini Pro)

しかしながら、Gemini Proの応答文を基に、領域を赤枠でオーバーレイしてみると、オブジェクトの位置関係は漠然と掴んでいそうではあるものの、期待する結果ではありませんでした。

応答文①(Gemini Pro)のJSONを基に領域を赤枠でオーバーレイした画像

絶対座標の取得にGPT-4Vが拒否反応を示しているように思えたため、相対的な位置情報を取得するようにプロンプトを変更してみました。

画像に含まれる各オブジェクトの領域の位置情報をJSON形式で表してください。位置情報は[x1,y1,x2,y2]の座標で表されます。 x1とy1は領域の左上、x2とy2は右下を表します。画像全体の領域は[0,0,1,1]になります。値は0から1に正規化します。

プロンプト②

するとGPT-4Vも結果を返してくれるようになりました。

画像には3つの幾何学的形状が含まれています。
それぞれの形状の位置情報をJSON形式で以下に示します。
```json
{ "rectangle": [0.10416666666666667, 0.20618556701030927, 0.3541666666666667, 0.38144329896907214], "circle": [0.6666666666666666, 0.20618556701030927, 0.7916666666666666, 0.38144329896907214], "triangle": [0.375, 0.6391752577319587, 0.5208333333333334, 0.8144329896907216] }
```
各形状は、画像内の相対的な位置と大きさに基づいて正規化された座標で表されています。左上の座標が[x1, y1]、右下の座標が[x2, y2]です。

応答文②(GPT-4V)

位置情報もかなり近づいてきました。

応答文②(GPT-4V)のJSONを基に領域を赤枠でオーバーレイした画像

Gemini Proの位置情報も前回より改善されました。

{
"rectangle": [0.2,0.2,0.6,0.4],
"circle": [0.5,0.5,0.7,0.7],
"triangle": [0.3,0.6,0.5,0.8]
}

応答文②(Gemini Pro)
応答文②(Gemini Pro)のJSONを基に領域を赤枠でオーバーレイした画像

その後、プロンプトを調整したり(「あなたは位置情報の特定に関して卓越した専門知識を持つエキスパートです。」などを加えたり)、領域をマーキングしてヒントを与えてみたりもしましたが、正確な位置を捉えることはできませんでした。
もう少し複雑な画像でも確認してみました。

ダッシュボードの画像を入力した場合(GPT-4V)
右側はよい感じだが、左側は上部に寄っている
ダッシュボードの画像を入力した場合(Gemini Pro)
一見良好な結果にも見えるが、コンボボックスなど細部は捉えきれていない

プロンプトの調整などで改善の余地があるかもしれませんが、モデルの特性のようにも見受けられます。

現時点のGPT-4VとGemini Proですと、オブジェクトの位置情報取得にはMLLMを用いず、事前の画像解析によりオブジェクトを特定し、位置を把握しておき、画像内に番号などをマーキングしておくことで、MLLMには付番された領域の解釈のみを任せる方が賢明なのかもしれません。

入力画像の各領域に予め番号をマーキングしておく
マーキングのために画像解析を別途行っておく必要がある

{
"1": { "object": "date_picker","color": ["white", "gray"],"text": ["日付", "2022/08/18"]},
"2": { "object": "combo_box","color": ["white", "blue"],"text": ["状態", "全て"]},
"3": {"object": "combo_box","color": ["white", "blue"],"text": ["種類", "全て"]},
"4": { "object": "search_field","color": ["white"],"text": ["ロット"]},
"5": { "object": "text_area","color": ["black", "orange"],"text": ["生産数", "620個"]},
"6": { "object": "text_area","color": ["black", "orange"],"text": ["サイクルタイム", "77.4 h"]},
"7": { "object": "text_area","color": ["black", "orange"],"text": ["可動率", "87.3%"]},
"8": {"object": "line_graph","color": ["blue", "red", "gray"],"text": ["生産数推移", "300", "245", "370", "485", "600", "620"]},
"9": { "object": "gantt_chart","color": ["blue", "pink", "gray", "black"],
"text": ["2022/08", "18日 (木)", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "日程未定", "日程確定"]},
"10": { "object": "bar_graph","color": ["red", "green", "gray"],"text": ["停止 (分)", "稼働", "稼働/停止比", "稼働/稼働オフライン", "稼働/直接稼働", "140", "100", "95", "40", "16"]}
}

GPT-4Vの応答結果のJSON(ナンバリングされた箇所の領域の情報を抽出)

特に明確な指示を出さずとも、各領域の情報がある程度抽出されている
事前の画像解析によって得られた「番号」とマッピングして抽出情報と紐付けることが可能

このようなアプローチには、「Visual Referring Prompting」や「Set-of-Mark(SoM)」のような手法があり、入力画像の「意味のある領域」を事前にマーキングすることで、応答精度を向上させることができるようです。

上のレポートで示されたSoMの例
右側の画像のように番号をマーキングすることで応答の精度が高くなっている

おわりに

両者ともに、現時点では画像中のオブジェクトの位置の特定には課題があるようでした。正式版で改善されるのでしょうか。
以下のベンチマークの結果を見ると、様々なMLLMが、独自の強みを持っており、位置の特定に強いモデルもあるようですので、今後試してみたいです。

上のレポートで示された各種MLLMのベンチマーク
やはり「Position」に関してGPT-4Vの成績は良くない


この記事が気に入ったらサポートをしてみませんか?