CLIP

CLIPは、画像とテキストの埋め込みを生成できる機械学習モデルです。これらの埋め込みは、ゼロショット分類やセマンティック画像検索など、さまざまなユースケースで利用できます。Roboflow Inference ServerでCLIPを利用するためのルートは3つあります。

  • embed_image: 画像埋め込みの計算に使用します

  • embed_text: テキスト埋め込みの計算に使用します

  • compare: テキストと画像の埋め込みを計算し比較するために使用します

Embed Image

画像を埋め込むことは、その画像の情報をより扱いやすいサイズに圧縮するようなものです。画像を埋め込む際、何万ものピクセルからなる画像を入力として受け取り、数百個の数値(埋め込み)にまとめます。これらの埋め込みは人間の目には特に意味があるものではありませんが、他の埋め込みと比較することで非常に有用になります。

CLIPとRoboflow Inference Serverを使って画像埋め込みを生成するには:

#リクエストペイロードの定義
infer_clip_payload = {
    #画像はURLまたはbase64エンコード文字列として提供できます
    "image": {
        # "type"は"base64"にもできます
        "type": "url",
        # "value"は画像データのbase64エンコード文字列にもできます
        "value": "https://images.freeimages.com/images/large-previews/36c/raccoons-in-the-wild-4-1624830.jpg",
    },
}

# 推論サーバーのURLを定義します(localhost:9001, infer.roboflow.comなど)
base_url = "https://infer.roboflow.com"

# Roboflow APIキーを定義します
api_key = <YOUR API KEY HERE>

res = requests.post(
    f"{base_url}/clip/embed_image?api_key={api_key}",
    json=infer_clip_payload,
)

embeddings = res.json()['embeddings']

print(embeddings)
[[-0.4853120744228363, ... ]]

1回のリクエストで複数の画像を埋め込むことができます:

#リクエストペイロードの定義
infer_clip_payload = {
    #画像はURLまたはbase64エンコード文字列として提供できます
    "image": [
        {
            "type": "url",
            "value": "https://images.freeimages.com/images/large-previews/36c/raccoons-in-the-wild-4-1624830.jpg",
        },
        {
            "type": "url",
            "value": "https://images.freeimages.com/images/large-previews/36c/raccoons-in-the-wild-4-1624830.jpg",
        }
    ],
}

res = requests.post(
    f"{base_url}/clip/embed_image?api_key={api_key}",
    json=infer_clip_payload,
)

Embed Text

CLIPは画像と同様にテキストの埋め込みも生成できます。

#リクエストペイロードの定義
infer_clip_payload = {
    "text": "the quick brown fox jumped over the lazy dog",
}

res = requests.post(
    f"{base_url}/clip/embed_text?api_key={api_key}",
    json=infer_clip_payload,
)

embeddings = res.json()['embeddings']

print(embeddings)
[[0.56842650744228363, ... ]]

複数のテキストブロックを1つのリクエストでまとめて処理できます:

#リクエストペイロードの定義
infer_clip_payload = {
    "text": [
        "the quick brown fox jumped over the lazy dog",
        "how vexingly quick daft zebras jump"
    ]
}

res = requests.post(
    f"{base_url}/clip/embed_text?api_key={api_key}",
    json=infer_clip_payload,
)

Compare

CLIPの真価は埋め込みを比較することで発揮されます。比較は、コサイン類似度を使って2つの埋め込み間の数学的距離を計算します。この距離は類似度スコアと考えることができます。2つの埋め込みのコサイン類似度が1に近い場合、それらは似ていると言えます。

比較を行う際は、プロンプトと1つまたは複数のサブジェクトを定義します。テキストや画像の任意の組み合わせを比較できるため、プロンプトタイプとサブジェクトタイプも定義する必要があります。

#リクエストペイロードの定義
infer_clip_payload = {
    "prompt": {
        "type": "url",
        "value": "https://images.freeimages.com/images/large-previews/36c/raccoons-in-the-wild-4-1624830.jpg",
    },
    "prompt_type": "image",
    "subject": "A very cute raccoon",
    "subject_type": "text",
}

res = requests.post(
    f"{base_url}/clip/compare?api_key={api_key}",
    json=infer_clip_payload,
)

similarity = res.json()['similarity']

print(similarity)
[0.30969720949239016]

複数のプロンプト(1リクエストにつき最大8つ)をリストとして渡すことができます:

infer_clip_payload = {
    "subject": {
        "type": "url",
        "value": "https://i.imgur.com/Q6lDy8B.jpg",
    },
    "subject_type": "image",
    "prompt": [
        "A very cute raccoon",
        "A large dog",
        "A black cate",
    ],
    "prompt_type": "text",
}
[0.80559720949239016, 0.20329720949239016, 0.505559720949239016]

Last updated

Was this helpful?