Link to this sectionOpenAI CLIPを使用したセマンティック画像検索の構築方法#
This guide walks you through building a semantic image search engine using OpenAI CLIP and Flask. By combining CLIP's visual-language embeddings with fast cosine similarity search powered by NumPy, you can build a web interface that retrieves relevant images from natural language queries, no labels or categories required.
Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

Ultralytics Pythonパッケージは、このパイプライン全体を2つのクラスにラップしているため、数行のコードで検索アプリを起動したり、プログラムからクエリを実行したりできます。このガイドでは、セマンティック検索が有用な理由、仕組み、Webアプリの実行、プログラムによる検索、およびパラメータの設定について解説します。
Link to this sectionセマンティック画像検索を使用する理由#
CLIPを使用して独自のセマンティック画像検索システムを構築することには、いくつかの魅力的な利点があります。
- ゼロショット機能: データセットで学習させる必要はありません。CLIPのゼロショット学習により、自由形式の自然言語を使用して任意の画像コレクションを検索できるため、時間とリソースを節約できます。
- 人間のような理解: キーワード検索とは異なり、CLIPはセマンティックなコンテキストを理解し、「自然の中で遊ぶ幸せそうな子供」や「夜の未来的な都市のスカイライン」といった抽象的、感情的、または関係性に基づくクエリから画像を検索できます。
- ラベルやメタデータが不要: このアプローチには生画像のみが必要です。CLIPは手動の注釈なしでエンベディングを生成します。
- 軽量で正確な検索: NumPyでの単一の正規化行列乗算により、すべての画像をcosine similarityでランク付けします。これにより、数千のembeddingに対してリアルタイムに応答する正確な結果が得られ、追加の検索依存関係をインストールまたは管理する必要はありません。
- ドメイン横断的なアプリケーション: 個人の写真アーカイブ、クリエイティブなインスピレーションツール、製品検索エンジン、アート推奨システムのいずれを構築する場合でも、最小限の調整で同じスタックを適用できます。
Link to this sectionセマンティック画像検索の仕組み#
このパイプラインは3つのコンポーネントを組み合わせたもので、各コンポーネントが画像とテキストをランク付けされた結果に変換する各ステージを処理します。
- CLIPは、画像にはビジョンエンコーダー(ResNetやViTなど)、言語にはテキストエンコーダー(Transformerベース)を使用し、両方を同じマルチモーダルエンベディング空間に投影します。これにより、コサイン類似度を使用してテキストと画像を直接比較できます。
- NumPyは画像embeddingを単一の配列として保存し、1回の行列乗算でクエリembeddingと比較してランク付けを行うため、追加のインデックス作成依存関係なしで、cosine similarityが最も近いベクトルを返します。
- Flaskは、自然言語クエリを送信し、インデックスからセマンティックに一致した画像を表示するためのシンプルなWebインターフェースを提供します。

