OpenAI CLIP を使用したテキストから画像への検索および画像から画像への検索

I.はじめに

今日の情報が爆発的に増加する時代において、政府、公安、小売業などの業界は、大量のデータ処理のニーズに直面しています。たとえば、車両の銃剣データでは、展開および制御のために疑わしい車両を見つけるために、大量の情報を迅速に取得して照合する必要があります。物品や商品の識別に関しては、関連する証拠を見つけるために類似性検索を実行する必要があり、大型連休、セキュリティ 以前は、構造化データに基づいて大量のビッグデータをリアルタイムで比較するには、Flink や Spark などのビッグ データ フレームワークを使用することしかできませんでした。画像が 1 つしかない場合、巨大なデータ ウェアハウスから上位 N 件の類似結果レコードをいかに迅速に取得するかが重要なビジネス シナリオになっています。

この場合、最先端の人工知能ソリューションを活用することで、これらの課題に対処できます。OpenAIのCLIPは、テキストと画像を簡単に接続できるディープラーニングアルゴリズムです。CLIP を使用することで、正確かつ効率的な検索を効果的に実行し、車両のバックル データの大量の情報検索と高速な画像ベースのマッチングを実現できます。同時に、CLIPはアイテムや商品の特徴を自動的に識別し、類似点検索を実行し、疑わしいものとの比較などのビジネスニーズにも対応します。政府、公安、小売業界のいずれにおいても、画像の検索とマッチングに CLIP を使用することには重要な応用価値があります。

2.クリップとは何ですか?

CLIP (Contrastive Language-Image Pre-training) は、 OpenAI が 2021 年 2 月にリリースした最先端のモデルです。これは、約 4 億個の (テキストと画像) ペアでトレーニングされたニューラル ネットワークです。CLIP は、対照的な学習方法を使用してテキストと画像を均一に処理するため、GPT-2 および GPT-3 のゼロサンプル機能と同様に、タスクを直接最適化することなく、テキストと画像の類似性によって画像分類などのタスクを完了できます。オリジナルの ResNet50 と比較すると、CLIP はオリジナルの 128 万個のラベル付きサンプルを一切使用せずに ImageNet 上のパフォーマンスに匹敵することができ、コンピュータ ビジョンにおけるいくつかの大きな課題を克服できることがわかりました。

CLIPは、テキストや画像の検索に加えて、画像分類、画像生成、画像類似検索、画像ランキング、ターゲット追跡、ロボット制御、画像字幕などの分野にも応用できます。CLIP の利点は、ドメイン固有のトレーニングなしで、特定の画像とテキストの説明が一致するかどうかを判断できることであり、すぐに使用できる非常に強力なテキストおよび画像の検索ツールになります。これもこの記事の焦点です。

3. なぜ CLIP モデルを採用する必要があるのですか?

AI コミュニティで CLIP モデルの採用が促進された理由のいくつかを以下に示します。

3.1. CLIP は非常に効率的です

対照的なターゲットを使用すると、ゼロショット ImageNet 分類における CLIP モデルの効率が向上し、既存のモデルよりも 4 ~ 10 倍高くなります。さらに、ビジュアル トランスフォーマーの使用により、標準の ResNet と比較して計算効率が 3 倍向上します。

3.2. より多用途かつ柔軟に

CLIP は、さまざまな視覚表現を自然言語から直接学習できるため、新しい領域で既存のImageNetモデルを上回ります。

以下のグラフは、きめの細かい物体検出、地理位置情報、アクション認識、光学式文字認識タスクにおける CLIP のゼロショット パフォーマンスと ResNet モデルの数ショット線形検出パフォーマンスの比較を示しています。

4.CLIPアーキテクチャ

