本文最后更新于:2026年7月9日 上午

DINOv2(Meta AI,2023)是个自监督视觉基础模型——无标签训出对视角/光照/域鲁棒性强的通用 patch 特征;AnyLoc(2023)把它和经典 VLAD 加按域适配组装起来,零 VPR 专属训练就拿到 SOTA 级的视觉位置检索。这篇拆解 DINOv2 怎么"自己教自己"(自蒸馏 DINO + 掩码 iBOT + 防塌缩)、AnyLoc 怎么零训练用上它,是 NetVLAD 那条线的终点。

概述

  • DINOv2(Meta AI,2023,arXiv:2304.07193)= 自监督视觉基础模型。一个无标签训练的 Vision Transformer,喂一张图吐出稠密的 patch 特征。它是通用特征引擎,不限于 VPR——分类、分割、深度、检索都能用。它解决的是"好的视觉特征从哪来"。
  • AnyLoc(2023,arXiv:2308.00688)= VPR 方法。配方极简:冻结 DINOv2 提稠密特征 + 经典 VLAD 聚合 + 按域词表与 PCA 白化零 VPR 专属训练就拿到 SOTA 级表现。它解决的是"怎么用这些特征认地方"。
1
2
3
4
AnyLoc(VPR 方法)
├─ 特征来源 = DINOv2(基础模型,冻结不训练) ← 这一层贡献"鲁棒特征"
├─ 聚合方式 = VLAD(经典残差聚合,硬分配) ← 这一层只是"数残差"
└─ 适配方式 = 按域词表 + PCA 白化(无监督) ← 这一层贴合具体场景

两者不同层、不同方法,但紧耦合:AnyLoc 的成功绝大部分来自 DINOv2 这块"地基",VLAD 只是把它稳稳盖起来。下文先讲 DINOv2 这个地基,再讲 AnyLoc 怎么盖房子。

背景

回看 VPR 的主线(详见 NetVLAD):BoW → VLAD → NetVLAD → GeM → 基础模型。每一步的进步几乎都集中在特征质量上——

  • BoW 用手工 ORB/SIFT,对视角/光照不鲁棒;
  • NetVLAD 用 CNN 特征,但那是有监督 ImageNet 预训练,特征带着"分类偏置"(为分 1000 类优化),而且只在自然图像上训过,换域(室内、航空、水下)就掉;
  • GeM 证明"聚合可以极简,特征才决定胜负"。

于是问题自然变成:能不能有一个不带分类偏置、在海量多样数据上训出来、对域变化鲁棒的通用特征源? 这就是自监督视觉基础模型的动机,DINOv2 是其代表。它的特征不依赖人工标签、见过上亿张多样图像,所以"鲁棒性"是白送的——而这正是 VPR 最想要的"局部描述子"性质。

DINOv2 工作原理

目标:无标签学特征

DINOv2 是个 Vision Transformer(ViT):图像切成 patch(patch size = 14),线性嵌入,过 transformer,输出一堆 patch token(稠密局部特征)+ 一个 CLS token(全局特征)。模型有 ViT-S/14、ViT-B/14、ViT-L/14、ViT-g/14 几档。

难的是怎么训练——它没有标签。监督学习里,标签告诉网络"这两张是猫、那张是狗",网络据此学区分。没有标签,监督信号从哪来?

DINOv2 的思路是自己造监督,核心就一句话:同一张图的不同视角(crop)应该映射到相近的特征;不同图应该映射到相远的特征。 这条规则不需要人标——"是不是同一张图"网络自己知道(crop 就是它自己切出来的)。只要逼网络遵守这条规则,它就不得不学出"能区分不同图像内容"的特征——而这正好是通用、与下游任务无关的好特征。

但朴素按这条规则做会塌缩(见后文"三道防线")——网络发现"对所有图都输出同一个特征"就能让"同图 crop 一致"轻松满足。所以需要一套机制:既传"一致性"信号、又防塌缩。DINOv2 的训练就是围绕这个设计的,下面逐块拆。

多 crop

先造训练样本。对一张图 $I$,切出两类 crop:

  • global views(几个):大 crop,覆盖图像大部分(比如 >50%),代表"全景";
  • local views(很多个):小 crop,覆盖一小块(比如 5%–25%),代表"特写"。

