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

【多模态】18、ViLD | 通过对视觉和语言知识蒸馏来实现开集目标检测(ICLR2022)

在这里插入图片描述

文章目录

    • 一、背景
    • 二、方法
      • 2.1 对新类别的定位 Localization
      • 2.2 使用 cropped regions 进行开放词汇检测
      • 2.3 ViLD
    • 三、效果

论文:Open-vocabulary Object Detection via Vision and Language Knowledge Distillation

代码:https://github.com/tensorflow/tpu/tree/master/models/official/detection/projects/vild

效果:

  • 在 zero-shot 测试下,coco 达到了 36.6 AP,PASCAL VOC 达到了 72.2AP,Object365 达到了 11.8AP

本文提出了 Vision and Language knowledge Distillation(ViLD):

  • 通过将预训练的开集分类模型作为 teacher model,来蒸馏两阶段目标检测器 student model
  • 即使用 teacher model 来对 category texts 和 proposal region进行编码
  • 然后训练 student detector 来对齐 text 和 region embedding

一、背景

在这里插入图片描述

如图 1 所示,作者思考,目标检测器能否识别 base category 之外的类别?

所以,本文作者就构建了一个 open-vocabulary 目标检测器,用于检测从 text 输入的任意类别的目标

现有的目标检测方法都是只学习数据集中出现的类别,而扩充检测类别的方法就是收集更多的类别标注数据,如 LVIS 包括 1203 个类别,有较为丰富的词汇量,但也不够强大。

另外一方面,互联网上有丰富的 image-text pairs,CLIP 就尝试使用 4 亿图文对儿来联合训练模型,并且在 30 个数据集上展示了很好的效果

zero-shot 迁移的效果很大程度上来源于预训练的 text encoder 对任意类别文本的编码能力,尽管现在对 image-level 特征表达的编码能力已经被证明挺好的了,但还 object-level 的特征编码仍然很有挑战

所以,本文作者思考能否从开集分类模型中拿到一些能力来用于开集检测

作者首先从 R-CNN 类的方法入手,将开集目标检测也构建为两个子问题:

  • object proposal 的生成
  • open-vocabulary 图像分类

如何操作 R-CNN 类的模型:

  • 先基于基础类别训练一个 region proposal model
  • 然后使用预训练好的图像分类器来对 cropped object proposal 进行分类,可以包括新类和基础类
  • 作者使用 LVIS 当做 benchmark,把 rare 类别作为 novel categories,将其他类当做 base categories
  • 缺点:很慢,因为每个 object proposal 都是一个个的进入分类器来分类的

基于此,作者提出了 ViLD,来训练两阶段的开放词汇目标检测器,ViLD 包含两部分:从开集目标分类模型的输出中来学习 text embedding 和 image embedding

  • ViLD-text:只会从基础类中蒸馏
    • 首先,将类别名称输入预训练好的 text encoder 来得到 text embedding
    • 然后,使用推理的 text embedding 结果来对检测到的 region 进行分类
  • ViLD-image:会同时从基础类和新类中来蒸馏,因为 proposal 网络可能会检测到包含新类的区域
    • 首先,将 object proposal 输入预训练好的 image encoder 来得到 image embedding
    • 然后,训练一个 Mask R-CNN 来将 region embedding 和 image embedding 来对齐

二、方法

在这里插入图片描述

作者将检测数据集中的类别分类 base 和 novel:

  • base: C B C_B CB,参与训练
  • novel: C N C_N CN

编码器符号:

  • T ( . ) T(.) T(.):text encoder
  • V ( . ) V(.) V(.):image encoder

2.1 对新类别的定位 Localization

开放词汇目标检测的第一个挑战就是对新类别目标的定位

作者以 Mask RCNN 为例,作者使用 class-agnostic 模块替换了 class-specific 定位模块,对每个 RoI,模型只能对所有类别预测一个 bbox 和一个 mask,而不是每个类别都会预测一个,所以,使用 class-agnostic 的模块可以扩展到用于新类别的定位

2.2 使用 cropped regions 进行开放词汇检测

一旦对目标候选区域定位成功,就可以使用预训练好的分类器来对区域进行分类

Image embedding:

  • 作者基于基础类别 C B C_B CB 训练了一个 proposal 网络,来提取感兴趣区域
  • 首先 crop 并 resize proposal,然后输入 image encoder 中计算 image embedding
  • 作者使用了两种 crop 区域的 resize 方式:1x 和 1.5x,1.5x 的用于提供更多的上下文信息,整合后的 embedding 然后会被归一化

