视觉大模型DINOv2:自我监督学习的新领域

news2025/4/22 10:23:22

如果你对自监督学习感兴趣,可能听说过Facebook人工智能的DINO(无标签知识蒸馏)。我们在以前的文章中也介绍过它。DINOv2不仅是一个新版本而且带来了新的改进,并为判别性自监督学习设定了更高的标准。当然公司的名字也从Facebook变为了Meta。

本文将介绍DINOv2是如何改进的,以及这些进步可能对整个领域有什么影响。

DINO回顾

如果你对DINO不了解,我们首先回顾以下它的信息。它是 Facebook AI 的发布的视觉理解领域自监督学习的解决方案。DINO 架构的核心是不使用标签的知识提炼,distillation with no labels。通俗地说,它训练了一个学生网络来模仿一个更强大的教师网络的行为,所有这些都不需要在训练数据中有明确的标签。

DINO 的底层是 Vision Transformer (ViT) 架构,该设计从自然语言处理 (NLP) 中的转换器模型中汲取灵感,并将其应用于视觉数据。DINO 使用对比学习方法,模型学习从图像检索任务中有用的数据中识别相似和不同的例子。但是DINO 放弃了负采样的通常做法,而是选择了全局自注意力机制。这使它能够捕获更全面的数据视图。

在性能方面,DINO 优于其他自监督学习方法,甚至可以与一些监督方法相媲美。它的多功能性在其成功应用于各种任务中是显而易见的,包括图像分类、对象检测,甚至实例分割。

DINOv2:增强版DINO

DINOv2保留了DINO的好处,并增加了一些增强功能,可以实现更好的性能。下面是一些关键的改进:

FlashAttention机制:这个新的自注意力层,它1提高了内存使用效率和速度,这对于管理大模型至关重要。每个头部维数是64的倍数,整个嵌入维数是256的倍数时,它的效果最好。

Self-Attention 中的嵌套张量:在同一前向传播中运行全局裁剪和局部裁剪(具有不同数量的补丁令牌),可以显着提高计算效率。

Efficient Stochastic Depth:这个版本跳过了残差下降计算,节省了内存和计算能力。

Fully-Shared Data Parallel (FSDP):模型跨 GPU 拆分,模型大小不受单个 GPU 内存的限制,而是受所有计算节点上 GPU 显存的总和限制。

模型蒸馏:对于较小的模型,DINOv2利用最大模型ViT-g的知识蒸馏,而不是从头开始训练,从而提高了性能。这个过程包括将知识从更大、更复杂的模型(教师)转移到更小的模型(学生)。学生模型被训练来模仿教师的输出,从而继承其优越的能力。这个过程提高了小型模型的性能,使它们更有效率。

数据集和训练

论文使用了经过整理和未经整理的数据的12亿张图像,这些数据是由多个高质量来源组成,包括ImageNet-22k、ImageNet-1k的训练分割、Google Landmarks和各种细粒度数据集。这些精心策划的图像提供了广泛的定义良好的视觉数据,有助于模型的学习。

未经整理的数据集来源于公开可用的网络抓取数据。为了保证这些图像的质量和安全,还使用了多种过滤技术,例如PCA删除重复内容,NSFW过滤内容适当性,人脸模糊处理以确保隐私。

这些图像无论是经过整理的还是未经整理的,都先映射到嵌入中。在与经过整理的图像匹配之前,未整理的图像要经过额外的重复数据删除步骤。

LVD-142M是由1.42亿张图像组成的大型数据集,Meta通过在高性能计算集群上分布执行整理步骤创建了该数据集。该计算集群由20个节点组成,配备8个V100-32GB gpu,创建时间不到2天。也就是说光数据准备就用了8个V100的2天时间。在模型训练方面,使用了A100-40GB的GPU,花了22k GPU小时来训练dinov2g模型。

这对于我们个人研究来说,是不可能复现的,所以我们这里使用它们发布的预训练模型来进行推理和研究:

 git clone https://github.com/facebookresearch/dinov2.git
 cd dinov2 && pip install -r requirements.txt