所有这些 crop 都来自同一张 $I$,按上面的规则它们应该映射到相近的特征。多 crop 还有个额外红利:逼网络学"一块局部细节和整张全景是同一个东西"的局部-整体关系,这对学语义很有用。

自蒸馏

要让网络对不同 crop 输出一致,但跟谁对齐?如果让 student 自己跟自己对齐(同一个网络、前后两次前向互相靠),梯度会震荡发散。DINO 的解法是自蒸馏

  • 维护两个同结构网络:student(正常用梯度更新)和 teacher(不接梯度)。
  • teacher 的参数 = student 参数的指数滑动平均(EMA):每次 student 更新后,teacher 按 $\theta_{\text{teacher}} \leftarrow \alpha\,\theta_{\text{teacher}} + (1-\alpha)\,\theta_{\text{student}}$ 慢慢朝 student 挪一小步($\alpha$ 接近 1,挪得很慢)。

最容易卡的一个疑虑:teacher 是 student 的平均,那不就"自己教自己"、循环了吗?关键在:teacher 变化比 student 慢得多,所以任一时刻 teacher 代表的是"student 最近一段时间的平滑共识——一个滞后但稳定的目标"。student 追一个稳定的、稍微过时的自己,而不是追实时跳动的自己,这就稳了。

直觉类比:像学生(student)对着"自己过去讲话的慢镜头回放"(teacher)做对齐——回放是滞后的、平滑的,反而成了稳定参考。实时对着自己当下对齐会震荡发散;对着平滑回放对齐反而能收敛。

再加一道 stop-gradient:teacher 这条路上不算梯度(teacher 只靠 EMA 更新),保证 student 只被"推向 teacher"、不会被反过来拉。这个不对称是稳定性的关键。

DINO 损失

student/teacher 怎么"输出一致"?不是直接比特征向量,而是比一个分布

  1. 取 CLS token(全局表征),过一个投影头压到低维,得 $g$;
  2. 算 $g$ 与 $K$ 个可学的 prototype 向量 $\{p_1,\dots,p_K\}$ 的相似度,softmax 成概率分布:
$$ q = \mathrm{softmax}\big(\langle g, p_1\rangle/T,\ \langle g, p_2\rangle/T,\ \dots,\ \langle g, p_K\rangle/T\big) $$ $T$ 是温度。$q$ 就是"这张图最像哪个 prototype"的软分配(一个 $K$ 维概率向量)。
  1. teacher 在 global view 上给 $q_t$,student 在所有 crop(global + local)上给 $q_s$,最小化交叉熵:
$$ \mathcal{L}_{\text{DINO}} = -\sum_{k=1}^{K} q_t(k)\,\log q_s(k) $$

一个具体小例子:假设 $K=3$ 个 prototype。对一张猫图的某个 global crop,teacher 输出 $q_t=(0.7, 0.2, 0.1)$(“主要像 prototype 1”)。那 student 看这张猫图的任何 crop(哪怕只截了猫耳朵的 local crop)都得输出接近 $(0.7, 0.2, 0.1)$。要满足这点,student 只能去学"猫的各个部分/视角都指向同一个视觉概念"——这就是视角不变性。prototype 会在训练中自己浮现成一组"视觉概念",但训练完后投影头和 prototype 都扔掉,只留 ViT backbone——那才是 AnyLoc 真正用的特征源。

投影头、prototype 是什么:投影头是 backbone 特征和"算损失的空间"之间的 MLP 翻译(吸收损失偏置、保护 backbone 通用性);prototype 是 $K$ 个学出来的参考向量,把特征变成"对齐哪个参考点"的软分布,好让交叉熵能算。两者都是训练脚手架,训完全扔,只留 backbone。这结构其实很像"学习型、过完备、软分配的 BoW"。

防塌缩

