【无监督】2、MAE | 自监督模型提取的图像特征也很能打!(CVPR2022 Oral)

在这里插入图片描述

文章目录

    • 一、背景
    • 二、方法
    • 三、效果

论文:Masked Autoencoders Are Scalable Vision Learners

代码:https://github.com/facebookresearch/mae

出处:CVPR2022 Oral | 何凯明 | FAIR

一、背景

本文的标题突出了两个词:

  • masked:借鉴了 BERT 中的 mask 方法,在视觉中引入了 mask 的操作,随机 mask 掉一些图像块,然后预测这个图像块
  • scalable:说明模型有很好的扩展性

auto:自回归模型,特点就是标签和样本来自于同一个东西

  • 比如 NLP 中一个被 mask 掉一些 word 的句子是输入样本, mask 掉的单词是学习的标签,这两个东西都来自于同一个句子。所以说不说 auto 都是可以的
  • 但在视觉任务中,很少有样本和标签是来自于同一个东西的,一般标签是文本,样本是图片
  • 所以这里的 auto 的意思就是说,在模型训练的时候,训练的样本和标签是来自于一个图片的,所以引入了 auto 这个前缀
  • autoencoder 就表示自编码器

MAE 是怎么做的:

  • 随机的盖住图片中的一些块儿,然后再去重构这些被盖住的像素
  • 思想来自于 BERT,这里 mask 掉的是一个 patch

核心设计:

  • 非对称的 encoder-decoder 架构,非对称是指编码器是作用在可见的像素上,解码器是作用在所有块的特征上的(对被 mask 掉的块来说,解码器是要学习不可见的块)。解码器相比编码器更小,开销不到编码器的 1/10
  • 作者发现当遮掉图像中绝大部分的像素(如 75%)时,那么会得到一个很有意义的自监督的任务(因为如果遮住很少的部分可能插值就能重构了,而学习不到更深层的表征)

效果:

  • 在 ViT-H 上使用小的数据集 ImageNet-1k 的时候,就能得到在 ViT 中使用百倍以上图片训练的效果(87.8%),而且是没有使用标签的
  • MAE 主要是用来做迁移学习的,在迁移学习上表现的比较好,在物体检测、示例分割、语义分割上都挺好的,所以通过不带标签的数据使用自监督方法训练出来的模型,在迁移学习上的效果也很不错,达到了 BERT 在 NLP 中的效果。

MAE 和对比学习的不同(对比学习也是自监督学习的一种):

  • MAE 是对一张图像随机 mask 掉像素,通过模型来还原像素
  • 对比学习是使用代理任务(如数据增强)来将一张图像变成 两张不同的图像,通过对比学习来让模型学习哪些图像是正样本对,从而学习出图像特征

二、方法

在这里插入图片描述

注意:

  • encoder 的输入是经过 mask 的 patch embedding
  • decoder 的输入是 encoder 的输出 embedding 被 mask 掉的 token 编码,这里 mask 掉的 token 编码是待学习的的向量,而不是直接把原图信息输入了

预训练过程:

  • 输入是被打 patch 然后遮盖一些 patch,灰色表示被 mask 掉,对 patch 得到 patch embedding ,且加上位置编码,然后随机打乱这些 patch embedding,如果要删除80%的话,就把最后的 80% patch 拿掉就可以了,和随机抹除 mask 的意义是一样的。
  • 把保留的可见的 patch embedding 送入 encoder(ViT),得到每个块的特征表示(较大的绿色块),经过提取后的特征块会根据之前块的编号重新拉长,也就是恢复到打乱顺序之前的顺序,被 mask 掉的块也会放上原来的像素特征(小的灰色块)
  • 重新放回原来位置的特征序列送入 decoder,用于恢复全部的像素信息,然后计算 MSE loss
  • 而且这里的编码器灰色块比解码器更大一些,说明主要的计算量来自编码器,因为对图像信息的编码很重要,而且编码器接收的是少量的没有被盖住的图片,计算量相对少一点

怎么重构出原图:

  • 解码器的最后一层是线性层,如果一天 patch 是 16x16 的话,就输出 256 维度的特征,拿到后 reshape 到 16x16 即可

损失函数:MSE

  • 预测像素和真正像素做相减,然后做平方和
  • 而且只在被 mask 掉的像素块上做 MSE,因为有一些像素是没有被盖住的,本来模型就是可见的,所以不用计算 MSE

如果像用这个结构做一些其他的视觉任务:

  • 只需要编码器,不需要解码器,将这个结构当做一个特征提取器
  • 具体的做法就是,输入的图像不用 mask,只需要打成 patch 序列,然后经过 encoder 得到对应的特征就可以了

效果展示:

图 2 是使用 MAE 在 ImageNet 验证集上构造的图片,这些是测试结果,图像没有参与训练

  • 左边一列是遮住 80% 的图像
  • 中间一列是重构的图像
  • 右边一列是真实的图片
  • 虽然细节比较模糊,但是这种能重构的思路已经很惊人了