我们使用下面这4张图

 import os
 import torch
 import torchvision.transforms as T
 import hubconf
 from PIL import Image
 import numpy as np
 import matplotlib.pyplot as plt
 from sklearn.decomposition import PCA
 
 # Load the largest dino model
 dino = hubconf.dinov2_vitg14()
 dino = dino.cuda()
 
 # Load the images
 img_dir = '/path/to/your/image/folder'
 image_files = os.listdir(img_dir)
 images = []
 for image in image_files:
     img = Image.open(os.path.join(img_dir, image))
     img_array = np.array(img)
     images.append(img_array)

让我们看看DINOv2如何寻找这4张图像的相似之处

 # Preprocess & convert to tensor
 transform = T.Compose([
               T.Resize(560, interpolation=T.InterpolationMode.BICUBIC),
               T.CenterCrop(560),
               T.ToTensor(),
               T.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),
             ])
 
 # Use image tensor to load in a batch of images
 batch_size = 4
 imgs_tensor = torch.zeros(batch_size, 3, 560, 560)
 for i, img in enumerate(images):
   imgs_tensor[i] = transform(img)[:3]
 
 # Inference
 with torch.no_grad():
   features_dict = dino.forward_features(imgs_tensor.cuda())
   features = features_dict['x_norm_patchtokens']
 
 print(features.shape)

输出为torch.Size([4, 1600, 1536]),因为ViTg14模型的特征维度是1536。我们使用了4张图像来运行这个推理,如果您的目录中有超过4个图像,则需要相应地调整它。

使用PCA分析:

 # Compute PCA between the patches of the image
 features = features.reshape(4*1600, 1536)
 features = features.cpu()
 pca = PCA(n_components=3)
 pca.fit(features)
 pca_features = pca.transform(features)
 
 # Visualize the first PCA component
 for i in range(4):
     plt.subplot(1, 4, i+1)
     plt.imshow(pca_features[i * 1600: (i+1) * 1600, 0].reshape(40, 40))
 plt.show()

第一个 PCA 分量对应于高维空间中数据变化最大的方向。在像 DINOv2 这样的模型学习的特征的上下文中,这应该是对应于模型已经学会识别的最重要的视觉特征。例如,它可能对应于高级特征(例如某些对象的存在)或低级特征(例如边缘、颜色或纹理)。

我们移除背景并可视化前 PCA 分量,以查看这 4 个图像中的特征如何匹配。

 # Remove background
 forground = pca_features[:, 0] < 1 #Adjust threshold accordingly
 background= ~forground
 
 # Fit PCA
 pca.fit(features[forground])
 features_forground = pca.transform(features[forground])
 
 # Transform and visualize the first 3 PCA components
 for i in range(3):
     features_forground[:, i] = (features_forground[:, i] - features_forground[:, i].min()) / (features_forground[:, i].max() - features_forground[:, i].min())
 rgb = pca_features.copy()
 rgb[background] = 0
 rgb[forground] = features_forground
 rgb = rgb.reshape(4, 40, 40, 3)
 for i in range(4):
     plt.subplot(1, 4, i+1)
     plt.imshow(rgb[i][..., ::-1])
 plt.show()

可以看到,尽管类型、姿势和图像风格发生了变化,但狗的相同部位在图像中是匹配的。这种特征提取方法适用于无数的用例,可以为理解和解释复杂的高维数据提供了一个健壮的框架。

DINOv2应用

实例检索:使用非参数方法,DINOv2能够在各种数据集(如Paris、Oxford、Met和amsterdam)上优于自监督和弱监督模型。它在不同任务粒度上表现良好的能力证明了它强大的特征学习能力。

语义分割:该模型在所有数据集上都表现出强大的性能,使用更简单的预测器也是如此。并且当使用boosted recipe进行评估时,它几乎与 Pascal VOC 上的最新技术水平相匹配。通过冻结主干并调整适配器和头部的权重,模型在 ADE20k 数据集上取得了接近现有技术水平的结果。

