尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

DINOv2 实战教程:从零到跑通自监督特征提取的完整指南

DINOv2 实战教程:从零到跑通自监督特征提取的完整指南 DINOv2 实战教程从零到跑通自监督特征提取的完整指南【免费下载链接】dinov2PyTorch code and models for the DINOv2 self-supervised learning method.项目地址: https://gitcode.com/GitHub_Trending/di/dinov2DINOv2 是 Meta 开源的自监督视觉模型它用 1.42 亿张无标注图片学出一套通用图像特征你无需训练就能直接搭建检索、分类、分割系统。适合想快速接入视觉特征提取器的工程师和研究者。能力速览DINOv2 到底是什么把 DINOv2 理解成一台通用视觉翻译机你喂给它一张图它还你一个 768 维向量ViT-B 规格加一组逐块的细粒度特征。不需要标签也不关心你要做什么任务。最常被拿来做三件事图像检索图片变成向量余弦相似度即可找图图像分类骨干网络冻住只训一层线性层就能接新任务密集预测逐 patch 的特征能接分割头、深度头输出像素级结果。它的价值在于特征是在 LVD-142M 无标注数据上盲练出来的迁移到下游任务时几乎不用重新教它看图省掉的是你从头训 backbone 的时间和数据。选型速查四个尺寸怎么选仓库内置四种规模的骨干网络每个都有带 register 的_reg增强版模型名参数量特征维度层数一句话定位dinov2_vits1421M38412跑得最快适合批量处理和低配卡dinov2_vitb1486M76812默认选择速度和精度平衡dinov2_vitl14300M102424显存够就上精度上限更高dinov2_vitg141.1B153640只追求极限精度时考虑_reg后缀的版本多了 4 个 register token——相当于给模型留的草稿纸专门吸收 CLS token 上容易溢出的杂散信息让 patch 级特征更干净。做分割、深度这类密集任务时优先选它。三条判断标准对号入座没有特殊诉求、第一次用 →vitb14闭眼选输入图很大1080p 以上或单卡要跑大批量 →vits14省下的显存留给 batch任务是分割/深度/检测头对逐像素质量敏感 → 对应尺寸的reg 版。四款的 patch 都是 14、默认输入都是 518切换尺寸不用改预处理。⚡ 最快上手三行加载 十行代码跑通特征提取DINOv2 安装对环境的要求压成一张表组件版本要求Python3.9PyTorch2.0.0CUDA 11.7 编译版本torchvision0.15.0xformers0.0.18GPU 显存推理 ≥8GB训练建议 ≥16GB拉代码并建好环境官方 conda 配置已锁好版本git clone https://gitcode.com/GitHub_Trending/di/dinov2 cd dinov2 conda env create -f conda.yaml conda activate dinov2下面是能直接跑通的最小片段一次拿到整图特征import torch from PIL import Image from torchvision import transforms model torch.hub.load(facebookresearch/dinov2, dinov2_vitb14).eval() prep transforms.Compose([transforms.Resize(518), transforms.CenterCrop(518), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]) x prep(Image.open(cat.jpg).convert(RGB)).unsqueeze(0) with torch.no_grad(): print(model(x).shape) # torch.Size([1, 768])两个容易踩的点第一次调用会从服务器下载预训练权重并缓存到~/.cache/torch/hub所以首跑卡住是在下文件不是死机model(x)返回的是 CLS token想要逐块特征时改调model.forward_features(x)从返回字典里取x_norm_patchtokens。模型入口都在 backbones.py权重枚举和下载逻辑写在一起想看它怎么拼 URL 可以直接翻这个文件。特征流水线一张图怎么变成向量用人话拆开讲先切再译每张 14×14 的小块被一次线性变换映射成 D 维向量就是一个 token。整张图从此变成 1369 个 token 的句子交给 Transformer 逐层做注意力CLS token 是摘要它不来自图像任何区域靠每层注意力收集全局信息。所以分类、检索直接用它就够了patch token 是逐词注释顺序和空间位置严格对齐做分割、检测时就是现成的特征图原料register token 是草稿纸注意力计算中的溢出量会堆到这几个额外 token 上CLS 和 patch 特征反而更干净——这就是 reg 版在密集任务上更稳的原因。上面这张图来自仓库内 Cell-DINODINOv2 适配细胞显微成像的版本的文档右侧 B 面板画的正是 patch → token → 自注意力这条主线可以对照流程图看。 场景实战三个高频任务各十行以内图像检索把图片压成向量再找相似import torch.nn.functional as F def vec(path): x prep(Image.open(path).convert(RGB)).unsqueeze(0) with torch.no_grad(): return F.normalize(model(x), dim-1) q vec(query.jpg) db torch.stack([vec(p) for p in gallery]) # (N, 768) print((db q).topk(5).indices.tolist()) # 最相似的 5 个编号L2 归一化之后内积就等于余弦相似度。跑一遍你会发现返回的第一张图在语义上同一只猫、同一种构图而不是逐像素意义上最接近查询图——这正是自监督特征的价值。图像分类只训一层线性层import torch.nn as nn class LinearHead(nn.Module): def __init__(self, dim768, k1000): super().__init__() self.fc nn.Linear(dim, k) head LinearHead().cuda() opt torch.optim.LBFGS(head.parameters(), max_iter20) # backbone 全程 eval()只有 self.fc 在更新骨干冻结后待训练参数只有 768×1000 量级ImageNet-1K 这类线性探测单卡几十分钟能收敛。工程化版本多层特征拼接、KNN 评估、分布式训练在 dinov2/eval/linear.pyKNN 评估脚本 也在同一目录数据少于 1 万张时建议直接跑这两个脚本而不是自己写训练循环。语义分割先拿 37×37 的特征图with torch.no_grad(): patch, cls model.get_intermediate_layers( x, n1, return_class_tokenTrue, reshapeTrue) print(patch[0].shape) # (1, 768, 37, 37)可直接喂给分割头reshapeTrue会把 patch token 还原成和输入对齐的空间图接一个 DPT 解码头就是完整的分割管线。完整实现骨干 DPT 头 训练循环在 dinov2/eval/segmentation/不想读代码的话直接打开 notebooks/semantic_segmentation.ipynb 跟着点。 微调要点与高频坑三种策略一句话对照线性探测骨干全冻只训分类头。数据少于 1 万张、或想先要个基线就它部分微调解冻最后几层骨干学习率压到头的 1/10 左右。万级以上数据的中档选择全量微调所有参数都动。数据十万级起且要盯着验证集防过拟合。五个高频坑及解法CUDA 版本不匹配torch 2.0.0 只和 CUDA 11.7 的 wheel 严格配套。装成 torch 2.1 再配 xformers 0.0.18报错里会刷一片 undefined symbol——把两者重装回配套版本即可xformers 编译失败九成是版本对不上。优先用 conda 通道里的预编译 wheelconda env create会直接带上实在要源码编译时设MAX_JOBS4降低内存峰值显存不够vitg14 推理就要 10GB 上下。三步走降到 vitl14/vitb14、输入从 518 缩到 224、开torch.cuda.amp.autocast()半精度推理分割输出出现花屏或黑边多半是输入尺寸不是 14 的倍数位置编码插值没对齐。统一用 518 或 14 的任意整数倍首次运行像卡死在下载权重。瞄一眼~/.cache/torch/hub里文件大小在涨就是正常的第二次起直接命中缓存。 收尾记住这五句就够了DINOv2 开箱即用的自监督特征提取器一行torch.hub.load起步四尺寸任选。默认三件套vitb14、输入 518、ImageNet 归一化跑不通先从这三样查起。CLS token 管分类和检索patch token 管密集预测reg 版让后者更稳。数据 1 万张以内上线性探测更多数据再逐层解冻。想进垂直领域仓库里现成的 Cell-DINO细胞成像和 XRay-DINO 是最好的参考起点。延伸阅读线性 / KNN / 分割 / 深度四类评估脚本全集dinov2/eval/Cell-DINO 领域适配案例与架构图说明docs/README_CELL_DINO.md【免费下载链接】dinov2PyTorch code and models for the DINOv2 self-supervised learning method.项目地址: https://gitcode.com/GitHub_Trending/di/dinov2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表