OpenAI CLIPとMeta FAISSによるセマンティック画像検索

はじめに

本ガイドでは、OpenAI CLIPMeta FAISS、およびFlaskを使用して、セマンティック画像検索エンジンを構築する方法を説明します。CLIPの強力な視覚・言語エンベディングとFAISSの効率的な近傍探索を組み合わせることで、自然言語クエリを使用して関連画像を検索できるフル機能のWebインターフェースを作成できます。



Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP, META FAISS and Ultralytics Package 🎉

セマンティック画像検索の視覚的プレビュー

セマンティック検索結果の概要を示すFlaskウェブページ

仕組み

  • CLIPは、画像用にビジョンエンコーダー(例:ResNetやViT)、言語用にテキストエンコーダー(Transformerベース)を使用して、両方を同じマルチモーダルエンベディング空間に投影します。これにより、コサイン類似度を使用してテキストと画像を直接比較することが可能になります。
  • FAISS (Facebook AI Similarity Search) は、画像エンベディングのインデックスを作成し、特定のクエリに対して最も近いベクトルを高速かつスケーラブルに取得できるようにします。
  • Flaskは、自然言語クエリを送信し、インデックスからセマンティックに一致した画像を表示するためのシンプルなWebインターフェースを提供します。

このアーキテクチャはゼロショット検索をサポートしているため、ラベルやカテゴリは不要で、画像データと適切なプロンプトさえあれば検索が可能です。

Ultralytics Pythonパッケージを使用したセマンティック画像検索
画像パスに関する警告

独自の画像を使用する場合は、画像ディレクトリへの絶対パスを指定してください。そうしないと、Flaskのファイル提供制限により、Webページ上に画像が表示されない場合があります。

from ultralytics import solutions

app = solutions.SearchApp(
    # data = "path/to/img/directory" # Optional, build search engine with your own images
    device="cpu"  # configure the device for processing, e.g., "cpu" or "cuda"
)

app.run(debug=False)  # You can also use `debug=True` argument for testing

VisualAISearchクラス

このクラスは、すべてのバックエンド操作を実行します:

  • ローカル画像からFAISSインデックスを読み込む、または構築します。
  • CLIPを使用して画像とテキストのエンベディングを抽出します。
  • コサイン類似度を使用して類似度検索を実行します。
類似画像検索
画像パスに関する警告

独自の画像を使用する場合は、画像ディレクトリへの絶対パスを指定してください。そうしないと、Flaskのファイル提供制限により、Webページ上に画像が表示されない場合があります。

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    # data = "path/to/img/directory" # Optional, build search engine with your own images
    device="cuda"  # configure the device for processing, e.g., "cpu" or "cuda"
)

results = searcher("a dog sitting on a bench")

# Ranked Results:
#     - 000000546829.jpg | Similarity: 0.3269
#     - 000000549220.jpg | Similarity: 0.2899
#     - 000000517069.jpg | Similarity: 0.2761
#     - 000000029393.jpg | Similarity: 0.2742
#     - 000000534270.jpg | Similarity: 0.2680

VisualAISearchのパラメータ

以下の表は、VisualAISearchで利用可能なパラメータをまとめたものです:

引数タイプデフォルト説明
datastr'images'類似検索に使用される画像ディレクトリへのパス。
引数タイプデフォルト説明
devicestrNone推論用のデバイス(例:cpucuda:00など)を指定します。ユーザーはCPU、特定のGPU、またはその他の計算デバイスを選択してモデルを実行できます。

CLIPとFAISSによるセマンティック画像検索の利点

