DINOv3视觉基础模型零样本分割快速上手:一条命令出掩码
【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3
你手头有一批街景图,想直接拿到像素级类别掩码,又不想等标注、更不想从零训分割模型。DINOv3 的零样本语义分割就是干这个的:传入一组类别名,它直接返回掩码,全程不碰标注数据。这个仓库是 DINOv3 视觉基础模型的参考 PyTorch 实现,分类、深度、检测、分割的预训练头都现成可用。
DINOv3 能帮你做什么:密集特征加文本对齐
DINOv3 是一族自监督预训练的骨干网络:ViT 从 21M 参数的 ViT-S/16 到 67 亿参数的 ViT-7B/16,另有 ConvNeXt 四个尺寸,全部是 16×16 patch。网络图版本在 16.9 亿张网页图(LVD-1689M)上预训练,还有两个用 4.9 亿张卫星图(SAT-493M)预训练的权重,可以拿去做遥感。
- 密集特征即取即用:patch 级特征直接可支撑分割、匹配、深度估计,不必先接分类头
- 文本和视觉同空间:dino.txt 头把 24 层文本 Transformer(dim 1280、词表 49408)与视觉特征对齐到 2048 维
- 下游配方齐了:线性分类、COCO 检测、NYU 深度、ADE20K 分割头都有现成的加载入口
一次前向:图像和文本是怎么对上的
流程是一条线。图像过 ViT 骨干得到 h×w×2048 的 patch 特征网格;类别名经 BPE 分词(最多 77 个 token)过文本 Transformer 得到文本向量;两边 L2 归一化后做余弦相似度,得到 类别数×h×w 的相似度图;上采样回原图尺寸再 argmax,就是掩码。
视觉侧在骨干后还接了 2 个 Transformer 头块,patch 特征取自最后一层;相似度乘了一个可学习温度 logit_scale,初始值 log(1/0.07)。模型定义在 dinov3/eval/text/dinotxt_model.py,hub 加载入口在 dinov3/hub/dinotxt.py。
搭环境并加载模型:三步
第一步,克隆并建环境,要求 Linux、PyTorch 2.7.1 以上:
git clone https://gitcode.com/GitHub_Trending/di/dinov3 cd dinov3 && micromamba env create -f conda.yaml micromamba activate dinov3第二步,申请权重。审核通过后你会拿到下载 URL,官方建议用 wget 而不是浏览器下载。
第三步,用 torch.hub 加载 dino.txt 模型:
import torch model, tokenizer = torch.hub.load( REPO_DIR, "dinov3_vitl16_dinotxt_tet1280d20h24l", source="local", weights="<dinotxt权重URL>", backbone_weights="<ViT-L/16骨干URL>", )weights和backbone_weights两个参数都接受 URL 或本地文件路径。
动手跑通:Cityscapes 19类零样本分割
官方 notebook notebooks/dinotxt_segmentation_inference.ipynb 直接演示了 Cityscapes(19 类)和 ADE20K(150 类)的零样本分割,流程三步。
第一步,编码类别名。每个类别名填进 79 条提示模板("a photo of the {0}" 这类),过encode_text再取平均,得到该类一条归一化向量:
feats = model.encode_text(tokens) # [79, 2D] feats = feats[:, feats.shape[1] // 2:] # 丢掉CLS token那一半 road = F.normalize(feats.mean(0), p=2, dim=-1) # 该类一条向量第二步,编码图像。预处理是短边缩放到 512 加 ImageNet 标准归一化,然后取 patch 特征,和文本向量逐像素算余弦相似度:
cos = torch.einsum("cd,hwd->chw", text_feats, F.normalize(blocks, p=2, dim=-1)) pred = F.interpolate(cos, size=(H, W), mode="bilinear").argmax(1)第三步,选推理模式。512×512 以内的图用 whole 整图模式;分辨率更高用 slide 滑窗,默认 side=384、stride=192,重叠窗口的 softmax 概率在原分辨率上累加取平均。
卡住了先拨这三个开关:OOM、分错类、归一化错
大图 OOM:把短边 resize 从 512 降到 384,或切 slide 模式。slide 的显存占用约等于一个窗口,不随整图尺寸增长。
掩码发糊、类别串门:先换类别名表述。多条模板平均本身就在平滑文本向量,多给几个说法("a close-up photo of a {0}" 就在模板集里)通常能把边界改善。
归一化参数不匹配:LVD-1689M 权重用 mean 0.485/0.456/0.406;SAT-493M 卫星权重必须换成 mean 0.430/0.411/0.296、std 0.213/0.156/0.143,否则特征质量会直接掉下来。
读完后的行动清单
- 打开 notebooks/pca.ipynb 对自己的图看 DINOv3 patch 特征,几分钟就能对特征质量有体感
- 复制零样本分割 notebook,把数据集换成自己的图,先跑通 Cityscapes 19 类
- 只需要特征做自己的下游:加载 86M 参数的
dinov3_vitb16骨干就够,不必动 67 亿参数的大模型 - 有标注数据时,跑线性探针:
dinov3/eval/segmentation/run.py配 config-ade20k-linear-training.yaml
【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考