只看上面的损失,网络有个"作弊"捷径:对所有图都输出同一个分布(比如永远 $q=(1,0,0)$)。这样"同图 crop 一致"轻松 100% 满足、loss 为 0,但啥也没学。这叫塌缩(collapse)。DINOv2 用几道防线逼它"老实学":

  • 防线 1:teacher 只看 global、student 看 global+local(非对称)。 student 没法靠"塌成常数"过关——它得从一个只截了猫耳朵的 local crop,猜出 teacher 看整只猫才给的分布。这逼它真的去理解内容,而不是输出常数。
  • 防线 2:Sinkhorn-Knopp 平衡。 在每个 batch 里,对所有图的 prototype 分配做"行 + 列归一化"迭代,强制每个 prototype 分到大约等量的图。这从机制上堵死"所有图都塌到 prototype 1"——分配必须均衡。
  • 防线 3:KoLeo 正则 $\mathcal{L}_{\text{KoLeo}}$:鼓励特征向量在超球面上均匀铺开(最大化每个特征到最近邻的距离),防它们挤成一团。这让特征空间被充分利用、不堆在一个点。
  • (DINO 原版还用 centering + sharpening——给 teacher 的输出减去一个滑动均值、用低温度锐化——也是防塌缩的经典招,DINOv2 一并继承。)

合起来:一致性信号逼网络学不变性,三道防线逼它不能靠塌缩偷懒——剩下的唯一出路就是真的学出有区分力的特征。

iBOT

前面的 DINO 只让 CLS 全局特征学到了东西。但 AnyLoc 用的是稠密 patch 特征,所以 patch 本身也得学好。这就靠 iBOT(patch 级的"完形填空"):

  • 随机掩码一部分 patch(像 MAE/BERT 那样把一些 patch 涂掉);
  • student 看带掩码的图,要去预测那些被掩 patch 的表征
  • 监督来自 teacher 看未掩码版本时、对同样那些 patch 给出的表征
  • 损失 $\mathcal{L}_{\text{iBOT}}$ 是 patch 级的交叉熵。

直觉:被涂掉的 patch,student 只能从周围上下文"猜"它该是什么——这逼每个 patch 的特征承载足够语义(光靠颜色/纹理猜不出来,得理解"这里大概是猫耳朵")。没有 iBOT,patch 特征会很单薄;有了它,DINOv2 的 patch token 才成为 AnyLoc 那种"稠密检索"能用的好描述子。

DINO + iBOT 的分工:DINO 让全局 CLS 特征学到视角不变性(对分类等全局任务好),iBOT 让每个 patch 特征也有语义(对分割、检索这种稠密任务好)。AnyLoc 用的是 patch 特征,所以 iBOT 这一半对它至关重要。

总损失把三者加权:

$$ \mathcal{L} = \lambda_1\,\mathcal{L}_{\text{DINO}} + \lambda_2\,\mathcal{L}_{\text{iBOT}} + \lambda_3\,\mathcal{L}_{\text{KoLeo}} $$

(Sinkhorn-Knopp 在算 $\mathcal{L}_{\text{DINO}}$ 的 prototype 分配时在线施加,不单列损失项。)

训练流程

  1. 采样一张图 $I$,切出 global views + local views;
  2. teacher 前向(只喂 global views,且不掩码)→ 得 teacher 的 CLS 分布 $q_t$ 和各 patch 表征;
  3. student 前向(喂所有 crops;对每个 crop 再做一次带掩码的版本供 iBOT)→ 得 student 的 $q_s$ 和被掩 patch 的预测;
  4. 算损失 $\mathcal{L}=\lambda_1\mathcal{L}_{\text{DINO}}+\lambda_2\mathcal{L}_{\text{iBOT}}+\lambda_3\mathcal{L}_{\text{KoLeo}}$;
  5. 反传更新 student(teacher 那条路 stop-gradient,不回传);
  6. EMA 更新 teacher:$\theta_{\text{teacher}} \leftarrow \alpha\,\theta_{\text{teacher}}+(1-\alpha)\,\theta_{\text{student}}$。

跨 1.42 亿张图反复跑很多 epoch,最后扔掉投影头、prototype、teacher,只留 student 的 ViT backbone——这就是 AnyLoc 加载的特征提取器。

训练数据

DINOv2 的特征之所以强,数据算法一样重要。它没用人有标签的 ImageNet,而是自建了 LVD-142M(1.42 亿张图)

  • 从一个更大的爬取池(数十亿级原始图)里,去重 + 用一个初始视觉模型做相似检索,匹配一组精心选的"种子"图,筛出多样且相关的子集;
  • 全程无标签。

