OpenAI CLIPでセマンティック画像検索を構築する方法#
このガイドでは、OpenAI CLIPとFlaskを使って、セマンティック画像検索エンジンを構築する方法を説明します。CLIPの視覚と言語の埋め込みと、NumPyを活用した高速なコサイン類似度検索を組み合わせることで、ラベルやカテゴリを必要とせず、自然言語のクエリから関連画像を取得するWebインターフェースを構築できます。
視聴: 類似検索の仕組み | OpenAI CLIP と Ultralytics パッケージによるビジュアル検索 🎉

Ultralytics Pythonパッケージでは、パイプライン全体が2つのクラスにまとめられているため、数行のコードで検索アプリを起動したり、プログラムからクエリを実行したりできます。このガイドでは、セマンティック検索が役立つ理由、仕組み、Webアプリの実行、プログラムからの検索、パラメーターの設定を説明します。
セマンティック画像検索を使う理由#
CLIPを使って独自のセマンティック画像検索システムを構築すると、次のような利点があります。
- ゼロショット機能:データセットを使ったトレーニングは不要です。CLIPのゼロショット学習では、自由形式の自然言語であらゆる画像コレクションを検索できるため、時間とリソースを節約できます。
- 人間のような理解力:キーワード検索とは異なり、CLIPは意味的なコンテキストを理解し、「自然の中で楽しそうにしている子ども」や「夜の未来的な都市のスカイライン」のような抽象的、感情的、または関係性を表すクエリから画像を取得します。
- ラベルやメタデータが不要:この手法で必要なのは未加工の画像だけです。CLIPは手動でアノテーションを付けなくても埋め込みを生成します。
- 軽量で正確な検索:NumPyで正規化済み行列を1回乗算するだけで、すべての画像をコサイン類似度で順位付けできます。追加の検索依存関係をインストールまたは管理することなく、数千件の埋め込みに対してリアルタイムに正確な結果を得られます。
- 異なる分野への応用:個人用の写真アーカイブ、クリエイティブなインスピレーションツール、商品検索エンジン、アート推薦システムなど、最小限の調整で同じ技術スタックをさまざまな用途に適用できます。
セマンティック画像検索の仕組み#
このパイプラインは、画像とテキストを順位付けされた結果に変換する各段階を担う、3つのコンポーネントで構成されています。
- CLIPは画像にビジョンエンコーダー(ResNetやViTなど)、言語にテキストエンコーダー(Transformerベース)を使用し、両方を同じマルチモーダル埋め込み空間に写像します。これにより、コサイン類似度を使ってテキストと画像を直接比較できます。
- NumPyは画像の埋め込みを1つの配列に格納し、行列乗算を1回行ってクエリの埋め込みと照合します。追加のインデックス依存関係なしで、コサイン類似度が最も高いベクトルを返します。
- Flaskは、自然言語のクエリを送信し、インデックスから意味的に一致する画像を表示するためのシンプルなWebインターフェースを提供します。