画像とテキストの両方が同じベクトル空間に存在するため、取得はゼロショットで行われます。ラベルやカテゴリは不要で、画像データと適切なプロンプトさえあれば可能です。
Link to this sectionセマンティック検索Webアプリの実行#
SearchAppクラスは完全なFlaskインターフェースを起動します。初回実行時にサンプル画像セットをダウンロードし、embeddingインデックスを構築し、クエリを入力してランク付けされた結果を表示できるページを提供します。
画像パスに関する警告
独自の画像を使用する場合は、画像ディレクトリへの絶対パスを指定するようにしてください。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 testingLink to this sectionプログラムによる画像検索#
VisualAISearchクラスは、Webレイヤーなしで全てのバックエンド操作を実行します。
- ローカル画像からembeddingインデックスをロードまたは構築します。
- CLIPを使用して画像とテキストのembeddingsを抽出します。
- コサイン類似度を使用して類似性検索を実行します。
自然言語クエリで検索関数を呼び出し、類似度でランク付けされた一致する画像のファイル名リストを取得します。
from ultralytics import solutions
searcher = solutions.VisualAISearch(
# 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"
)
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.2680Link to this sectionVisualAISearchパラメータの設定#
以下の表は、VisualAISearchで使用可能なパラメータの概要です。
| 引数 | タイプ | デフォルト | 説明 |
|---|---|---|---|
data | str | 'images' | 類似検索に使用される画像ディレクトリへのパス。 |
| 引数 | タイプ | デフォルト | 説明 |
|---|---|---|---|
device | str | None | 推論に使用するデバイスを指定します(例:cpu、cuda:0、または 0)。CPU、特定のGPU、その他の演算デバイスをモデル実行用に選択できます。 |
ローカルファイルを管理せずに本番環境規模で画像コレクションを検索するには、CLIPでインデックスを作成する前に、Ultralytics Platformで画像を整理およびバージョン管理できます。
Link to this section結論#
CLIPとUltralytics Pythonパッケージを使用すれば、Flask Webアプリまたはプログラム可能な検索バックエンドとして、わずか数行のコードでゼロショットのセマンティック画像検索エンジンを立ち上げることができます。ここから、dataを自身の画像ディレクトリに向けてインデックスを作成し、他のUltralytics Solutionsを探索してコンピュータビジョンワークフローを構築してください。
Link to this sectionよくある質問 (FAQ)#
Link to this sectionCLIPはどのようにして画像とテキストの両方を理解するのですか?#
CLIP(Contrastive Language Image Pretraining)は、視覚情報と言語情報の関連付けを学習するOpenAIによって開発されたモデルです。自然言語のキャプションとペアになった膨大な画像データセットで学習されており、この学習により、画像とテキストの両方を共有エンベディング空間にマッピングし、ベクトル類似度を使用して直接比較することが可能になります。
Link to this sectionなぜCLIPはAIタスクにおいて強力だと見なされているのですか?#
CLIPの際立った特徴は、その汎化能力です。特定のラベルやタスク専用にトレーニングされるのではなく、自然言語そのものから学習します。これにより、「ジェットスキーに乗る男性」や「超現実的な夢の風景」といった柔軟なクエリを処理できるため、再学習なしで、分類からクリエイティブなセマンティック検索まで幅広く活用できます。
Link to this section画像はテキストクエリに対してどのようにランク付けされますか?#
CLIPが画像をembeddingに変換した後、UltralyticsパッケージがそれらをL2正規化し、単一のNumPy配列に保存します。クエリは、クエリembeddingとすべての画像embeddingの間のcosine similarityを計算する1回の行列乗算でランク付けされ、スコアがソートされます。このブルートフォース検索は、一般的な画像コレクションに対して正確かつ高速であり、インストールや管理が必要な追加のベクトルデータベース依存関係はありません。
Link to this sectionCLIPはOpenAIのものですが、なぜUltralytics Pythonパッケージを使用するのですか?#
CLIPはOpenAIによって開発されていますが、Ultralytics Pythonパッケージは、embedding生成、インデックス作成、cosine similarity検索を完全なセマンティック画像検索パイプラインとしてラップしており、わずか数行のコードで動作します。
from ultralytics import solutions
searcher = solutions.VisualAISearch(
# 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"
)
results = searcher("a dog sitting on a bench")この高レベルな実装は以下を処理します:
- CLIPベースの画像およびテキストエンベディング生成。
- Embeddingインデックスの作成と管理。
- コサイン類似度による効率的なセマンティック検索。
- ディレクトリベースの画像読み込みおよび可視化。
Link to this sectionこのアプリのフロントエンドをカスタマイズできますか?#
はい。現在の構成ではFlaskと基本的なHTMLフロントエンドを使用していますが、独自のHTMLに置き換えたり、React、Vue、その他のフロントエンドフレームワークを使用してより動的なUIを構築したりすることも可能です。Flaskは、カスタムインターフェースのバックエンドAPIとして機能させることができます。
Link to this section静止画ではなく動画を検索することは可能ですか?#
直接的にはできません。簡単な回避策として、動画から個々のフレーム(例:1秒ごとに1フレーム)を抽出し、それらを独立した画像として扱ってシステムに読み込ませる方法があります。これにより、検索エンジンは動画内の視覚的な瞬間をセマンティックにインデックス化できます。