ARTICLE DETAIL

资讯详情

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

DINOv2 多头注意力:3 步看懂视觉聚焦机制

DINOv2 多头注意力:3 步看懂视觉聚焦机制 DINOv2 多头注意力3 步看懂视觉聚焦机制【免费下载链接】dinov2PyTorch code and models for the DINOv2 self-supervised learning method.项目地址: https://gitcode.com/GitHub_Trending/di/dinov2DINOv2 的视觉 Transformervision Transformer用 Transformer 架构处理图像的模型里多头注意力multi-head attention把一次注意力拆成多个并行视角把一张 512×512 的荧光细胞图处理成一组能直接用于分类、分割、深度估计的视觉特征全程不需要任何标注。无标签自监督预训练多头注意力自己学会看图 注意力头的并行特征提取从图像块到聚焦特征图像先被切成 token语言模型读文章要先分词视觉模型同理。dinov2/layers/patch_embed.py里的PatchEmbed用一个卷积核大小步长的卷积把 224×224 的图直接切成 14×14 的小块并投影成向量得到 256 个 patch token每个小块对应的向量标记。最前面再拼上一个 CLS tokenclassification token全局信息的汇聚点所有 token 加上位置编码positional encoding记录每个 token 在图像里的空间位置后续每一层都在这串 token 上工作。QKV 与缩放点积注意力在算什么注意力头就像一组各有偏好的审稿人每个头独立打分、各盯一种视觉模式。Attention类只有一个线性层nn.Linear(dim, dim * 3)同时产出 Qquery查询、Kkey键、Vvalue值三组矩阵再按头数拆开并行计算完整实现在 dinov2/layers/attention.py# dinov2/layers/attention.py def forward(self, x: Tensor, is_causal: bool False) - Tensor: B, N, C x.shape qkv self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads) # ← 关键一个线性层产出 Q/K/V q, k, v torch.unbind(qkv, 2) q, k, v [t.transpose(1, 2) for t in [q, k, v]] # ← 关键把头维提到批次维各头并行 x nn.functional.scaled_dot_product_attention( q, k, v, attn_maskNone, dropout_pself.attn_drop if self.training else 0, is_causalis_causal ) x x.transpose(1, 2).contiguous().view(B, N, C) x self.proj_drop(self.proj(x)) # ← 关键各头输出拼回 C 维再投影一次 return x核心是缩放点积注意力Scaled Dot-Product AttentionQ 与 K 点积得到相似度分数按头维取 -0.5 次方缩放防止数值过大导致 softmax 输出饱和softmax 归一化后对 V 加权求和。以 ViT-L 为例1024 维拆成 16 个头、每头 64 维各自学着关注不同的视觉模式。Transformer 块如何逐层叠加每一层块像一轮审校注意力改写 token 之间的关系前馈网络补充每个 token 自身的信息残差连接residual connection把输入原样加回输出保证训练稳定。dinov2/layers/block.py的Block骨架是LayerNorm → Attention → 残差 → LayerNorm → MLP → 残差外面再套 LayerScale可学习的逐维缩放和 DropPath随机深度训练时按概率丢弃整条残差路径做正则。dinov2/models/vision_transformer.py 的DinoVisionTransformer把 1240 个这样的块叠起来注意力在前、MLP 在后逐层把聚焦细化。⚡ 显存友好的注意力实现xFormers 与降级路径注意力分数矩阵规模是 N×NDINOv2 默认输入 518×518切 14×14 块后有 1369 个 token一次要算上千万个注意力分数全精度展开非常吃显存。所有vit_*工厂函数都默认挂载MemEffAttention优先调用 xFormers 库的分块注意力memory efficient attention分块计算、不落地 N² 大矩阵没装 xFormers 时自动降级功能不受影响# dinov2/layers/attention.py class MemEffAttention(Attention): def forward(self, x: Tensor, attn_biasNone) - Tensor: if not XFORMERS_AVAILABLE: return super().forward(x) # ← 关键未装 xFormers 时回退到原生 SDPA B, N, C x.shape qkv self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads) q, k, v unbind(qkv, 2) x memory_efficient_attention(q, k, v, attn_biasattn_bias) # ← 关键分块计算避开 N² 注意力矩阵 return self.proj_drop(self.proj(x.reshape([B, N, C])))想用环境变量强制关闭时设置XFORMERS_DISABLED即可加载逻辑会自动回退。最小可运行路径4 步拿到 DINOv2 特征输出环境加载预训练模型只依赖 PyTorchpip install torch建议带 CUDA可选pip install xformers启用显存优化。拉代码git clone https://gitcode.com/GitHub_Trending/di/dinov2加载并调用入口在hubconf.py# 模型入口见 hubconf.py import torch model torch.hub.load(本地仓库路径, dinov2_vitb14, sourcelocal) # ← 关键一行加载 ViT-B/14 预训练权重 x torch.randn(1, 3, 224, 224) feats, cls model.get_intermediate_layers(x, n1, return_class_tokenTrue) # ← 关键n1 表示取末尾 1 层特征 print(feats[0].shape, cls[0].shape)看输出feats[0]是[1, 256, 768]即 256 个 patch token 的 768 维特征可直接接下游头cls[0]是[768]的全局特征适合接分类器。延伸方向细胞显微成像、语义分割与深度估计细胞显微镜场景仓库自带 Channel-Adaptive DINO把多通道图像逐通道过 backbone 再做跨通道聚合CHAMMI 数据集上线性评测linear evaluation特征冻结只训一层线性头结果见 docs/README_CHANNEL_ADAPTIVE_DINO.md方法WTC - Task 1HPA - Task 2CP - Task 4KNN复现80.361.418.4KNN论文79.459.318.5线性评测复现89.987.232.5线性评测论文90.584.732.7像素级任务语义分割头与深度估计头如 DPT head把 patch 特征重采样回像素分辨率再回归深度直接消费前面拿到的特征入口在dinov2/eval/segmentation/与dinov2/eval/depth/配套示例见notebooks/depth_estimation.ipynb。训练侧机制teacher-student 自蒸馏self-distillation教师网络把自己学到的东西教给学生网络的完整流程在dinov2/train/ssl_meta_arch.py想复现自监督预训练可以从这里读起。那张 512×512 的细胞图从切块、256 个 token 到一组可直接迁移的特征全程没有一张标签。想继续深挖直接翻dinov2/layers/目录的源码或到项目 issue 区提问。【免费下载链接】dinov2PyTorch code and models for the DINOv2 self-supervised learning method.项目地址: https://gitcode.com/GitHub_Trending/di/dinov2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表