利用clip-retrieval自动化收集图像并用于模型引导

自动化图像收集

图像收集使我们能够以新颖且激动人心的方式定制强大的机器学习模型。例如,某平台上的一些文本到图像模型可以使用现有图像进行引导。当我们希望将视觉模型引导至特定场景或美学风格时,这个功能非常有用,但前提是我们需要有自己的示例图像。

我是一名研究者。在这篇文章中,我将展示如何使用一个名为 clip-retrieval 的 pip 包,从 LAION-5B 数据集中收集数百张图像(及其标题)。我们将探讨如何收集与文本描述匹配或与现有图像风格相似的图像。

clip-retrieval 由 LAION 的另一位成员开发。它通过 CLIP 对 LAION 数据集中的数十亿图像和标题进行嵌入来实现。利用 k-NN 和 autofaiss 技术,我们可以在这些嵌入上创建一个内存索引,并获得相当快的检索速度。如果你对技术层面的工作原理感兴趣,建议阅读相关文章《使用嵌入进行语义搜索:为任何内容建立索引》。

开始使用

首先安装 clip-retrieval:

pip install clip-retrieval

它允许我们使用 ClipRetrieval.ClipClient 类查询预构建的 CLIP faiss 索引。默认情况下,查询会发送到由某机构构建的、基于 LAION-5B 的免费托管 knn 索引。

我们可以设置自定义的返回图像数量 num_images。现在先设为 400。

from clip_retrieval.clip_client import ClipClient, Modality

laion5b_search_client = ClipClient(
    url="https://knn5.laion.ai/knn-service", # url 可能变动,请查看 github.com/rom1504/clip-retrieval
    indice_name="laion5B",
    num_images=400,
)

使用文本查询 LAION-5B

设置完成后,我们可以查询后端:

results = laion5b_search_client.query(text="fresh avocado, digital art")

响应将是一个包含标题、URL 和相似度的 JSON 结果数组。

[
  {
    "caption": "Авокадо",
    "url": "https://t1.ftcdn.net/jpg/00/79/43/44/240_F_79434473_qNSi5WUEi8y3oFrwPjupQvxbUIzXY7mE.jpg",
    "id": 4540616960,
    "similarity": 0.5977489948272705
  } // ...更多结果
]

由于 API 会去重,我们不会正好得到 400 个结果。

print(len(cat_results))
# 输出:321

但是,321 个结果也相当不错!

使用文本到图像模型获取图像变体

这可以作为为各种文本到图像模型寻找良好初始图像的一种方法。初始图像可以引导文本到图像模型生成原始图像的不同变体,并受指定提示词的影响。在某些情况下,使用初始图像甚至可以使模型运行得更快。

我们可以使用某平台轻松探索初始图像的效果。首先,在该平台上进行设置:

pip install replicate

从此处获取你的 API 令牌,然后将其设置为环境变量。

export REPLICATE_API_TOKEN=...

现在,我们可以远程运行文本到图像模型了!这里使用一个名为“afiaka87/glid-3-xl”的照片级写实图像模型,它接受提示词和一个 init_image 参数。init_image 参数方便地接受 URL,因此无需预先下载 clip-retrieval 的结果。让我们使用搜索结果的第一个图像作为初始图像:

model = replicate.models.get("afiaka87/glid-3-xl")
version = model.versions.get("d74db2a276065cf0d42fe9e2917219112ddf8c698f5d9acbe1cc353b58097dab")
text2image_generations = list(
    version.predict(
        prompt="fresh avocado, digital art",
        guidance_scale=10.0,
        batch_size=3,
        init_image="https://t1.ftcdn.net/jpg/00/79/43/44/240_F_79434473_qNSi5WUEi8y3oFrwPjupQvxbUIzXY7mE.jpg",
        steps=100,
        init_skip_fraction=0.5,
        seed=0,
    )
)[
    -1
]  # 抓取最终生成结果 - 不需要中间输出。
print(text2image_generations)

使用图像查询 LAION-5B

使用 clip-retrieval 可以做的另一件很酷的事情是,拿一张现有图像并尝试找到与之相似的图像。

为此,我们需要 CLIP。让我们加载 CLIP,并添加一些将 torch 张量转换为 clip-retrieval 所需的 numpy 数组的辅助方法。
你可以在官方的 clip_retrieval.clip_client 笔记本中找到类似的示例和用法。

加载 CLIP

import clip
import torch

model, preprocess = clip.load("ViT-L/14", device="cpu", jit=True)

import urllib
import io
import numpy as np
from PIL import Image

def download_image(url):
    urllib_request = urllib.request.Request(
        url,
        data=None,
    )
    with urllib.request.urlopen(urllib_request, timeout=10) as r:
        img_stream = io.BytesIO(r.read())
    return img_stream

def get_image_emb(image_url):
    with torch.no_grad():
        image = Image.open(download_image(image_url))
        image_emb = model.encode_image(preprocess(image).unsqueeze(0).to("cpu"))
        image_emb /= image_emb.norm(dim=-1, keepdim=True)
        image_emb = image_emb.cpu().detach().numpy().astype("float32")[0]
        return image_emb

将你的图像转换为 CLIP 嵌入,并将嵌入传递给 clip-retrieval

现在,我们使用图像作为输入并将其转换为图像嵌入,而不是使用文本作为输入并将其转换为文本嵌入。

让我们以这张身穿蓝色连衣裙的模特图像为例,寻找一些相似的图像。

blue_dress_image_emb = get_image_emb("https://rukminim1.flixcart.com/image/612/612/kv8fbm80/dress/b/5/n/xs-b165-royal-blue-babiva-fashion-original-imag86psku5pbx2g.jpeg?q=70")
blue_dress_results = laion5b_search_client.query(embedding_input=blue_dress_image_emb.tolist())
blue_dress_results

同样,响应将是一个包含标题、URL 和相似度的 JSON 结果数组。

[
  {
    "caption": "8c7889e0b92b Cinderella Divine 1295 Long Chiffon Grecian Royal Blue Dress Mid Length  Sleeves V Neck ...",
    "id": 2463946620,
    "similarity": 0.9428964853286743,
    "url": "https://cdn.shopify.com/s/files/1/1417/0920/products/1295cd-royal-blue_cfcbd4bc-ed74-47c0-8659-c1b8691990df.jpg?v=1527650905"
  },
  {
    "caption": "Classy V-Neck A-Line Floor Length Zipper-Up Mother Of the Bride Dress",
    "id": 717054383,
    "similarity": 0.9329575896263123,
    "url": "http://images.ericdress.com/Upload/Image/2014/44/270-360/0e842524-2bf0-44ef-be20-e9a6478db283.jpg"
  }
  // ...
]

第一个结果是“Cinderella Divine 1295 Long Chiffon Grecian Royal Blue Dress Mid Length Sleeves V Neck”。

最后总结

使用文本和图像查询 LAION-5B 只是 clip-retrieval 可以做的几件事情。

深度学习的关键优势之一是,只要有足够的数据,我们就可以扩展或微调模型以提高通用和/或特定任务(“下游”)的性能。借助 clip-retrieval,使用你自己筛选的数据来微调模型现在成为可能。我们正在撰写一篇未来的博客文章,向你展示如何微调你自己的模型并在某平台上运行它们。敬请期待!

当然,还有其他用例。如果你有任何其他很酷的想法,请在某平台的 Discord 上联系。很乐意听取你的想法!
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

posted @ 2025-12-23 22:59  CodeShare  阅读(0)  评论(0)    收藏  举报