在这里插入图片描述

在这里插入图片描述

图 4 展示了遮盖不同比例的图像的重构效果:

在这里插入图片描述

BERT 在 NLP 上取得了很大的成功,计算机视觉这边也有很多使用 BERT 思想的方法,但都不是很成功,作者认为有三个原因:

  • 第一,视觉任务上之前大多使用的都是 CNN 这种操作方式,通过不断叠加卷积核,来提取聚合的图像像素信息,但是 mask 这种操作不太适合 CNN,因为在 transformer 中,mask 掉的是一个单词,这个词是一个特定的词,会一直保留下来,和别的单词区分开来。如果在卷积上做 mask,也就是把部分像素盖住或者换上特定的值,在卷积时,无法把这部分所表达的信息识别出来,所以在后面的时候比较难还原这块到底是什么,不好加入位置编码。但现在 ViT 在视觉上的成功,已经能解决了。
  • 第二,信息的粒度不同,NLP 中每个词表示的是有语义信息的,如果去掉某些词可能会导致语义变化。但是在图片中,会有冗余的像素信息,如果去掉一个块的话,可以使用插值还原。所以作者将高比率的块随机去掉,就能极大降低图像的冗余性。这样的策略是自监督的模式,就是图像自己监督自己,会驱使模型学习全局的信息,而不是局部的信息(可以看图 2 和图 4)
  • 第三,解码器要还原的东西不同,在 NLP 中,mask 掉的是单词,解码器要还原的是单词,单词是有个哦层语义信息的,而在视觉中,mask 掉的像素,解码器要还原的是相似,像素是比较低层的信息。所以 BERT 中使用的一层全连接层解码器在图像中是不可用的,图像中需要更大的解码器来还原更复杂的特征

MAE 可以看做 BERT 在视觉上的扩展,但语言和视觉有很多不同:

  • 语言中,一个单词是有语义信息的
  • 图像中,一个 patch 虽然是图像的一部分,但不是独立的个体,不是一个含有语义信息的分割,可能是多个物体的一小块
  • 但 MAE 学到了比较好的效果,也能做一些复杂的任务,所以说 MAE 或 transformer 确实能学习一些隐藏的表达

三、效果

  • 左侧:ViT 原文在 ImageNet-1k 上训练的结果
  • 中间:作者重构和改进的的 ViT 方法(因为原文训练的不太稳定),主要是加了一些正则化的方法,因为 BiT 论文当时说 transformer 需要在很大的数据集上才能训练好,但后面大佬们就发现加入一些正则化的项也能在小的数据集上训练出好的结果
  • 右侧:MAE 在 ImageNet-1k 上预训练,再在 ImageNet 微调

在这里插入图片描述

各种消融实验:

在这里插入图片描述

mask 比例:75% 最好

在这里插入图片描述

mask 方式:随机采样最好

在这里插入图片描述

预训练轮数和微调轮数:

在这里插入图片描述

迁移学习效果:COCO 检测和分割

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序前后端开发快速入门(完结篇)

这篇是微信小程序前后端快速入门完结篇了,今天利用之前学习过的所有知识做一个新的项目「群登记助手v1.0」小程序。 整体技术架构:小程序原生前端小程序云开发。 经历了前面教程的学习,大家有了一定的基础,所以本次分享重心主要是…

【C++】位图和布隆过滤器

位图和布隆过滤器 前言正式开始位图位图讲解模拟实现位图几道关于位图的题目 布隆过滤器概念实例布隆过滤器模拟实现误判率测试几道题 前言 本来本篇是和前面的两篇连着的,但是没写到一块,位图和布隆过滤器都是基于哈希的思想的,如果对于哈希…

2023年即将推出的CSS特性对你影响大不大?

Google开发者大会每年都会提出有关于 Web UI 和 CSS 方面的新特性,今年又上新了许多新功能,今天就从中找出了影响最大的几个功能给大家介绍一下 :has :has() 可以通过检查父元素是否包含特定子元素或这些子元素是否处于特定状态来改变样式,也…

【JavaEE进阶】MyBatis的创建及使用

文章目录 一. MyBatis简介二. MyBatis 使用1. 数据库和数据表的创建2. 创建Mybatis项目2.1 添加MyBatis框架支持2.2 设置MyBatis配置信息 3. MyBatis开发流程4. MyBatis查询数据库测试 三. MyBatis 流程1. MyBatis 查询数据库流程2. MyBatis 框架交互流程图 一. MyBatis简介 M…

Springboot 实践(8)springboot集成Oauth2.0授权包,对接spring security接口

此文之前,项目已经添加了数据库DAO服务接口、资源访问目录、以及数据访问的html页面,同时项目集成了spring security,并替换了登录授权页面;但是,系统用户存储代码之中,而且只注册了admin和user两个用户。在…

Tomcat 部署优化

