【多模态】23、RO-ViT | 基于 Transformer 的开发词汇目标检测(CVPR2023)

在这里插入图片描述

文章目录

    • 一、背景
    • 二、方法
      • 2.1 基础内容
      • 2.2 Region-aware Image-text Pretraining
      • 2.3 Open-vocabulary Detector Finetuning
    • 三、效果
      • 3.1 细节
      • 3.2 开放词汇目标检测效果
      • 3.3 Image-text retrieval
      • 3.4 Transfer object detection
      • 3.5 消融实验

论文:Region-Aware Pretraining for Open-Vocabulary Object Detection with Vision Transformers

代码:暂无

出处:CVPR2023

贡献:

  • 本文提出的 RO-ViT 解决了 image-text pretraining 到 open-vocabulary object finetuning 之间的 positional embedding 问题
  • 证明了 image-text pretraining 使用 focal loss 比 CE loss 更好
  • 使用 novel object proposals 提高了开放词汇目标检测 fine-tuning 效果
  • 在 LVIS 上得到 SOTA 32.4 APr,超越了当前最好的方法 6.1 APr

一、背景

近期,open-vocabulary detection task (OVD) 得到了很多关注,其被提出是为了解决传统目标检测的限制性,开放词汇目标检测最大的特点是将类别看做 text embedding,而不是离散的 id,所以,开放词汇目标检测能够更灵活的预测在训练过程中没见过的类别。

现有的很多方法是使用大量的 image-text pairs 来进行预训练,为模型引入丰富的语义信息,很多方法用的是 CNN,但随着对图像理解的更强的需求和多模态任务的出现,使用 vision transformer 来实现也很重要

我们已知现有的方法很多都是使用预训练好的 vision-language model,然后再微调一下来解决 image-level 预训练和 object-level fine-tuning 之间的 gap

本文提出了 RO-ViT,将预训练好的 vision transformer 迁移到 region-aware 上来实现开放词汇的目标检测

本文和前面的方法最大的不同在于,本文作者探索了如何更好的使用 vision transformer 来预训练 VLMs,更好的适用于开放词汇检测

然后使用预训练的权重来初始化检测器的 backbone,将 backbone 冻住后训练检测器的 neck 和 head 等特殊部件

二、方法

在这里插入图片描述

2.1 基础内容

1、contrastive image-text pretraining

一般的对比学习都是 two-tower 的结构,由 image encoder 和 text encoder 构成

  • image encoder:可以是 CNN 或者 ViT 的
  • text encoer:一般是 transformer 的

对比学习的目标是在 embedding space 中,将一对儿的 image-text 距离拉近,非一对儿的 image-text 距离拉远

一般使用的 loss 是 softmax CE loss

2、开放词汇目标检测

使用基础类别训练,但是测试的时候需要同时能够检测基础类别和新类别

一般的方法就是将原本的固定尺寸的全连接分类器使用 text embedding 来替换,因为 text embedding 来自于预训练的 text encoder 中,所以预训练中的开放语义知识能很好的保留

作者对于 background 类别使用 “background” 词汇来作为类别词汇

训练过程中,作者会给每个 region r r r 计算对应的 detection score p i p_i pi,计算方法是计算 RoI-Align feature(region embedding)和基础类别的 text embedding 的 cosine similarity,然后使用 softmax 规范化

在测试过程中,text embedding 扩展到了基础类别和新类别的 embedding,并且加上了 background,在 ViT backbone的输出 feature map 上使用 RoI-Align 来获得region i i i 的 VLM embedding,并且计算这个区域 embedding 和 text embedding 的 cosine similarity,得到 region score z i z_i zi,detection score 计算如下, α , β ∈ [ 0 , 1 ] \alpha, \beta \in [0,1] α,β[0,1] 用了控制基础类别和新类别的 weights

作者使用预训练好的 ViT 模型来初始化 detector 的 backbone

2.2 Region-aware Image-text Pretraining

现有的 vision-language model 基本上都是使用整张图和 text 来进行匹配

