🧜‍♀️

日本語にも対応するマルチモーダルAIモデルSigLIPでゼロショット画像分類を試す

2024/05/06に公開

はじめに

画像とテキストを同じ空間に埋め込み表現することで、画像とテキストという異なる種類の情報をまとめて扱うことができるようになります。このようなAIモデルとしては、OpenAI社の開発したCLIPモデルがとても有名です。このCLIPモデルから派生したAIモデルは多く存在しますが、本記事では、比較的新しいSigLIPモデルでゼロショット画像分類を試す方法を説明します。
なお、本記事作成のために開発した実験用アプリケーションを、以下のGitHubリポジトリで公開中です。

https://github.com/tsutof/siglip-tester

ゼロショット画像分類

画像訓練データには存在しない未知のクラスさえも認識し分類できるのがゼロショット画像分類です。但し、その分類モデルは、大規模コーパスを学習しているので、クラスラベルは既知です。未知の物体の画像が与えられた場合、その埋め込み表現の、埋め込み空間上の位置からクラスを推定します。この場合の埋め込み空間は、画像とテキストをまとめて扱うことができる空間なので、画像の埋め込み表現からラベルを推定することができる訳です。[1]

SigLIPモデル

通常、ゼロショット画像分類モデルは、与えられた画像と複数のテキストから、テキストそれぞれが画像にマッチするスコアを返し、それらをSoftmax関数で確率に変換します。

一方、SigLIPモデルは、Softmax関数ではなく、Sigmoid関数で確率に変換できます。すなわち、入力するテキストが1つでも確率を得ることができます。

We propose a simple pairwise Sigmoid loss for Language-Image Pre-training (SigLIP). Unlike standard contrastive learning with softmax normalization, the sig- moid loss operates solely on image-text pairs and does not require a global view of the pairwise similarities for nor- malization. [2]

この特徴は、学習を効率的に行うために考案されたものらしいのですが、推論時であっても、与えた画像に対して、どのようなテキストがマッチするか試行錯誤を繰り返すのに便利です。「犬」で確率が低いので、「子犬」ではどうか?さらに「茶色の子犬」ではどうか?といった感じです。

実験用アプリケーション

実験用のアプリケーションを、TransformersStreamlitを利用して作成しました。GPUによるアクセラレーションが利用できないコンピュータでも特に問題なく動作します。[3]

https://github.com/tsutof/siglip-tester

インストール方法

既存の環境に影響を与えないよう仮想環境上にインストールした方が良いと思います。Miniforgeを利用の場合は、

conda create -n siglip python=3.10 -y && \
conda activate siglip

本アプリケーションのGitHubリポジトリをクローンして、インストールします。

git clone https://github.com/tsutof/siglip-tester && \
cd siglip-tester && \
pip install -e .

使い方

  1. アプリケーションを起動します。自動的にウェブブラウザ内でアプリケーションが起動します。自動的に起動しない場合は、http://localhost:5678 を、ウェブブラウザで開きます。初回起動時はモデルをHugging Face Hubからダウンロードするので、アプリケーションが操作可能となるまで、しばらく時間がかかります。

    streamlit run siglip_tester/app.py
    
  2. サイドバーから、画像ソースを選びます。

  3. 表示に従い、画像データを読み込みます。

  4. テキストフィールドに、SigLIPモデルに入力するテキストを入力してリターンキーを押します。そうすると、SigLIPモデルによる推論がスタートし、画像の下に位置するデータフレームに、結果が追加されます。1枚の画像に対して、結果を確認しながら、納得のいくまで試行錯誤を繰り返すことができます。
    SigLIPモデルの処理には、乱数的な要素が存在しないようで、同一入力データに対する出力結果には再現性があります。

実験:テキストの工夫

SigLIPモデルのサンプル推論アプリケーションや、CLIP系モデルのサンプル推論アプリケーションでは、"A photo of a cat"など、〜の写真とテキストを指定しているものが多いです。とりあえず、英語のテキストでその必要性を試してみました。