CLIP アーキテクチャは、テキスト エンコーダと画像エンコーダという 2 つの主要コンポーネントで構成されます。2 つのエンコーダーは、トレーニング サンプル (画像、テキスト) のバッチの正しいペアを予測するために共同でトレーニングされます。

  • テキスト エンコーダーのバックボーンは、6,300 万のパラメーター、12 レイヤーを含むトランスフォーマー モデルで、8 つのアテンション ヘッドを備えた 512 幅のモデルを使用します。

  • 画像エンコーダーは、ビジュアル トランスフォーマー (ViT) と ResNet50 をバックボーンとして使用し、画像の特徴表現の生成を担当します。

4.1. CLIP アルゴリズムはどのように機能しますか?

CLIP アルゴリズムがどのように機能するかは、次の 3 つの方法で説明できます。

(1)対照的な事前トレーニング: CLIP は事前トレーニングに対照的な学習方法を使用します。画像とテキストをトレーニング サンプルとしてペアにし、モデルが画像とテキストの関係を学習できるようにします。CLIP は、特定の画像に対して最も関連性の高いテキストの断片を予測することで、画像とテキストを統合できます。

(2)注釈付きテキストからデータセット分類子を作成する: CLIP は注釈付きテキストを使用してデータセット分類子を作成します。多数の画像と関連するテキストの説明を使用して分類子をトレーニングし、モデルがその特徴に基づいて画像が属するカテゴリを予測できるようにします。このようにして、CLIP は特定のアノテーションなしで画像データセットの分類を実行できます。

(3)分類にゼロサンプル技術を適用: CLIP は分類にゼロサンプル技術を使用します。つまり、目に見えないカテゴリに基づいて分類します。画像とテキストの関係を学習することで、CLIP は、トレーニング段階でそのカテゴリの画像サンプルを確認していなかった場合でも、指定されたテキストの説明に基づいて画像が特定のカテゴリに属する​​かどうかを判断できます。

これら 3 つの方法を通じて、CLIP は強力なテキストと画像の関連付け機能を実現し、画像分類、画像生成、画像検索などの複数の分野に適用できます。

4.1.1. 比較事前トレーニング

対照的な事前トレーニング段階では、CLIP アルゴリズムは次の手順でトレーニングされます。

  • サイズ 32768 の画像とテキストのバッチをペアにし、テキスト エンコーダー画像エンコーダーを通じてそれぞれのベクトル表現を生成します。

  • トレーニング中に、各画像に対応する最も近いテキスト表現をバッチ全体で検索することにより、実際の画像とテキストのペア間のコサイン類似性が最大化されます。これは、実際の画像と最も関連性の高いテキストを一致させることを意味します。

  • 同時に、実際の画像と他のすべてのテキストの間のコサイン類似性を最小限に抑えることにより、実際の画像と他のテキストが区別されます。これにより、実際の画像がベクトル空間内の他のテキストから遠く離れた場所に配置されます。

  • 最後に、モデルは、以前に計算された類似性スコアを最適化することにより、対称クロスエントロピー損失を使用してトレーニングされます。この損失関数により、実際の画像とそれに関連付けられたテキストとの類似性が高く、他のテキストとの類似性が低いことが保証されます。

この対照的な事前トレーニング段階を通じて、CLIP アルゴリズムは画像とテキストの相関関係を学習し、それらを統合できるベクトル表現を生成できます。

4.1.2. 注釈付きテキストからデータセット分類子を作成する

注釈付きテキストからデータセット分類子を作成するプロセスは次のとおりです。

1). すべてのタグ/オブジェクトを特定のコンテキスト形式「{object} の写真」にエンコードします。各オブジェクトはテキスト エンコーダを通過してベクトル表現を生成します。

2). データセットのカテゴリーとして犬、車、飛行機があると仮定すると、次のコンテキスト表現が生成されます。

  • 犬の写真

  • 車の写真

  • 飛行機の写真