然而,这种预训练没有考虑到 region-level 特征和 text token 之间的关系,而这种关系又对开发词汇目标检测很重要

所以,作者提出了一种新的 Cropped Positional Embedding(CPE)的方法来解决 image 和 region 之间的 gap,并且发现使用 focal loss 从难样本中挖掘很有益处

CPE:

  • transformer 中,positional embedding 是很重要的,能够保留每个元素的相对位置,这种信息对下游的识别和定位任务都很重要
  • 但现有的 contrastive pretraining 和 open-vocabulary detection fine-tuning 的 positional embedding 之间有一定的不对齐,pretraining 方法一般都在训练时对全图位置进行编码,在下游的任务也是使用全图的位置编码。但是 detection fine-tuning 中,需要将全图的位置编码泛化到 region 的编码

为了解决这个 gap,作者提出了 CPE,如图 2 所示:

  • 首先,对于 pretraining,将 positional embedding 从图像大小(224)上采样到检测任务大小(如 1024)
  • 然后,从上采样的 positional embedding 中随机 crop 一个 region 并 resize,来作为预训练时候的 image-level 的 positional embedding
  • 这样一来,就能让模型将图像看做从更大的未知图像中随机 crop 出的 region,而非一个整图,能更好的适应于下游检测任务

在这里插入图片描述

CPE 可视化:

  • 每个小格子是一个 patch 和其他 patches 的余弦相似度
  • 相近的 patches 有着更相似的位置编码

在这里插入图片描述

Focal loss:

作者认为更细致的控制 hard 样本的权重比使用 CE loss 更好

假设:

  • v i v_i vi l i l_i li 是归一化后的 image embedding 和 text embedding

  • Image-to-text(I2T)对比学习 loss 分别设置为 CE loss 和 Focal loss 来对比,公式如下

  • Text-to-image(T2I)对比学习 loss 和 I2T 的是对称的

    在这里插入图片描述

  • 总 loss 是两个 loss 之和

2.3 Open-vocabulary Detector Finetuning

虽然 backbone 可以使用预训练权重来初始化,但检测器的 neck 和 head 还是全新的

现有的方法一般不会对新类或未标注的类进行 proposal generation

但本文提出了一个新的生成 proposal 的方法,使用 localization quality-based objectness(如 centerness 等)来衡量 proposal 的得分,而不是使用 object-or-not 的二分类得分来衡量

OVD score: S i O V D = o i δ . s i O V D S_i^{OVD}=o_i^{\delta} .s_i^{OVD} SiOVD=oiδ.siOVD o i δ o_i^{\delta} oiδ 是预测的 objectness score

三、效果

3.1 细节

预训练:

  • 本文的 pretraining 是作者从头训练的,使用 ViT-B/16 和 ViT-L/16 来作为 image encoder
  • 输入图像大小为 224x224,patch size 为 16x16,共 14x14 个 positional embedding
  • 为了生成 CPE,作者首先将 positional embedding 插值到 64x64,然后随机 crop 一个 region(scale ratio 为 [0.1,1.0],aspect ration 为 [0.5, 2.0]),然后将 region crop resize 为 14x14,驾到 patch embedding 上
  • 在 ViT 最后一层使用 global average pooling 来得到 image embedding
  • text encoder 是 12 层的 transformer,最长的 text encoder 是 64
  • 数据集:LAION-2B [44]

下游检测的细节:

  • LVIS: iters = 46.1k,img size =1024,batch = 256,SGD weight decay 1e-4,lr 0.36,momentum=0.9
  • COCO:iters = 11.3k,img size =1024,batch = 128,SGD weight decay 1e-2,lr 0.02,momentum=0.9
  • 使用 CLIP prompt 模版,对每个类别的 text embedding 求平均
  • 在 RPN 阶段使用 OLN-RPN,使用 centerness 作为 objectness,每个位置上有一个 anchor,使用 IoU loss,RPN NMS 在训练时 threshold=0.7,测试时为 1.0

3.2 开放词汇目标检测效果

