🤖

CLIP/BLIP2を使ってrosbagの画像検索できるようにした話、プロンプトと検索結果の比較を添えて

2023/12/25に公開

本記事は「基盤モデル×Robotics Advent Calendar 2023」の12/25に投稿されたものです。

https://qiita.com/advent-calendar/2023/robot-ai

はじめに

こんにちは、昨日こんな記事を投稿していたものです。
最近Vision&Languageや基盤モデルの発展には目覚ましいものがありますが、その応用先の一つとして「自然言語による画像検索」が挙げられます。
YOLOなどに代表される従来の物体認識手法と異なりVision&Languageモデルはembeddingと呼ばれる画像とテキスト情報を同じ次元のベクトルに変換する機能があります。
本記事では、Vision&Langageモデルの代表例であるCLIP/BLIP2を比較して画像検索というアプリケーションに対して2つのモデルを評価していきたいと思います。

BLIP2は本来はVQAなどをするモデルではありますが、Q-Formerという部品があり、その内部で画像とテキストの対照学習を行っているため、今回の評価が実現しました。

本記事に使用したソースコードはすべてこちらで公開しています。
試してみたい方はこちらのドキュメントを参考にしながらお手元で動かしてみてください。

詳しい方はなんとなくん..?となるかもしれませんが、今回の評価ではBLIP2のITC(Image-Text Contrastive Learning)のみを使用してITM(Image-Text Matching)は使っていません。
BLIP2の論文内ではITCで候補を求めたあとITMで最終結果を絞り込むロジックになっています。
おそらくそのほうが精度が高くなるのでしょうが明らかに検索時間が伸びるので今回はITCのみで評価しました。

評価に使ったデータ

今回評価に使用したのはford datasetに含まれるデータです。
成功失敗度合いをわかりやすくするため、検索対象となった画像を全部載せます。

Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found
Not Found

合計35枚のデータでテストを実施しました。

評価の実行方法

詳しくはこちらのドキュメントを参照ください

modelの切替時にはqdrantのdocker containerを落とす必要があります。
下記のコマンドでdocker containerを落とせます。

docker stop $(docker ps -q)
docker rm $(docker ps -q -a)

BLIP2

python3 amber/apps/image_search.py --rosbag_directory tests/rosbag/ford/ --sampling_duration=0.1 --model blip2

CLIP

python3 amber/apps/image_search.py --rosbag_directory tests/rosbag/ford/ --sampling_duration=0.1 --model blip2

検索結果以外の評価結果

評価に使用した環境は

  • 12th Gen Intel(R) Core(TM) i9-12900
  • メモリ64GB
  • GPUなし

です。今回実行された計算はすべてCPUの上で行われています。

CLIP BLIP2
モデル openai/clip-vit-base-patch32 blip2_image_text_matching
モデルの読み込み時間 2.158031702041626秒 10.15829610824585秒
35枚の画像からembeddingを計算するのにかかった時間 約2秒 約37秒
検索にかかった時間 0.01 ~ 0.03秒 0.05~0.06秒

検索結果

Prompt CLIP BLIP2
An yellow bus Not Found❌どこにも黄色いバスが写っていません Not Found⭕黄色いバスが写っています
Signs indicating the number of the roadway Not Found⭕「EAST 12」という看板が写っています Not Found❌速度制限の標識に反応していそうですね
Speed limit sign Not Found❌どこにも速度制限の標識が写っていません Not Found⭕速度制限の標識が写っています
A red passenger car Not Found❌どこにも赤い乗用車は写っていません Not Found⭕小さいですが左端に赤い車が写っています
Traffic lights Not Found⭕信号機が写り込んでいます Not Found⭕信号機が写り込んでいます
A building under construction Not Found⭕工事中の建物が大きく写っています Not Found⭕工事中の建物が大きく写っています

非常に定性的な評価にはなってしまいますが、今回の評価を通して以下の傾向が言えるかなと思います。

  • BLIP2を使った場合image embeddingの計算にはCLIPの18倍程度の時間が必要
  • BLIP2を使った場合検索にかかる時間は約2倍に増加(embeddingの次元数が異なるため、正確な評価にはqdrantの計算量を考慮する必要がある)
  • CLIPを使うと半分当たればいい方、正直ハズレも多い
  • BLIP2を使えばかなり検索精度は良い、BLIP2の論文ではITCを計算するだけでもそこそこの精度で検索できる、間違えたとしても似たような物体は含まれることが多い
  • BLIP2は局所的な特徴量をよく見れている(CLIPは画像全体で学習していて、BLIP2はVQAができるモデルなのでそれはそう)

とりあえずやってみたレベルの評価にはなりますが、BLIP2はかなり精度よく画像検索ができると感じます。
公開できないデータなので画像が載せられないのが申し訳ないのですが、以下のようなプロンプトでも検索に成功しました。

  • A white car is parked at the rotary in front of the station.
  • A man is climbing on the back of a truck.

これらのことから、計算資源が許すのであればCLIPよりBLIP2を使ったほうがよさそう、ということが言えそうです。
少なくともロボットアプリケーションで局所特徴量に注目しなくていいケースはほぼ無いと言っていいでしょうから、基本的にはBLIP2を使用、CLIPを使用する場合は何らかの物体領域提示手法と組み合わせるDeticのような手法を採用することになりそうです。

Discussion