这个"大规模 + 干净 + 多样 + 无标签"的数据,是 DINOv2 泛化能力的根源——它见过太多外观变化,鲁棒性自然就来了。数据策展是个常被低估的工程贡献。

特征鲁棒性

三个原因叠加:

  1. 多 crop 自蒸馏:逼模型学"同一物体不同视角 → 一致"的不变性;
  2. 海量多样数据:见过各种光照/季节/域变化;
  3. iBOT 的 patch 级监督:patch 特征携带丰富语义,而非只有 CLS 全局。

结果:DINOv2 的 patch 特征对视角/光照/域变化鲁棒性强——这正是 VPR 一直想要的“局部描述子”性质。也无怪 AnyLoc 直接把它当现成的特征源,连微调都不用。

AnyLoc 工作原理

核心配方

AnyLoc 的全部配方:

冻结 DINOv2 提稠密 patch 特征 → 经典 VLAD 聚合 → 按域词表与 PCA 白化 → 检索。

没有 NetVLAD 那种 ranking loss 微调、没有 VPR 标注——它纯粹是"货架上的 DINOv2 + 老老的 VLAD + 两个无监督小适配"。论文的哲学原话大意:对的不变性来自 DINOv2 的自监督特征,对的聚合来自无监督 VLAD 加按域适配。

用对层

DINOv2 是深层 transformer,不同层的特征性质不同。AnyLoc 发现:不是用最后一层,而是用 deeper layers(靠后的几层)的 patch 特征做 VPR 效果最好——这些层携带更强的语义和不变性。论文做了层消融,层选择对 VPR 性能影响显著。

按域词表

这是 AnyLoc 性能的最大杠杆之一。VLAD 需要一组聚类中心(词表),AnyLoc 的做法是:

  • 按场景域分别建词表:室内(indoor)、室外驾驶(outdoor driving)、航空(aerial)、水下(underwater)、对象中心(object)……每个域一套词表,而不是全局统一。
  • 为什么按域:不同域的 DINOv2 特征分布差异大,一套全局词表谁都不贴合。按域词表比全局词表、比按地图(per-map)词表,Recall@1 高最多 4×
  • 词表怎么建(无监督):用 DINOv2-GeM(GeM 池化的全局描述子)对域内图算全局向量,做无监督 PCA 投影,用投影空间来定义 VLAD 的聚类中心。这种"vocabulary-independent"构造(不直接对局部特征做 k-means,而是借全局描述子的主结构定词表)省事且贴合域。

注:这里 “AnyLoc” 的 “Any” 就是这层意思——适配任意域,只要给少量该域的代表性图建词表即可。

PCA 白化

VLAD 聚合出向量后,做 PCA 白化(whitening):

  • 降维 + 去相关:把 VLAD 向量投影到主成分空间、各维除以标准差,得到各维不相关、方差均衡的紧凑向量;
  • 无监督,不需要度量学习/监督微调;
  • 白化后再 L2 归一化,得最终全局描述子。

白化是经典图像检索的标准技巧(VLAD 时代就在用),AnyLoc 把它和按域 PCA 组合,进一步榨取判别力。

完整流水线

1
2
3
4
5
6
7
8
9
10
11
12
13
输入图像
│ 冻结 DINOv2(deeper layers 的 patch 特征) ← 鲁棒局部特征,零训练

稠密 patch 特征 {x_i}(每位置一个 D 维)
│ 按域 VLAD(硬分配到域词表的簇,残差聚合) ← V_k = Σ_i a_k(x_i)(x_i − c_k)

KD 维 VLAD 向量
│ PCA 白化(降维 + 去相关)+ L2 归一化

紧凑全局描述子(一张图 → 一个向量)
│ 检索:FAISS / ANN,找最近邻图像

匹配的数据库图像(同一处地方,跨视角/季节/光照)

注意 AnyLoc 用的是经典硬分配 VLAD($a_k$ 是 0/1,不是 NetVLAD 的软分配)。连软分配都不需要——因为 DINOv2 特征已经足够好,硬分配的量化损失可以接受,省了 NetVLAD 那套可微软化的复杂度。

