DINOv3 快速上手指南:5 分钟跑出第一份图像密集特征
【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3
DINOv3 是 Meta AI Research 的自监督视觉基础模型参考实现,核心能力是为图像生成高质量密集特征(每个 16×16 图像块一个特征向量,可用于检索、匹配、分割),且多数下游任务无需微调。这篇文章面向需要提取图像特征、把模型接进自己业务的工程师,走完四个步骤即可完成接入。
DINOv3 最小安装步骤:一条命令装好 PyTorch 环境
仓库 hubconf.py 声明的硬依赖只有torch和numpy,加载预训练模型不需要训练那套重依赖。官方声明训练与评估代码要求 PyTorch 2.7.1 及以上版本,且只在 Linux 上验证过;仓库自带的 conda.yaml 用的是 Python 3.11。如果你只做推理,装好 PyTorch 再克隆代码就够:
git clone https://gitcode.com/GitHub_Trending/di/dinov3 pip install "torch>=2.7.1" numpy跑通第一个结果:提取 256×256 图像的 patch 特征
模型权重需要先在 Meta 官网申请访问权限,批准后会收到一组下载地址。拿到 URL 或本地文件路径后,用torch.hub.load并加上source='local'指定本地仓库目录、weights指定权重:
import torch REPO_DIR = '/path/to/dinov3' # 你 clone 下来的仓库目录 model = torch.hub.load( REPO_DIR, 'dinov3_vits16', source='local', weights='dinov3_vit_s_pretrain_lvd1689m-<hash>.pth', )取特征时不要直接model(x)——那个入口走的是分类头,backbone 没有挂头。正确的入口是get_intermediate_layers(实现在 dinov3/models/vision_transformer.py),reshape=True会把特征整理成空间网格:
import torchvision.transforms.v2 as v2 transform = v2.Compose([ v2.Resize((256, 256), antialias=True), v2.ToDtype(torch.float32, scale=True), v2.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)), ]) img = transform(pil_image)[None] # [1, 3, 256, 256] patches, cls = model.get_intermediate_layers( img, n=1, reshape=True, return_class_token=True )[0] print(patches.shape, cls.shape) # torch.Size([1, 384, 16, 16]) torch.Size([1, 384])patch 特征是一个 16×16 网格(256÷16=16 个块)、每格 384 维(ViT-S 的嵌入维度);cls是 384 维的全局图像向量,适合整图级别的相似度计算。归一化参数是 README 中 LVD-1689M 权重对应的标准 ImageNet 评测值,照抄即可。
DINOv3 模型规格选型对比:ViT 还是 ConvNeXt
所有骨干都预训练在网页图像数据集 LVD-1689M 上,另有卫星影像版 SAT-493M。下表参数规模与嵌入维度来自 README 和 dinov3/hub/backbones.py:
| 模型 | 参数量 | patch 特征维度 | 适用场景 |
|---|---|---|---|
| dinov3_vits16 | 21M | 384 | 快速实验、CPU 可用规模 |
| dinov3_vits16plus | 29M | 512 | 小规模部署 |
| dinov3_vitb16 | 86M | 768 | 精度与速度平衡,最常用的默认档 |
| dinov3_vitl16 | 300M | 1024 | 生产级精度;官方 ImageNet-1k 线性评测 83.5% 即此规格 |
| dinov3_vith16plus | 840M | 1152 | 顶级精度,需要较强显存 |
| dinov3_convnext_tiny | 29M | 768 | 偏实时、偏轻量部署 |
| dinov3_convnext_small / base / large | 50M / 89M / 198M | 768 / 1024 / 1536 | 偏好卷积结构(对高分辨率更稳)时选 ConvNeXt |
选法很直接:显存紧张选 tiny/small,常规业务选 vitb16,追求指标上限且有多卡再考虑 vitl16 及以上。ViT-7B/16(6,716M 参数)用于官方预训练配方,推理场景基本用不上。
接到你的业务:分类、分割、深度与零样本
- 图像分类:冻结 backbone、只训练一个线性头,入口 dinov3/eval/linear.py,配
PYTHONPATH=.运行即可。官方快速配方(ViT-L/16,ImageNet-1k)训练约 14 小时(32 张 H100-80GB),线性评测 83.5%、k-NN 82.0%。 - 语义分割:ADE20K 线性分割的训练脚本在 dinov3/eval/segmentation/,配置文件 config-ade20k-linear-training.yaml。
- 单目深度:NYUv2-Depth 线性深度估计在 dinov3/eval/depth/。
- 零样本玩法:仓库带了一组 notebook(notebooks/),patch 特征 PCA 可视化、前景分割、跨图 patch 匹配、dino.txt 开放词表分割都能直接打开跑,适合先验证想法再接管线。
DINOv3 常见报错与踩坑点
- 权重不能用浏览器下:官方明确要求用
wget下载 checkpoint,torch.hub.load的weights参数支持 URL 或本地路径,加载器会自动判断。 - 两版权重归一化参数不同:LVD-1689M(网页图像)用 mean=(0.485, 0.456, 0.406)、std=(0.229, 0.224, 0.225);SAT-493M(卫星影像)用 mean=(0.430, 0.411, 0.296)、std=(0.213, 0.156, 0.143)。混用会直接掉点。
- 输入分辨率要配合 patch 尺寸:ViT 用 RoPE 位置编码,分辨率不必是 224,但保持边长能被 16 整除最稳妥;分辨率越高,16×16 网格数越多,显存占用按 patch 数平方增长。
- 跑 eval 模块别忘 PYTHONPATH=.:所有训练/评估命令(如
python -m dinov3.eval.linear)都要以仓库根目录加入模块搜索路径,否则报 ModuleNotFoundError。 - 大模型要配多卡:840M 的 ViT-H+ 单卡 256 分辨率已较吃力,7B 级别官方配方按 256 卡训练,推理也建议多卡切分。
到这里你已经能加载模型、取到 patch 与 class 特征,也知道了各规格的取舍。下一步按任务走:整体用法看 README.md,数据格式与下载要求见 DATASETS.md;想改模型结构看 dinov3/models/,想接新任务参考 dinov3/eval/ 里的线性评测模板。许可条款见 LICENSE.md,权重申请入口在 README 的 Pretrained models 一节。
【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考