「画像のためのモダンなセマンティック検索」
「美容とファッションの専門家による鮮やかで活気のある記事のタイトルを、日本語で改善してください」
Python、Pinecone、Hugging Face、およびOpen AI CLIPモデルを活用して、クラウドフォトの意味検索アプリケーションを作成するためのハウツー記事。
数年前の「あの1枚の写真」を見つけたいと思っています。設定に関するいくつかの具体的な情報を覚えています。Apple Photosには意味検索の機能がありませんし、Google Photosはいくつかの予め定義されたアイテム分類器に制限されています。どちらの検索もこの種類の検索には適していません。私は、Google Photosでの2つの異常なクエリ「ドーナツの誕生日ケーキ」および「雪玉の戦いでの割れた唇」を使用して、この問題を実証します。そして、自分自身の意味ベースの画像検索アプリケーションの構築方法を共有します。
デモンストレーション:現在の制限とモダンな意味ベースの画像検索の比較
例1
私は誕生日ケーキが好きです。また、ドーナツも好きです。昨年、私はドーナツの積み重ねを誕生日ケーキにしようという素晴らしいアイデアを思いつきました。それを見つけてみましょう。
Google Photosのクエリ:「ドーナツの誕生日ケーキ」
結果: ドーナツのないケーキの写真が6枚あり、その後に欲しかった写真が1枚あります。
意味検索アプリのクエリ:「ドーナツの誕生日ケーキ」
結果: 欲しかった写真といそうなものがちょうど2つの画像と1つのビデオが表示されます。
例2
私は息子と彼の友達の大グループと一緒に雪山に行きました。彼らは廃墟となっていたトンネルの上に登りました。「一斉に雪玉を投げて、スローモーションのビデオを撮るよ!」と私は叫びました。しかし、私は自分が20人の強い腕を持つティーンエイジボーイたちの的になるという明白な結果を予測していませんでした。
Google Photosのクエリ:「雪玉の戦いでの割れた唇」
結果:
現在のGoogleの画像分類モデルは、訓練された単語に制限があります。
意味検索アプリのクエリ:「雪玉の戦いでの割れた唇」
結果: 割れた唇の写真(非表示)と割れた唇の前のビデオが1位と2位の結果になります。
OpenAI CLIPモデルとアプリケーションアーキテクチャ
CLIPは、モデルがイメージのピクセルをテキストと関連付ける方法を学び、画像分類モデルを訓練する際には考慮しないような「ドーナツケーキ」と「割れた唇」といったものを検索する柔軟性を与えます。これはConstastive Language-Image Pretrainingの略で、オープンソースのマルチモーダルなゼロショットモデルです。数百万枚のイメージとその説明的なキャプションで訓練されています。
画像とテキストの説明が与えられた場合、モデルは特定のタスクに最適化することなく、画像の最も関連性の高いテキストの説明を予測することができます。
ほとんどのオンラインチュートリアルで見つけることができるCLIPアーキテクチャは、POCには十分ですが、エンタープライズには対応していません。これらのチュートリアルでは、CLIPとHugging Faceプロセッサは埋め込みをメモリに保持して、類似性スコアやリトリーバルの実行のためのベクトルストアとして機能します。
Pineconeなどのベクトルデータベースは、このようなアプリケーションのスケーリングにおいて重要なコンポーネントです。これにより、画像のバッチ処理、ストリーム処理、埋め込みのエンタープライズ管理、低遅延のリトリーバル、メタデータのフィルタリングなど、簡素化された頑強なエンタープライズ対応の機能が提供されます。
アプリの構築
このアプリケーションのコードとサポートファイルは、GitHubのhttps://github.com/joshpoduska/llm-image-caption-semantic-searchで見つけることができます。それらを使用して、クラウドの写真のための意味的な検索アプリケーションを構築してください。
このアプリケーションは、十分なメモリを持つノートパソコンでローカルに実行されます。私はMacBook Proでテストしました。
アプリを構築するために必要なコンポーネント
- Pineconeまたは同様のベクトルデータベース(このチュートリアルでは、Pineconeの無料版で十分です)
- Hugging Faceのモデルとパイプライン
- OpenAI CLIPモデル(Hugging Faceからアクセスできます)
- 個人のGoogleフォトにアクセスするためのGoogle Photos API
開始する前に役立つ情報
- GitHubユーザーのpolzerdo55862は、Pythonを介してGoogle Photos APIを使用するための素晴らしいノートブックチュートリアルを持っています。
- Pineconeのクイックツアーでは、Pineconeの”index”の初期化、満たし、削除の方法が説明されています。
- Pineconeのインデックスへのクエリの方法の例
- 独立したクエリと検索パイプラインでCLIPを使用する方法のHuggingFaceの例
- Antti Havankoは、ベクトル検索エンジンで使用するためのCLIPの埋め込みの生成方法の例を共有しています。
画像へのアクセス
Google Photos APIにはいくつかの重要なデータフィールドがあります。詳細はAPIリファレンスを参照してください。
- Idは不変です
- baseUrlを使用すると、メディアアイテムのバイトにアクセスできます。有効期間は60分です。
パンダ、JSON、およびrequestsライブラリの組み合わせを使用すると、画像のID、URL、および日付のDataFrameを簡単にロードすることができます。
画像の埋め込みを生成する
Hugging FaceとOpenAI CLIPモデルを使用すると、このステップはアプリケーション全体で最も簡単なものです。
from sentence_transformers import SentenceTransformerimg_model = SentenceTransformer('clip-ViT-B-32')embeddings = img_model.encode(images)
メタデータの作成
セマンティック検索は、しばしばメタデータフィルターで強化されます。このアプリケーションでは、写真の日付を使用して年、月、日を抽出します。これらはDataFrameフィールド内の辞書として保存されます。Pineconeクエリでは、この辞書を使用して辞書内のメタデータで検索結果をフィルタリングできます。
ここに、画像のフィールド、ベクトル、およびメタデータ辞書フィールドを持つpandas DataFrameの最初の行があります。
埋め込みのロード
非同期および並列ローディングのためのPineconeの最適化があります。基本的なローディング関数は次の通りです。
index.upsert(vectors=ids_vectors_chunk, async_req=True)
埋め込みのクエリ
CLIPモデルを使用して画像をクエリするには、セマンティッククエリのテキストを渡す必要があります。これは、CLIPテキスト埋め込みモデルをロードすることによって容易になります。
text_model = SentenceTransformer(‘sentence-transformers/clip-ViT-B-32-multilingual-v1’)
これで、検索フレーズの埋め込みを作成し、Pineconeに格納された画像の埋め込みと比較することができます。
# create the query vectorxq = text_model.encode(query).tolist()# now queryxc = index.query(xq, filter= { "year": {"$in":years_filter}, "month": {"$in":months_filter} }, top_k= top_k, include_metadata=True)
結論
CLIPモデルは素晴らしいものです。それは一般的な知識、ゼロショットモデルであり、事前に定義されたクラスの画像分類器のトレーニングの制約から解放されています。これをPineconeのようなエンタープライズグレードのベクトルデータベースの力と組み合わせることで、低遅延で高い信頼性を持つセマンティックな画像検索アプリケーションを作成できます。これは毎日発展している生成的AIのエキサイティングな応用の一つです。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles