DINOv3 密集视觉特征提取实践指南:12 个预训练模型从安装到推理的完整路径
DINOv3 是 Meta AI 的自监督视觉基础模型,核心功能是从图像提取高质量密集特征,适合做检索、匹配、密集预测的团队。它提供 12 个预训练模型(21M 至 67 亿参数),冻结特征即可在 ImageNet 线性分类达到 91.1%。
密集特征解决什么问题:以检索和遥感为例
不谈抽象概念,先看两个仓库里真实存在的用法。
检索与匹配:不为每个任务训一个模型
做商品图搜索、内容去重这类业务的团队,普遍卡在同一个问题上:每个业务线单独训一个模型,成本高,而且数据分布一变效果就掉。DINOv3 的思路是不再针对任务训练,而是冻结特征,上层直接用最近邻。仓库自带的 notebooks/ 里就有可运行的示例:dense_sparse_matching.ipynb 演示用 patch 特征做跨图的稠密/稀疏匹配,foreground_segmentation.ipynb 则完全靠特征、不训练任何参数地做前景分割。对多数业务来说,"提一次特征 + 做近邻"就能上线,新任务的迭代周期从几周压到天级。
遥感:卫星预训练权重到全球树冠高度图
一个更具体的落地是 CHMv2:官方团队在卫星图像预训练的 ViT-L/16 骨干上接了一个深度估计头,做全球范围的树冠高度估计,模型权重和推理代码都已放出。遥感场景过去常常要为不同区域、不同传感器找专门的模型;换成卫星权重(SAT-493M 数据集预训练)的密集特征后,同一套骨干同时覆盖全球一致性和局部细节。用法可以直接看 notebooks/chmv2_inference.ipynb。
从 clone 到出结果:三步跑通 DINOv3
第一步,建环境。 克隆仓库(git clone https://gitcode.com/GitHub_Trending/di/dinov3),在仓库根目录执行 micromamba env create -f conda.yaml,会生成名为 dinov3 的环境:Python 3.11、PyTorch 2.7.1 以上,外加评估代码需要的 pandas、submitit 等依赖。官方代码只在 Linux 上测试过,建议直接在该平台操作。如果只做推理,其实装好 PyTorch 就够加载模型;完整环境是给要跑训练和评估的人准备的。
第二步,拿权重。 权重不在仓库里,需要按 README 的说明向官方申请,下载链接会以邮件形式给出,并且官方明确要求用 wget 而不是浏览器下载。建议下载后固定放在本地,之后一直用本地路径引用,避免重复拉取。
第三步,加载并前向。 入口是 torch.hub.load,第一个参数填仓库本地路径:
import torch
REPO_DIR = "/path/to/dinov3" # 克隆后的仓库路径
model = torch.hub.load(REPO_DIR, "dinov3_vitb16", source="local",
weights="/path/to/dinov3_vitb16_pretrain_lvd1689m.pth")
推理时包一层 inference_mode,GPU 上建议开 bf16 自动混合精度:
with torch.inference_mode(), torch.autocast("cuda", dtype=torch.bfloat16):
out = model(images) # 输出 class token 和逐 patch 特征
选模型前要懂的三件事:模型家族、RoPE 与训练目标
12 个预训练模型怎么选
所有小模型都来自同一个 67 亿参数的 ViT-7B 教师:5 个 ViT(S/S+/B/L/H+)和 4 个 ConvNeXt 都是蒸馏出来的,权重分网络图像(LVD-1689M)和卫星图像(SAT-493M)两套。选型的经验法则大致是:
- 原型验证或低显存环境:蒸馏版 ViT-S/B 或 ConvNeXt 系列;
- 单卡常态推理:ViT-L(300M 参数)是精度和开销的平衡点;
- 卫星影像任务:只用 SAT-493M 那一组权重,别混用网络图像权重。
各模型的具体参数量和结构差异在 MODEL_CARD.md 里有一张完整的表。
分辨率与位置编码:RoPE 和 16 的倍数
ViT 主干(dinov3/models/vision_transformer.py)用 RoPE 做位置编码,并引入 4 个 register token:一张 224×224 的图会产出 1 个 class token + 4 个 register token + 196 个 patch token。输入不必是 224,任意 16 的倍数尺寸都能进模型;尺寸不满足时模型会裁到最近的更小倍数。这是它能直接吃高分辨率图像、且高分辨率下特征依然稳定的原因。
训练目标:不止是自蒸馏
翻一下 dinov3/loss/ 能看到完整配方:class token 上的 DINO 多裁剪自蒸馏、patch 上的 iBOT 掩码建模、KoLeo 正则,外加一个 gram anchoring 阶段;训练栈本身用 FSDP2 跑 bf16/fp8 混合精度。一个可参考的规模数字:README 里的快速配方——ImageNet-1k 上预训练 ViT-L/16——在 32 张 H100 上约 14 小时,线性评估 83.5%,说明整套流程是可复现的,不只是黑盒权重。
推理时容易踩的三个坑
归一化参数要和权重配套。 网络图像权重要用 ImageNet 标准均值/方差(0.485/0.456/0.406 与 0.229/0.224/0.225),卫星权重则是一组完全不同的数值(0.430/0.411/0.296 与 0.213/0.156/0.143)。配错了不会报错,只会让精度悄悄掉,排查起来很浪费时间。
7B 不是拿来试错的。 ViT-7B 有 67 亿参数,官方的深度估计、分割等示例都包在 bf16 autocast 里,但仍需要可观的显存。建议先用蒸馏版 ViT-L 或 B 验证思路,效果确认后再考虑上更大模型。
需要接下游头时,用仓库现成的 eval 代码。 dinov3/eval/ 下有线性分类、逻辑回归、k-NN、ADE20K 分割、NYUv2 深度估计,以及 dino.txt 文本对齐(做开放词汇分割)的完整训练与推理脚本,配置走 YAML + dataclass(基线配置见 dinov3/configs/),命令行传参即可覆盖,不必自己搭训练循环。
写在最后
DINOv3 把"拿到一套可用的密集视觉特征"这件事压缩成了一次 torch.hub.load,当你不需要为新任务专门训练模型时,它值得作为第一选择。数据集准备与逐任务的评估细节,可以直接查仓库里的 DATASETS.md 和各 eval 子目录。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