深度估计:DINOv2在单目深度估计任务上表现出很好的结果,超过了自监督模型和弱监督模型。SUN-RGBd数据集突出了它在域外的泛化能力,其中一个在纽约大学室内场景上训练的模块可以泛化到了室外场景。

总结

DINOv2令人印象深刻的能力和广泛的适用性预示着自我监督学习领域的光明前景。DINOv2 的发布是在 Segment Anything 项目之后发布的,可以说DINOv2 补充了 Segment Anything。SAM 是一个可以通过提示专注于对不同分割任务的零样本泛化系统,而 DINOv2 使用简单的线性分类器可以在分割以外的任务中取得很好的结果。如果能够将这两个模型合在一起将是计算机视觉领域的重大飞跃。

DINOV2的Demo网站:https://avoid.overfit.cn/post/d70e30fcf8024fc1b6e4a8a841048c13

作者:Ashwanth Ravi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/520536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

成功打破 GPT-4 上限,新版 Claude 横空出世!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 前 OpenAI 团队成员在离职后&#xff0c;创办了 Anthropic 公司。今年 3 月份的时候&#xff0c;该公司推出一款名为 Claude 的应用&#xff0c;试图与 ChatGPT 一争高下。 一个多月过去了…

分享Python采集77个css3代码,总有一款适合您

分享Python采集77个css3代码&#xff0c;总有一款适合您 Python采集的77个css3代码下载链接&#xff1a;https://pan.baidu.com/s/13EiUDXOAZvvKmF2KGrivzA?pwdubb2 提取码&#xff1a;ubb2 两款漂亮的bootstrap分页样式 纯CSS3用户卡片设计效果 4种炫酷CSS3 loading预加…

第六十章 Unity 发布Web平台

WebGL 是一种用于在 Web 浏览器中渲染图形的 API&#xff0c;基于 OpenGL ES 图形库的功能。WebGL 1.0 大致与 OpenGL ES 2.0 功能相匹配&#xff0c;而 WebGL 2.0 大致与 OpenGL ES 3.0 功能相匹配。WebGL 构建选项允许 Unity 将内容发布为 JavaScript 程序&#xff0c;而这些…

FastDFS+Nginx - 本地搭建文件服务器同时实现在外远程访问「端口映射」(1)

大家好&#xff0c;我是晓星航。今天为大家带来的是面向对象编程相关的讲解&#xff01;&#x1f600; 文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Ngi…

ARM 处理器模式(二)

文章目录 ARM 处理器模式工作模式模式切换内核寄存器各个模式对应的内核寄存器 ARM 处理器模式 ARMv7-a 处理器共有 9 种工作模式 工作模式 User&#xff1a;用户模式&#xff0c;非特权模式&#xff0c;大部分程序运行的时候就处于此模式FIQ&#xff1a;快速中断模式&#x…

算法修炼之练气篇——练气二十二层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

Vue列表展示计数器【第二篇】

&#x1f331; 1、vue列表展示案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>vueDemo02列表展示</title> </head> <body> <div id"xy"><!--原始展示方式…

2023最新CleanMyMac中文版系统清理优化工具

CleanMyMac中文版功能非常的强大&#xff0c;操作简单&#xff0c;使用起来高效快捷&#xff0c;软件自身拥有一个安全数据&#xff0c;且拥有一定的规格&#xff0c;CleanMyMac中文版能够确定软件能够正确选择和清理Mac垃圾文件&#xff0c;更加安全&#xff0c;可靠。一键快速…

thinkPhP6.0安装教程图解--PHP框架安装

ThinkPhP 6.0 安装 1.环境检查 首先&#xff0c;thinkphp6.0&#xff0c;要求php的环境是7.2.5及以上的&#xff0c;所以先检查自己的php环境是否符合要求。 在cmd命令窗口中输入php -v 或者没有配置环境变量的话&#xff0c;可以在php编辑器中输出php_info()或则PHP_VERSIO…

记录一次异常:feign异常--NoSuchBeanDefinitionException: No qualifying bean of type

1、完整报错 2023-06-29 16:17:28.127 WARN 3732 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyExcep…