このようにして、各カテゴリは、そのカテゴリの画像を説明するために使用される特定の文脈表現に対応します。このようにして、これらのコンテキスト表現を使用して、画像の特徴に基づいて画像が属するカテゴリを予測できるデータセット分類器をトレーニングできます。

4.1.3. ゼロサンプル予測を使用する

ゼロショット予測を使用する段階では、セクション 2 の出力を使用して、各画像ベクトルがどのコンテキスト ベクトルに対応するかを決定します。ゼロサンプル予測法を使用すると、目に見えないデータに対する CLIP モデルの汎化能力を向上させることができます。

CLIP モデルは、ゼロショット予測を通じて、以前に学習した画像とテキスト間の相関関係を新しい画像データに適用できます。これは、モデルがトレーニング中にこれらの新しい画像を認識していない場合でも、画像ベクトルとコンテキスト ベクトルの間の類似性に基づいてそれらの一致関係を予測できることを意味します。

ゼロショット予測を使用する利点は、CLIP モデルが目に見えないデータに対してより適切に一般化できることです。これは、新しい画像データに直面した場合でも、モデルは再トレーニングや注釈を必要とせずにそれらを正確に識別して分類できることを意味します。これにより、モデルの適用とプロモーションの柔軟性と拡張性が向上します。

5. Pythonを使用してCLIPを実装する

CLIP のアーキテクチャと動作原理を理解したところで、2 つの実際のシナリオを実装して CLIP の使用方法を示します。まず、自然言語を使用して画像検索を行う方法を学び、次に画像を使用して画像検索を行う方法を学びますこのプロセスが終わるまでに、これらのユースケースでベクター データベースを使用する利点が理解できるようになります。

5.1. ユースケースの一般的なワークフロー

以下のワークフローを通じてエンドツーエンドのプロセスを説明します。Hugging Faceデータセットからデータを取得し、画像エンコーダーとテキスト エンコーダーを使用してそれを処理し、ベクトル表現を生成します。最後に、Pinecone クライアントを使用して、これらのベクトルをベクトル インデックスに挿入します。

ユーザーはテキストまたは別の画像に基づいて画像を検索できます。具体的なプロセスは次のとおりです。

1).データセットの収集: ハグ顔データセットから必要なデータを取得します。

2)画像とテキストのエンコード: CLIP の画像エンコーダとテキスト エンコーダを使用して、画像とテキストをエンコードし、対応するベクトル表現を生成します。

3)ベクトル インデックス: Pinecone クライアントを使用して、生成されたベクトル表現をベクトル インデックスに挿入します。

4)画像検索: ユーザーはテキストまたは別の画像に基づいて検索し、類似性スコアを計算することで最も一致する画像を見つけることができます。

このプロセスを通じて、CLIP モデルの機能を活用して、テキストベースの検索であっても画像ベースの検索であっても、画像検索機能を実装できます。この方法は、クエリに関連する画像を迅速かつ正確に見つけるのに役立ち、柔軟性と拡張性に優れています。

5.2. 前提条件

CLIPを実装するには以下のライブラリをインストールする必要があります。

インストールライブラリ

!pip install -qU transformers torch datasets gdcm pydicom pinecone-client

必要な依存ライブラリをインポートする

import os
import torch
import skimage
import requests
import numpy as np
import pandas as pd
from PIL import Image
from io import BytesIO
import IPython.display
import matplotlib.pyplot as plt
from datasets import load_dataset
from collections import OrderedDict
from transformers import CLIPProcessor, CLIPModel, CLIPTokenizer

5.3. データの取得と探索

コンセプト字幕データセットには約 330 万枚の画像が含まれており、画像 URL対応する字幕という2 つの主要な列があります。対応するハグフェイスのリンクから詳細を確認できます。

# https://huggingface.co/datasets/conceptual_captions
image_data = load_dataset("conceptual_captions", split="train")

5.3.1. データの前処理

データセット内のすべての URL が有効であるわけではありません。この問題を解決するために、不正な URL エントリをテストして削除します。

