识别一切模型RAM(Recognize Anything Model)及其前身 Tag2Text 论文解读

news2025/2/8 12:15:22
img
img

总览

大家好,我是卷了又没卷,薛定谔的卷的AI算法工程师「陈城南」~ 担任某大厂的算法工程师,带来最新的前沿AI知识和工具,欢迎大家交流~

继MetaAI 的 SAM后,OPPO 研究院发布识别一切模型(Recognize Anything Model,RAM):

  • 项目链接:https://recognize-anything.github.io/
  • Demo链接:https://huggingface.co/spaces/xinyu1205/Tag2Text
  • 源码链接:https://github.com/xinyu1205/recognize-anything
  • 论文链接:https://arxiv.org/pdf/2306.03514.pdf
img
img

无论是从论文内容、源码git或者Demo,都不难看出 RAM 其实是一个增强型的 Tag2Text,RAM中提到的识别,本质上是图片标记任务(image tagging),而 Tag2Text 也是作者团队提出的可应用于 image tagging 任务的大模型预训练框架。

图片识别:给一个图片,旨在通过识别给定图像的多个标签来提供语义标签,可以理解为给出多个tags用来形容这个图,包括目标(object)、场景(scene)、属性(attribute)和行为(action),是一个多标签分类(multi-label classification)。

分割一切模型(SAM)[12]的Zero Shot能力很强,但其只有定位能力(location),没有识别能力(SAM只能给出分割Mask,没法指定该Mask的类别)。因此RAM旨在于提供强大的识别能力(包含Zero Shot的识别能力)。作者也将RAM和定位模型(SAM、Grounding-DINO)进行了结合,具体在Grounded-SAM项目中,这样就能同时达到定位+识别了。下图是作者给出的SAM、RAM等模型的分别特点。

img
img

由于RAM的很大工作都是基于Tag2Text,所以在介绍RAM前我需要先介绍Tag2Text,了解Tag2Text论文的朋友可以直接看RAM。

Tag2Text:Guiding Vision-Language Model via Image Tagging

Tag2Text是一种视觉语言预训练(Vision Language Pretrain, VLP)框架。在该框架中,作者通过对视觉语言模型(Vision-Language Models)引入图片标记(images tagging)任务来指导模型学习更好的视觉-语言特征。图片标记,类似于给一个图片打个多个与图片有关的label,有点像多label分类。

img
img

如上图所示,之前的Tagging方法(OSCAR [32]、VIVO [21]、VinVL [61])遵循的是基于检测器的范式。通过使用目标 tags 作为锚点来简化图片和文本之间的语义对其。这些方法通过一个检测器来提取图片特征,并送进多模态交互模块中进行学习。这种情况下检测器参数都是冻住的(如果梯度优化检测性能就会骤降),所以检测器不能优化,导致检测器性能会制约视觉-语言特征的学习。

作者提出了用 图片标记 来作为 视觉语音预训练的多任务,有两个关键问题:数据网络结构

数据问题

引入了图片标记(image tagging)就需要构造图片中的tags 作为 label 用于训练。因为 image-text-pair数据很丰富,所以作者对image-text-pair进行自动化文本语义解析,从而从text中获取图片的tags。这样,图像tags能提供了图像和文本之间更好的桥梁,因为解析的标记类别更加多样化,同时比目标检测的object更丰富,有例如场景、属性、动作等。

从Text挖掘Tags来构建数据,包含2个关键:

  1. **解析获取Tags:**利用解析器[58]来识别Text中的实体(head+modifier)和关系,然后映射出tags:Head->目标(object)和场景(scene),modifier->attribute,relationship->action;
  2. **筛选有效Tags:**得到解析后的Tags集合,按照Tags的频率将其排序,只取前5000个最高频的进行人工筛序,最后保留了3429个tag类别作为需要的有效Tags;

网络结构

如下图,包含3个分支:Tagging, Generation, Alignment,为不同的任务分支,训练后分别可以用于不同的子任务。比如下图右边的:多标签识别(就是tagging),Image Caption生成,Visual QA 和 Image-Text 检索,这几个子任务。

img
img

Image Tagging:用了Query2Label[35]中的多label分类transformer decoder(用法如下图,都是DETR的思路),同时为了避免解析的tags中有某些对应图片tag的缺失、正负样本的不平衡,使用了Asymmetirc Loss(ASL)[44]。

