クラウド3社で使えるマルチモーダルモデルを試してみた（Claude 3 Sonnet/gpt4-v/Gemini Pro Vision）


# はじめに
先日、AnthropicよりClaude 3がリリースされ、その性能の高さが話題となっています。Amazon BedrockからもClaude 3 Sonnetが使えるようになり、これでクラウド3社（AWS/Azure/GCP）でマルチモーダルモデルが使えることになりました。
それぞれのモデルがどこまで出来るのか、特に画像からの情報読み取りについて、サンプルレベルで簡単に比較してみたので共有します。

入力の画像と指示文、それに対する各モデルの出力を記載しますので、
自分だったらこの画像と指示に対して何と答えるかな？と想像しながら見ても楽しいかもしれません。

# マルチモーダルモデルとは
ご存じの方はスキップして構いませんが、念のためマルチモーダルについても説明しておきます。
マルチモーダルモデルは複数の異なる種類のデータ(モダリティ)を同時に処理できる機械学習モデルのことです。
例として
- 画像とテキストの両方を入力として受け取り、テキストを生成するモデル
- 音声と映像の両方を入力として受け取り、キャプションを生成するモデル
- センサーデータと自然言語の両方を入力として受け取り、システムの制御を行うモデル

などがあげられます。
ここ1年でLLMが多くの自然言語タスクに活用され成果をあげてきましたが、マルチモーダルモデルの登場によって、適用できるタスクが大幅に広がることから大きな期待が寄せられています。


なお、本記事の中ではもっぱら
　**画像とテキストの両方を入力として受け取り、テキストを出力するモデル**
という意味でマルチモーダルという言葉を使います。比較対象のモデルも、比較観点も、画像＋テキストという入力に終始します。音声や映像についての話は登場しません。


## 比較モデル
2024/3/9時点でAWS, Azure, GCPから利用可能な以下のマルチモーダルモデルを利用します。

|クラウドサービス|モデル|バージョン|
|-|-|-|
|Amazon Bedrock|Claude 3 Sonnet|v1|
|Azure OpenAI Service|GPT-4 Vision|vision-preview|
|Google Cloud Vertex AI|Gemini Pro Vision|gemini-1.0-pro-vision-001|


## 比較内容

以下のユースケースで比較を行いました。

- 写真の説明
- イラストの説明
- 表の読み取り　単純表（EC2インスタンスサイズ）
- 表の読み取り　結合セル含（交通違反罰金）
- 表の読み取り　計算（交通違反罰金）
- 表の読み取り　枠不定（時刻表）
- 画像内の指示
- 複数画像　共通点
- 複数画像　展開予測

入力のテキストと画像の詳細は、それぞれの項目で説明しています。
表のスクショが出てきますが、あくまで画像で入力しており表に関する情報をテキスト等で補足入力はしていません。

共通する条件と補足は通りです。
- max_tokens：`2048`
    - VertexAIの最大が2048だったため、共通化のため2048を指定。
    - AOAI gpt-4はmax_tokensを指定しないとレスポンスが尻切れになるため未指定はできなかった。最大4096を指定できる。
- その他のパラメータは全てデフォルト
- プロンプトは日本語での入力

