图片表征的 SOTA 模型:DINO 系列演进与原理剖析

图片表征的 SOTA 模型:DINO 系列演进与原理剖析
本文主要对比了DINO系列v1/v2/v3和CLIP在图搜图任务上的表现。本文的核心结论CLIP是文搜图的标杆DINO是图搜图的标杆——DINO系列因专注于图像自监督学习更擅长图搜图CLIP基于图文语义对齐更适合文搜图。一、背景回顾一下最近在做影视内容相关的建设—希望用户在看完一个视频后能够自然找到下一集。这个任务经过拆解后得到一个子问题如何判断两张图片或两个视频帧在视觉上是相似的或者说包含相似内容前序对比 模型参数量越大越好用qwen-vl-embedding模型实践发现CLIP和 DINOv2的图片表征能力都比qwen-vl-embedding能力要强。那么CLIP和DINO系列模型在图片检索与分类找相似这个场景下究竟哪个更强一些二、方案设计为了验证图搜图领域各个模型的能力我设计了一个图搜图的检索实验。2.1 数据准备我使用了ImageNet的一个子集mini_imagenet这个子集有100个类别、共 70000张图其中60000张作为待检索的图片100个类别每个类别600张10000张作为query图片进行查询同样100个类别。评估方式是同类即正确query检索回来的邻居类别和它一致就算命中。2.2 模型选择我选择了DINO系列3个模型 CLIP进行对比全部统一到ViT-B/16量级保证骨干网络一致。模型模型卡VIT模型向量维度DINOv1facebook/dino-vitb16ViT-B/16768DINOv2facebook/dinov2-baseViT-B/16768DINOv3facebook/dinov3-vitb16-pretrain-lvd1689mViT-B/16768CLIPopenai/clip-vit-base-patch16ViT-B/165122.3 执行过程整个实验流程不复杂分四步走1、embedding计算各模型用自带的encoder把70000张图全部跑成向量输出做L2归一化。2、入库每个模型单独存储到一个Milvus collectiongallery_dino、gallery_dinov2、gallery_dinov3、gallery_clip各一份把60000张底库的向量灌进去建HNSW索引。四个模型各自一套collection不混用是为了避免不同模型的向量空间相互干扰每个模型在自己的空间里被独立评估。3、查询10000 张query 各自跑一遍特征提取到对应的collection里检索 top-100。4、算指标把top-100邻居的label和query的真实label一对比分别算RecallK和mAPKK取 1/5/10。RecallK和mAPK是搜索场景比较标准的两个评估指标这里简单解释一下RecallKtop-K个邻居里只要有一个和query同类就算命中。衡量的是能不能至少找到一张相似的——一票通过制。mAPKtop-K里同类越靠前、越密集分数越高。衡量的是召回的这一批里到底有多少是真相似的而且排得有多靠前——按比例打分。三、效果对比3.1 数据对比四个模型在10000张query上的完整结果模型Recall1Recall5Recall10mAP10DINOv186.793.495.265.1DINOv290.295.797.075.5DINOv391.896.697.877.7CLIP87.494.996.665.4两个核心结论1、在Recall和mAP两个指标表现上DINOv3 DINOv2 CLIP DINOv1。也就是说在当前图搜图检索这个任务下DINOv3模型是最强的。2、mAP10上 DINOv2/v3 把CLIP和DINOv1拉开了10个点75–77 vs 65。也就是说让它们各自吐10个邻居出来DINOv2/v3 这10个里同类的密度比CLIP高得多。3.2 主观评估为了方便观察结果我把query和四个模型召回的top5拼成了一张图图片可以放大看左1是query 图片左2-6是DINOv1 检索结果左7-11是DINOv2 检索结果左12-16是DINOv3检索结果最右侧5张是CLIP检索结果。绿色框召回正确红色框为召回错误。有些例子还是能看出一些问题的1、图片中是一个女生正在举杠铃锻炼。DINOv3召回的都是杠铃锻炼图片而CLIP召回的除了杠铃还有一些使用哑铃锻炼的图片。queryDINOv3召回CLIP召回2、query是一把类似剪刀的东西明显由两个部分构成。DINOv3召回的都是画面上很接近的结果而CLIP召回的很多是语义上的“刀”而在视觉画面层面并不像。queryDINOv3召回CLIP召回不是说CLIP错了——它只是在按语义做事。后面讲对比的时候会回到这件事。3.3 一个值得讲的坑fp16把DINOv2拖到了67%写完上面这一节我插一个我自己踩过的坑——它对效果影响很大。第一轮跑实验我所有模型都用fp16MPS 推理省显存结果DINOv2的 Recall1只有67.2%mAP10只有26.3%。一开始我以为是DINOv2在这个数据集上水土不服后来换成fp32重跑同一份代码Recall1直接从67.2跳到90.2mAP10从26.3跳到75.5。23个点的差距全在数值精度。DINOv1、DINOv3、CLIP在fp16下都没这个问题。下探了一下原因DINOv2在每个transformer block里都加了一个叫LayerScale的模块——给通道乘一个可学习的小系数lambda1初始化是1e-5fp16 的相对精度只有10⁻³量级乘上这么小的数再做残差连接每一层都丢一点信息12层transformer × 2次LayerScale一路累积下来最后CLS的方向就被噪声带歪了。四、DINO 系列模型的原理解析要讲清楚为什么DINO在图搜图上表变现更好得回到它的原理和训练方式去看。故事得从隔壁NLP说起。最近几年大模型的能力大爆发回头看会发现有一个共同的起手式自监督预训练。BERT、GPT系列做的事情其实是一样的——把一大堆没标注的文本扔进去让模型自己跟自己玩完形填空或者接下一个词把语言的结构学进参数里。这条路被证明能work然后大家就在想图像能不能也这么干直接照搬很困难图像没有词这种天然的离散单元也没有下一个token这种天然的预测目标自监督任务得自己造。从2018年到现在图像领域在这条路上有过很多探索DINO就是其中非常成功的一个方向。4.1 DINOv12021年基于VIT的自监督训练DinoV1的训练方式用一句话来概括对于同一张图片让表征局部图片的embedding和表征全局图片的embedding距离无限缩小从而让模型学到能够表征图片特点的特征。不用标签、不用文本只靠图像自己跟自己学是一种基于VIT的自监督学习模型。DINO 自监督学习模型结构4.1.1 模型结构DINOv1的模型结构并不复杂Student和 Teacher是同一个架构——ViT骨干网络 投影头。Backbone核心网络是标准的 Vision TransformerViT负责把图像切成 Patch提取特征。最终输出使用 [CLS] 全局Token作为整张图的特征代表。投影头是一个 3 层 MLP768 → 2048 → 2048 → K它的作用是把 Backbone 输出的 768 维通用特征投影到 K 维K65536的“虚拟类别空间”里用来计算损失。4.1.2 训练策略Multi-cropDINO 采用了一个叫Multi-crop的数据增强策略这也是DINO能“无师自通”学会分割的关键设计之一。对每一张输入图片生成一组不同尺寸、不同覆盖范围的裁剪视图2个全局视图Global Crops覆盖原图面积的50%~100%。这两个大图包含了图片的绝大部分信息。6到10个局部视图Local Crops覆盖原图面积的15%~50%。这些小图只覆盖图片的一小部分比如只看到猫耳朵、猫尾巴或者一块草地。这些视图怎么分配给Student和TeacherTeacher老师只看2个全局视图。它视野开阔能看到整只猫的全貌。Student学生看所有视图2个全局 6~10 个局部。它不仅要看大图还要看大量的小碎片。4.1.3 损失函数DINO的损失函数本质上就一件事让Student的输出去匹配Teacher的输出用交叉熵算损失从而让局部图片和全局图片注意到相同的特征。对于一张图片生成一组视图 V2 个全局视图 若干个局部视图损失函数定义为外层求和Teacher只看那两张全局大图Teacher不看局部小图。内层求和Student 看所有视图全局 局部交叉熵计算Teacher输出的概率分布Pt和Student输出的概率分布Ps之间的差距。4.1.4 EMA向量更新与模型防塌陷EMA动量更新Teacher 的参数不参与反向传播而是 Student 的 EMA指数滑动平均由于Student和Teacher模型结构相同每次模型训练反向传播更新的是Student模型的参数然后按微小比例缓慢更新到Teacher模型上。Centering中心化Teacher输出向量前减去一个历史均值避免某一维度向量过于突出防止学生和教师过渡依赖某一维度特征学习不到真正的图片特征。Sharpening锐化Teacher输出前除以一个极小的温度如 0.07把微小差异放大避免教师和学生模型同时产出过于平均的向量导致学习不到真正的图片特征。这三种处理可以说是DINO这种自蒸馏训练方式带来的独特的处理方式。4.1.5 VIT自监督学习的“涌现”物体的识别DINOv1最让人印象深刻的结果不是分类准确率而是Attention Map可视化把 [CLS] Token 对各个Patch的注意力分数铺回原图能清晰看到物体的轮廓——猫从背景里被“抠”了出来。图片摘自论文原图和[CLS] 可视化后的结果为什么会涌现出分割能力拆开来看Student只看猫耳朵局部却要输出整只猫全局的特征。为了做到这一点它必须通过自注意力机制把“身体Patch”的信息聚合到“耳朵Patch”上。反向传播迫使它给同类Patch高权重、异类Patch低权重。训练完成后高权重区域和低权重区域的边界恰好就是物体的物理边缘。监督学习的ViT做不出这件事因为分类任务只需要区分猫和狗的整体特征局部细节对Loss贡献小会被模型主动忽略。DINO 的学生永远在看残缺的局部为了活下去被迫把局部细节和全局结构绑定。一句话总结DINO学到的不是“猫”这个标签而是“哪些像素属于相同分类”的底层规则。 分割能力的涌现不是意外而是“局部匹配全局”这个数学目标的最优解的自然结果。4.2 DINOv22023把规模化做完让特征开箱即用DINOv2 的工作可以理解成 v1 的工业化升级做的主要是三件事第一更大的数据量。Meta 自己造了一份 LVD-142M——从一个 12 亿张的未标注图像池里用一种基于聚类 相似度的自动 curation 方法挑出了 142M 张。挑数据的目标是覆盖度够、冗余度低、质量不差。这一步是 v2 比 v1 强的最主要原因远比模型本身的改动重要。第二更大的参数量。模型扩到 ViT-g/1410 亿参数级加了一系列稳定训练的 trick——比如 KoLeo regularizer让特征在 hypersphere 上分布更均匀避免坍缩、把高分辨率 finetune 单独拎出来作为一个阶段。最大的模型上 12.8 万亿 token 量级训练。第三损失函数更新。在 DINOv1的基础上又加了 iBOT losspatch-level被 mask 掉的 patch 要预测原始 token。这意味着模型不光要学整张图代表什么还要学每个 patch 局部代表什么。图片摘自论文dinoV2的特征识别效果4.3 DINOv32025把dense feature训练的同样稳定第一继续增加训练数据量DINOv3进一步把训练数据从1.42亿张扩展到16.89亿张。第二继续增加模型参数量从11 亿1.1B涨到67 亿6.7B第三避免 dense feature 的退化核心改进DINOv2训练里有个现象模型跑得越久图像分类等全局指标还在涨但Patch级别的dense feature反而越来越“糊”——不同Patch之间的特征差异变小做分割、深度估计时精度下降。DINOv3 引入了一个叫Gram Anchoring的损失函数来解决这个问题。简单说就是在训练过程中强制当前模型的Patch间相似度结构去匹配早期训练阶段dense feature 还很好时的Patch间相似度结构不让局部特征被全局优化目标“带歪”。第四其他特性。蒸馏出一族小模型用67亿参数的模型做Teacher一次性蒸馏出ViT-S、B、L、H 等多个尺寸的Student覆盖不同算力需求。其中ViT-H8.4 亿参数在部分任务上接近Teacher水平参数量却只有后者的1/8。支持4K分辨率得益于RoPE位置编码高分辨率微调DINOv3能在4096×4096 的输入下稳定输出清晰的特征图。可选文本对齐借鉴CLIP的方法训练文本编码器与 DINOv3 视觉特征对齐获得零样本分类和开放词汇分割能力。五、与CLIP的应用对比CLIP是文搜图的标杆DINO是图搜图的标杆讲完原理回到CLIP和DINO的选型问题维度CLIPDINO 系列训练范式图文对比学习图像自监督自蒸馏监督信号4 亿对 (image, text)纯图像无任何文本/标签学习目标让和文本描述匹配的图在向量空间里靠近让同一张图的不同视角在向量空间里靠近表征性质语义级、跨模态对齐视觉级、单模态自洽天然擅长文本搜图、零样本分类、跨模态检索图搜图、实例检索、密集预测分割/深度CLIP学的是图配什么文字。 它的向量空间是按语义相似对齐的——两张语义相近但视觉差很多的图比如一只哈士奇和一只阿拉斯加在CLIP空间里会很近因为它们都被描述成a dog in the snow。反过来两张视觉相近但语义可被不同描述的图比如同一只哈士奇的两个不同角度未必近因为对应的文本中心不一样。DINO 学的是图自己长什么样。 它根本不知道哈士奇这个词但它知道同一只哈士奇换个角度、换个光照、裁一块出来应该是同一个东西。它的向量空间是按视觉相似对齐的。所以选型不是哪个更强是哪个更对CLIP是文搜图的标杆DINO是图搜图的标杆。用户给一段文字找匹配的图/帧 → 选CLIP。用户给一张图/一帧画面找视觉上相似的图/帧 → 选DINO。六、一些认知和思考Yann LeCun 用一张图表达了他对不同学习范式的看法强化学习是蛋糕上的樱桃监督学习是糖霜自监督学习才是真正的蛋糕。核心差异在于信息量强化学习樱桃模型偶尔收到一个标量奖励。反馈信号稀疏信息量极小。监督学习糖霜模型预测人类提供的标签。每张图对应一个或多个类别信息量在 10~10000 bits 之间。自监督学习蛋糕模型预测输入本身的任意部分。每一张图都包含数百万比特的监督信号。DINO 系列属于“蛋糕”那一层。它不依赖标签、不依赖文本只靠图像本身——预测缺失的 Patch、匹配不同视角——来提供学习信号。正因为监督信号足够丰富模型才能在没有任何人工标注的情况下从像素中自然涌现出物体边缘、语义分割等中层视觉理解能力。这张图也解释了为什么自监督学习近年来能快速追赶甚至超越监督学习不是模型变聪明了而是我们终于让它用上了输入数据里所有的信息。