为什么有效

把胜负拆到三层:

  • 特征层(决定性):DINOv2 的 patch 特征鲁棒性显著超过之前方案(手工 ORB/SIFT、有监督 CNN)。这是 AnyLoc 的地基。
  • 聚合层:VLAD 残差聚合比简单池化保留更多信息;硬分配在特征够好时也够用。
  • 适配层:按域词表 + 白化是"小而关键"的工程——用极低成本(少量域图,无监督)补上域差异。

这套组合的优势:

  • 零 VPR 训练:不依赖 VPR 标注或弱监督(GPS 共定位等),泛化到任何域只需少量该域图建词表;
  • 强域迁移:换域(街景→室内→水下)只换词表,DINOv2 主干不动;
  • 可解释:VLAD 的"哪个簇贡献多少"还能看,比纯黑箱全局描述子透明。

这正是"特征主导、聚合简化"趋势的终点——特征好到极致时,聚合回到最朴素的经典 VLAD 就够,连 NetVLAD 的可微软化和 VPR 专属训练都不再需要。

与 BoW / NetVLAD 对比

维度 BoW(DBoW2) NetVLAD DINOv2 + AnyLoc
局部特征 手工 ORB/SIFT 有监督 CNN(ImageNet) 自监督基础模型 DINOv2
特征鲁棒性 中(有分类偏置) (视角/光照/域)
“词”/聚合 离线 k-means + 直方图 学出来的软簇 + 软残差 按域 k-means + 硬残差 VLAD
是否训练 端到端(ranking loss) 零 VPR 训练(只用预训 DINOv2)
按域适配 按域词表 + 白化
位置处理 丢弃(袋) 丢弃(袋) 丢弃(袋,VLAD 也扔位置)
检索结构 倒排索引 ANN/FAISS ANN/FAISS
推理成本 CPU 毫秒 需 GPU(CNN) 需 GPU(ViT,更重)
冷启动 加载词典 加载权重(域要匹配) 加载权重 + 少量域图建词表

一条主线:BoW(手工硬直方图)→ VLAD(手工残差)→ NetVLAD(学习特征 + 学习软 VLAD)→ GeM(学习特征 + 简单池化)→ DINOv2/AnyLoc(基础特征 + 经典 VLAD + 轻按域适配)

三个清晰的趋势:(1) 特征质量持续上升、且越来越主导;(2) 聚合结构持续简化(学习的软 VLAD → 简单池化 → 回到经典硬 VLAD);(3) VPR 专属训练量持续减少(端到端微调 → 只预训练 → 零训练)。AnyLoc 是这三个趋势的交汇点。

呼应:三者(BoW、NetVLAD、AnyLoc)在"位置处理"上是同一招——都靠聚合丢弃位置换视角容忍(详见 NetVLAD 的"全局描述子为什么位置无关"一节)。AnyLoc 没有改变"袋"的哲学,它换的是袋里装的特征(DINOv2 patch 特征)和怎么数(按域 VLAD + 白化)。

局限与开放问题

  • 推理重:DINOv2 大模型(尤其 ViT-g/L)前向慢、要 GPU,边缘 SLAM 设备吃不消。
  • 按域词表需要少量目标域图:虽小但有冷启动成本,且域定义模糊时词表质量不稳。
  • 稠密描述子检索:全局描述子要存 + ANN,大库内存/延迟仍有压力。
  • 完全没见过的域:基础模型也可能掉点(极端新域),不是万能。
  • 实时性:仍是边缘 SLAM 的门槛,常需分级(BoW 粗筛 + AnyLoc 兜底)。

在 SLAM 中的角色

  • 重定位、跨季节/昼夜回环的强力前端:大视角/外观剧变下,DINOv2 特征的鲁棒性让 AnyLoc 在这些 BoW/NetVLAD 会失效的场景里仍能命中。
  • 工程分级:边缘设备上,BoW 做毫秒级粗筛,难工况或 BoW 低置信时再调 AnyLoc(GPU 上跑)兜底。
  • 落地:已有工作把 AnyLoc 直接集成进视觉 SLAM 做回环,如在 DPV-SLAM(Lipson et al., 2024 学习型单目 SLAM)上用 AnyLoc 替换原词袋回环(Zhang et al., 2026 预印本)。这类工作示范了"基础模型 VPR 进 SLAM"的方向,但多是小型应用/预印本,不代表 SLAM 整体 SOTA——真正的部署主力仍是 ORB-SLAM3 / VINS / FAST-LIO2 这些更成熟的系统。