Text embedding:

  • 作者会使用 prompt 模版(如 “a photo of {} in the scene”)来送入 text encoder,并得到 text embedding

相似度:

  • 计算完两个 embedding 之后,作者使用 cosine similarities 来计算 image embedding 和 text embedding 的相似程度,然后使用 softmax 激活和类内的 NMS 来得到最终的检测结果

效率:

  • 由于每个 cropped region 都会被送入 image encoder 来提取 image embedding,所以效率很低

2.3 ViLD

在这里插入图片描述

作者提出了 ViLD 来缓解上面提到的效率低的问题

使用 text embedding 来代替分类器:

  • 首先,引入了 ViLD-text,目标是训练一个可以使用 text embedding 来分类的 region embedding
  • 如图 3b 展示了训练的目标函数,使用 text embedding 来代替了如图 3a 的分类器,只有 text embedding 用于训练
  • 对于没有匹配到任何 gt 的 proposal,被分配到背景类别,可以学习其自己的编码 e b g e_{bg} ebg
  • 对所有类别编码,都计算 region embedding 和 category embedding 的余弦相似性,包括前景和背景 e b g e_{bg} ebg
  • 然后,计算带温度参数的 softmax 激活后的分布并计算 cross-entropy loss
  • 为了训练第一个阶段,也就是 region proposal 网络,作者在线抽取 region proposal r,并且从头开始使用 ViLD-text 来训练

ViLD-text 的 loss 如下:

在这里插入图片描述

蒸馏 image embedding:

训练 ViLD-image 时,主要是从 teacher model 来蒸馏到 student model 上,也就是将 region embedding 和 image embedding 对齐

为了提升训练速度,对每个 training image 先离线抽取 M 个 proposal,并且计算其对应的 image embedding

这些 proposal 包含了基础类和新类,所以网络是可以扩展的

但 ViLD-text 只能从基础类学习

ViLD-image loss 是 region embedding 和 image embedding 的 L1 loss:

在这里插入图片描述

ViLD 的整个训练 loss 如下:w 是超参数

在这里插入图片描述

三、效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

相关文章:

【多模态】18、ViLD | 通过对视觉和语言知识蒸馏来实现开集目标检测(ICLR2022)

文章目录 一、背景二、方法2.1 对新类别的定位 Localization2.2 使用 cropped regions 进行开放词汇检测2.3 ViLD 三、效果 论文:Open-vocabulary Object Detection via Vision and Language Knowledge Distillation 代码:https://github.com/tensorflo…...

【AGI】Copilot AI编程辅助工具安装教程

1. 基础激活教程 GitHub和OpenAI联合为程序员们送上了编程神器——GitHub Copilot。 但是,Copilot目前不提供公开使用,需要注册账号通过审核,我也提交了申请:这里第一期记录下,开启教程,欢迎大佬们来讨论…...

Mac配置android studio的终端terminal

一共6步 首先打开terminal 1.echo $HOME 2.touch .bash_profile 3.open -e .bash_profile 4.在弹出框中输入 export PATH${PATH}:你电脑sdk的路径/tools:你电脑sdk的路径/platform-tools 5.source .bash_profile 6.adb version 出现类似上图即为成功...

第八次CCF计算机软件能力认证

第一题:最大波动 小明正在利用股票的波动程度来研究股票。 小明拿到了一只股票每天收盘时的价格,他想知道,这只股票连续几天的最大波动值是多少,即在这几天中某天收盘价格与前一天收盘价格之差的绝对值最大是多少。 输入格式 输入…...

MATLAB RANSAC平面拟合 (29)

MATLAB RANSAC平面拟合 (29) 一、算法简介二、函数介绍三、算法实现四、效果展示一、算法简介 将一个平面与一个从内点到平面的最大允许距离的点云相匹配。该函数返回描述平面的几何模型。该函数采用 M- 估计量样本一致性(MSAC)算法求解平面。MSAC 算法是随机样本一致性(RAN…...

铁路关基保护新规:优先采购安全可信的网络产品和服务!

《征求意见稿》第十四条提到:运营者应当加强供应链安全保护,优先采购安全可信的网络产品和服务;采购网络产品和服务影响或者可能影响国家安全的,运营者应当预判网络产品和服务投入使用后可能带来的国家安全风险,按照国…...

Kafka在大数据处理中的应用

Kafka在大数据处理中的应用 一、Kafka简介1. 基础概念2. Kafka的主要功能3. Kafka的特点 二、应用场景1. 数据采集和消费2. 数据存储和持久化3. 实时数据处理和流计算4. 数据通信和协同 三、技术融合1. Kafka与Hadoop生态技术的融合1) 使用Kafka作为Hadoop的数据源2) 使用Hadoo…...

