导读
你是否曾疑惑,为什么电脑总觉得一张坐着的狗和一张站着的狗是完全不同的两张图?今天,我们来聊聊一个能让电脑像人类一样感知图像相似度的新模型------DreamSim。>>更多资讯可加入CV技术群获取了解哦
咱们来聊聊图像相似度这事儿。说起来简单,其实里头门道可深了。我一直琢磨一个问题 :怎么让电脑能像人一样,觉得两张图"看起来很像"? 这事儿真没听起来那么容易。
老方法 vs. 聪明方法:各有各的短板
- 像素级较真的"老黄牛"
一方面,有些老牌标准,比如PSNR或者SSIM。它们玩的是像素级对比,死磕原始像素值、颜色和纹理。检查压缩痕迹挺好用,但只要照片里的东西稍微动一下,它们就懵了。比如一张狗坐着的照片和同一只狗站着的照片?对这些标准来说,简直是天壤之别。
- 高瞻远瞩的"语义大师"
然后呢,还有那些高段位的语义模型,比如CLIP。这些家伙很聪明,能理解图片里有什么。它们知道"狗"就是"狗",不管姿势或背景怎么变。但有时候聪明反被聪明误,会忽略更细致的视觉细节。它们看到一张金毛的照片和一张贵宾犬的素描,可能会说:"对,都是狗。"这没错,但并不总是我们想要的结果。
- 被遗忘的"中间地带"
麻烦就麻烦在这儿。那些中间层面 的东西怎么办?就是研究人员说的中阶特征。我指的是布局、物体姿态、场景里物品的数量、整体形状和构图这些。这些细微差别,人眼一眼就能看出来,但机器一直搞不定。而这恰恰就是DreamSim想要填补的空缺。
DreamSim:博采众长的"专家会诊"
- DreamSim的核心思路是什么?
DreamSim不是要另起炉灶,而是很聪明地把已有的老牌嵌入模型(CLIP, DINO, OpenCLIP)拿来,融合起来。就像请了一个专家团:
- CLIP 擅长语义理解(知道是啥)。
- DINO 擅长在不依赖标签的情况下理解物体形状和纹理。
把它们的"看法"(嵌入向量)拼接起来,你就能得到一个更丰富、更全面的视图。

但真正的魔法在这里:这个融合后的结果,会用海量的人类主观判断数据进行微调。这就是独门秘籍。模型不仅仅是从原始数据中学习,而是在学习像我们人类一样去看图像。
用人类的审美来训练:NIGHTS数据集
这大概是整个项目最有趣的部分了。你怎么创建一个关于"人类视觉相似度"的数据集呢?
DreamSim的创造者想出了一个绝妙的办法。他们用AI扩散模型 生成了一个巨大的图像三元组数据集(NIGHTS)。每个三元组包含:
- 一张参考图片
- 两张经过不同处理的版本(图A和图B)
这些处理不是随便加噪点,而是针对性地改变一些东西,比如相机角度、物体颜色、物品数量或者主体姿态。

然后,他们把这些三元组拿给真人看,问一个简单的问题:"哪张图,A还是B,看起来和参考图更相似?"
他们收集了大约2万份这种人类判断高度一致的数据。模型就被训练着让它自己计算出的"距离分数",能够符合人类的选择。这简直就是在学着让它自己的 "感知"和我们保持一致。
上手实战:两种方式,轻松使用
DreamSim最棒的一点就是特别好用。pip install dreamsim 就搞定了。装好之后,主要有两种用法:
- 直接计算距离(简单粗暴)
当你只想直接比较两张图的时候用这个。
python
from dreamsim import dreamsim
from PIL import Image
# 加载模型(第一次会自动下载权重)
model, preprocess = dreamsim(pretrained=True, device="cuda")
# 加载并预处理图片
img1 = preprocess(Image.open("我的狗.jpg"))
img2 = preprocess(Image.open("邻居的狗.jpg"))
# 获取距离值:分数越低,越相似!
distance = model(img1, img2)
print(f"电脑觉得这两张狗的相似度分数是:{distance.item()}")
- 嵌入向量助力海量检索(高效专业)
如果你有一个包含成千上万图片的数据库,比如做以图搜图或者相似商品推荐,逐对比较会慢得让人抓狂。
这时候嵌入向量就派上用场了。你可以为数据库里的每张图片预计算一个特征向量(嵌入向量)并存起来。
ini
# 为每张图片预计算一个'数字指纹'(嵌入向量)
embedding = model.embed(preprocessed_image)
# 把这个 embedding 存到数据库里
当用户查询时,只需计算查询图片的向量,然后快速比对数据库中所有向量的余弦相似度即可,效率极高!
速度与精度的权衡:总有一款适合你
- 全能冠军(默认集成模型): 精度最高,与人类判断一致性可达96%以上,适合对精度要求高的场景。
- 轻量快手(单分支模型): 比如只使用DINO主干,速度提升近3倍,精度略有牺牲,适合需要快速响应的应用。
你可以像点菜一样选择模型:
ini
model, preprocess = dreamsim(pretrained=True, dreamsim_type="dino_vitb16")
总结:为什么DreamSim值得关注?
说到底,DreamSim就是一个能更好地理解图像相似度的工具。它填补了像素级对比和纯语义对比之间的空白。
- 它能理解背景颜色的改变没有主体姿态的改变重要。
- 它对物体形状、布局敏感,同时又不会完全迷失在"都是狗"的高层概念里。
对于任何构建近似重复检测、视觉产品搜索、智能相册整理系统的人来说,这都是一个非常趁手且强大的新工具。它让电脑的"视觉感知"向人类的直觉迈进了扎实的一步。
而且,它真的足够简单,一个pip命令,几行代码,你就能在自己的项目里用上它。