img
img

Image-Tag-Text Generation:用了NLP中标准的transformer的encoder-decoder框架,tags/text 都经过 tokennizer + embeding matrix 映射为 embeding,然后 tags embeding(随机乱序,防止顺序影响学习)与 image embedding(features) 一起送入 encoder,再经过decoder解码。输出与text embedding进行loss计算。相当于用 tag 指导 image 生成 text;

**Image-Text Alignment:**用了BLIP[29] 中 Encoder 结构(如下),image embedding 与 text embeding送入encoder,用粗粒度的 Image-Text Contrastive(ITC) Loss 和 细粒度的 Image-Text Matching(ITM) Loss 分别进行监督。

img
img

RAM:Recognize Anything: A Strong Image Tagging Model

模型结构

img
img

如图,SAM结构上与 Tag2Text 相似,Tag2Text 有3个分支,tagging,generation 和 alignment;SAM 只保留了 Tagging 和 Generation 两个,其中 Tagging 分支用来多tags推理,完成识别任务;Generation用来做 image caption任务;Tag2Text 中的alignment是做 Visual-Language Features学习的,在这里被移除了。

  • Image Encoder 使用 Swin,
  • 训练时,Tagging分支和Generation分支都用 解析的Tags作为label;
  • 测试时,Tagging会输出Tags,用于Generation的Caption任务生成最终的Text;

综合起来,SAM在网络上基本和Tag2Text一致,多了一点区别在和图中的CLIP有关,具体在开放词汇识别这一节。

开放词汇识别

  • 受[23, 28]的启发,作者把每个Tag进行prompt ensembling[22] 扩充,然后送入训好的CLIP Text Encoder得到其对应的文本标签查询(Textual label queries,其实就是 promopt + tag 的 embedding),作者认为这些 queries 比可学习的参数有更强的语义性和上下文信息。然后将这些Label Queris送进Tagging Decoder用image features进行Cross Attention。

    • 不做Tag prompt扩充的话,tag太短了,送入模型得到的embedding会比较差;

另外作者还用CLIP的Image Encoder对SAM的图片feature进行蒸馏(因为CLIP的image和text特征是对齐的),这样SAM模型在没见过的类别也会有更好的特征生成。

所以综合来看,SAM和Tag2Text在网络框架上的区别,基本也就在这个CLIP的额外使用上。

数据问题

在 Tag2Text 中作者利用 image-text-pair 的 text 进行解析,得到 tags,然后利用高频排序进行筛选,取了前5k的。频率越高越重要。

SAM中则进一步扩大了数据量,同时频率筛选扩大到top-10k。还有一系列扩大数据量的方法,直接翻译下摘要大家可以看看,数据这部分就不赘述了,细节大家看看原文吧:

标签系统:我们首先建立一个通用和统一的标签系统。我们结合了来自流行学术数据集(分类、检测和分割)以及商业标记产品(谷歌、微软、苹果)的类别。我们的标签系统是通过将所有公共标签与文本中的公共标签合并而获得的,从而覆盖了大多数公共标签,数量适中,为 6,449。剩余的开放词汇标签可以通过开放集识别来识别。

数据集:如何用标签系统自动标注大规模图像是另一个挑战[30]。从 CLIP [22] 和 ALIGN [11] 中汲取灵感,它们大规模利用公开可用的图像文本对来训练强大的视觉模型,我们采用类似的数据集进行图像标记。为了利用这些大规模图像文本数据进行标记,按照[9、10],我们解析文本并通过自动文本语义解析获得图像标签。这个过程使我们能够根据图像文本对获得各种各样的无注释图像标签。

数据引擎:然而,来自网络的图像文本对本质上是嘈杂的,通常包含缺失或不正确的标签。为了提高注释的质量,我们设计了一个标记数据引擎。在解决丢失的标签时,我们利用现有模型生成额外的标签。对于不正确的标签,我们首先定位与图像中不同标签对应的特定区域。随后,我们采用区域聚类技术来识别和消除同一类中的异常值。此外,我们过滤掉在整个图像及其相应区域之间表现出相反预测的标签,确保更清晰和更准确的注释。

