ARTICLE DETAIL

资讯详情

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

DINOv3 零样本语义分割实战:dino.txt 免训练逐像素分类

DINOv3 零样本语义分割实战:dino.txt 免训练逐像素分类 DINOv3 零样本语义分割实战dino.txt 免训练逐像素分类【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3这篇文章只讲一件事不训练、不标注用 DINOv3 仓库里的 dino.txt 模型做零样本语义分割。给定一组类别名和一张图推理代码会输出形状为[num_classes, H, W]的逐像素类别概率图取 argmax 即为分割结果。零样本分割zero-shot segmentation指对训练时从未出现过的类别直接出图不需要再跑任何训练流程。全文以仓库自带的分割推理 notebook 为主线每步结果都可打印验证。零样本分割能解决什么问题传统语义分割的前提是像素级标注每张图每个像素都要人工标好类别标注成本和覆盖度都限制着项目启动速度。dino.txt 属于 CLIP 式对比模型把视觉特征和文本特征拉进同一个嵌入空间于是类别名是文本、图像块是特征、两者做相似度这件事在数学上成立了。它的结构可以一句话概括视觉侧是 DINOv3 ViT-L/16 主干加 2 个附加块文本侧是 24 层 Transformer两侧共享 2048 维的嵌入空间对应DINOTxtConfig中embed_dim2048。适用边界说清楚避免期望错位适合新数据集的可行性验证、无标注预算下的长尾类别覆盖、快速出原型。不适合标注充足且精度优先的生产场景此时监督训练的专用模型上限更高。DINOv3 环境怎么装在任意工作目录执行git clone https://gitcode.com/GitHub_Trending/di/dinov3然后按下面的要点配置全部来自仓库自带的conda.yaml环境名dinov3Python 3.11渠道为 defaults conda-forge创建命令为micromamba env create -f conda.yaml。核心依赖torch、torchvision建议选 CUDA 构建版本、torchmetricsmIoU 指标用、omegaconf、pandas。dino.txt 特有的两个依赖ftfy和regex它们服务于 BPE 分词器缺了会报 import 错误。激活环境后在仓库根目录以可编辑模式安装本地包pip install -e .。验证方式激活环境能正常 importdinov3并执行下一节的模型加载代码、拿到(model, tokenizer)两个对象即表示环境就绪。加载 dino.txt 模型与分词器from dinov3.hub.dinotxt import dinov3_vitl16_dinotxt_tet1280d20h24l model, tokenizer dinov3_vitl16_dinotxt_tet1280d20h24l() model.to(cuda, non_blockingTrue) model.eval()几个可以在源码中核对的细节函数返回(model, tokenizer)元组model是DINOTxt实例定义在dinov3/eval/text/dinotxt_model.py。模型名可拆解tet 指文本编码器1280 为文本嵌入维度20 为注意力头数24 为文本层数与TextTransformer的构造参数一一对应。权重默认加载 LVTD2300M 的视觉头部 文本编码器权重视觉主干使用 LVD1689M 的 ViT-L/16 预训练权重。notebook 中还有一步tokenizer tokenizer.tokenize把分词器对象换成可直接调用的 tokenize 方法后文示例沿用这一写法。最小推理流程文本与图像特征怎么算整个推理链路只有三步类别名编码成文本向量、图像编码成补丁特征、两者做余弦相似度。前两步各算一次可复用于整批图像。文本侧类别名到向量每个类别会填入多条提示模板生成多条文本编码后取平均text_feats [] for class_name in class_names: texts [t.format(class_name) for t in PROMPT_TEMPLATES] tokens tokenizer(texts).to(cuda) feats model.encode_text(tokens) # [num_prompts, 2D] feats feats[:, feats.shape[1] // 2:] # 前半是 CLS 分支的输出丢弃 feats F.normalize(feats, p2, dim-1) feats F.normalize(feats.mean(dim0), p2, dim-1) # 跨提示平均再归一 text_feats.append(feats) text_feats torch.stack(text_feats) # [num_classes, D]要点encode_text的输出宽度是2D前半段对应 CLS 分支参与匹配的是后半段先对每条嵌入做 L2 归一化再在提示维度上取均值并再次归一化保证每个类别得到一条单位向量。图像侧补丁特征与相似度匹配图像侧先把尺寸拉到补丁大小的整数倍。本模型patch_size16即每个 16×16 像素块对应一个向量def encode_image(model, img): B, _, H, W img.shape P model.visual_model.backbone.patch_size # 16 new_H, new_W math.ceil(H / P) * P, math.ceil(W / P) * P if (H, W) ! (new_H, new_W): img F.interpolate(img, size(new_H, new_W), modebicubic, align_cornersFalse) _, _, 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).contiguous() # [B, h, w, D]拿到空间网格状的特征后与文本特征做逐位置点积两侧均已归一化点积即余弦相似度def predict_whole(model, img, text_features): blocks_feats encode_image(model, img.unsqueeze(0)).squeeze(0) # [h, w, D] blocks_feats F.normalize(blocks_feats, p2, dim-1) cos torch.einsum(cd,hwd-chw, text_features, blocks_feats) # [num_classes, h, w] return cos输出是低分辨率的相似度网格h H/16、w W/16。后续用双线性插值放大到目标分辨率再取 argmax。图像预处理与 notebook 保持一致短边缩放到 512、ToTensor、ImageNet 均值方差归一化。whole 与 slide两种推理模式怎么选notebook 的配置项mode只有两个取值对应两种前向方式whole全图整张图一次前向得到[num_classes, h, w]后放大。计算量最小适合短边约 512 的中等分辨率输入这是 notebook 的默认 resize 尺寸。slide滑窗滑窗推理把大图画成多个重叠窗口逐窗口跑 whole 的逻辑再拼回原图。notebook 默认参数为窗口边长side384、步长stride192即相邻窗口重叠约一半。每个窗口的相似度图先放大到窗口分辨率、沿类别维度做 softmaxnotebook 注释明确说明这不是真概率只是归一化后的相似度累加进probs同时用counts记录每个像素被几个窗口覆盖最后probs / counts得到图像分辨率下的[num_classes, H, W]结果。选择规则很直接输入短边 512 上下、追求速度用 whole原图远大于 512 且小目标如远处的 traffic light对结果影响大用 slide代价是前向次数按h_grids × w_grids增长。用 Cityscapes 跑评估mIoU 口径说明评估流程在 notebook 的最后一个 cell 中数据集与指标都可以直接复用。类别定义Cityscapes类给出 19 个类别依次为 road、sidewalk、building、wall、fence、pole、traffic light、traffic sign、vegetation、terrain、sky、person、rider、car、truck、bus、train、motorcycle、bicycle且IGNORE_ZERO_LABEL False标签从 0 起、不做 255 重映射。指标口径miou MulticlassJaccardIndex(len(class_names), averagemacro, ignore_index255)mIoU 是各类别 IoU 的宏平均先对每个类别算预测与真值掩码的交集并集比IoU再把所有类别的 IoU 相加除以类别数最后乘 100 得到百分比。评估循环中预测图先双线性插值到标注分辨率、argmax 得到[H_target, W_target]的类别图再喂给miou.update循环结束调miou.compute()。notebook 同时内置了Ade20k150 类数据集类换数据集时只需替换CLASS_NAMES和数据加载部分。提示模板怎么调默认模板是 80 条以{0}为占位符的字符串取自 CLIP 官方的提示工程做法例如a photo of a {0}.、a photo of many {0}.、a blurry photo of the {0}.、a sketch of a {0}.。调优时注意成本结构文本特征只在数据集开始算一次增加模板的开销是一次性的真正值得做的是消融实验而不是盲目加模板。基线对比只保留a photo of a {0}.单条模板 vs 完整 80 条在固定验证集上各跑一遍记录 mIoU 差值。按类别属性裁剪road、sky 这类场景词从 a sculpture of a {0}. 这类物体化模板里得到的是噪声可以试一个去掉物体化模板的子集。结论以数字为准哪套模板 mIoU 高就用哪套模板数量本身不是指标。代码地图关键模块在哪模块路径职责模型加载入口dinov3/hub/dinotxt.py组装DINOTxt、加载权重返回(model, tokenizer)分割推理流程notebooks/dinotxt_segmentation_inference.ipynb数据集定义、whole/slide 推理、mIoU 评估的完整参考实现文本编码器dinov3/eval/text/text_tower.py24 层文本 Transformer 与池化逻辑视觉特征提取dinov3/eval/text/vision_tower.py封装骨干网络get_class_and_patch_tokens输出 CLS 与补丁 token下一步做什么先在单张图上跑通打开 notebook填好DINOv3_REPO_DIR打印pred的形状确认它是[19, H, W]Cityscapes 19 类。做一组对照实验取 Cityscapes 验证集 100 张whole 与 slideside384, stride192各跑一遍记录 mIoU 与单图耗时得到你自己的选型数据。迁移到自己领域医疗影像、遥感等时先用默认 80 条模板出基线再做模板子集消融用 mIoU 决定最终模板集。【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表