No テキスト 確率
1 a rose 0.293
2 a photo of a rose 0.536
3 a photo of a pink rose 0.862
4 a photo of a pink rose in full bloom 0.806
5 a photo of a pink rose from an angle 0.902
6 a photo of a pink rose from an angle in a bokeh background 0.941

確かに、"a rose"よりも"a photo of a rose"の方が結果が良いです。さらに、画像に写っている物体を詳細に説明すると、テキストと画像のマッチする確率が上昇しました。なお、確率の値は小数点以下3桁で表示しています。0.000と表示されていても、まったくのゼロではありません。

では、日本語ではどうでしょうか?

No テキスト 確率
1 ばら 0.127
2 バラ 0.160
3 薔薇 0.150
4 🌹 0.003
5 0.005
6 ひまわり 0.000
7 カーネーション 0.000
8 ダリア 0.000
9 花弁 0.031
10 バラの写真 0.004
11 1本のバラ 0.072
12 一輪のバラ 0.372
13 ピンク色の一輪のバラ 0.226
14 バラ 一輪 0.329
15 斜めから撮影した一輪のバラ 0.560
16 斜めから撮影した一輪のバラと背景ぼけ 0.567
17 斜めから撮影した一輪のバラと緑色の背景ぼけ 0.042
18 咲き誇るピンク色の一輪のバラ 0.502
19 斜めから撮影した咲き誇るピンク色の一輪のバラ 0.598

「ばら」、「バラ」、「薔薇」、「🌹」の中では、「バラ」が最もマッチしました。後述のとおり、英語では、大文字と小文字を区別せず埋め込み表現されているようですが、ひらがなとカタカナは区別しているようです。
次に、英語の場合にならって、「バラの写真」としてみましたが、この確率はきわめて低くなりました。詳細に説明すると、英語の場合と同様に確率は上昇しましたが、英語の場合ほど、うまくいきませんでした。SigLIPはバイリンガルなモデルですが、英語の方が得意のように感じました。

次は、5種類の食材が写った画像です。

No テキスト 確率
1 人参 0.018
2 きゅうり 0.000
3 生姜 0.001
4 0.014
5 オレンジ 0.018
6 人参 きゅうり 0.377
7 人参 きゅうり 生姜 0.906
8 人参 きゅうり 生姜 卵 0.972
9 人参 きゅうり 生姜 卵 オレンジ 1.000

興味深いことに、食材1種類の名前をテキストとして与えた場合はとても低い確率ですが、種類を増やしていくと、確率は急上昇していきました。ばらの場合と同様に、詳細な表現が確率を上昇させました。

実験:SigLIPモデルは数えることができるか?

鶏卵の画像を使って、SigLIPモデルに数える能力があるか試してみました。

卵1個

はじめに、「たまご」、「玉子」、「卵」のどれが良いのか、また、紙の上に置いてあることを表現する方が良いのかを試しました。

No テキスト 確率
1 たまご 0.541
2 玉子 0.090
3 0.622
4 卵の写真 0.340
5 紙の上にある卵 0.955
6 茶色の紙の上にある卵 0.838
7 紙の上に置いた卵 0.889

「卵」の確率が高く、「紙の上にある」と表現した方がさらに高くなることが確認できました。そのため、「紙の上にある卵1個」のように表現して、個数の数字を変化させていこうと思いましたが、

No テキスト 確率
1 紙の上にある卵1個 0.961
2 紙の上にある卵2個 0.601
3 紙の上にある卵3個 0.658
4 紙の上にある卵4個 0.415
5 紙の上にある卵5個 0.539
6 紙の上にある卵6個 0.386
7 卵1個 0.943
8 卵2個 0.688
9 卵3個 0.526
10 卵4個 0.439
11 卵5個 0.322
12 卵6個 0.248

「紙の上にある」を付けると、個数の変化が際立たないようなので、「卵1個」のようにシンプルに表現することにしました。確かに、個数を認識しているようです。

卵2個

No テキスト 確率
1 卵1個 0.784
2 卵2個 0.981
3 卵3個 0.777
4 卵4個 0.639
5 卵5個 0.544
6 卵6個 0.481

