DINOv3 零样本语义分割:不写训练代码,输入类别名就出像素级结果
DINOv3 零样本语义分割不写训练代码输入类别名就出像素级结果【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3DINOv3 是 Meta AI 发布的视觉基础模型配套的 dino.txt 模块支持零样本语义分割输入几张图、一行类别名无需任何标注或训练直接得到逐像素的分割结果省掉传统分割项目最耗时的标注环节。先看效果给类别名出分割图一张街景照片类别列表是[road, building, car, ...]跑一次推理每个像素就被分到了对应的类。你不需要标注一张图也不需要微调任何权重仓库自带的 dinotxt_segmentation_inference.ipynb 里还内置了 Cityscapes 18 类、ADE20K 150 类两个完整评估流程可直接算出 mIoU。下面先讲清它为什么不用训练也能用再带你跑通。为什么没有一张标注图也能用关键在两步视觉端自监督预训练再用文本把特征接上。DINOv3 的 ViT 骨干dinov3/models/在海量无标注图像上用自监督目标学出稠密特征每个 16×16 像素的 patch 都有一个嵌入向量对纹理和语义都敏感。dino.txtdinov3/eval/text/在骨干后面加了一个文本编码器用图文对把视觉特征和文字描述对齐到同一个向量空间。于是每个 patch 向量都能和每个类别的文本向量比余弦相似度——本质上就是给每个像素找它对应的名字。全程没有分割这个任务参与训练。最快上手路径三步出第一张分割结果克隆仓库后先装依赖micromamba env create -f conda.yaml一条命令即可依赖只有 PyTorch 2.7.1、torchvision、ftfy、regex 等见 requirements.txt只加载模型的话装好 PyTorch 就够。第一步加载模型。hubconf 入口在 hubconf.py一行拿到模型和分词器from dinov3.hub.dinotxt import dinov3_vitl16_dinotxt_tet1280d20h24l model, tokenizer dinov3_vitl16_dinotxt_tet1280d20h24l() model.to(cuda).eval()第二步把类别名编码成文本向量每个类别用多条 prompt 模板取平均import torch.nn.functional as F text_features [] for name in class_names: texts [t.format(name) for t in PROMPT_TEMPLATES] feats model.encode_text(tokenizer.tokenize(texts).cuda()) feats feats[:, feats.shape[1] // 2 :] # 丢掉前半段 CLS 对应部分 feats F.normalize(feats, p2, dim-1).mean(0) text_features.append(F.normalize(feats, p2, dim-1)) text_features torch.stack(text_features) # [num_classes, D]第三步提取图像 patch 特征和文本特征算相似度逐像素取 argmax 就是分割图from dinov3.data.transforms import make_classification_eval_transform img make_classification_eval_transform()(pil_img)[None].cuda() cls_tokens, patch_tokens, _ model.encode_image_with_patch_tokens(img) x F.normalize(patch_tokens, p2, dim-1).movedim(2, 1) # [1, D, h, w] y F.normalize(text_features[:, :1024], p2, dim-1) logits torch.einsum(bdhw,cd-bchw, x, y) # 每像素对每个类别的分数 segmentation logits[0].argmax(0) # [h, w]双线性上采样到原图尺寸把segmentation用 matplotlib 的 colormaps 上色就是你看到的分割结果。功能亮点whole 与 slide 两种推理模式notebook 里封装了两个推理函数覆盖不同分辨率需求。whole 模式整图一次过适合 512 短边左右的中小图速度快slide 模式384 窗口、192 步长滑动切块逐窗计算后累加平均适合高分辨率大图如 2048×2048 的街景显存占用平稳。两者输出的都是低分辨率相似度图最后双线性插值回原图尺寸。模型加载入口与权重说明在 dinov3/hub/ 的backbones.pyWeights枚举可选 LVD-1689M网络图和 SAT-493M卫星图两套预训练骨干跑遥感数据时用后者。进阶调优与常见坑三个最值得调的参数。分辨率whole 模式建议短边 512大图直接切 slideside 384、stride 192 是 notebook 的默认值改小 stride 会让边界更平滑但更慢。prompt 数量80 条模板取平均比只用单句 a photo of {}. 更稳想提速可先降到 8 条掉点通常可接受。显存ViT-L/16 配 bfloat16 混合精度torch.autocast能省一半以上显存文本特征与类别绑定、不随图像变化整批推理前缓存一次即可别每张图重复编码。最常见的坑patch 粒度是 16 像素上采样后细边缘会模糊追求边界精度请改走带标注的线性探针路线。什么场景适合什么场景别用适合开放词汇的语义分割类别随时可增删、项目早期的快速基线、遥感卫星图用 SAT-493M 骨干。不适合需要精细轮廓的任务发丝、器官边界、医学影像这类域差大的数据、逐帧实时性要求高的视频。这三类要么标注训练要么换方案零样本路线帮不上忙。下一步模型加载看 dinov3/hub/零样本推理参考 notebooks/dinotxt_segmentation_inference.ipynb骨干权重配置在 dinov3/hub/backbones.py建议先按上面的三步跑通第一张图再打开 notebook 复现 Cityscapes 的 mIoU。【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考