当前位置: 首页 > news >正文

dinov3使用介绍

文章目录

  • dinov3 使用
    • 1.简单使用
      • 1.1 第一步在huggingface网站上申请dinov3的获取权限
      • 1.2 申请通过之后,在本地运行huggingface-cli login登录huggingface
      • 1.3 登录成功之后,git clone https://huggingface.co/facebook/dinov3-vits16-pretrain-lvd1689m 下载到本地
      • 1.4 然后就可以在本地运行dinov3了
      • 1.5 运行命令python dinov3.py
    • 2 关于 DINOv3 模型输出201个特征块的原因:
      • Vision Transformer 图像分块机制
      • DINOv3 特殊 Tokens
      • Register Tokens 的作用
      • 总计算

dinov3 使用

使用说明:https://github.com/facebookresearch/dinov3

1.简单使用

1.1 第一步在huggingface网站上申请dinov3的获取权限

1.2 申请通过之后,在本地运行huggingface-cli login登录huggingface

1.3 登录成功之后,git clone https://huggingface.co/facebook/dinov3-vits16-pretrain-lvd1689m 下载到本地

1.4 然后就可以在本地运行dinov3了

1.5 运行命令python dinov3.py

dinov3.py

# DINOv3 模型使用示例
# 本脚本展示了如何使用 Hugging Face transformers 库加载和使用 DINOv3 模型进行图像特征提取import torch
from transformers import AutoImageProcessor, AutoModel
from transformers.image_utils import load_image# 加载测试图像
# 使用 COCO 数据集中的一张示例图片
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = load_image(url)
print(f"图像加载完成,尺寸: {image.size}")# 指定要使用的预训练模型名称
# 使用本地下载的 DINOv3 ViT-S/16 模型
pretrained_model_name = "./dinov3-vits16-pretrain-lvd1689m"# 加载与模型匹配的图像处理器(Image Processor)
# 图像处理器负责将输入图像转换为模型所需的格式
processor = AutoImageProcessor.from_pretrained(pretrained_model_name)
print("图像处理器加载完成")# 加载预训练的 DINOv3 模型
# device_map="auto" 参数让 transformers 自动选择最佳设备(GPU/CPU)
model = AutoModel.from_pretrained(pretrained_model_name, device_map="auto", 
)
print(f"模型加载完成,设备: {model.device}")# 预处理输入图像
# return_tensors="pt" 返回 PyTorch 张量格式
# .to(model.device) 确保输入数据与模型在同一设备上
inputs = processor(images=image, return_tensors="pt").to(model.device)print(f"输入预处理完成,输入形状: {inputs['pixel_values'].shape}")# 执行模型推理
# torch.inference_mode() 上下文管理器优化推理性能,禁用梯度计算
with torch.inference_mode():outputs = model(**inputs)
print(outputs.keys())
# 提取汇聚输出(通常来自 CLS token)
# pooler_output 是图像的全局特征表示,适用于下游任务
pooled_output = outputs.pooler_output
print(f"汇聚输出形状: {pooled_output.shape}")
print(f"汇聚输出前5个元素: {pooled_output[0][:5].tolist()}")# 提取最后隐藏状态(每个图像块的特征)
# last_hidden_state 包含每个图像块(patch)的特征向量
last_hidden_state = outputs.last_hidden_state
print(f"最后隐藏状态形状: {last_hidden_state.shape}")
print(f"包含 {last_hidden_state.shape[1]} 个图像块,每个块的特征维度为 {last_hidden_state.shape[2]}")# 打印模型架构和参数信息
print("\n=== DINOv3 模型架构信息 ===")# 计算模型参数量
total_params = sum(p.numel() for p in model.parameters())
trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)print(f"模型总参数量: {total_params:,} ({total_params/1e6:.2f}M)")
print(f"可训练参数量: {trainable_params:,} ({trainable_params/1e6:.2f}M)")# 打印模型配置信息
config = model.config
print(f"\n模型架构配置:")
print(f"- 模型类型: {config.model_type}")
print(f"- 隐藏层维度: {config.hidden_size}")
print(f"- 注意力头数: {config.num_attention_heads}")
print(f"- Transformer层数: {config.num_hidden_layers}")
print(f"- 中间层维度: {config.intermediate_size}")
print(f"- 图像尺寸: {config.image_size}x{config.image_size}")
print(f"- Patch尺寸: 16x16 (推断)")
print(f"- Register tokens数量: {config.num_register_tokens}")# 计算理论计算量 (FLOPs)
# 简化的 FLOPs 估算,主要考虑 Transformer 层的计算
batch_size = inputs['pixel_values'].shape[0]
seq_length = last_hidden_state.shape[1]  # 201 (196 patches + 1 CLS + 4 registers)
hidden_size = config.hidden_size
num_layers = config.num_hidden_layers
intermediate_size = config.intermediate_size# 每层的主要计算量估算
# 1. Multi-head attention: 4 * batch_size * seq_length * hidden_size^2
# 2. Feed-forward network: 2 * batch_size * seq_length * hidden_size * intermediate_size
attention_flops_per_layer = 4 * batch_size * seq_length * hidden_size * hidden_size
ffn_flops_per_layer = 2 * batch_size * seq_length * hidden_size * intermediate_size
total_flops_per_layer = attention_flops_per_layer + ffn_flops_per_layer
total_flops = total_flops_per_layer * num_layersprint(f"\n计算量估算 (单次前向传播):")
print(f"- 每层注意力机制 FLOPs: {attention_flops_per_layer/1e9:.2f} GFLOPs")
print(f"- 每层前馈网络 FLOPs: {ffn_flops_per_layer/1e9:.2f} GFLOPs")
print(f"- 总计算量: {total_flops/1e9:.2f} GFLOPs")print(model)

