恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
DINOv3 三步完成零样本分割:dino.txt 免训练语义分割实战
首页
资讯中心
/
DINOv3 三步完成零样本分割:dino.txt 免训练语义分割实战
DINOv3 三步完成零样本分割:dino.txt 免训练语义分割实战
发布时间:2026/9/15 16:16:05
DINOv3 三步完成零样本分割:dino.txt 免训练语义分割实战【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3DINOv3 是 Meta AI 开源的视觉基础模型,其多模态版本 dino.txt 已将文本编码器与图像 patch 特征在大规模数据上对齐,因此只需用类别名做提示,就能直接得到逐像素的 DINOv3 语义分割结果,全程不需要微调训练。下面以街景图像为例,给出这套零样本分割教程的最小可复现路径:环境准备、推理模式选择、Cityscapes 上的 mIoU 评估。为什么可行:文本-图像对齐原理dino.txt 由两个塔构成。视觉侧是 ViT-Large 骨干,定义见 dinov3/models/vision_transformer.py,它把图像切成 16×16 的 patch,每个 patch 产出一个特征向量;文本侧是 24 层 Transformer,定义见 dinov3/eval/text/text_tower.py,把一句自然语言描述编码成同维度向量。两个塔共享同一向量空间,patch 向量与某类事物的句子向量之间的距离,由语义相关程度决定。推理时只需一步运算:对每个 patch 特征,分别计算它与每个类别文本向量的余弦相似度,结果就是一张 [类别数, h, w] 的相似度图,相似度直接充当像素得分。没有分割头,也没有任何标注数据参与训练,类别间的区分能力全部来自预训练阶段建立的图文对齐。DINOv3 环境搭建步骤克隆仓库并用自带的 conda.yaml 建环境,其中已固定 Python 3.11、torch、torchvision、torchmetrics,以及 dino.txt 所需的 ftfy 和 regex:git clone https://gitcode.com/GitHub_Trending/di/dinov3 cd dinov3 micromamba env create -f conda.yaml micromamba activate dinov3模型入口是 dinov3/hub/dinotxt.py 中的dinov3_vitl16_dinotxt_tet1280d20h24l函数,一行调用即可拿到模型与 BPE 分词器,接着把类别名按提示模板批量编码为文本特征:import torch.nn.functional as F from dinov3.hub.dinotxt import dinov3_vitl16_dinotxt_tet1280d20h24l model, tokenizer dinov3_vitl16_dinotxt_tet1280d20h24l() model.to(cuda).eval() text_feats [] for name in [road, car, sky]: text [t.format(name) for t in PROMPT_TEMPLATES] feats model.encode_text(tokenizer(text).to(cuda)) feats F.normalize(feats[:, feats.shape[1] // 2:], p2, dim-1) # 丢弃 CLS 前半 text_feats.append(F.normalize(feats.mean(dim0), p2, dim-1)) text_feats torch.stack(text_feats) # [num_classes, D]图像侧的流程与之对应:先把图像缩放到宽高均为 patch 大小整数倍,骨干网络和附加 head blocks 输出的 patch token 重排成二维网格,逐 patch 归一化后与文本向量做内积,得到低分辨率相似度图;上采样再取 argmax,就是最终的分割掩码。零样本推理模式选择方法推理提供 whole 与 slide 两种模式,按图像尺寸取舍:维度wholeslide输入方式整图一次送入模型按 side×side 窗口、步长 stride 依次处理显存占用随 patch 总数增长单窗口恒定输出分辨率从 patch 网格上采样在输入分辨率上逐像素累积平均推荐参数短边 resize 到 512side384,stride192适用场景中等分辨率、快速评估高分辨率街景、航拍大图滑动窗口模式的做法值得展开:每个窗口算出相似度图并上采样到窗口像素尺寸,沿类别维做 softmax 得到概率值,累加进一张与图像同尺寸的结果矩阵;同时用一个计数器记录每个像素被多少个窗口覆盖。最后结果矩阵除以计数,重叠区域自然得到平均后的预测。这样做避免了整图一次下采样造成的细节损失,类别边界也更为平滑。Cityscapes 街景分割与 mIoU 评估官方推理 notebook 内置了 Cityscapes 与 ADE20K 两个数据集的加载器,类别定义(road、sidewalk、building、car、bus 等 19 类)开箱即用,路径在 notebooks/dinotxt_segmentation_inference.ipynb。评估指标用 torchmetrics 的 MulticlassJaccardIndex(多类别 Jaccard 指数,即 mIoU),macro 平均并忽略索引 255:from torchmetrics.classification import MulticlassJaccardIndex miou MulticlassJaccardIndex(len(class_names), averagemacro, ignore_index255) for img, target in dataloader: pred predict_slide(model, img, text_feats, side384, stride192) pred F.interpolate(pred[None], sizetarget.shape, modebilinear).argmax(1) miou.update(pred[None], target[None]) print(100 * miou.compute().item())每张图的预测先上采样到标注掩码的原生分辨率,取 argmax 得到类别图再累入指标,最后输出各类别 Jaccard 的均值。由于整个流程不训练任何参数,所得数字即模型的免训练真实水平,便于与同样免训练的方法横向对比。提升分割精度:提示模板聚合单句描述会让文本向量偏向特定措辞。实践中参考 CLIP 的做法:准备数十条模板(如 a blurry photo of a {0}.、a low resolution photo of the {0}.、a photo of the hard to see {0}.),把每个类别名填入所有模板后一次性编码;输出中每句对应两段特征,前半属于 CLS token 需丢弃,保留后半;对每条嵌入做 L2 归一化,再跨模板取平均并再次归一化,得到最终类别向量。多条描述求平均可以抵消单一措辞带来的偏差,让类别向量更稳定地指向该类的语义中心。这一步只发生在图像推理之前,运行一次即可,不影响推理速度。小结以上就是 DINOv3 零样本分割的完整链路:双塔共享向量空间,whole 或 slide 两种推理模式,提示模板聚合。需要复现完整数字时,直接从仓库中的推理 notebook 起步,文本塔与视觉塔的实现可对照上文给出的模块路径查阅。【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考