ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DINOv3 零样本分割落地:从一张类别清单到像素级掩码

DINOv3 零样本分割落地:从一张类别清单到像素级掩码 DINOv3 零样本分割落地从一张类别清单到像素级掩码【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3像素级标注采集昂贵、长尾类别难以覆盖是语义分割项目常见的起步障碍。DINOv3 开源仓库提供了 dino.txt 方案给一张图像加一份类别名称列表直接输出每个像素的类别掩码无需任何训练完成 DINOv3 零样本分割的完整链路。DINOv3 零样本分割能做什么先交代产出形态。整条管线只依赖两样输入不需要任何标签数据输入处理输出图像任意分辨率自动缩放到 patch 倍数冻结 ViT-L/16 提取 patch 特征与文本嵌入做余弦相似度像素级类别图[H, W]取值为类别下标类别名称列表英文短语80 条提示模板编码后取平均每类一个归一化向量[C, D]仓库自带的推理 notebooknotebooks/dinotxt_segmentation_inference.ipynb覆盖了两组类别集Cityscapes 19 类街景、ADE20K 150 类室内/室外场景指标用多类别 JaccardmIoU。类别集完全自定义——换成road、pothole、manhole这样的列表就是对自研数据集的开集分割。 最小可运行示例从克隆到掩码环境与权重说明代码依赖conda.yaml定义的 Python 3.11 环境dino.txt 头部权重与 ViT-L/16 骨干权重不在仓库内由 hub 函数首次运行时按需下载加载逻辑见 dinov3/hub/dinotxt.py。git clone https://gitcode.com/GitHub_Trending/di/dinov3 cd dinov3 micromamba env create -f conda.yaml micromamba activate dinov3import torch, math 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.to(cuda).eval() tokenize tokenizer.tokenize # 1) 文本侧提示模板 x 类别名平均后归一化 templates (a photo of a {0}., a blurry photo of a {0}., a close-up photo of a {0}.) class_names (road, car, person, sky) text_feats [] for name in class_names: tokens tokenize([t.format(name) for t in templates]).to(cuda) feats model.encode_text(tokens) feats feats[:, feats.shape[1] // 2:] # 丢弃前半 CLS token feats F.normalize(feats, p2, dim-1).mean(0) # 模板平均再归一化 text_feats.append(feats) text_feats F.normalize(torch.stack(text_feats), p2, dim-1) # [C, D] # 2) 图像侧冻结骨干的 patch 特征重排为网格 img T.functional.to_image(Image.open(street.jpg)) img T.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))( T.Resize((512, 512), antialiasTrue)(img)[None].to(cuda) ) P model.visual_model.backbone.patch_size h, w img.shape[2] // P, img.shape[3] // P _, _, patch model.visual_model.get_class_and_patch_tokens(img) feats F.normalize(patch.reshape(1, h, w, -1).permute(0, 3, 1, 2), p2, dim1) # 3) 余弦相似度 → 上采样 → 逐像素 argmax 得到掩码 cos torch.einsum(cd,hwd-chw, text_feats, feats) # [C, h, w] mask F.interpolate(cos.unsqueeze(0), sizeimg.shape[2:], modebilinear, align_cornersFalse)[0].argmax(0) print(mask.shape) # torch.Size([512, 512])取值 0..C-1 对应 class_names 关键机制拆解文本与像素如何对齐模型结构在 dinov3/eval/text/dinotxt_model.py 中视觉侧是冻结的 DINOv3 骨干加 2 个注意力头部块文本侧是 24 层、20 头、维度 1280 的因果 Transformer结构定义见 dinov3/hub/dinotxt.py 的配置段。几个设计点值得注意。文本侧对每个类别套用一组提示模板再平均是因为单一措辞如a photo of a car会把嵌入拉到特定语境平均相当于对措辞做边际化对sidewalk这类词面差异大的类别更稳。文本嵌入取 argmax 池化对应最后一个真实 token而encode_text输出是[N, 2D]——前半是 CLS token 特征使用前必须切掉后半。视觉侧冻结骨干、只训练头部块好处是骨干的稠密特征质量不动新增的对齐能力只存在于轻量头部推理时 patch token 直接按h x w网格排布天然就是像素级信号不需要额外解码器。匹配用余弦相似度而非点积配合两侧 L2 归一化尺度上等价于 CLIP 的logit_scale * f t.T见 dinotxt_model.py 的get_logits但逐 patch 计算无需缩放参数。高分辨率图用滑动窗口每个窗口独立算余弦相似度softmax 后累加、按覆盖次数取平均核心循环只有几行probs torch.zeros(C, H, W, devicecuda) counts torch.zeros(H, W, devicecuda) for (y1, y2, x1, x2, win) in windows: # side384, stride192 cos predict_whole(model, win, text_feats) # [C, h, w] 低分辨率网格 cos F.interpolate(cos[None], sizewin.shape[-2:], modebilinear, align_cornersFalse)[0] probs[:, y1:y2, x1:x2] cos.softmax(dim0) counts[y1:y2, x1:x2] 1 probs / counts这里的 softmax 结果只是类概率的累加权重不是真实概率分布注释里也有说明窗口边界处的预测会重复计入用counts归一化消除重复。完整的predict_slide实现见 notebooks/dinotxt_segmentation_inference.ipynb。全图推理与滑动窗口怎么选模式适用分辨率前向次数显存说明whole短边 ≲ 7681 次随分辨率平方增长输出[C, h, w]网格直接上采样slide高分辨率1024 及以上((H-384)/1921) * ((W-384)/1921)固定只与窗口有关窗口内 softmax 累加取平均选择建议短边小于约 768 的图直接用 whole省掉窗口调度开销超过则用 slide默认side384, stride19250% 重叠stride 调小可提升边界平滑度但前向次数线性增加。同一套 whole/slide 逻辑也用在 M2F 分割头的评测里参考 dinov3/eval/segmentation/inference.py。️ Cityscapes 实战与踩坑记录以 Cityscapes 为例19 类清单直接写在数据集类里见 notebook 的Cityscapes.CLASS_NAMESIGNORE_ZERO_LABELFalseADE20K 则需IGNORE_ZERO_LABELTrue把背景 0 映射到 255 并整体减 1。评测用MulticlassJaccardIndex(19, averagemacro, ignore_index255)逐图更新即可。踩坑记录现象 → 原因 → 解法相似度矩阵对不上 / 掩码恒为一类→encode_text输出是[N, 2D]前半 CLS token 未切掉 → 按feats[:, feats.shape[1] // 2:]取后半再归一化。get_class_and_patch_tokens报 shape 错误→ 输入 H、W 不是 patch size 16 的倍数 → 先按ceil(H/16)*16做 bicubic 插值notebook 的encode_image已内置此步。whole 模式在 2048x1536 图上变慢甚至 OOM→ patch token 数随分辨率平方增长 → 切 slide 模式窗口固定为 384。mIoU 明显偏低且某些类整类缺失→ ADE20K 标签未做 0→255 映射与ignore_index255冲突 → 按IGNORE_ZERO_LABEL语义统一标签后再算指标。首次加载长时间无输出→ hub 函数在后台下载头部与骨干权重仓库本身不含权重文件 → 提前用wget下载好通过weights/backbone_weights参数指向本地路径。适用边界与下一步零样本路线的效果上限由类别能否用短语说清决定streetlight 与 pole、car 与 truck 这类视觉相近的类别纯文本对齐仍会混淆此时更划算的做法是走仓库自带的少量训练路线——ADE20K 线性分割dinov3/eval/segmentation/或 M2F 微调头二者都支持 slide 推理。若目标域与预训练分布差距大也可以按 dinov3/eval/text/ 提供的配置与训练脚本用自有图文对重训文本对齐头。对多数先验证再投入的场景dino.txt 是成本最低的第一步它把标注预算花在了真正难自动化的部分。【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表