"""
并非所有的URL都是有效的。如果URL有效,该函数返回True;否则返回False。 
"""
def check_valid_URLs(image_URL):

    try:
      response = requests.get(image_URL)
      Image.open(BytesIO(response.content))
      return True
    except:
      return False

def get_image(image_URL):
    response = requests.get(image_URL)
    image = Image.open(BytesIO(response.content))

    # 如果图像有透明度通道,则转换为RGBA格式
    if image.mode == "P" and "transparency" in image.info:
        image = image.convert("RGBA")
    else:
        image = image.convert("RGB")

    return image

def get_image_caption(image_ID):

    return image_data[image_ID]["caption"]

以下のコードは、URL が有効な場合は True、それ以外の場合は False となる新しい列「is_valid」を持つ新しいデータフレームを作成します。

# 转换 dataframe
image_data_df["is_valid"] = image_data_df["image_url"].apply(check_valid_URLs)
# 获取有效的URL
image_data_df = image_data_df[image_data_df["is_valid"]==True]
# 从URL获取图像
image_data_df["image"] = image_data_df["image_url"].apply(get_image)

次に、URL から画像をダウンロードします。これにより、頻繁なネットワーク要求が回避されます。

5.3.2. 画像とテキストの埋め込み実装

エンコーダーを正常に実装するには、モデル、プロセッサー、トークナイザーを使用する必要があります。次の関数はこれらの要件を満たし、指定されたモデル ID とデバイス (CPU または GPU) に基づいて対応するエンコーダーを作成します。

def get_model_info(model_ID, device):
  # 将模型保存到设备上
  model = CLIPModel.from_pretrained(model_ID).to(device)
  # 获取处理器
  processor = CLIPProcessor.from_pretrained(model_ID)
  # 获取分词器
  tokenizer = CLIPTokenizer.from_pretrained(model_ID)
  # 返回模型、处理器和分词器
  return model, processor, tokenizer

# 设置设备
device = "cuda" if torch.cuda.is_available() else "cpu"
# 定义模型ID
model_ID = "openai/clip-vit-base-patch32"
# 获取模型、处理器和分词器
model, processor, tokenizer = get_model_info(model_ID, device)

5.3.3. テキストの埋め込み

まず個々のテキストの埋め込みを生成し、次に同じ関数をデータセット全体に適用します。

def get_single_text_embedding(text):
  inputs = tokenizer(text, return_tensors = "pt").to(device)
  text_embeddings = model.get_text_features(**inputs)
  # 将嵌入转换为NumPy数组
  embedding_as_np = text_embeddings.cpu().detach().numpy()

  return embedding_as_np

def get_all_text_embeddings(df, text_col):
   df["text_embeddings"] = df[str(text_col)].apply(get_single_text_embedding)
   return df 

# 将这些函数应用于数据集
image_data_df = get_all_text_embeddings(image_data_df, "caption")
image_data_df.head()

最初の 5 行は次のようになります。

5.3.4. 画像の埋め込み

画像の埋め込みでは同じプロセスを使用しますが、異なる機能を使用します。

def get_single_image_embedding(my_image):
  image = processor(
      text = None,
      images = my_image, 
      return_tensors="pt"
  )["pixel_values"].to(device)

  embedding = model.get_image_features(image)
  # 将嵌入转换为NumPy数组
  embedding_as_np = embedding.cpu().detach().numpy()

  return embedding_as_np

 def get_all_images_embedding(df, img_column):
  df["img_embeddings"] = df[str(img_column)].apply(get_single_image_embedding)
  return df

image_data_df = get_all_images_embedding(image_data_df, "image")
image_data_df.head()

テキストと画像のベクトル インデックスの最終的な形式は次のとおりです。

5.4. ベクトルの保存方法 - ローカル ベクトル インデックスとクラウドベースのベクトル インデックス

