本地以图搜图可以把查询图和图库转换成同一种向量,再按余弦相似度排序。CLIP 适合试验语义相近的图片检索,例如在自有图库中寻找同类主体;它不是精确文件去重,也不保证找到同一商品型号。
先建一个能人工看完的小图库
创建 gallery 文件夹,放入约十张自有 JPG 或 PNG,包含你希望命中的图片和几个明显不同的对照。另存 query.jpg。先记录至少一张你认为应排在前面的图,结果出来后有据可比。

python -m pip install torch "transformers==4.57.1" pillow
在 Python 3.11 环境使用 CPU,首次从 Hugging Face 获取模型。本文未运行 CLIP 图库推理,没有展示实测排序;代码采用 4.57.1 的 get_image_features 接口。
归一化后按相似度排序
保存为 search_images.py,运行 python search_images.py。
from pathlib import Path
from PIL import Image
import torch
from transformers import CLIPModel, CLIPProcessor
name = "openai/clip-vit-base-patch32"
model = CLIPModel.from_pretrained(name).eval()
processor = CLIPProcessor.from_pretrained(name)
def features(path):
with Image.open(path) as source:
image = source.convert("RGB")
inputs = processor(images=image, return_tensors="pt")
with torch.inference_mode():
vector = model.get_image_features(**inputs)
return vector / vector.norm(dim=-1, keepdim=True).clamp_min(1e-12)
files = sorted(p for p in Path("gallery").iterdir()
if p.suffix.lower() in {".jpg", ".jpeg", ".png"})
if not files:
raise ValueError("gallery has no supported images")
query = features("query.jpg")
database = torch.cat([features(p) for p in files], dim=0)
scores = (query @ database.T)[0]
order = torch.argsort(scores, descending=True)[:5]
for i in order.tolist():
print(files[i].name, round(float(scores[i]), 4))
每个向量先除以自身长度,再做点积,得到余弦相似度。查询图和图库必须使用同一模型与处理器;不能把不同模型的向量混在一张索引里。
怎样判断检索对当前任务有用
人工查看前五名,记录预先指定的相关图是否出现,以及无关图被排进来的原因。再换一个查询主体测试,避免只对一张图片满意。相似度是排序依据,不是“有多少概率属于同一物品”。
若商品外形很相近,语义检索可能把不同型号排在一起。需要核对商品身份时增加型号、包装文字或人工复核,不以分数差直接判定同款。
从示例扩展到大图库
本例逐张计算,适合小规模验证。图库增大时先缓存向量,并保存模型名称、处理器配置和图片文件对应关系;更新模型后重建相关向量。加载失败的图片应显式记录,不能从数量统计中悄悄消失。
想查像素相同或仅压缩变化的重复图片,选择文件哈希或感知哈希;想按文字选场景类别,则需要文本候选输入。二者都不等于这里的图像查询图库排序。
资料与适用范围
本文依据 2026 年 10 月 1 日读取的项目资料编写。安装后请记录实际依赖版本;版本升级时先用小样本核对接口和输出。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30695.html