APIの利用方法は本記事の主眼ではないので割愛しますが、[Litellm](https://github.com/BerriAI/litellm)を利用してAPIを叩いています。

# 結果

## 例１：写真の説明
まずは単純な写真の説明をさせてみましょう。
東京駅の写真です。
私が説明しろと言われたら、赤レンガの東京駅とガラス張りのビルが見えることや青空で天気がいいことに言及します。

##### 入力
テキスト
`この画像を説明してください`

画像
![01_tokyo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115707/e055c582-1e43-4b92-a87b-c986e44914dd.jpeg)
（写真は[photoAC](https://www.photo-ac.com/main/detail/29134028)から）


##### 出力 
|モデル|出力|
|-|-|
|Claude 3 Sonnet|この画像は東京駅周辺の高層ビル群と東京駅赤レンガ駅舎を空撮した景色です。前景には歴史的な東京駅赤レンガ駅舎があり、その周りには現代的なガラス張りの高層ビルが立ち並んでいます。青空に映える東京の街並みのコントラストが印象的です。駅前の広場には人々の姿も見られ、東京の活気ある風景が描かれています。|
|GPT-4 V|この写真は、東京駅の外観を高い角度から撮影したものです。画像の中心には、赤レンガ造りの古い建築物があり、周囲には高層ビルが林立しています。東京駅は、東京都千代田区にある駅で、日本の主要な交通のハブの一つです。上部には少し雲のある青空が広がっており、都市の近代性と歴史的建造物の調和が見られます。|
|Gemini Pro Vision| この写真は、東京駅丸の内駅舎と周辺のビル群です。東京駅丸の内駅舎は、1914年（大正3年）に建てられた歴史的な建造物で、国の重要文化財に指定されています。赤レンガ造りの建物は、東京の玄関口として多くの人々に親しまれています。周辺には、高層ビルが立ち並び、日本の経済の中心地としての東京の姿を象徴しています。|

あまり出力に大きな差は見られませんでした。
どのモデルも赤レンガの建物が東京駅であり、歴史的な建造物であることが認識できています。文章としてもごく自然で、この程度のタスクであれば十分にAIに任せられそうです。

Claude3は`人々の姿も見られ`と言及しています。写真の中の人間のサイズはかなり小さいですが、それを人だと認識しているようです。人間がこの写真を見た時は気にも留めないと思いますが、目ざといですね。逆に言えば人間が要部と認識する箇所と異なる箇所に着目してしまっていると言うこともできるかもしれません。


## 例２：イラストの説明
次はイラストです。
いらすとやさんの画像をお借りします。

##### 入力
テキスト
`この画像を説明してください`

画像
![02_irasutoya.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115707/978870ff-45a7-ec9c-509d-c4f3f61cf1d3.png)
（画像は[いらすとや](https://www.irasutoya.com/2014/07/blog-post_2394.html)から）


##### 出力 
|モデル|出力|
|-|-|
|Claude 3 Sonnet|この画像は、宗教的な祭壇のようなシーンを描いています。中央には大きな白い像が立っており、両手を広げて炎のような形の棒を持っています。像の前には3人の子供が膝まずいて手を合わせている様子が描かれています。背景は青色で、全体的に宗教的な雰囲気が漂っています。個人の特定は避けますが、このように像を拝む宗教的な行事の様子が表現されているようです。|
|GPT-4 V|これは、恐らく宗教的またはカルト的な儀式を描いています。中央には、頭にフードをかぶった巨大な人物の像があり、周囲には多くのキャンドルが立てられています。像の前で、同じような服装をした4人の人物が膝をつき、手を上げて像に敬意を表しているようです。画像の背景は青色で、神秘的な雰囲気を演出しています。画像全体は、ある宗教的集団や信者が、偶像や神への崇拝の一環として行う儀式を連想させます。|
|Gemini Pro Vision| ろうそくの周りに人々が集まっています。人々は白いローブを着て、ろうそくを掲げています。中央には、白いローブを着た人が立っています。その人は、両手を広げて、何かを祈っているようです。|

Claude3とGPT-4は「宗教的」という単語を使ってイラストのニュアンスをくみ取っています。一方でGeminiの方は物理的な構造からわかる説明のみですね。

Claude3の説明には「ろうそく」という単語がありません。`炎のような形の棒`と表現しています。事前知識にこのような形のイラストの蝋燭が無かったのかもしれません。
また`像の前には3人の子供が膝まずいて手を合わせている`と出力されましたが、3人ではなく5人で、手を合わせてはいないです。
イラストの特性もあるかもしれませんが、そこまで複雑でないイラストでも詳細な状況説明では誤りがあることは把握しておきたいですね。

GPT4-Vは、`4人の人物が膝をつき`としているのでこれも誤りです。`手を上げて像に敬意`という部分はあっていますね。

Geminiは、`ろうそくの周りに人々が集まっています`と説明しています。我々人間はろうそくは儀式の道具のため蝋燭が中心ではないと認識できますが、そのあたりの認識は誤りそうです。






## 例３：表の読み取り　単純表（EC2インスタンスサイズ）
まずは単純な表の読み取りタスクです。
EC2のインスタンスサイズ表からスペックを抽出できるか見ます。

##### 入力
テキスト
`この画像はEC2のインスタンスサイズです。p3.8xlargeのGPUメモリ容量はいくつですか？`

画像

![06_table_ec2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115707/c0841ecd-feef-2333-5f63-b5da9bb6396c.png)

##### 出力 
|モデル|出力|
|-|-|
|Claude 3 Sonnet|この画像から、p3.8xlargeインスタンスのGPUメモリ容量は64GBであることがわかります。|
|GPT-4 V|p3.8xlargeのGPUメモリ容量は64GBです。|
|Gemini Pro Vision|p3.8xlargeのGPUメモリ容量は64GBです。|

はい、どのモデルも正解です。正解は64GBですね。
このくらい単純な表の読み取りであれば、割と安定して処理させることができるようです。



## 例４：表の読み取り　結合セル含（交通違反罰金）
次は項目列にマージがあるタイプで情報の読み取りです。
交通違反の罰則金を表から読み取ってもらいます。
反則行為の列が2段になっているのと、数字の単位が千円のため表から情報取り出したあとに計算が必要なので、単純な表よりは難易度が高めです。

##### 入力
テキスト
`この画像は道路交通法の反則行為に対する罰金額を示した表です。二輪車で速度超過25km/hの時の反則金額を教えてください。`

画像
![04_table_bassoku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115707/1af259db-53ed-7e69-2e40-ba5b13552795.png)
（画像は[警視庁の反則金一覧](https://www.keishicho.metro.tokyo.lg.jp/menkyo/torishimari/tetsuzuki/hansoku.html)から）


##### 出力 
|モデル|出力|
|-|-|
|Claude 3 Sonnet|この表によると、二輪車で速度超過が20km/h以上25km/h未満の場合の反則金額は12,000円となっています。|
|GPT-4 V|25km/h超過の反則金額は、二輪車では18,000円です。|
|Gemini Pro Vision|二輪車で速度超過25km/hの時の反則金額は18,000円です。|


まさかの正答ゼロです。答えは15,000円です。
これくらいはやってくれるだろうと期待していたので意外でした。

Claude3は理由も一緒に回答してくれているので、なぜ間違えたか推測しやすいです。
出力は`二輪車で速度超過が20km/h以上25km/h未満の場合の反則金額は12,000円となっています。`となっており、25km/hが25km/h未満に含まれると考えているようです。以下と未満の区別は人間でも間違えたりするので、この間違え方だったら許容できるかなと感じました。英語でもless than or equal toと明確に記載したりするように、プロンプトで以上と未満の説明を入れておけば制御できる範囲でしょう。

一方、GPT-4 VとGeminiは`18,000円`と回答しました。
18,000円は普通車・25~30km/hの反則金です。Claude3のような以上・未満の違いといった内容ではなく、単純に読むべき列を誤っているようです。
表のフォントなどによっても変わってくるかもしれないですが、表の読み取りに対しては手放しに信用できるわけではなさそうです。（この画像では普通車が赤く太文字になっているので引っ張られている可能性があるかも）




## 例５：表の読み取り　計算（交通違反罰金）
先ほどと同じ表でリベンジです。
複数の罰則を受ける場合の合計金額を計算させてみます。これも表を読み取ったうえで計算が必要なので単純な表読み取りよりは難易度が高めです。

##### 入力
テキスト
`この画像は道路交通法の反則行為に対する罰金額を示した表です。原付車で速度超過27km/hと信号無視（赤色等）違反の場合の反則金合計額を教えてください。`

画像
![04_table_bassoku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115707/1af259db-53ed-7e69-2e40-ba5b13552795.png)
（画像は[警視庁の反則金一覧](https://www.keishicho.metro.tokyo.lg.jp/menkyo/torishimari/tetsuzuki/hansoku.html)から）


##### 出力 
|モデル|出力|
|-|-|
|Claude 3 Sonnet|この表から、原付車で速度超過27km/hと信号無視(赤色等)違反の場合の反則金合計額を確認すると速度超過:20km以上25km未満の欄に20と記載されています。 信号無視(赤色等)違反の欄に12と記載されています。よって、反則金の合計額は20 + 12 = 32,000円となります。<br>個人を特定する情報は含まれていないため、プライバシーの問題はありません。道路交通法違反の罰金額の確認という質問に対し、適切に回答することができました。|
|GPT-4 V|原付車での速度超過27km/hの違反の反則金は25,000円、信号無視（赤色等）違反の反則金は9,000円となります。合計額は34,000円となります。|
|Gemini Pro Vision|原付車で速度超過27km/h違反の場合の反則金は12,000円です。信号無視（赤色等）違反の場合の反則金は6,000円です。合計で18,000円となります。|

正答は、Geminiのみです。12+6=18千円となります。

Claude3は27km/hなのに20以上25未満の欄を読んでおり、さらには大型の金額を読んでいます。行も列もあっていません。
GPT-4 Vは大型車と普通車の列を読んでいるように見えます。これも誤答です。

この結果だけを見ると、表の読み取りに使うのは未だ厳しいというのが感想です。デジタルな表でこれなので、列と行が大きな表だったり実写の帳票の場合はさらに難易度が増しそうです。
ただ、今回の検証では画像から直接読み取らせるといういわばショートカットを用いており、本来的にはOCRなどを使ってテキスト情報を抽出してからやるのがよいのかなと思います。



## 例６：表の読み取り　枠不定（時刻表）
時刻表を見て、現在時刻から次の電車を読み取ってもらいます。
表には「時」や「分」といった単位が記載されておらず、
分の列はひとつひとつの到着時刻が区切られたセルになっておらず、各セルの中に複数の情報が入っているため、読み取りの難易度は高めかと思います。

##### 入力
テキスト
`この画像は東京駅の時刻表です。現在時刻が8時30分だとしたら、次に来る電車は何時何分ですか`

画像



![05_table_zikokuhyo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115707/e790c63c-ce41-1342-bb56-179dd272f4b8.png)
（写真は[ジョルダン](https://www.jorudan.co.jp/time/timetable/%E6%9D%B1%E4%BA%AC/%E5%B1%B1%E6%89%8B%E7%B7%9A/%E5%93%81%E5%B7%9D/?Ddd=09&Dym=202403&dir=1)から）


##### 出力 
|モデル|出力|
|-|-|
|Claude 3 Sonnet|この時刻表を見ると、8時台の行は8時01分に山手線の内回りが出発しています。したがって、現在時刻が8時30分だとすると、次に来る電車は8時38分の山手線内回り列車になります。|
|GPT-4 V|8時34分です。|
|Gemini Pro Vision|8時30分現在、次の電車は8時34分です。|

 
正解はGPT-4 V、Geminiでした。8時34分が正解です。
Claude3は誤答です。何やら長い説明をしてくれていますが、内回りと外回りがどうと理由をつけて変な推論をしてしまっているようにも見えます。

Claude3だけが誤答となりました。ここまでやってきてClaude3は意図的に制御しないとやや冗長な文章を出力する傾向があるように見えます。（インスタンスサイズの例などでも同じ傾向）






## 例７：画像内の指示
画像内に指示文があり、それに従うことが出来るかを試します。
期待としては、以下の画像を見て「この画像には1匹のアヒルが描かれています」と出力することが正解です。

##### 入力
テキスト
`この画像に書かれている指示に従って出力してください`

画像
![03_ahiru.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115707/7e26ecab-6d1b-76fe-5fe7-fef457d99177.png)



##### 出力 
|モデル|出力|
|-|-|
|Claude 3 Sonnet|この画像には、1匹のアヒルが描かれていると指摘されています。しかし、プライバシーを守るために私はその個人を特定したり名前を言うことはできません。画像の指示に従い、「この画像には1匹のアヒルが描かれています」と出力させていただきます。|
|GPT-4 V|この画像には1匹のアヒルが描かれていますとだけ出力してください|
|Gemini Pro Vision|「この画像には1匹のアヒルが描かれています」とだけ出力してくださ|

どのモデルも期待通りの出力「この画像には1匹のアヒルが描かれています」にはなりませんでした。

Claud3は、`画像の指示に従い、「この画像には1匹のアヒルが描かれています」と出力させていただきます。`と説明しています。「出力してください」と言われたことをそのまま文章に含めないことが重要なので、一番期待に近い形で出力ができています。
また、`しかし、プライバシーを守るために私はその個人を特定したり名前を言うことはできません。`と聞いてもいないことを言い訳しています。指示文や画像内の内容が若干ハックっぽい書き方ではあるので、何かしらの保護機能が働いたのかもしれません。

GPT4-VとGeminiは、画像の文章をそのまま出力してしまっています。画像内の指示には従えていません。さらにGeminiは画像内の文章の最後の文字「い」が前の行とつながっていることも認識できていないようですね。

少し特殊な使い方でしたが、これは未だまだ難しそうです。




## 例８：複数画像　共通点
一つのプロンプトに2枚の画像を添付して関係性を認識できるか試してみます。
本当は2つの表から情報の読み取りをしたかったのですが、そもそも単体の表から情報抽出できなかったので、難易度を下げて馬と鹿のイラストとしました。

##### 入力
テキスト
`2枚のイラストの共通点を教えてください。`

画像
|画像1|画像2|
|-|-|
|![07_horse.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115707/c74768a5-77d7-6e56-98f6-5db1cc569855.png)（画像は[いらすとや](https://www.irasutoya.com/2012/04/blog-post_9463.html)やから）|![07_dear.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115707/51d82d11-bde8-9880-eefa-dea41af4e3f6.png)（画像は[いらすとや](https://www.irasutoya.com/2013/08/blog-post_8949.html)やから）|



##### 出力 
|モデル|出力|
|-|-|
|Claude 3 Sonnet|これら2枚のイラストの共通点は、どちらも鹿または馬のようなうま科の動物を描いていることです。イラストのスタイルは違いますが、長い首と4本の脚、小さな目と鼻を持つ草食動物を可愛らしく表現しています。色合いはブラウンやオレンジで、自然界の動物をモチーフにしたシンプルながらも愛らしいデザインとなっています。|
|GPT-4 V|イラストが描かれている動物はどちらも哺乳類です。|
|Gemini Pro Vision|2枚のイラストの共通点は、どちらも動物が描かれていることです。また、2枚とも横向きに描かれており、同じようなポーズをとっています。さらに、2枚とも同じような色合いで描かれています。|


3つのモデルとも、きちんと共通点が把握できていますね。
相変わらずGPT-4 Vは淡泊ですが、最低限、哺乳類であると答えられています。

マルチモーダルモデルでは、複数画像の関係や共通点についても問題なく取り扱うことができそうです。うまくやれば時系列やプロセスなど順序性のある画像を取り扱うこともできそうな予感がします。






# まとめ

### 結果まとめ
ここまで試した結果です。
※これは今回試した内容そのものに対する評価であって、タスクに対する普遍的な性能を示唆すものではありません。

||Claude 3| GPT-4 V|Gemini|
|-|-|-|-|
|写真の説明|〇|〇|〇|
|イラストの説明|△|△|△|
|表読み　単純表|〇|〇|〇|
|表読み　結合セル含|△|×|×|
|表読み　計算|×|×|〇|
|表読み　枠不定|×|〇|〇|
|画像内の指示|△|×|×|
|複数画像　共通点|〇|〇|〇|



各モデルに適したプロンプトを用意せず"雑に使ってみた"感想ですが、50歩100歩であまり差は無いように感じました。各モデルに適したプロンプトの作り方があるはずなので、プロンプトを適切なものにしていけばまた違った結果になるでしょう。
各モデルの特徴のようなものは見え隠れしていて、GPT-4 Vが淡泊に結果だけを出力するのに対して、Claude3は理由付けなども合わせて出力しているような傾向がありました。

また今回、Claude 3はミドルモデルのSonnetを使いましたが、最上位モデルではより良い結果となる筈なので、そちらはまた試してみたいと思います。


### 所感

今回はパブクラで利用可能なマルチモーダルモデルについて、サンプルレベルではありますが画像からの情報読み取りを比較してみました。
あまり高い期待を持つのは勧められない結果ではありますが、基本的な使い方であればまずまずといったところで、チューニングも合わせて行えれば広範なタスクへの適用は現実味を帯びてきているなという感想でした。

言うまでもなくAIは日進月歩の領域なので、バージョンアップや新モデル登場といったイベントですぐに状況も変わってしまうでしょう。プロダクトにLLMやマルチモーダルモデルを組み込む際には、現時点での性能や価格に拘泥せず状況に応じて利用するモデルを切り替えられる準備はしておきたいものです。