このセクションでは、ベクトルの保存と検索に対する 2 つの異なるアプローチについて説明します。1つはベクトルのインデックス作成にローカル データ フレームを使用しもう 1 つはクラウドベースのベクトルのインデックス作成に Pinecone を使用しますどちらの方法でもコサイン類似度測定を使用します。

5.4.1. ローカルデータフレームをベクトルインデックスとして使用する

ヘルパー関数get top N_images は、ワークフローで説明されている 2 つのケース (テキストから画像への検索または画像から画像への検索) に関連する同様の画像を生成できます。

from sklearn.metrics.pairwise import cosine_similarity

def get_top_N_images(query, data, top_K=4, search_criterion="text"):

    """
    检索与查询相似的前K篇文章(默认值为5)
    """
    # 文本到图像搜索
    if(search_criterion.lower() == "text"):
      query_vect = get_single_text_embedding(query)

    # 图像到图像搜索
    else: 
      query_vect = get_single_image_embedding(query)

    # 相关列
    revevant_cols = ["caption", "image", "cos_sim"]

    # 运行相似度搜索
    data["cos_sim"] = data["img_embeddings"].apply(lambda x: cosine_similarity(query_vect, x))

    data["cos_sim"] = data["cos_sim"].apply(lambda x: x[0][0])

    """
    按余弦相似度列降序排序 
    在排序时从1开始,以排除与自身的相似度(因为它始终为1)
    """
    most_similar_articles = data.sort_values(by='cos_sim', ascending=False)[1:top_K+1]

    return most_similar_articles[revevant_cols].reset_index()

画像を推奨する方法を見てみましょう。

  • ユーザーは検索基準としてテキストまたは画像を指定し、デフォルトでモデルはテキストから画像への検索を実行します。

  • 行 20 では、各画像ベクトルとユーザー入力ベクトルの間のコサイン類似度が計算されます。

  • 最後に、28 行目で、結果は類似性スコアに基づいて降順に並べ替えられ、クエリ自体に対応する最初の画像を除いて、最も類似した画像が返されます。

5.4.2. 検索例

この補助機能により、推奨画像を簡単に視覚化できます。各画像には、対応するキャプションと類似性スコアがあります。

import matplotlib.pyplot as plt
import numpy as np

def plot_images(images):

  for image in images:
    plt.imshow(image)
    plt.show()

def plot_images_by_side(top_images):

  index_values = list(top_images.index.values)
  list_images = [top_images.iloc[idx].image for idx in index_values] 
  list_captions = [top_images.iloc[idx].caption for idx in index_values] 
  similarity_score = [top_images.iloc[idx].cos_sim for idx in index_values] 

  n_row = n_col = 2

  _, axs = plt.subplots(n_row, n_col, figsize=(12, 12))
  axs = axs.flatten()
  for img, ax, caption, sim_score in zip(list_images, axs, list_captions, similarity_score):
      ax.imshow(img)
      sim_score = 100*float("{:.2f}".format(sim_score))
      ax.title.set_text(f"Caption: {caption}\nSimilarity: {sim_score}%")
  plt.show()

5.5. テキストを画像に変換

  • まず、ユーザーは検索用のテキストを入力します。

  • 次に、類似性検索を実行します。

  • 最後に、アルゴリズムによって推奨される画像をプロットします。

query_caption = image_data_df.iloc[8].caption

top_images = get_top_N_images(query_caption, image_data_df)
print("Query: {}".format(query_caption))
top_images

plot_images_by_side(top_images)

3 行目では次のテキストが生成されます。

質問: スポーツ チームのメンバーは、試合中に別のスポーツ チームと対戦します。

9 行目では、次のプロット結果が生成されます。

5.6. 画像から画像へ

同じプロセスが画像間の検索にも適用されます。唯一の違いは、ユーザーが字幕の代わりに画像を提供することです。

query_image = image_data_df.iloc[27].image
query_image