2個の場合は、「卵2個」が最も高確率となりました。

卵3個

No テキスト 確率
1 卵1個 0.711
2 卵2個 0.800
3 卵3個 0.990
4 卵4個 0.926
5 卵5個 0.806
6 卵6個 0.666

3個の場合は、「卵3個」が最も高確率となりました。

卵4個

No テキスト 確率
1 卵1個 0.329
2 卵2個 0.370
3 卵3個 0.808
4 卵4個 0.973
5 卵5個 0.930
6 卵6個 0.805

4個の場合は、「卵4個」が最も高確率となりました。

卵5個

No テキスト 確率
1 卵1個 0.312
2 卵2個 0.173
3 卵3個 0.464
4 卵4個 0.863
5 卵5個 0.942
6 卵6個 0.870

5個の場合は、「卵5個」が最も高確率となりました。

卵6個

No テキスト 確率
1 卵1個 0.429
2 卵2個 0.193
3 卵3個 0.559
4 卵4個 0.756
5 卵5個 0.960
6 卵6個 0.952

6個の場合は、残念ながら、「卵6個」ではなく、「卵5個」がわずかながら高確率となりました。少ない個数は認識できているようですが、多くなっていくと難しいのかも知れません。

実験:SigLIPモデルは文字を読めるか?

最後に、SigLIPが文字を認識できるか試しました。もちろん、文字を認識するには、文字認識に特化したモデルを使うべきです。また、LLaVAモデルのように、かなり上手に画像中の文章を認識してくれるマルチモーダルモデルもいくつか存在します。ですので、この実験は、SigLIPモデルのように比較的軽量なモデルに文字認識の能力があるのか?という単純な興味から行いました。

まず、英単語で試しました。

No テキスト 確率
1 Computer 0.262
2 Camp 0.000
3 Complicated 0.053
4 Compression 0.000
5 PC 0.014
6 Computor 0.388
7 コンピュータ 0.005

理解に苦しむ結果となりました。"Computer"よりも、英単語として存在しない"Computor"の方が、かなり高確率になりました。背景模様があったり、文字が傾いているのが、うまく認識しない原因か?と思って、もっとシンプルな画像でテストしたのが以下です。

No テキスト 確率
1 COMPUTER 0.393
2 computer 0.393
3 computor 0.838
4 tor 0.000
5 putor 0.000
6 putorcom 0.001

しかし、予想に反して、前の例と同じ傾向です。"COMPUTER"と"computer"は同じ確率なので、埋め込み表現が大文字と小文字を区別していないと想像します。

気を取り直して、日本語で試しましたが、

No テキスト 確率
1 コンピュータ 0.000
2 0.859
3 コン 0.163
4 コンピ 0.956
5 コンピュ 0.982
6 コンピュー 0.936
7 コンピュータ 0.000
8 スマートフォン 0.000
9 ネットワーク 0.000
10 アップル 0.001
11 マイクロソフト 0.000
12 グーグル 0.005
13 ケチャップ 0.012
14 トマトピューレ 0.000

「コンピュータ」はきわめて低確率なのに、「コンピュ」が高確率という、理解にとても苦しむ結果になりました。「ータ」は文字と認識できていないのでしょうか?まったく異なる単語には反応しないので、とにかく、不完全ながら、文字を読めているらしいことは分かりました。

まとめ

マルチリンガルのゼロショット画像分類モデルSigLIPを試す方法と、簡単な実験結果を紹介しました。対象をうまく認識させるためには、LLM(大規模言語モデル)に対するプロンプトエンジニアリングに似たテクニックが必要でそれが興味深いです。また、対象物の数量を認識できるのには、素直に驚きました。興味を持っていただけましたら、ぜひ、本記事で紹介したアプリケーションもお試しください。

脚注
  1. Zero-shot Learning入門 ↩︎

  2. Sigmoid Loss for Language Image Pre-Training ↩︎

  3. もちろん、GPUによるアクセラレーションの利用できるコンピュータの方が、テキスト入力から結果が表示されるまでの時間が短いので、操作感は良いです。 ↩︎

Discussion