本文最后更新于: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 | |
两者不同层、不同方法,但紧耦合: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 怎么"输出一致"?不是直接比特征向量,而是比一个分布:
- 取 CLS token(全局表征),过一个投影头压到低维,得 $g$;
- 算 $g$ 与 $K$ 个可学的 prototype 向量 $\{p_1,\dots,p_K\}$ 的相似度,softmax 成概率分布:
- teacher 在 global view 上给 $q_t$,student 在所有 crop(global + local)上给 $q_s$,最小化交叉熵:
一个具体小例子:假设 $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 分配时在线施加,不单列损失项。)
训练流程
- 采样一张图 $I$,切出 global views + local views;
- teacher 前向(只喂 global views,且不掩码)→ 得 teacher 的 CLS 分布 $q_t$ 和各 patch 表征;
- student 前向(喂所有 crops;对每个 crop 再做一次带掩码的版本供 iBOT)→ 得 student 的 $q_s$ 和被掩 patch 的预测;
- 算损失 $\mathcal{L}=\lambda_1\mathcal{L}_{\text{DINO}}+\lambda_2\mathcal{L}_{\text{iBOT}}+\lambda_3\mathcal{L}_{\text{KoLeo}}$;
- 反传更新 student(teacher 那条路 stop-gradient,不回传);
- 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 泛化能力的根源——它见过太多外观变化,鲁棒性自然就来了。数据策展是个常被低估的工程贡献。
特征鲁棒性
三个原因叠加:
- 多 crop 自蒸馏:逼模型学"同一物体不同视角 → 一致"的不变性;
- 海量多样数据:见过各种光照/季节/域变化;
- 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 | |
注意 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 的重心从"设计专用网络"转向"用好通用基础模型"。
参考资料
- M. Oquab et al., “DINOv2: Learning Robust Visual Features without Supervision,” arXiv:2304.07193, 2023.
- N. Keetha et al., “AnyLoc: Towards Universal Visual Place Recognition,” RA-L, 2024(arXiv:2308.00688).
- M. Caron et al., “Emerging Properties in Self-Supervised Vision Transformers”(DINO), ICCV, 2021.
- J. Zhou et al., “iBOT: Image BERT Pre-Training with Online Tokenizer”(iBOT), ICLR, 2022.
- 相关笔记:NetVLAD:把 VLAD 可微化的端到端位置检索(直接前驱)、词袋模型 BoW 与回环检测(VPR 主线起点)、SLAM 全景、回环检测:候选之后
文章链接:
https://www.zywvvd.com/notes/study/SLAM/dinov2-anyloc/dinov2-anyloc/
“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”
微信支付
支付宝支付