「画像のためのモダンなセマンティック検索」

「美容とファッションの専門家による鮮やかで活気のある記事のタイトルを、日本語で改善してください」

Python、Pinecone、Hugging Face、およびOpen AI CLIPモデルを活用して、クラウドフォトの意味検索アプリケーションを作成するためのハウツー記事。

Image by the author

数年前の「あの1枚の写真」を見つけたいと思っています。設定に関するいくつかの具体的な情報を覚えています。Apple Photosには意味検索の機能がありませんし、Google Photosはいくつかの予め定義されたアイテム分類器に制限されています。どちらの検索もこの種類の検索には適していません。私は、Google Photosでの2つの異常なクエリ「ドーナツの誕生日ケーキ」および「雪玉の戦いでの割れた唇」を使用して、この問題を実証します。そして、自分自身の意味ベースの画像検索アプリケーションの構築方法を共有します。

例1

私は誕生日ケーキが好きです。また、ドーナツも好きです。昨年、私はドーナツの積み重ねを誕生日ケーキにしようという素晴らしいアイデアを思いつきました。それを見つけてみましょう。

Google Photosのクエリ:「ドーナツの誕生日ケーキ」

結果: ドーナツのないケーキの写真が6枚あり、その後に欲しかった写真が1枚あります。

Image by the author

意味検索アプリのクエリ:「ドーナツの誕生日ケーキ」

結果: 欲しかった写真といそうなものがちょうど2つの画像と1つのビデオが表示されます。

Image by the author

例2

私は息子と彼の友達の大グループと一緒に雪山に行きました。彼らは廃墟となっていたトンネルの上に登りました。「一斉に雪玉を投げて、スローモーションのビデオを撮るよ!」と私は叫びました。しかし、私は自分が20人の強い腕を持つティーンエイジボーイたちの的になるという明白な結果を予測していませんでした。

Google Photosのクエリ:「雪玉の戦いでの割れた唇」

結果:

Image created by the author

現在のGoogleの画像分類モデルは、訓練された単語に制限があります。

意味検索アプリのクエリ:「雪玉の戦いでの割れた唇」

結果: 割れた唇の写真(非表示)と割れた唇の前のビデオが1位と2位の結果になります。

Image by the author

OpenAI CLIPモデルとアプリケーションアーキテクチャ

CLIPは、モデルがイメージのピクセルをテキストと関連付ける方法を学び、画像分類モデルを訓練する際には考慮しないような「ドーナツケーキ」と「割れた唇」といったものを検索する柔軟性を与えます。これはConstastive Language-Image Pretrainingの略で、オープンソースのマルチモーダルなゼロショットモデルです。数百万枚のイメージとその説明的なキャプションで訓練されています。

画像とテキストの説明が与えられた場合、モデルは特定のタスクに最適化することなく、画像の最も関連性の高いテキストの説明を予測することができます。

出典: Nikos Karfitsas, Towards Data Science

ほとんどのオンラインチュートリアルで見つけることができる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

開始する前に役立つ情報

画像へのアクセス

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の最初の行があります。

Image by the author

埋め込みのロード

非同期および並列ローディングのための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!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more