Tomcat Tomcat 开放源代码web应用服务器,是由java代码开发的 tomcat就是处理动态请求和基于java代码的页面开发 可以在html当中写入java代码,tomcat可以解析html页面当中的iava,执行动态请求 动态页面机制有问题:不对tomcat进行优…

仿牛客论坛项目day7|Kafka

一、阻塞队列 创建了一个生产者线程和一个消费者线程。生产者线程向队列中放入元素,消费者线程从队列中取出元素。我们可以看到,当队列为空时,消费者线程会被阻塞,直到生产者线程向队列中放入新的元素。 二、Kafka入门 发布、订阅…

mysql数据库迁移

目录 背景迁移数据库 背景 公司有个项目,刚开始数据量不是大的时候,数据库和服务上的所有应用数据都放在一个旧小盘中,随着项目数据的增长,旧的磁盘被占满了,导致系统无法写入数据,我和同事排查了很长时间…

阿里云云主机_ECS云服务器_轻量_GPU_虚拟主机详解

阿里云云主机分为云虚拟主机、云服务器ECS、轻量应用服务器、GPU云服务器、弹性裸金属服务器、专有宿主机、FPGA云服务器、高性能计算E-HPC、无影云电脑等,阿里云百科来详细说下阿里云云主机详解: 目录 阿里云云主机 云服务器ECS 轻量应用服务器 云…

C++ 面向对象三大特性——多态

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C 继承 ☂️<3>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<4>前言&#xff1a;面向对象三大特性的&#xff0c;封装&#xff0c;继承&#xff0c;多态&#xff…

红帽8.2版本CSA题库:第十一题查找文件

红帽8.2版本CSA题库&#xff1a;第十一题查找文件 touch /tmp/{gamelan,jacques,libWedgeit.so.1.2.3} chown jacques:jacques /tmp/{gamelan,jacques,libWedgeit.so.1.2.3}mkdir /root/findfiles #创建文件夹 find / -user jacques -exec cp -a {} /root/findfiles \; …

Centos7安装Docker及配置加速器地址

一、安装docker #1.yum 包更新到最新 yum update #2.安装需要的软件包&#xff0c;yum-util 提供yum-config-manager功能&#xff0c;另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2 #3.设置yum源 yum-config-manager --add…

Leetcode每日一题:1444. 切披萨的方案数(2023.8.17 C++)

目录 1444. 切披萨的方案数 题目描述&#xff1a; 实现代码与解析&#xff1a; 二维后缀和 动态规划 原理思路&#xff1a; 1444. 切披萨的方案数 题目描述&#xff1a; 给你一个 rows x cols 大小的矩形披萨和一个整数 k &#xff0c;矩形包含两种字符&#xff1a; A …

BC136 KiKi去重整数并排序

给定一个整数序列&#xff0c;KiKi想把其中的重复的整数去掉&#xff0c;并将去重后的序列从小到大排序输出。 输入描述 第一行&#xff0c;输入一个整数n&#xff0c;表示序列有n个整数。 第二行输入n个整数&#xff08;每个整数大于等于1&#xff0c;小于等于1000&#xf…

【日常积累】Linux之init系统学习

init系统简介: Linux 操作系统的启动首先从 BIOS 开始&#xff0c;接下来进入 boot loader&#xff0c;由 bootloader 载入内核&#xff0c;进行内核初始化。内核初始化的最后一步就是启动 pid 为 1 的 init 进程&#xff0c;这个进程是系统的第一个进程&#xff0c;它负责产生…

企望制造ERP系统 RCE漏洞复现

0x01 产品简介 企望制造纸箱业erp系统由深知纸箱行业特点和业务流程的多位IT专家打造&#xff0c;具有国际先进的管理方式&#xff0c;将现代化的管理方式融入erp软件中&#xff0c;让企业分分钟就拥有科学的管理经验。 erp的功能包括成本核算、报价定价、订单下达、生产下单、…

编程语言学习笔记-架构师和工程师的区别,PHP架构师之路

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责…

Unity游戏源码分享-中国象棋Unity5.6版本

Unity游戏源码分享-中国象棋Unity5.6版本 项目地址&#xff1a; https://download.csdn.net/download/Highning0007/88215699

TCP拥塞控制简单理解

1.TCP的控制机制 序号 TCP通过序号可以实现一下几个功能&#xff1a; 1.确认应答处理。发送端收到接收端的确认应答&#xff0c;可以得知某些数据包被接收端接收了 2.顺序控制。接收端可以利用序号对接收到的报文进行排序 3.重发控制。如果发送端没有收到确认应答&#xff0c…

vue项目引入antDesignUI组件

快速安装ant-design-vue并配置&#xff0c;vue2.0 antDesign1.7.8 第一步&#xff1a;安装ant-deisgn-vue 1.7.8 npm install ant-design-vue1.7.8 --save第二步&#xff1a;配置package.json文件&#xff0c;将依赖写入后&#xff0c;npm install 安装依赖 "dependenc…