DINOv3 零样本语义分割完全指南:从逐类标注到像素级类别图

发布时间:2026/9/15 15:42:52
DINOv3 零样本语义分割完全指南:从逐类标注到像素级类别图 DINOv3 零样本语义分割完全指南从逐类标注到像素级类别图【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3DINOv3 是 Meta 的自监督视觉基础模型家族其中 dino.txt 分支把视觉与文本对齐到同一特征空间让你不标注、不训练就能做 DINOv3 零样本分割。读完本文你可以写出可运行的像素级类别图推理脚本。一、为什么需要它问题与方案对比 传统语义分割流程从像素级标注开始而这一步恰恰最贵换一个新任务就要重新标一轮类别一变又要重标。部分团队尝试 CLIP 类开放词汇方案但它的视觉侧特征主要依赖单个 CLS token遇到细线结构和小目标时密集的空间细节明显掉档。DINOv3 换了路线骨干先用自监督学出 patch 级密集特征再由 dino.txt 通过对比学习把文本编码器对齐到同一空间于是任意像素的特征都能直接与任意文本匹配。密集特征在 patch 粒度空间细节更强零样本换类别不训练即可用文本对齐靠 dino.txt 直接给出多头复用分类检测深度分割共用二、5 分钟跑通准备环境并运行首个推理代码 ⚡先确认你有 Linux 环境、PyTorch ≥ 2.7.1 和可用的 micromamba。克隆仓库并创建环境git clone https://gitcode.com/GitHub_Trending/di/dinov3 cd dinov3 micromamba env create -f conda.yaml micromamba activate dinov3运行最小脚本验证双塔能输出同空间特征import torch from PIL import Image from torchvision import transforms from dinov3.hub.dinotxt import dinov3_vitl16_dinotxt_tet1280d20h24l model, tokenizer dinov3_vitl16_dinotxt_tet1280d20h24l() # 权重拉不下来时用 weights 与 backbone_weights 指到本地 .pth model.to(cuda).eval() text_feats model.encode_text(tokenizer.tokenize([a photo of a cat.]).to(cuda), normalizeTrue) t transforms.Compose([ transforms.Resize(512, antialiasTrue), # 短边对齐保持原图纵横比 transforms.ToTensor(), transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)), ]) img_feats model.encode_image(t(Image.open(cat.jpg)).unsqueeze(0).to(cuda), normalizeTrue) print((img_feats * text_feats).sum(-1)) # 该相似度越高图像被判为 cat 的把握越大如果你看到下载失败或哈希校验报错通常是权重 URL 不对或本地文件不完整核对dinov3/hub/backbones.py中的默认下载地址并指向正确的本地路径。三、拆解零样本分割工作流三步代码走读 把整条流程拆成三个操作编码文本 → 提取密集特征 → 映射相似度每一步的输出都是下一步的输入。3.1 批量编码类名生成 dino.txt 文本特征这一步把类名变成归一化的文本向量多个提示模板取平均以抵消措辞差异。import torch.nn.functional as F PROMPT_TEMPLATES [a photo of a {0}., a close-up photo of a {0}.] text_feats [] for name in class_names: # class_names 是目标类名字符组 tokens tokenizer.tokenize([t.format(name) for t in PROMPT_TEMPLATES]).to(cuda) feats model.encode_text(tokens) feats feats[:, feats.shape[1] // 2:] # 前半段对应 CLS token密集任务用不到 feats F.normalize(feats, dim-1).mean(0) # 对模板取平均抹平措辞随机性 text_feats.append(F.normalize(feats, dim-1)) text_feats torch.stack(text_feats) # [num_classes, 1024]关键要点文本特征只需算一次循环外缓存之后所有图像复用。→ 拿到类的向量后还需要给图像上每个 patch 一个同维向量。3.2 从图像提取 DINOv3 密集特征这一步把图像送进骨干和 2 个头部块输出每个 16×16 patch 一条向量。import math import torch.nn.functional as F def encode_image(img): # img: [B, 3, H, W] B, _, H, W img.shape P model.visual_model.backbone.patch_size new_H, new_W math.ceil(H / P) * P, math.ceil(W / P) * P if (H, W) ! (new_H, new_W): # 先补齐到 patch 整数倍网格才不会越界 img F.interpolate(img, size(new_H, new_W), modebicubic) B, _, h_i, w_i img.shape _, _, patch_tokens model.visual_model.get_class_and_patch_tokens(img) return patch_tokens.reshape(B, h_i // P, w_i // P, -1) # [B, h, w, D]关键要点特征网格尺寸为“图像尺寸除以 16”这就是 DINOv3 密集特征的像素级基础。→ 两侧都是向量之后剩下的事就是一次点积。3.3 计算相似度图输出 DINOv3 零样本分割结果这一步用 einsum 一次对齐所有类向量和所有 patch 向量相似度最高的类即为该位置类别。def predict_whole(img, text_feats): blocks encode_image(img.unsqueeze(0))[0] # [h, w, D] blocks F.normalize(blocks, dim-1) cos torch.einsum(cd,hwd-chw, text_feats, blocks) # [num_classes, h, w] return cos # 低分辨率相似度图放大回原图尺寸后 argmax 即类别图高分辨率图像改用滑动窗口参考实现中side384、stride192每个窗口内做 softmax 后放大重叠区域取平均。关键要点cosine 相似度要求两侧都先做 L2 归一化顺序不能反。四、速览底层机制从双塔到相似度图 两个塔最终都投影进同一个 2048 维空间分割本质上是“patch 特征”与“文本向量”之间的矩阵乘法。输入 → 变换 → 输出image → ViT-L/1624 层patch16→ patch tokens [h, w, 1024] → 2 个自注意力头部块 线性投影 → [h, w, 1024] text → 24 层因果 Transformer77 tokens→ 文本 tokens → argmax 池化 线性投影 → [1024] align: cos(patch, text) × logit_scale → [num_classes, h, w] 相似度图视觉侧骨干在 dino.txt 训练时冻结只学 2 个头部块和投影层因此骨干的密集特征不会被对齐任务带偏。对齐损失是双向 InfoNCE图像-文本正对拉近负对推远logit_scale是可学习的温度系数等价于把原始点积换算成 softmax 前的 logit。关键实现分别位于dinov3/models/vision_transformer.py骨干、dinov3/eval/text/vision_tower.py视觉塔、dinov3/eval/text/dinotxt_model.py双塔与 logits。五、实战场景与调优两套可直接改的领域配置 把class_names换成你的领域词表再调“输入分辨率”和“推理模式”两个参数即可迁移。5.1 对城市街景做 DINOv3 零样本分割Cityscapes 共 19 类且图像尺寸大必须用滑动窗口推理。class_names (road, sidewalk, building, wall, fence, pole, traffic light, traffic sign, vegetation, terrain, sky, person, rider, car, truck, bus, train, motorcycle, bicycle) pred predict_slide(img, text_feats, side384, stride192) # 大图走窗口推理 pred pred.argmax(0) # [H, W] 的类别索引图参数典型值影响resize短边512越大细节越好显存约按平方增长side/stride384 / 192side 越大边界越细stride 小于 side 产生重叠平均提示模板数2~4 条细粒度类别下越多越稳⚠️ 滑动窗口模式累加的是各窗口 softmax 的局部平均不是全局真实概率不要直接拿去做置信度阈值过滤。5.2 医学器官分割医学图像通常不超过 2048 像素整图模式就够用重点是控制类别数和模板措辞。medical (lung, liver, kidney, bone, tumor) tf encode_text_feats(medical) # 流程同 3.1 pred F.interpolate( predict_whole(img, tf)[None], sizeimg.shape[1:], modebilinear )[0].argmax(0) # 低分辨率相似度图放大回原图再取类别参数典型值影响类别数5~10类别过多会拉低 top-1 分布的信噪比输入分辨率512~768小病灶靠更高分辨率先放大图像而非指望模型内插提示模板2~3 条器官词歧义少模板不必多六、速查表与下一步五处文件先记住 先记住这张表再决定往哪个方向深入。关键文件/目录用途何时需要修改dinov3/hub/dinotxt.pydino.txt 加载入口返回模型与分词器需要指定本地权重时dinov3/eval/text/dinotxt_model.py定义双塔结构与对齐 logits想改池化方式或特征维度时notebooks/dinotxt_segmentation_inference.ipynb零样本分割参考实现换数据集或评估指标时dinov3/configs/train/预训练与蒸馏配置自训模型时dinov3/data/datasets/ImageNet、COCO 等数据集类接入自定义数据时下一步可以做的事跑通notebooks/里其余四个 notebookPCA 可视化、前景分割、稠密/稀疏匹配、分割跟踪换用 SAT-493M 卫星权重在遥感数据上评估零样本效果通过 Hugging Face Transformers 或 timm 直接复用骨干省掉本地加载有自己的图文对时参照dinov3/eval/text/configs/dinov3_vitl_text.yaml训练自己的对齐模型现在你已经拥有一套可运行的 DINOv3 零样本分割流程下一步就是把你的类别和数据换进去。【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考