因为RAM在分类、检测、分割等数据集都有覆盖,同时也有seen数据(训练数据中有的)和unseen数据(训练中没有的)的识别能力,所以作者做了一个图,体现不同识别方法的识别范围(Recognition Scope),RAM-unseen是红色,因为RAM有开集识别能力,所以是最大的。

  • PS:这都不是六边形战士了,直接画了个圆,这图太唬人了
  • PS+:我第一眼以为是 performance 比较,看论文才发现是 scope 比较;
img
img

除了数据、模型,作者还有一些模型效率上的优化。

实验结果

最后看看实验部分,绿色为监督训练,蓝色是Zero-shot,黄色是无监督。

img
img
img
img

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

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

相关文章

MySQL如何保证数据的可靠性(保证数据不丢失)

1. 结论: 只要redo log 和 binlog 保证持久化到磁盘,就能确保MySQL异常重启后,数据可以恢复。 2. 机制 WAL机制,(Write Ahead Log): 事务先写入日志,后持久化到磁盘。 3. binlog…

华为OD机试真题 JavaScript 实现【非严格递增连续数字序列】【2022Q4 100分】

一、题目描述 输入一个字符串仅包含大小写字母和数字,求字符串中包含的最长的非严格递增连续数字序列的长度,比如122889属于非严格递增连续数字序列。 二、输入描述 输入一个字符串仅包含大小写字母和数字,输入的字符串最大不超过255个字符…

合金氢化物动力学与瞬时流量计算

在经典的合金氢化物动力学描述中,有一种是用JMAK方程来描述和拟合合金的吸放氢过程,方程很简洁:,其中是反应程度或者百分比,表示合金氢化物吸氢或者放氢的程度,是该合金吸氢或放氢的一种特征常数&#xff0…

57、基于51单片机智能硬币分拣分类机电子存钱罐报警系统设计(程序+原理图+PCB源文件+Proteus仿真+参考论文+参考PPT+元器件清单等)

摘 要 近年来,随着我国经济的发展和社会的进步,邮政事业得到了空前发展。邮政通信网的技术含量不断增加,技术装备水平也在不断的提高,邮件处理已基本实现机械化,并且朝着自动化的方向迈进。本文着眼于我国当前邮政事…

Unity编辑器扩展-第一集-在菜单栏加入自己的按钮

一、概述 unity自己本身就是一个大的程序,我们看见的所有功能,都是用程序写出来的,但是根据各行各业不同的需求,有些时候我们制作时,想要自己编辑一些原有的功能。 二、本节目标效果展示 1.在菜单栏加入属于自己的一…

【前端基础篇】CSS选择器 和 CSS属性

前言:CSS 简介 CSS 概述 CSS ( Cascading Style Sheet ) 层叠样式表,用来修饰 HTML,使得效果更加多样化CSS 在 HTML4.0 中引入,一般在开发过程中,会使用单独的 CSS 文件进行开发,然后将这个独立 CSS 文件引…

Unity编辑器扩展-第二集-按钮排序/分组/放入右键菜单

第一集链接:Unity编辑器扩展-第一集-在菜单栏加入自己的按钮_菌菌巧乐兹的博客-CSDN博客 一、本节目标效果展示 1.按钮排序 变成 2.按钮分组 仔细看,有个灰色的杠杠 3.放入右键菜单 4.皮一下 二、按钮排序具体流程 第一集讲,如果想放入…

Java自定义泛型类、泛型接口、泛型方法以及 泛型擦除的细节

体会&#xff1a;使用泛型的主要优点是能够在编译时而不是在运行时检测错误。 /*** 自定义泛型类*/ public class Order<T> {String orderName;int orderId;//类的内部结构就可以使用类的泛型T orderT;public Order(){//编译不通过 // T[] arr new T[10];//编译…

Unity基础3——Resources资源动态加载

一、特殊文件夹 &#xff08;一&#xff09;工程路径获取 // 注意 该方式 获取到的路径 一般情况下 只在 编辑模式下使用 // 我们不会在实际发布游戏后 还使用该路径 // 游戏发布过后 该路径就不存在了 print(Application.dataPath);&#xff08;二&#xff09;Resources 资…

如何自动生成正交法测试用例?

目录 引言 正交法实验 自动生成正交用例 引言 正交法测试用例是一种高效且可靠的方法&#xff0c;能够最大限度地减少测试工作量&#xff0c;同时保证覆盖所有可能的组合情况。通过了解如何优化这些测试用例的生成过程&#xff0c;可以提高产品的质量&#xff0c;降低故障率…

