YOLO Vision 2026:

OpenAI CLIPを使用したセマンティック画像検索の構築方法#

本ガイドでは、OpenAI CLIPFlaskを使用してセマンティック画像検索エンジンを構築する手順を解説します。CLIPの視覚言語埋め込みと、NumPyを活用した高速なコサイン類似度検索を組み合わせることで、ラベルやカテゴリを一切必要とせず、自然言語のクエリから関連画像を取得するWebインターフェースを構築できます。



Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

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

Ultralytics Pythonパッケージはこのパイプライン全体を2つのクラスでラップしているため、わずか数行のコードで動作する検索アプリを起動したり、プログラムでクエリを実行したりできます。このガイドでは、セマンティック検索が役立つ理由仕組みWebアプリの実行プログラムによる検索パラメータの設定について説明します。

セマンティック画像検索を使用する理由#

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

  • ゼロショット機能: データセットでトレーニングを行う必要はありません。CLIPのゼロショット学習を使用すると、自由形式の自然言語で任意の画像コレクションをクエリできるため、時間とリソースを節約できます。
  • 人間のような理解: キーワード検索とは異なり、CLIPはセマンティックなコンテキストを理解し、「自然の中で遊ぶ幸せそうな子供」や「夜の未来的な都市のスカイライン」といった抽象的、感情的、または関係性に基づくクエリから画像を検索できます。
  • ラベルやメタデータが不要: このアプローチには生画像のみが必要です。CLIPは手動の注釈なしでエンベディングを生成します。
  • 軽量で正確な検索: NumPyでの単一の正規化行列乗算により、すべての画像をcosine similarityでランク付けします。これにより、数千のembeddingに対してリアルタイムに応答する正確な結果が得られ、追加の検索依存関係をインストールまたは管理する必要はありません。
  • ドメイン横断的なアプリケーション: 個人の写真アーカイブ、クリエイティブなインスピレーションツール、製品検索エンジン、アート推奨システムのいずれを構築する場合でも、最小限の調整で同じスタックを適用できます。

セマンティック画像検索の仕組み#

このパイプラインは3つのコンポーネントを組み合わせたもので、各コンポーネントが画像とテキストをランク付けされた結果に変換する各ステージを処理します。

  • CLIPは、画像用のビジョンエンコーダ(ResNetやViTなど)と言語用のテキストエンコーダ(Transformerベース)を使用して、両方を同じマルチモーダル埋め込み空間に射影します。これにより、コサイン類似度を使用してテキストと画像を直接比較できるようになります。
  • NumPyは画像embeddingを単一の配列として保存し、1回の行列乗算でクエリembeddingと比較してランク付けを行うため、追加のインデックス作成依存関係なしで、cosine similarityが最も近いベクトルを返します。
  • Flaskは、自然言語クエリを送信し、インデックスからセマンティックに一致した画像を表示するためのシンプルなWebインターフェースを提供します。

OpenAI Clip画像取得ワークフロー

画像とテキストの両方が同じベクトル空間に存在するため、取得はゼロショットで行われます。ラベルやカテゴリは不要で、画像データと適切なプロンプトさえあれば可能です。

セマンティック検索Webアプリの実行#

SearchAppクラスは、完全なFlaskインターフェースを起動します。初回実行時には、サンプル画像セットをダウンロードし、埋め込みインデックスを構築して、クエリを入力してランク付けされた結果を表示できるページを提供します。

画像パスに関する警告

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

from ultralytics import solutions

app = solutions.SearchApp(
    data="images",  # replace with a path to build the 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クラスは、Web層なしですべてのバックエンド操作を実行します。

  • ローカル画像からembeddingインデックスをロードまたは構築します。
  • CLIPを使用して画像とテキストの埋め込みを抽出します。
  • コサイン類似度を使用して類似性検索を実行します。

自然言語クエリで検索関数を呼び出し、類似度でランク付けされた一致する画像のファイル名リストを取得します。

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    data="images",  # replace with a path to build the search engine with your own images
    device="cpu",  # 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:0、または0)。ユーザーはモデルの実行にCPU、特定のGPU、またはその他の計算デバイスを選択できます。
クラウドでのデータ管理

ローカルファイルを管理せずに本番環境のスケールで画像コレクションを検索するには、CLIPでインデックスを作成する前に、Ultralytics Platformで画像を整理し、バージョン管理を行うことができます。

結論#

CLIPとUltralytics Pythonパッケージを使用すると、Flask Webアプリまたはプログラムによる検索バックエンドとして、わずか数行でゼロショットセマンティック画像検索エンジンを立ち上げることができます。ここから、dataを自身の画像ディレクトリに向けてインデックスを作成し、他のUltralytics Solutionsを探索してコンピュータビジョンワークフローの上に構築を進めてください。

よくある質問 (FAQ)#

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

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

なぜCLIPはAIタスクにおいて強力だと見なされているのですか?#

CLIPの際立った特徴は、その汎化能力です。特定のラベルやタスク専用にトレーニングされるのではなく、自然言語そのものから学習します。これにより、「ジェットスキーに乗る男性」や「超現実的な夢の風景」といった柔軟なクエリを処理できるため、再学習なしで、分類からクリエイティブなセマンティック検索まで幅広く活用できます。

画像はテキストクエリに対してどのようにランク付けされますか?#

CLIPが画像を埋め込みに変換すると、UltralyticsパッケージがそれらをL2正規化し、単一のNumPy配列に格納します。クエリは、クエリの埋め込みとすべての画像の埋め込みの間のコサイン類似度を計算する1回の行列乗算によってランク付けされ、スコアがソートされます。この総当たり検索は、一般的な画像コレクションに対して正確かつ高速であり、インストールや管理が必要な追加のベクトルデータベースの依存関係はありません。

CLIPがOpenAIのものであるなら、なぜUltralytics Pythonパッケージを使用するのでしょうか?#

CLIPはOpenAIによって開発されていますが、Ultralytics Pythonパッケージは、埋め込み生成、インデックス作成、コサイン類似度検索を、すぐに機能する数行のコードの背後にある完全なセマンティック画像検索パイプラインにラップします。

from ultralytics import solutions

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

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

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

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

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

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

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

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

コメント