画像とテキストの両方が同じベクトル空間に配置されるため、検索はゼロショットで実行できます。ラベルやカテゴリは不要で、画像データと適切なプロンプトがあれば十分です。
セマンティック検索Webアプリを実行する#
SearchAppクラスは、Flaskインターフェース全体を起動します。初回実行時にサンプル画像セットをダウンロードして埋め込みインデックスを構築し、クエリを入力して順位付けされた結果を表示できるページを提供します。
画像パスに関する警告
独自の画像を使用する場合は、画像ディレクトリの絶対パスを指定してください。そうしないと、Flaskのファイル配信に関する制限により、Webページに画像が表示されない場合があります。
from ultralytics import solutions
app = solutions.SearchApp(
data="images", # 独自の画像を使って検索エンジンを構築するには、パスに置き換えてください
device="cpu", # 処理に使うデバイスを設定します(例:"cpu"または"cuda")
)
app.run(debug=False) # テストには`debug=True`引数も使用できますプログラムから画像を検索する#
VisualAISearchクラスは、Webレイヤーを介さずにすべてのバックエンド処理を実行します。
- ローカル画像から埋め込みインデックスを読み込むか、構築します。
- CLIPを使って画像とテキストの埋め込みを抽出します。
- コサイン類似度を使って類似画像を検索します。
検索クラスに自然言語のクエリを渡すと、類似度順に並んだ一致画像のファイル名一覧が返されます。
from ultralytics import solutions
searcher = solutions.VisualAISearch(
data="images", # 独自の画像を使って検索エンジンを構築するには、パスに置き換えてください
device="cpu", # 処理に使うデバイスを設定します(例:"cpu"または"cuda")
)
results = searcher("a dog sitting on a bench")
# 順位付けされた結果:
# - 000000546829.jpg | 類似度:0.3269
# - 000000549220.jpg | 類似度:0.2899
# - 000000517069.jpg | 類似度:0.2761
# - 000000029393.jpg | 類似度:0.2742
# - 000000534270.jpg | 類似度:0.2680VisualAISearchのパラメーターを設定する#
次の表に、VisualAISearchで利用できるパラメーターを示します。
| 引数 | 種類 | デフォルト | 説明 |
|---|---|---|---|
data | str | 'images' | インデックス作成と検索の対象となる画像ディレクトリのパスです。 |
device | str | 'cpu' | CLIPの推論に使用するデバイスです(例:cpu、cuda、0)。 |
ローカルファイルを管理せずに本番環境の規模で画像コレクションを検索するには、Ultralytics Platformで画像を整理、バージョン管理してから、CLIPでインデックスを作成できます。
結論#
CLIPとUltralytics Pythonパッケージを使えば、FlaskのWebアプリとしても、プログラムから利用する検索バックエンドとしても、数行のコードでゼロショットのセマンティック画像検索エンジンを構築できます。ここからは、dataに独自の画像ディレクトリを指定してインデックスを作成し、他のUltralytics Solutionsも活用して、コンピュータービジョンのワークフローを拡張できます。
よくある質問#
CLIPの際立った特徴は、汎化能力です。特定のラベルやタスクだけを対象にトレーニングされるのではなく、自然言語そのものから学習します。そのため、「ジェットスキーに乗る男性」や「シュールな夢の風景」のような柔軟なクエリに対応でき、再トレーニングなしで分類からクリエイティブなセマンティック検索まで、幅広い用途に役立ちます。
CLIPはOpenAIが開発しましたが、Ultralytics Pythonパッケージは埋め込みの生成、インデックス作成、コサイン類似度による検索を数行のコードで使える、包括的なセマンティック画像検索パイプラインにまとめています。
from ultralytics import solutions searcher = solutions.VisualAISearch( data="images", # 独自の画像を使って検索エンジンを構築するには、パスに置き換えてください device="cpu", # 処理に使うデバイスを設定します(例:"cpu"または"cuda") ) results = searcher("a dog sitting on a bench")この高レベルの実装は、次の処理を行います。
- CLIPを使った画像とテキストの埋め込み生成。
- 埋め込みインデックスの作成と管理。
- コサイン類似度を使った効率的なセマンティック検索。
- ディレクトリからの画像読み込みと可視化。
はい。現在の構成では基本的なHTMLフロントエンドを備えたFlaskを使用していますが、独自のHTMLに置き換えたり、React、Vueなどのフロントエンドフレームワークで、より動的なUIを構築したりできます。Flaskはカスタムインターフェース用のバックエンドAPIとして利用できます。
直接はできません。簡単な回避策として、動画から個々のフレーム(例:1秒ごとに1枚)を抽出し、独立した画像として扱ってシステムに入力できます。こうすることで、検索エンジンは動画内の視覚的な瞬間を意味的にインデックス化できます。