深度思考

基础模型的红利

NetVLAD 时代,VPR 进步靠 VPR 自己的架构/损失创新;DINOv2/AnyLoc 之后,VPR 的 SOTA 越来越靠"通用基础模型的红利"——DINOv2 不是为 VPR 训的,但它的特征恰好最适合 VPR。这意味着 VPR 研究的重心从"设计 VPR 专用网络"转向"怎么把通用基础模型用好"(层选择、聚合、域适配)。

零训练 VPR 的意义

AnyLoc 打破了一个长期假设:“VPR 必须在 VPR 数据上训练。” 它证明:好的特征 + 经典聚合 + 轻适配就够,不需要 VPR 标注或弱监督。这降低了 VPR 的使用门槛(不用标数据、不用训模型),也让 VPR 更像"即插即用"的组件。

与 BoW/NetVLAD 的结构同构

三者本质都是"提特征 → 量化/聚合 → 比向量",且都靠聚合丢弃位置(“袋"哲学)换视角容忍。AnyLoc 把每一步都用得很充分:很强的特征(DINOv2)+ 合适的经典聚合(按域硬 VLAD)+ 轻适配(PCA 白化)。位置无关性这条线,从 BoW 到 AnyLoc 一脉相承,没有本质变化——变的只是"袋里装什么、怎么数”。

域先验的回归

GeM 时代说"聚合无差别,特征主导";但 AnyLoc 又发现"按域词表"是关键杠杆(4× 提升)。这说明:纯靠特征强还不够,场景先验(域)仍有价值。基础模型把"通用鲁棒性"解决了,但"贴合具体场景"仍需小工程。这或许指向下一步:基础模型 + 自动域发现/在线域适配,把"按域"也自动化。

工程权衡

AnyLoc 是 SOTA 级方法,但 ViT-g + ANN 的算力开销让它在边缘 SLAM 上未必最优。最好的部署往往是混合:BoW(快、CPU、可在线增量)做日常粗筛,AnyLoc(强、GPU)只在难工况兜底。"研究 SOTA"和"工程最优解"在资源受限场景里仍是两条线。

小结

DINOv2 用自监督(DINO 自蒸馏 + iBOT 掩码预测 + KoLeo/Sinkhorn 防塌缩)在 1.42 亿张策展数据上训出 ViT,产生对视角/光照/域鲁棒性强的通用 patch 特征——这是 AnyLoc 的地基。AnyLoc 把冻结的 DINOv2 特征 + 经典硬 VLAD(按域词表)+ PCA 白化组装起来,零 VPR 专属训练就拿到 SOTA 级表现(发布时多项 VPR 基准 SOTA;后续 EffoVPR、OT-Aggregation 等 2024–2025 工作继续推高),尤其在非街景(室内/航空/水下)域上比 NetVLAD、CosPlace、MixVPR 等好最多 4×。

它是"特征主导、聚合简化、训练减少"这条趋势的终点:当特征足够强,聚合回到最朴素的经典 VLAD 就够,连 NetVLAD 的可微软化和 VPR 微调都不再必需。代价是 ViT 推理重、需 GPU,所以边缘 SLAM 里常与 BoW 分级互补。它的历史意义在于第一次证明"零训练、纯基础特征"能在 VPR 上超过此前的 VPR 专用方法,从此 VPR 的重心从"设计专用网络"转向"用好通用基础模型"。

参考资料



文章链接:
https://www.zywvvd.com/notes/study/SLAM/dinov2-anyloc/dinov2-anyloc/


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

DINOv2 与 AnyLoc
https://www.zywvvd.com/notes/study/SLAM/dinov2-anyloc/dinov2-anyloc/
作者
Yiwei Zhang
发布于
2026年7月7日
许可协议