LVIS:

  • 使用基础类别训练,rare 类别作为新类来测试,测试了 3 次取了平均
  • APr 取得 32.4

在这里插入图片描述

COCO:

  • 使用 48 个基础类别训练,17 个新类测试

在这里插入图片描述

3.3 Image-text retrieval

zero-shot image-text retrieval on coco and Flickr30k

在这里插入图片描述

3.4 Transfer object detection

在这里插入图片描述

3.5 消融实验

在这里插入图片描述

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

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

相关文章

【数据结构与算法】TypeScript 实现图结构

class Grapg<T> {// 用于存储所有的顶点verteces: T[] [];// 用于存储所有的边 采用邻接表的形式adjList: Map<T, T[]> new Map();// 添加顶点addVertex(v: T) {this.verteces.push(v);// 初始化顶点的邻接表this.adjList.set(v, []);}// 添加边addEdge(v: T, w:…

自动化测试Junit(测试系列8)

目录 前言&#xff1a; 1.什么是Junit 2.Junit相关的技术 2.1注解 2.1.1Test 2.1.2Disable 2.1.3BeforeAll和AfterAll 2.1.4BeforeEach和AfterEach 2.2参数化 2.2.1单参数 2.2.2多参数 2.2.2.1CSV获取参数 2.2.2.2方法获取参数 2.3测试套件 2.3.1通过class运行测…

hutool工具集验证手机号码和自定义验证手机号码

使用 Hutool 工具集对手机号码进行验证&#xff0c;你可以使用 Validator.isMobile 方法。以下是示例代码&#xff1a; import cn.hutool.core.lang.Validator;public class Example {public static void main(String[] args) {String phoneNumber "手机号码"; //…

vue3引用Font-Awesome字体图标库

环境&#xff1a;vue3tsviteelement plus 介绍&#xff1a;这里安装引用的是Font-Awesome 6.x 版本&#xff0c;有专业版&#xff08;付费&#xff09;&#xff0c;这里只介绍免费版字体使用方法 一、安装 1.使用npm安装&#xff0c;终端打开项目目录或者命令行cd到目录文件夹…

面向对象程序三大特性一:多态(超详细)

目录 1.重写 1.1基本语法规则 1.2规则深化 1.3重写与重载的区别 2.向上转型 2.1简单介绍 2.3向上转型的作用 3.向下转型 3.1介绍 3.2instanceof 基本介绍 4.多态 4.1多态实现条件 4.2避免在构造方法中调用重写的方法 1.重写 重写 (override) &#xff1a;也称为覆…

vscode 快捷键

今天好闲 就记一些学的东西吧~ vscode 快捷键 快速生成头文件注释&#xff1a;Ctrlalti 快速生成方法注释&#xff1a;Ctrlaltt 新建窗口&#xff1a;CtrlShiftn 查找&#xff1a;Ctrlf 替换&#xff1a;Ctrlh 替换所有&#xff1a;CtrlAltEnter 打开上一个编辑器&#xff1a;…

【漏洞挖掘】Xray+rad自动化批量漏洞挖掘

文章目录 前言一、挖掘方法二、使用步骤工具安装使用方法开始挖掘 总结 前言 自动化漏洞挖掘是指利用计算机程序和工具来扫描、分析和检测应用程序、网络和系统中的安全漏洞的过程。这种方法可以帮助安全专家和研究人员更高效地发现和修复潜在的安全威胁&#xff0c;从而提高整…

Docker-Compose编排与部署

目录 Docker Compose Compose的优点 编排和部署 Compose原理 Compose应用案例 安装docker-ce 阿里云镜像加速器 安装docker-compose docker-compose用法 Yaml简介 验证LNMP环境 Docker Compose Docker Compose 的前身是 Fig&#xff0c;它是一个定义及运行多个 Dock…

异或运算详解

异或运算详解 定义特性用途总结 定义 参与运算的两个数据,按二进制位进行 ^ 运算,如果两个相对应为值相同结果为0,否则为1 1 ^ 0 1 0 ^ 1 1 0 ^ 0 0 1 ^ 1 0特性 异或^运算只能用于数值(整数) x ^ 0 x x ^ x 0用途 两个值交换,而不用使用临时变量 a a ^ b; b b ^…

负数的二进制转换成十进制

对于一个k位的二进制正数&#xff0c;其表示成十进制的结果是&#xff1a; pos[i]表示&#xff1a;这个正数的二进制形式的第i位是1。 i从最低位&#xff08;第0位&#xff09;开始&#xff0c;一直到k-1位。有符号数中&#xff0c;正数的第k-1为0&#xff0c;负数的第k-1位为…

el-popover全屏不显示(bug记录)

我做了一个el-table全屏展示的功能, 然后里面的el-popover在全屏后无法展示, 刚开始以为是写唯一的key或者ref, 发现写了也不行, 后来以为要写’:append-to-body“false”, 最后发现是我的外层的层级写得太高了; position: fixed; z-index: 9999; <div class"box"…

HTML模板生成word,pdf文档

1.获取html模板 public static void main(String[] args) {String htmlContent getHtmlFileContent(templateName,dataMap);String exportType "pdf";if (exportType.equals("pdf")){convertToPdf(htmlContent,filePath);}else {exportWord(htmlContent…

SequenceDiagram 查看代码时序图的利器,做技术方案必备!

前言 “ 无论是快速了解业务流程&#xff0c;还是快速的熟悉系统的业务代码逻辑&#xff0c;以及各个类和方法等的调用关系&#xff0c;时序图无疑是其中一种不可获取的简便快捷的方式。一起来了解下&#xff0c;IDEA如何快速生成时序图吧。” 工作中&#xff0c;经常需要绘制…

22 年 408 新大纲操作系统新增考点

22 年 408 新大纲操作系统新增考点 一、操作系统引导 操作系统引导指的是将操作系统内核装入内存并启动系统的过程&#xff0c;系统引导通常是由一段被称为启动 引导程序的特殊代码完成的&#xff0c;它位于系统 ROM 中&#xff0c;用来完成定位内核代码在外存的具体位…

【动态规划算法】-回文串问题题型(34-40题)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

2.3转移线程的所有权

转移线程的所有权 假设你想要编写一个函数&#xff0c;它创建一个在后台运行的线程&#xff0c;但是向调用函数回传新线程的所有权&#xff0c;而非等待其完成&#xff0c;又或者你想要反过来做&#xff0c;创建一个线程&#xff0c;并将所有权传递给要等待它完成的函数。在任…

一个 git 仓库下拥有多个项目的 git hooks 配置方案

前言 通常情况下&#xff0c;一个 git 仓库就是一个项目&#xff0c;只需要配置一套 git hooks 脚本就可以执行各种校验任务。对于 monorepo 项目也是如此&#xff0c;monorepo 项目下的多个 packages 之间&#xff0c;它们是有关联的&#xff0c;可以互相引用&#xff0c;所以…

CRM系统如何进行公海池线索分配自动化?

在销售过程中&#xff0c;线索分配是一个非常重要的环节。传统的线索分配方式往往是由销售主管手动进行&#xff0c;不仅效率低下&#xff0c;还存在着不公平、不灵活的问题。因此&#xff0c;许多企业通过CRM来实现公海池线索分配自动化。 1、基于规则的分配 CRM可以让用户设…

C语言易错知识点总结2

函数 第 1 题&#xff08;单选题&#xff09; 题目名称&#xff1a; 能把函数处理结果的二个数据返回给主调函数&#xff0c;在下面的方法中不正确的是&#xff1a;&#xff08; &#xff09; 题目内容&#xff1a; A .return 这二个数 B .形参用数组 C .形参用二个指针 D .用…

express学习笔记6 - 用户模块

新建router/user.js const express require(express) const routerexpress.Router() router.get(/login, function(req, res, next) {console.log(/user/login, req.body)res.json({code: 0,msg: 登录成功})})module.exportsrouter 在router/user.js引入并使用 const us…