ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

DINOv3 零样本分割快速上手:3 步拿到第一张像素级掩码

2026/8/23 15:06:05 拓冰建站 浏览量
DINOv3 零样本分割快速上手:3 步拿到第一张像素级掩码 DINOv3 零样本分割快速上手3 步拿到第一张像素级掩码【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3DINOv3 是 Meta 开源的视觉基础模型家族其中的 dino.txt 子模型就是一个开箱即用的零样本分割工具不用训练、不用标数据给一张图和几个类别名它直接输出像素级掩码。这篇教程面向想快速验证分割效果的你目标是 3 步跑通 DINOv3 零样本分割10 分钟内看到第一张掩码。DINOv3 零样本分割三步跑通克隆、建环境、出第一张掩码第一步克隆 DINOv3 仓库并配置环境下面 5 行命令完成仓库克隆和环境搭建全程只需要 micromamba装完就能直接用。git clone https://gitcode.com/GitHub_Trending/di/dinov3 cd dinov3 micromamba env create -f conda.yaml micromamba activate dinov3 pip install -r requirements.txt环境里已经包含 PyTorch 和 xformers 等依赖不用额外配置 CUDA 工具链。第二步加载 DINOv3 模型并跑最小推理这段脚本做了四件事加载 dino.txt 模型、把一张街景图切成 512 输入、给 road 和 car 两个类别算特征、最后把每个像素分给最像的类别并保存成 mask.png。模型加载入口在 dinov3/hub/一个函数同时返回模型和分词器。import torch import torch.nn.functional as F from PIL import Image import torchvision.transforms as T from dinov3.hub.dinotxt import dinov3_vitl16_dinotxt_tet1280d20h24l model, tokenizer dinov3_vitl16_dinotxt_tet1280d20h24l() model.cuda().eval() img T.Compose([T.Resize(512), T.CenterCrop(512), T.ToTensor(), T.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))])(Image.open(street.jpg).convert(RGB)).unsqueeze(0).cuda() tok tokenizer.tokenize([a photo of a road, a photo of a car]).cuda() t F.normalize(model.encode_text(tok)[:, 1024:], p2, dim-1) _, p, _ model.visual_model.get_class_and_patch_tokens(img) n int(p.shape[1] ** 0.5) cos torch.einsum(cd,pd-cp, t, F.normalize(p, p2, dim-1)).reshape(-1, n, n) mask F.interpolate(cos, size(512, 512), modebilinear).argmax(0).cpu().numpy() Image.fromarray(mask).save(mask.png)首次运行会下载骨干权重、dino.txt 权重和 BPE 词表一共几 GB之后会走缓存。street.jpg 换成任意一张街景照片即可。第三步查看第一张像素级掩码用任意看图工具打开 mask.png黑块对应 road白块对应 car。路面的大范围区域通常能整块分出车辆位置也有对应白色区域——这就说明 DINOv3 零样本分割链路通了。DINOv3 零样本分割原理为什么没训练过也能认出任意物体它认出东西靠的不是背标签而是分两步的准备。第一步是自监督预训练把图像挖掉一块让模型看剩下的部分猜被挖掉的内容相当于用几万张图做拼图。做完这件事模型记住了物体的形状和纹理虽然从没听过road这个词。第二步是图文对齐文本编码器把 a photo of a road 翻译成图像特征能听懂的语言像一个会说两种话的翻译官。推理时只做匹配——每个图块和每段文字描述算一次相似度谁最像就归谁。图文对齐的实现就在 dinov3/eval/text/。所以认物在预训练时已完成你只是查表。DINOv3 图片到像素掩码链路走查整条链路四步。第一文本侧类别名过 BPE 分词进 24 层文本 Transformer得到 2048 维向量取后半段 1024 维——前半段对齐图像整体后半段才对齐图块。第二图像侧512×512 的图经 ViT-L 切成 32×32 共 1024 个图块每个图块得到 1024 维特征视觉骨干在 dinov3/models/。第三两侧做余弦相似度得到 [类别数, 32, 32] 的低分辨率图。第四双三次上采样回原尺寸再取 argmax就是掩码。前两步的产物在脚本里是变量 t 和 p后两步只有这两行cos torch.einsum(cd,pd-cp, t, F.normalize(p, p2, dim-1)).reshape(-1, 32, 32) mask F.interpolate(cos, size(512, 512), modebilinear).argmax(0)跑完你会看到 mask 的形状是 [512, 512]每个像素的取值就是类别编号。DINOv3 城市街景分割实战19 个类别零训练城市街景是最典型的场景输入一张路口的照片类别表直接抄 Cityscapes 的 19 个类比如 road、sidewalk、building、car、person、sky。类别名一定要用英文和预训练语料保持一致。关键参数有两个。一是提示模板别只喂 a photo of a road仓库官方做法是用 67 种模板a photo of the {0}.、a close-up photo of a {0}. 等各编码一次再取平均能明显减少单句措辞带来的偏差。二是高分辨率策略原图超过 768 像素时别硬压用滑窗推理官方配置是窗口 side384、步长 stride192窗口内做同样的相似度计算再按重叠平均。import torch.nn.functional as F names [road, sidewalk, building, car, person, sky] feats [] for name in names: tok tokenizer.tokenize([fa photo of a {name}.]).cuda() feats.append(F.normalize(model.encode_text(tok)[:, 1024:], p2, dim-1).mean(0)) text_feats F.normalize(torch.stack(feats), p2, dim-1) # [6, 1024]这段只算一次文本特征之后所有图片都复用同一个 text_feats。预期效果road、sky、building 这类大面积类别边界干净pedestrian、bicycle 这类小目标会偏粗边缘锯齿明显属于这套方法的正常表现。完整的评测脚本可以直接参考 notebooks/dinotxt_segmentation_inference.ipynb。DINOv3 常见坑显存、掩码边缘、推理速度问跑 512 分辨率直接 OOM 答ViT-L 加 dino.txt 头部在 512 下大概要吃十几 GB 显存。先把输入降到 384×384或者改用滑窗模式side384, stride192单窗口显存就下来了。问掩码边缘为什么是锯齿状、模糊的 答特征网格只有原图的 1/16512 下是 32×32再靠双线性上采样放大糊是结构性的。想要更细的边界就调小滑窗步长别指望改提示词能救。问第一次跑特别慢是卡死了吗 答第一次在下载几个权重文件和 BPE 词表几 GB 的量看终端有进度条就是正常的。之后走缓存512 单张图像前向在消费级卡上不到半秒。问没有 GPU 能验证吗 答把脚本里的 .cuda() 全换成 .cpu() 就能跑512 分辨率一张图要几分钟用来跑通逻辑没问题。DINOv3 零样本分割资源导航视觉骨干 ViTdinov3/models/dino.txt 图文对齐模型dinov3/eval/text/预训练配置dinov3/configs/项目说明与入口README.md官方零样本分割演示notebooks/dinotxt_segmentation_inference.ipynb【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考