DINOv2 视觉特征提取实战:跑通推理只要 5 分钟,坑一次讲清
【免费下载链接】dinov2PyTorch code and models for the DINOv2 self-supervised learning method.项目地址: https://gitcode.com/GitHub_Trending/di/dinov2
不想微调、只想直接拿到可用的视觉特征提取器?DINOv2 值得一看。这是 Meta AI 发布的自监督模型系列,用 1.42 亿张无标注图片训练,产出的特征可以直接接线性探针或 k-NN 检索——ViT-B/14 在 ImageNet 线性评测上就有 84.5% top-1。下面按“先跑起来、再选对版本、最后优化”的顺序走一遍。
先跑通一次推理
先把依赖装对
仓库锁定的环境是 python 3.9、PyTorch 2.0、xformers 0.0.18,且只在 Linux 上测试过。如果只是加载模型做推理,装 torch 就够;完整依赖只在训练和评测时才需要。
conda env create -f conda.yaml conda activate dinov2加载模型并做第一次前向
下面这段代码会下载 ViT-B/14 权重,并对一张随机 224×224 图像做一次前向。
import torch model = torch.hub.load("facebookresearch/dinov2", "dinov2_vitb14") model.eval() dummy = torch.rand(1, 3, 224, 222) with torch.no_grad(): out = model(dummy)模型默认输入是 518×518(14 像素 patch,切成 37×37 块),用 518 推理精度最好,224 只是快速验证。out是内置 DINO 头的 64 维输出,并不是你平时要用的图像特征。
怎么选骨干:四个尺寸加 reg 版本
| 变体 | 参数量 | 何时选它 | 何时别选 |
|---|---|---|---|
| ViT-S/14 | 21M | 低显存设备、大规模 k-NN | 精度不够时 |
| ViT-B/14 | 86M | 速度精度均衡的默认选择 | 追求精度上限时 |
| ViT-L/14 | 300M | 算力放得开 | 单卡要跑大批量时 |
| ViT-g/14 | 1.1B | 研究、冲 SOTA | 大多数场景,推理代价太高 |
ImageNet 线性评测:S 81.1%、B 84.5%、L 86.3%、g 86.5%。每个变体都有加 4 个寄存器 token 的_reg版本,精度再高一档,比如 ViT-g/14 reg4 到 87.0%。后面要做分割这类密集任务,直接用 reg 版本,寄存器 token 能让 patch 特征更平滑;其余变体同理,把名字换成dinov2_vitb14_reg即可。
深入用法:特征提取与图像分类
拿到真正能用的特征向量
真正要特征时,用get_intermediate_layers和forward_features,而不是直接调model(x)。
with torch.no_grad(): feats = model.get_intermediate_layers(dummy, n=1, reshape=True) cls = model.forward_features(dummy)["x_norm_clstoken"] print(feats[0].shape) # (1, 16, 16, 768)feats是 patch 特征图,每个 patch 768 维,可直接喂检索或分割头;cls是整图级表示。输入 518×518 时空间尺寸就是 37×37。
直接复用预训练线性分类器
如果任务就是 ImageNet 分类,头都不用自己写,直接加载完整模型:
classifier = torch.hub.load("facebookresearch/dinov2", "dinov2_vitb14_lc")其余变体同理,把名字换成dinov2_vits14_lc或dinov2_vitl14_lc就行。
🩺 换个领域:生物方向变体 Cell-DINO
同一套自监督思路也被搬到了细胞荧光显微图像上,就是仓库里的 Cell-DINO。权重需要先申请,拿到后用source='local'加本地 checkpoint 路径加载;文档里写明仅限科研用途,不能用于临床。细节看专门的 Cell-DINO 文档。
⚡ 提速与省内存:两件实际有效的事
第一件是精度与编译:GPU 上model.half()让显存和计算量都减半;PyTorch 2.0 里再套一层torch.compile合并算子。第二件是内存:构造模型时传block_chunks=1(参数定义见 dinov2/hub/backbones.py),Transformer 块分批前向,用算力换显存,跑 ViT-g 或大 batch 时特别有用。
🧭 避坑问答:三个高频问题
问:torch.hub.load 连不上网怎么办?先给TORCH_HOME指一个有空间的目录缓存权重。更彻底的做法是手动下好对应 .pth,git clone https://gitcode.com/GitHub_Trending/di/dinov2拉仓库,然后torch.hub.load(仓库路径, "dinov2_vitb14", source="local", weights="/path/to/dinov2_vitb14_pretrain.pth"),完全离线。
问:输出 shape 不符合预期,先查什么?三件事:model(x)裸输出是 64 维 DINO 头;要 patch 特征得走get_intermediate_layers(reshape=True);reg 版本序列里多了 4 个寄存器 token,但get_intermediate_layers已替你剔除,拿到的 shape 是干净的。
问:想做深度估计或分割,import 就报错?密集任务依赖特定版本的 mmcv 和 mmsegmentation,用仓库根目录的conda-extras.yaml或requirements-extras.txt单独建环境;官方notebooks目录里有两个任务现成的用法示例。
【免费下载链接】dinov2PyTorch code and models for the DINOv2 self-supervised learning method.项目地址: https://gitcode.com/GitHub_Trending/di/dinov2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考