top_images = get_top_N_images(query_image, image_data_df, search_criterion="image")
plot_images_by_side(top_images)

検索条件を指定することでノイズを軽減できます。たとえば、クエリ画像と少なくとも 60% 類似している画像のみを考慮します。

最終結果を以下に示します。

5.7. Pinecone を使用してベクトルインデックスを管理する機能

Pinecone は、高性能のベクトル検索アプリケーションを簡単に構築できる、フルマネージドの簡単に拡張可能なベクトル データベースを提供します。このセクションでは、Pinecone API 認証情報の取得から検索エンジンの実装までの手順を説明します。

5.7.1. Pinecone API の取得

Pinecone Web サイトから API 認証情報を取得する 8 つの手順を次に示します。

5.7.2. 構成ベクトルインデックス

作成、更新、削除、挿入操作を実行するインデックスを作成できます。

pinecone.init(
    api_key = "<YOUR_API_KEY>",  # app.pinecone.io 
    environment="us-west1-gcp-free"
)

my_index_name = "clip-image-search"
vector_dim = image_data_df.img_embeddings[0].shape[1]

if my_index_name not in pinecone.list_indexes():
  # 创建向量维度
  pinecone.create_index(name = my_index_name, 
                        dimension=vector_dim, 
                        metric="cosine", shards=1,
                        pod_type='s1.x1')

# 连接到索引
my_index = pinecone.Index(index_name = my_index_name)
  • pinecone.initセクションは、後続の対話のために Pinecone ワークスペースを初期化します。

  • 6 行目から 7 行目では、作成するベクトル インデックスの名前とベクトルの次元 (このシナリオでは 512) を指定します。

  • 9 行目から 14 行目では、インデックスが存在しない場合はインデックスを作成します。

以下の出力では、インデックスにデータがないことがわかります。

my_index.describe_index_stats()

次元が 512 であることだけがわかっています。

{'dimension': 512, 
           'index_fullness': 0.0, 
            'namespaces': {}, 
'total_vector_count': 0}

5.7.3. データベースにデータを入力する

Pinecone データベースの構成が完了したので、次のステップでは、次のコードをデータベースに入力します。

image_data_df["vector_id"] = image_data_df.index
image_data_df["vector_id"] = image_data_df["vector_id"].apply(str)

# 获取所有元数据
final_metadata = []

for index in range(len(image_data_df)):
  final_metadata.append({
      'ID':  index,
      'caption': image_data_df.iloc[index].caption, 
      'image': image_data_df.iloc[index].image_url
  })

image_IDs = image_data_df.vector_id.tolist()
image_embeddings = [arr.tolist() for arr in image_data_df.img_embeddings.tolist()] 

# 创建以字典格式插入的单个列表
data_to_upsert = list(zip(image_IDs, image_embeddings, final_metadata))

# 上传最终数据
my_index.upsert(vectors = data_to_upsert)

# 检查每个命名空间的索引大小
my_index.describe_index_stats()

ここで何が起こっているのかを理解しましょう。

挿入されるデータには、各観測の一意の識別子 (ID)、埋め込みリスト、および保存されるデータに関する追加情報を含むメタデータの 3 つの部分が必要です。

  • 7行目から12行目までは、各観測の「ID」「字幕」「URL」を格納してメタデータを作成しています。

  • 14 行目と 15 行目では、ID のリストを生成し、埋め込みをリストのリストに変換します。

  • 次に、ID、埋め込み、メタデータを相互にマッピングする辞書のリストを作成します。

  • 最後に、.upsert() 関数を使用してデータをインデックスに挿入します。

前のシナリオと同様に、.myindex.describeindex_stats ()を使用して、すべてのベクトルが挿入されたかどうかを確認できます。

5.7.4. クエリの開始

残っているのは、テキストから画像への検索と画像から画像への検索を使用してインデックスをクエリすることだけです。どちらも次の構文を使用します。