JetCache 使用简单案例到源码解析读这一篇就够

背景 github.com/alibaba/jet… 一、使用方法&#xff1a; 1. 创建项目— 此处使用springboot项目 2. 引入starter <dependency> <groupId>com.alicp.jetcache</groupId> <artifactId>jetcache-starter-redis</artifactId><version>2…

Servlet3.0 新特性全解

Servlet3.0新特性全解 tomcat 7以上的版本都支持Servlet 3.0 Servlet 3.0 新增特性 注解支持&#xff1b;Servlet、Filter、Listener无需在web.xml中进行配置&#xff0c;可以通过对应注解进行配置&#xff1b;支持Web模块&#xff1b;Servlet异步处理&#xff1b;文件上传AP…

DEV SIT UAT PET SIM PRD PROD常见环境英文缩写含义

一、英文缩写 英文中文 DEV development开发 SIT System Integrate Test系统整合测试&#xff08;内测&#xff09; UAT User Acceptance Test用户验收测试 PET Performance Evaluation Test性能评估测试&#xff08;压测&#xff09; SIM simulation仿真 PRD/PROD produ…

我们花一个月调研了小红书种草的新机会和增长策略

分析师&#xff1a;Jane、彬超 编辑&#xff1a;yolo 出品&#xff1a;增长黑盒研究组 *本报告为增长黑盒独立研究系列&#xff0c; 与第三方不存在任何利益关系 随着618的临近&#xff0c;小红书再次成为了品牌重要的“营销战场”。面临着经济环境的不确定性&#xff0c;想必各…

数据结构_串

目录 1. 串的定义和实现 1.1 串的定义 1.2 串的存储结构 1.2.1 定长顺序存储表示 1.2.2 堆分配存储表示 1.2.3 块链存储表示 1.3 串的基本操作 2. 串的模式匹配 2.1 简单的模式匹配算法 2.2 串的模式匹配算法——KMP算法 2.2.1 字符串的前缀、后缀和部分匹配值 2.2…

你不知道的裁员攻略:真正的离职赔偿是2N起步,不是N+1!计算赔偿金时,年终奖要计入总收入!...

最近裁员现象猖獗&#xff0c;许多人都不知道如何维护自己的合法权益&#xff0c;在和公司撕扯时屡屡被坑。一位曾经和字节撕过且成功的网友&#xff0c;友情给大家写了一份离职攻略。但要注意&#xff0c;这份攻略只针对那些守规矩的大公司&#xff0c;如果是不守规矩的小公司…

得ChatGPT者,得智能客服天下?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 在现代社会&#xff0c;高效、专业的客服服务已成为企业、组织机构竞争力的关键要素。智能客服系统应运而生&#xff0c;智能客服系统对客服的赋能作用和价值主要表现在提高效率、降低成本、优化用户体验、深度挖掘用户需求…

【综述】结构化剪枝

目录 摘要 分类 1、依赖权重 2、基于激活函数 3、正则化 3.1 BN参数正则化 3.2 额外参数正则化 3.3 滤波器正则化 4、优化工具 5、动态剪枝 6、神经架构搜索 性能比较 摘要 深度卷积神经网络&#xff08;CNNs&#xff09;的显著性能通常归因于其更深层次和更广泛的架…

QML转换(Transformation)

目录 一 QML介绍 二 QML的使用场合 三 实例演示 一 QML介绍 QML是Qt Quick的缩写&#xff0c;它是一种新型的、面向对象的、跨平台的脚本语言&#xff0c;可以用来描述用户界面或应用程序的交互逻辑。QML可以在Qt应用程序中使用&#xff0c;也可以在其他JavaScript应用程序中…

Python入门(九)字典(二)

字典&#xff08;二&#xff09; 1.遍历字典1.1 遍历所有键值对1.2 遍历字典中的所有键1.3 按特定顺序遍历字典中的所有键 2.嵌套2.1 字典列表2.2 在字典中存储列表2.3 在字典中存储字典 作者&#xff1a;xiou 1.遍历字典 一个Python字典可能只包含几个键值对&#xff0c;也可…