机器人视觉梳理(上)

原创 | 文BFT机器人 01 机器人视觉的概念 在智能制造过程中&#xff0c;通过传统的编程来执行某一特定动作的机器人&#xff08;机械手、机械手臂、机械臂等&#xff0c;未作特殊说明时&#xff0c;不作严格区分&#xff0c;统一称为机器人&#xff09;&#xff0c;将难以满足制…

【CV大模型SAM(Segment-Anything)】如何保存分割后的对象mask?并提取mask对应的图片区域?

上一篇文章【CV大模型SAM&#xff08;Segment-Anything&#xff09;】真是太强大了&#xff0c;分割一切的SAM大模型使用方法:可通过不同的提示得到想要的分割目标中详细介绍了大模型SAM&#xff08;Segment-Anything&#xff09;的不同使用方法&#xff0c;后面有很多小伙伴给…

【JVM 监控工具】使用JConsole监控进程、线程、内存、cpu、类情况

文章目录 前言一、如何启动JConsole二、如何设置JAVA程序运行时可以被JConsolse连接分析三、JConsole如何连接远程机器的JAVA程序&#xff08;举例说明&#xff09;四、性能分析概述内存线程类VM摘要MBean 五、使用Jconsole监控某方法的性能总结 前言 Jconsole是JDK自带的监控…

网络工程师必备,华为/思科/华三交换机命令对比

本期对华为/思科/华三交换机配置命令对比,来看下他们的区别在哪里&#xff0c;这里对命令做了个汇总&#xff0c;平时对命令不熟的朋友这次可以看下。 另外我们来看下华为与H3C的命令情况&#xff0c;方便大家进行对比。 一、华为交换机基础配置命令 1、创建vlan&#xff1a; …

Unity基础1——3D数学

一、Mathf &#xff08;一&#xff09;Mathf 和 Math ​ Math 是 C# 中封装好的用于数学计算的工具类 —— 位于 System 命名空间中 ​ Mathf 是 Unity 中封装好的用于数学计算的工具结构体 —— 位于 UnityEngine 命名空间中 ​ 他们都是提供来用于进行数学相关计算的 ​…

机器学习 day18(用Tensorflow搭建一个神经网络)

之前搭建神经网络的方法 先初始化输入数据X&#xff0c;创建layer 1并计算激活值a1&#xff0c;创建layer 2并计算激活值a2&#xff0c;这是前向传播代码的显式形式。 另一种简单些的创建神经网络的方法 创建layer 1和layer 2与前一种方法相同&#xff0c;但我们不需要手动…

JUC并发编程学习笔记

1&#xff1a;回顾多线程 进程和线程是什么 进程是操作系统分配资源的最小单元&#xff0c;而线程是cpu调度的最小单元。 java默认有几个线程 2个,main线程和GC线程&#xff08;GC垃圾回收机制&#xff09; java可以开启线程么 不能 并发和并行 并发,多线程操作同一个资源,cp…

纯电驱动车辆动力总成的优化与比较研究

摘要&#xff1a; 不同动力总成拓扑结构的对比分析 前言 纯电驱动的电动汽车因为集成有大容量电池组&#xff0c;可以存储取自公共电网的电能&#xff0c;用来驱动车辆的行驶。相比于传统的混合动力汽车&#xff0c;具有更加优越的节能减排效果和潜力。因此&#xff0c;近年来…

cpp文件编译过程 makefile cmake

这里写目录标题 argc argv参数头文件编译过程静态链接&#xff0c;动态链接&#xff0c;静态库&#xff0c;动态库 -shared制作使用动态库libxxx。so冲突 静态库预处理编译汇编链接目录选项-Idir 大写Iinclude<> 与 " "-I -I- 与 -I- -I ld/objdump/objcopy 选…

内网渗透—隧道搭建Ngrok与Frp内网穿透

这里写目录标题 1. 前言1.1. 隧道技术介绍1.2. 代理技术介绍1.2.1. 正向代理1.2.2. 反向代理1.2.3. 透明代理1.2.4. 正向代理与透明代理区别 2. 内网穿透2.1. Ngrok2.1.1. 访问Ngrok2.1.2. 代理设置2.1.2.1. 开通代理2.1.2.2. 配置隧道2.1.2.3. 下载客户端 2.1.3. 配置客户端2.…