【多模态】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 变量名 ÿ…...
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列表是序列容器,允许在序列内的任何…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...