
DINOv3 dino.txt 免训练零样本语义分割文本到掩码的完整流程【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3dino.txt 是 DINOv3 的文本对齐模型本文介绍如何用它在免训练的情况下做零样本语义分割不标注、不训练只给一份类别名列表就能得到像素级分割掩码配套 notebook 提供 whole 与 slide 两种推理模式并用 mIoU 在 Cityscapes、Ade20k 上验证。为什么需要零样本分割与监督式分割的工作量对比该方案省掉的是监督式分割的整条上游流水线。用常规方案在某个数据集上落地语义分割至少要做三件事组织并标注像素级掩码、训练并调参一个分割头、每个新数据集重新来过而 dino.txt 路线里这三步都不存在需要写进代码的只有类别名列表类别集合变了也只需改文本、重新编码不涉及任何训练。代价是精度上限通常低于同数据集上充分训练的专业模型所以它更适合作为快速原型、跨域评估和开放词汇场景的第一选择。工作原理文本模板如何变成像素级概率图 该模型由两条编码器支路加一次余弦相似度构成整条链路只有三步。文本模板编码每个类别名先展开成一批提示模板官方 notebook 默认 80 条参考自 CLIP 的 prompt engineering 做法经 BPE 分词后进入 24 层文本 Transformer每条模板得到一个向量同一类别的多条模板向量平均后归一化得到该类别的一条特征向量。图像 patch 特征提取视觉侧用冻结的 ViT-L/16 主干提取 patch token再过两个自注意力 head block然后按空间位置重排成[h, w, D]的密集特征图。余弦相似度得概率图把 patch 特征逐位置归一化后与全部类别向量做点积得到[num_classes, h, w]的余弦相似度图双线性上采样回原图尺寸再逐像素 argmax即得类别掩码。两种推理模式共用这套计算差别在喂图方式whole 把缩放后的整图一次前向输出分辨率受单次前向限制slide 用重叠滑窗逐块前向在每个窗口内对余弦相似度做 softmax、再按命中次数平均累积到原图分辨率上细节更好代价是推理次数约为窗口数的倍数。准备工作用 conda.yaml 建环境并加载 dino.txt 模型环境按项目自带的 conda.yaml 创建即可要求 Linux 与 PyTorch ≥ 2.7.1建议装 CUDA 版本git clone https://gitcode.com/GitHub_Trending/di/dinov3 cd dinov3 micromamba env create -f conda.yaml micromamba activate dinov3模型和分词器由 hub 加载器一次返回加载器定义在 dinov3/hub/dinotxt.pyfrom dinov3.hub.dinotxt import dinov3_vitl16_dinotxt_tet1280d20h24l model, tokenizer dinov3_vitl16_dinotxt_tet1280d20h24l() model.to(cuda, non_blockingTrue) model.eval()dinov3_vitl16_dinotxt_tet1280d20h24l()返回模型与 BPE 分词器权重涵盖 ViT-L/16 主干以及视觉头加文本编码器权重文件需先到官方下载页申请获取 URL再用weights/backbone_weights参数指向。实战主流程从一张图到分割掩码 主流程拆成三步准备文本特征 → 推理图像 → 得到掩码。第一步准备文本特征。对每个类别名套用全部提示模板批量编码取输出向量后半段前半对应 CLS token丢弃逐条归一化、平均、再归一化text_feats [] for class_name in class_names: # 例如 Cityscapes 的 19 个类别 text [template.format(class_name) for template in PROMPT_TEMPLATES] feats model.encode_text(tokenizer(text).to(cuda)) feats feats[:, feats.shape[1] // 2:] feats F.normalize(feats, p2, dim-1).mean(dim0) text_feats.append(F.normalize(feats, p2, dim-1)) text_feats torch.stack(text_feats) # [num_classes, D]第二步推理图像。整图模式与滑窗模式各一个函数完整实现含图像拉伸到 patch 整数倍、窗口遍历在官方 notebooks/dinotxt_segmentation_inference.ipynbpred predict_whole(model, img, text_feats) # [num_classes, H, W] 低分辨率 # 大图改用滑窗 pred predict_slide(model, img, text_feats, side384, stride192)第三步得到掩码。整图模式输出的是低分辨率余弦图双线性上采样到目标尺寸后 argmaxpred F.interpolate(pred[None], size(H_target, W_target), modebilinear) mask pred[0].argmax(dim0) # [H_target, W_target] 类别掩码滑窗模式则直接在原图分辨率上累积各窗口的 softmax 概率并按命中次数平均输出即原图尺度无需再上采样。决策要点whole 与 slide 怎么选型选型取决于目标分辨率和算力预算先看对照wholeslide分辨率缩放后整图一次前向输出受单次前向上限约束原图分辨率逐窗口累积关键参数短边缩放notebook 默认 512窗口side384、步长stride192显存与耗时最小单窗口窗口数倍增长stride越小重叠越多越精细越慢适用中小图、快速评估大图、高精度要求两个调参方向提示模板默认 80 条平均后单类别只占一条向量想试子集效果直接删条目即可stride取side的一半是默认折中追求边缘精度再调小追求吞吐再调大。效果验证用 mIoU 与 Cityscapes 类别配置 评估用MulticlassJaccardIndex的 macro 平均即 mIoU各类别交并比的均值对 Cityscapes 这类 0 号是有效类别的数据集用ignore_index255from torchmetrics.classification import MulticlassJaccardIndex miou MulticlassJaccardIndex(len(class_names), averagemacro, ignore_index255).to(cuda) miou.update(mask[None], target[None]) print(100 * miou.compute().item())类别集合在 notebook 的ZeroShotSegmentationDataset各子类里定义Cityscapes 共 19 类road、sidewalk、building、wall、fence、pole、traffic light、traffic sign、vegetation、terrain、sky、person、rider、car、truck、bus、train、motorcycle、bicycleIGNORE_ZERO_LABEL FalseAde20k 子类则是 150 类且IGNORE_ZERO_LABEL True标签 0 与 255 映射到 255 后忽略、其余整体减 1。改数据集时只需新增一个子类并填CLASS_NAMES与IGNORE_ZERO_LABEL。边界与扩展硬件、常见报错与适用边界硬件上dino.txt 的视觉主干是 300M 参数的 ViT-L/16LVD-1689M 权重文本侧约 1280 维、20 头、24 层单张 CUDA GPU 即可推理未标注具体显存规格显存不够时优先把 slide 的side调小。常见问题有三个整图模式在大图上显存不足直接切 slide权重文件缺失报错因为模型权重须经官方下载页申请获取不能用浏览器直接下载IGNORE_ZERO_LABEL写反导致评估分数异常这是两套数据集标签约定不同先核对类别 0 是否为有效类。适用面上免训练、类别列表随时可换的特性适合快速原型、跨数据集对比和开放词汇探索但在固定类别集上追求极限精度、或类别不在预训练数据分布内时仍建议退回到训练式方案——仓库同时提供了 ADE20K 线性分割头与 M2F 分割器的推理配置dinov3/eval/segmentation/configs/config-ade20k-m2f-inference.yaml作为对照基线。【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考