CLIP/BLIP2を使ってrosbagの画像検索できるようにした話、プロンプトと検索結果の比較を添えて
本記事は「基盤モデル×Robotics Advent Calendar 2023」の12/25に投稿されたものです。
はじめに
こんにちは、昨日こんな記事を投稿していたものです。
最近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に含まれるデータです。
成功失敗度合いをわかりやすくするため、検索対象となった画像を全部載せます。
合計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 | ❌どこにも黄色いバスが写っていません | ⭕黄色いバスが写っています |
Signs indicating the number of the roadway | ⭕「EAST 12」という看板が写っています | ❌速度制限の標識に反応していそうですね |
Speed limit sign | ❌どこにも速度制限の標識が写っていません | ⭕速度制限の標識が写っています |
A red passenger car | ❌どこにも赤い乗用車は写っていません | ⭕小さいですが左端に赤い車が写っています |
Traffic lights | ⭕信号機が写り込んでいます | ⭕信号機が写り込んでいます |
A building under construction | ⭕工事中の建物が大きく写っています | ⭕工事中の建物が大きく写っています |
非常に定性的な評価にはなってしまいますが、今回の評価を通して以下の傾向が言えるかなと思います。
- 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