2 关于 DINOv3 模型输出201个特征块的原因:

Vision Transformer 图像分块机制

基础计算

  • 输入图像尺寸:224×224 像素
  • Patch 大小:16×16 像素(ViT-S/16 中的 “/16” 表示 patch size)
  • 图像块数量:(224÷16) × (224÷16) = 14 × 14 = 196个块

DINOv3 特殊 Tokens

额外的 5 个 tokens

  1. CLS Token (1个):分类标记,用于全局图像表示
  2. Register Tokens (4个):DINOv3 引入的新特性

Register Tokens 的作用

根据 DINOv3 配置文件中的 "num_register_tokens": 4,这4个 register tokens 的作用是:

  • 改善特征质量:帮助模型更好地处理全局信息
  • 减少伪影:避免在注意力图中出现不相关的高激活区域
  • 增强稳定性:提供额外的可学习参数来优化特征表示

总计算

201 = 196(图像块)+ 1(CLS token)+ 4(register tokens)

这种设计使得 DINOv3 相比传统的 ViT 模型具有更好的特征表示能力和更稳定的训练过程。每个 token 都有384维的特征向量,其中 CLS token 的输出通常作为整个图像的全局特征表示(即 pooler_output)。

http://www.dtcms.com/a/347854.html

相关文章:

  • 【51单片机】【protues仿真】 基于51单片机储物箱系统
  • 企业智脑智能体开发全解析
  • docker的基础配置
  • SEO优化工具学习——Ahrefs进行关键词调研(包含实战)
  • 元宇宙的未来展望:机遇、风险与人类社会的新形态
  • FLOPs、TFLOPs 与 TOPS:计算能力单位
  • pig框架导入总结
  • Claude Code 新手使用入门教程
  • 第2题 - 登山鞋(C++实现)
  • 计算机组成原理(12) 第二章 - 主存储器的基本组成
  • 遥感机器学习入门实战教程|Sklearn案例⑨:数据预处理(Processing)
  • 基于STM32的智能温室控制系统设计
  • 【yocto】Yocto Project 配置层(.conf)文件语法详解
  • Service详解
  • 鸿蒙异步处理从入门到实战:Promise、async/await、并发池、超时重试全套攻略
  • 【C++】全局变量/静态变量的初始化时机
  • 基于电力电子变压器的高压脉冲电源方案复现
  • 最小覆盖子串+滑动窗口
  • 【JVM内存结构系列】二、线程私有区域详解:程序计数器、虚拟机栈、本地方法栈——搞懂栈溢出与线程隔离
  • mysql为什么使用b+树不使用红黑树
  • tcpdump命令打印抓包信息
  • 用vscode使用git工具
  • 深度优先搜索(DFS)和广度优先搜索(BFS)
  • 【内网渗透】Relay2LDAP之NTLMKerberos两种利用
  • windows中bat脚本的一些操作(三)
  • 如和在不同目录之间引用模块-python
  • 微调系列:LoRA原理
  • MVC模式在个人博客系统中的应用
  • 【通俗易懂】TypeScript 增加了 JavaScript 的可选链 (?.) 和空值合并运算符 (??)理解
  • 【集合和映射】USACO Bronze 2019 December - 我在哪Where Am I?