Linux Day03

一、基础命令(在Linux Day02基础上补充) 1.10 find find 搜索路径 -name 文件名 按文件名字搜索 find 搜索路径 -cmin -n 搜索过去n分钟内修改的文件 find 搜索路径 -ctime -n搜索过去n分钟内修改的文件 1)按文件名字 2)按时间 1.11 grep 在文件中过…...

OpenCV 对轮廓进行多边形逼近(Polygon Approximation)

在 OpenCV 中,cv::approxPolyDP 是一个函数,用于对轮廓进行多边形逼近(Polygon Approximation)。它可以将复杂的轮廓逼近为简化的多边形,从而减少轮廓的数据点,使轮廓更加紧凑。 函数原型如下:…...

Docker的数据管理和Dockerfile的指令

Docker的数据管理 一、Docker数据的概念1、数据卷2、数据卷容器 二、端口映射三、容器互联(使用centos镜像)四、Docker 镜像的创建1、基于现有镜像创建(1)首先启动一个镜像,在容器里做修改(2)然…...

[SQL挖掘机] - 交叉连接: cross join

介绍: 交叉连接是一种多表连接方式,它返回两个表的笛卡尔积,即将一个表的每一行与另一个表的每一行进行组合。换句话说,交叉连接会生成一个包含所有可能组合的结果集。 交叉连接的工作原理如下:它会将左表的每一行与右表的每一行…...

Python web实战 | 使用 Django 搭建 Web 应用程序 【干货】

概要 从社交媒体到在线购物,从在线银行到在线医疗,Web 应用程序为人们提供了方便快捷的服务。Web 应用程序已经成为了人们日常生活中不可或缺的一部分。搭建一个高效、稳定、易用的 Web 应用程序并不是一件容易的事情。本文将介绍如何使用 Django 快速搭…...

UE5自定义蓝图节点(二)

继承于UBlueprintAsyncActionBase的类,异步输出节点的实现方法,代码测试正常 .h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "Kismet/BlueprintA…...

Bean容器中的ThreadPoolTaskExecutor需要手动关闭吗

ThreadPoolTaskExecutor 是 Spring 提供的一个方便的线程池实现,用于异步执行任务或处理并发请求。 在使用 ThreadPoolTaskExecutor 作为 Spring Bean 注册到容器中后,Spring 会负责在应用程序关闭时自动关闭所有注册的线程池,所以不需要手动…...

Redis学习路线(3)——Redis的Java客户端

一、如何使用Redis的Java客户端 官方文档: https://redis.io/docs/clients/java/ Java-Redis客户端使用场景Jeids 以Redis命令作为方法名称,学习成本低,简单实现,但是Jedis实例是线程不安全的,多线程环境下需要基于连…...

行车遥控接线图

这个一般只有电工才会用。 主要是 【共线和总电】让人疑惑。 这图实际就是PLC的梯形图。 共电:接主电源。【它串联10A保险丝,再到继电器】 总电:它是所有继电器的公共端。【共电的继电器吸合,共电和总电就直通了。】共电的继电器…...

区块链实验室(11) - PBFT耗时与流量特征

以前面仿真程序为例,分析PBFT的耗时与流量特征。实验如下,100个节点构成1个无标度网络,节点最小度为5,最大度为38. 从每个节点发起1次交易共识。统计每次交易的耗时以及流量。本文所述的流量见前述仿真程序的说明:区块链实验室(3)…...

Shell编程基础(三)环境变量 位置变量 系统内置变量

环境变量 & 环境变量环境变量范围父子进程之间有效指定用户有效所有用户有效 位置变量系统内置变量 环境变量 在脚本种直接定义的变量,只能在当前shell进程中使用 若想要在其他shell进程中使用,可以将变量声明为 环境变量 export 变量名 &#xff…...

P5718 【深基4.例2】找最小值

题目描述 给出 n n n 和 n n n 个整数 a i a_i ai​,求这 n n n 个整数中最小值是什么。 输入格式 第一行输入一个正整数 n n n,表示数字个数。 第二行输入 n n n 个非负整数,表示 a 1 , a 2 … a n a_1,a_2 \dots a_n a1​,a2​……...

C++——STL容器之list链表的讲解

目录 一.list的介绍 二.list类成员函数的讲解 2.2迭代器 三.添加删除数据: 3.1添加: 3.2删除数据 四.排序及去重函数: 错误案例如下: 方法如下: 一.list的介绍 list列表是序列容器,允许在序列内的任何…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...