CLIPとFAISSを使用して独自のセマンティック画像検索システムを構築することには、いくつかの大きな利点があります:

  1. ゼロショット機能: 特定のデータセットでモデルをトレーニングする必要はありません。CLIPのゼロショット学習により、自由形式の自然言語を使用してあらゆる画像データセットに対して検索クエリを実行でき、時間とリソースの両方を節約できます。

  2. 人間のような理解力: キーワードベースの検索エンジンとは異なり、CLIPはセマンティック(意味的な)コンテキストを理解します。「自然の中の幸せそうな子供」や「夜の未来的な都市のスカイライン」といった、抽象的、感情的、または関係性に基づくクエリに基づいて画像を検索できます。

    OpenAI CLIPによる画像検索ワークフロー

  3. ラベルやメタデータが不要: 従来の画像検索システムでは、丁寧にラベル付けされたデータが必要です。このアプローチでは生の画像のみが必要です。CLIPは手動の注釈なしでエンベディングを生成します。

  4. 柔軟でスケーラブルな検索: FAISSにより、大規模なデータセットであっても高速な近傍探索が可能になります。速度とメモリ効率に最適化されており、数千(または数百万)のエンベディングがある場合でもリアルタイムの応答が可能です。

    Meta FAISSによるエンベディングベクトル構築のワークフロー

  5. ドメイン横断的な応用: 個人の写真アーカイブ、クリエイティブなインスピレーションツール、製品検索エンジン、あるいはアート推薦システムなど、どのようなシステムを構築する場合でも、このスタックは最小限の調整で多様なドメインに適応します。

FAQ

CLIPはどのようにして画像とテキストの両方を理解するのでしょうか?

CLIP (Contrastive Language Image Pretraining) は、視覚情報と言語情報の関連付けを学習するOpenAIによって開発されたモデルです。自然言語のキャプションと対になった膨大な画像データセットでトレーニングされています。このトレーニングにより、画像とテキストの両方を共有エンベディング空間にマッピングし、ベクトル類似度を使用してそれらを直接比較できるようになります。

なぜCLIPはAIタスクにおいてこれほど強力だと考えられているのでしょうか?

CLIPが際立っている理由は、その汎化能力にあります。特定のラベルやタスクのためだけにトレーニングされるのではなく、自然言語そのものから学習します。これにより、「ジェットスキーに乗る男」や「シュールな夢の世界」といった柔軟なクエリを処理できるため、再トレーニングなしで分類から創造的なセマンティック検索まで、あらゆる用途に役立ちます。

このプロジェクト(セマンティック検索)において、FAISSは具体的に何をするのでしょうか?

FAISS (Facebook AI Similarity Search) は、高次元ベクトルを非常に効率的に検索するためのツールキットです。CLIPが画像をエンベディングに変換した後、FAISSを使用することでテキストクエリに最も近い一致を高速かつ簡単に検索でき、リアルタイムの画像検索に最適です。

CLIPとFAISSがOpenAIとMetaのものであるなら、なぜUltralyticsPythonパッケージを使うのですか?

CLIPとFAISSはそれぞれOpenAIとMetaによって開発されていますが、Ultralytics Pythonパッケージを使用すると、完全なセマンティック画像検索パイプラインへの統合が簡素化され、2行のコードでそのまま動作するワークフローが実現します:

類似画像検索
from ultralytics import solutions

searcher = solutions.VisualAISearch(
    # data = "path/to/img/directory" # Optional, build search engine with your own images
    device="cuda"  # configure the device for processing, e.g., "cpu" or "cuda"
)

results = searcher("a dog sitting on a bench")

# Ranked Results:
#     - 000000546829.jpg | Similarity: 0.3269
#     - 000000549220.jpg | Similarity: 0.2899
#     - 000000517069.jpg | Similarity: 0.2761
#     - 000000029393.jpg | Similarity: 0.2742
#     - 000000534270.jpg | Similarity: 0.2680

この高レベルな実装は、以下を処理します:

  • CLIPベースの画像およびテキストエンベディング生成。
  • FAISSインデックスの作成と管理。
  • コサイン類似度を用いた効率的なセマンティック検索。
  • ディレクトリベースの画像読み込みと可視化

このアプリのフロントエンドをカスタマイズすることはできますか?

はい。現在の構成ではFlaskと基本的なHTMLフロントエンドを使用していますが、それを独自のHTMLに置き換えたり、React、Vue、その他のフロントエンドフレームワークを使用してより動的なUIを構築したりすることも可能です。Flaskは、カスタムインターフェースのバックエンドAPIとして機能させることができます。

静止画ではなく、動画を検索することは可能ですか?

直接的にはできません。簡単な回避策として、動画から個々のフレーム(例:1秒ごとに1枚)を抽出し、それらを独立した画像として扱ってシステムに入力する方法があります。これにより、検索エンジンは動画内の視覚的な瞬間をセマンティックにインデックス化できます。

コメント