my_index.query(my_query_embedding, top_k=N, include_metadata=True)
  • 私のクエリの埋め込みは、ユーザーが指定したクエリ(字幕または画像)の(リストとしての)埋め込みです。

  • N は、返される結果の数に対応します。

  • include_metadata=True は、クエリ結果にメタデータを含めることを示します。

5.7.5. テキストを画像に変換

text_query = image_data_df.iloc[8].caption

# 获取标题嵌入
query_embedding = get_single_text_embedding(text_query).tolist()

# 运行查询
my_index.query(query_embedding, top_k=4, include_metadata=True)

以下はクエリによって返される JSON 応答です。

「matches」属性から、クエリによって返された最も類似した 4 つの画像を観察できます。

5.7.6、画像から画像へ

画像間の検索でも同じアプローチが機能します。

image_query = image_data_df.iloc[9].image

これは、ユーザーが検索条件として提供した画像です。

# 获取标题嵌入
query_embedding = get_single_image_embedding(image_query).tolist()

# 运行查询
my_index.query(query_embedding, top_k=4, include_metadata=True)

リソースを解放するために完了したら、忘れずにインデックスを削除してください。

pinecone.delete_index(my_index)

6. ローカルの pandas データ フレームの代わりに Pinecone を使用する利点は何ですか?

この方法で Pinecone を使用すると、いくつかの利点があります。

  • シンプルさ: 最初の方法と比較して、クエリ方法は単純であり、ユーザーはベクトル インデックスを管理する必要がありません。

  • 速度: 松ぼっくり方式はより高速で、ほとんどの業界のニーズに適しています。

  • スケーラビリティ: Pinecone でホストされているベクター インデックスは、追加の作業を必要とせずに簡単にスケーリングできます。そして、最初のアプローチは、規模が拡大するにつれてますます複雑になり、時間がかかります。

  • 情報損失の可能性が低い: 松ぼっくりベースのベクトル インデックスは、バックアップと高度な情報セキュリティを備えたクラウドでホストされています。最初のアプローチは、運用環境ではよりリスクが高くなります。

  • Web サービスに優しい: クエリ結果は JSON 形式で返され、Web サービスに簡単に統合できます。

7. 結論

この記事では、画像と自然言語を使用して完全な画像検索アプリケーションを実装する方法について詳しく説明します。まず、必要なライブラリやデータセットなどの前提条件について説明します。次に、テキストと画像の埋め込みを実装する方法と、データの前処理を実行する方法を学びました。次に、ローカル データ フレームとクラウドベースのベクトル インデックスの使用を含む、ベクトル ストレージへの 2 つの異なるアプローチを検討しました。また、テキストから画像への検索と画像から画像への検索を実行する方法も示し、Pinecone を使用したベクトル インデックス管理の方法も示します。最後に、ローカル データ フレームよりも Pinecone を使用する利点を要約し、関連リソースをさらに学習することをお勧めします。この記事を学ぶことで、読者は高性能の画像検索アプリケーションを構築する方法を習得し、それを実際のプロジェクトに適用することができます。

  • Jupyter Notebook の完全なコード:

https://github.com/Crossme0809/frenzyTechAI/blob/main/clip-search/OpenAI CLIP を使用したテキストから画像への検索および画像から画像への検索.ipynb

参考文献

[1] A. Radford、JW Kim、他、自然言語監督からの転送可能な視覚モデルの学習(2021)

[2] A. Vaswani 他、「Attention Is All You Need」(2017 年)、NeurIPS

この記事に興味があり、AI 分野の実践的なスキルについて詳しく知りたい場合は、「Technology Frenzy AI」公開アカウントをフォローしてください。ここでは、AIGC 分野の最新の注目記事や実践的な事例チュートリアルをご覧いただけます。

おすすめ

転載: blog.csdn.net/FrenzyTechAI/article/details/132696135