ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

快速上手DINOv2:从加载无标注图片特征到离线部署的完整路径

快速上手DINOv2:从加载无标注图片特征到离线部署的完整路径 快速上手DINOv2从加载无标注图片特征到离线部署的完整路径【免费下载链接】dinov2PyTorch code and models for the DINOv2 self-supervised learning method.项目地址: https://gitcode.com/GitHub_Trending/di/dinov2从一个真实问题切入手头一批图没有标注你手上有一批商品图没有标注想搭一个相似图检索。从零训分类模型太贵找人标注更贵。DINOv2 就是一套自监督视觉Transformer的开源实现用 1.42 亿张无标注图片预训练你直接拿预训练权重提特征就行——检索、聚类、挂一层线性头做分类都能直接用不需要任何标注。30秒看懂它和别的方案差在哪和监督预训练、CLIP 相比它的不同在于一张标注都不碰靠自蒸馏从图像自己的裁剪中学习——教师网络蒸馏学生网络得到的特征对分割、深度估计这类密集任务也直接可用。方案训练信号需要标注吗特征定位监督 ImageNet 预训练分类损失约 128 万张标签分类强密集任务偏弱CLIP图文对比大规模图文对语言对齐、零样本分类MAE像素重建不需要面向重建分类偏弱DINOv2自蒸馏不需要通用特征密集分类都能用另外每个规格都提供标准和 register 两版权重。寄存器token可以理解为给模型留的几块草稿纸替边角纹理挡住注意力让主干特征更稳——做密集预测时直接选_reg版。最小可行路径四步跑通第一组特征第一步拿仓库、建环境# 克隆到本地后续所有命令都在仓库根目录执行 git clone https://gitcode.com/GitHub_Trending/di/dinov2 cd dinov2 # conda.yaml 锁定了 PyTorch xFormers 版本避免依赖漂移 conda env create -f conda.yaml conda activate dinov2如果这步报错通常是 conda 源不通或者你不在conda.yaml所在的仓库根目录执行。第二步加载骨干跑第一张图import torch from torchvision import transforms # 518 ImageNet 归一化是预训练时的输入约定必须一致 t transforms.Compose([transforms.Resize(518, interpolation3), transforms.ToTensor(), transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))]) model torch.hub.load(facebookresearch/dinov2, dinov2_vitb14).eval() x t(image).unsqueeze(0) cls model(x) # CLS 向量: (1, 768) patch model.get_intermediate_layers(x, n1)[0] # patch 特征: (1, 1369, 768)如果这步报错最常见的是首次运行需要联网拉一次权重之后走缓存或者输入少了 batch 维——shape 必须是 (1, 3, 518, 518)。第三步读懂输出cls是整图的一张 768 维名片拿去算余弦相似度就是检索patch是 1369 个 patch token518÷143737×37每个 768 维和图像网格一一对应分割、深度这类任务吃的是它。如果数量对不上先确认输入确实被 Resize 到了 518×518。第四步验证特征质量直接加载带预训练线性头的完整模型torch.hub.load(facebookresearch/dinov2, dinov2_vitb14_lc)。ViT-B 线性评估在 ImageNet 上 top-1 为 84.5%说明特征本身够用不用微调。想要更高精度把vitb14换成vitl14即可约 3 亿参数其余代码不变。按需深入怎么让模型断网也能跑weights参数支持传本地.pth路径配合sourcelocal就从本地读权重全程不发起网络请求# 权重提前下载到本地后推理环境可以完全离线 model torch.hub.load( /path/to/dinov2, # 本地仓库路径 dinov2_vitb14, sourcelocal, weights/path/to/dinov2_vitb14_pretrain.pth, )实现细节见 dinov2/hub/backbones.py。如果报size mismatch多半是权重和架构不匹配比如把_reg权重装进了非 register 版本。想只取中间层特征怎么办get_intermediate_layers的n支持取最后 n 层或显式层号列表layers model.get_intermediate_layers( x, n4, # 取最后 4 层 return_class_tokenTrue, # 附带各层 CLS ) patch, cls layers[0] # (1, 1369, 768) / (1, 768)n4 时返回 4 层元组多尺度特征融合、对比不同深度的表示时就用它不用改模型结构。想直接当分类器或做深度估计头权重都预训练好了分类用dinov2_vitb14_lc深度用dinov2_vitb14_ld线性头或dinov2_vitb14_ddDPT 头加载函数在dinov2/hub/depthers.py。注意深度和分割头依赖 mmcv / mmsegmentation基础环境里没有需要按仓库说明装 extras 依赖。想做细胞荧光显微成像仓库里还带了面向生物成像的 Cell-DINO 与 Channel-Adaptive DINO权重需先申请下载再用torch.hub.load(REPO_DIR, cell_dino_cp_vits8, sourcelocal, pretrained_path...)从本地加载流程与上面的离线加载一致。实战避坑你大概率会遇到这 5 种情况现象torch.hub.load卡在下载或超时。根因默认权重地址在当前网络不可达。解法自己下载.pth用weights本地路径sourcelocal加载。现象特征全乱、检索命中随机。根因跳过了 ImageNet 归一化直接喂了 0-1 张量。解法ToTensor()后必加transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))。现象RuntimeError提示张量维度不对。根因输入是 (H, W, C) 三维缺 batch 维。解法喂入前x t(img).unsqueeze(0)。现象ViT-g/14 版 batch1 都显存爆。根因约 11 亿参数加上 1369 个 token 的长序列注意力开销很大。解法任务允许就降到dinov2_vitb14或者model.half()走半精度。现象加载深度/分割头报ModuleNotFoundError: No module named mmcv。根因这些头依赖 mmcv/mmsegmentation基础环境未装。解法pip install -r requirements-extras.txt或用conda env create -f conda-extras.yaml建独立环境。走向下一步DINOv2 擅长的是无标注图像的特征提取与密集预测需要文本理解的 OCR、问答这类多模态任务它不碰仓库里的 dino.txt 只覆盖了一部分零样本任务。想继续深入先翻 MODEL_CARD.md 核对各版权重清单与许可边界再照着 dinov2/configs/train/ 里的配置在你自己的数据上复现一遍自监督训练。【免费下载链接】dinov2PyTorch code and models for the DINOv2 self-supervised learning method.项目地址: https://gitcode.com/GitHub_Trending/di/dinov2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表