Anchor DETR:Transformer-Based目标检测的Query设计

写在前面

文中指出之前DETR-like算法存在以下问题:

  • 之前DETR-liked检测算法里,object query是一组可学习的嵌入表示(就是一组256-d的向量),缺乏明确的物理意义,不能解释它们会关注什么地方。
  • 每个object query 预测的位置没有一个特定的模式(specific mode),即每个object query不会关注特定的区域。

PS:第二点所谓“预测位置没有一个特定模式”这个结论是怎么得出来的呢?作者援引了DETR论文中的一幅图像(如上图所示)进行说明。该图像中每个子图上都有很多点,每个子图代表了一个object query在验证集所有图像上得到的预测框的中心点坐标(经过归一化后的),绿色代表小的预测框,红色代表水平方向比较大的预测框,蓝色代表垂直方向比较大的预测框。通过上图可知,即使同一个object query,在不同图像上得到的预测框其位置和大小都是不固定的,所以说没有特定模式,而这使得object query难以优化。


为解决上述问题:

  • 本文基于anchor point(在CNN-based检测算法中被广泛使用)设计object query,每个object query关注anchor point附近的目标;
  • 本文object query的设计可以预测一个位置的多个目标;
  • 设计了一种注意力变体,减少显存占用。

论文的贡献或方法都可以转化成相应的问题,然后从文中逐一寻找答案,寻找答案的过程也是理解论文的过程,现在我们可以提出以下问题:

  • anchor point怎么来的?
  • 如何基于anchor point设计object query?
  • 为什么本文object query的设计可以预测一个位置的多个目标?
  • 注意力变体是怎么样的,为什么可以减少显存占用?

在阅读论文时带着问题,有目的的阅读,边阅读边思考,通常效果会好很多,也更容易理解作者想表达的意思。

接下来让我们从文中method部分寻找问题的答案。

一、Method

1. Anchor Points

Q1:anchor point怎么来的?

A1:如上图所示,文中采用两种方式获得anchor point。一种是网格均匀采样,anchor point被固定为图像中均匀的网格点;为另一种是可学习的点,这些点根据满足0~1均匀分布随机初始化并作为可学习参数进行更新,其中可学习点初始化的相关代码如下:

# --snap--
if self.spatial_prior == "learned":
    self.position = nn.Embedding(self.num_position, 2)

# --snap--
if self.spatial_prior == "learned":
    nn.init.uniform_(self.position.weight.data, 0, 1)

有了anchor point,就可以把回归头的输出当作对于anchor point的偏移量(参考了Deformable DETR的做法),将预测框中心点坐标(\widehat{cx},\widehat{cy})加到对应的anchor point上。

对Deformable DETR不了解的朋友可以查看我的博客:Deformable DETR:结合多尺度特征、可变形卷积机制的DETR

作者通过对比实验(如下图所示),采用了可学习anchor point的策略(但综合看起来两者好像差别不显著= = 、)。

2. Attention Formulation

在回答第二个问题之前,我们首先需要了解一下论文中的一些符号表示。论文在该部分讲解了DETR-like检测算法中的注意力机制的建模方式(比较容易理解,不过多赘述),其中涉及的一些符号表示对我们理解文章的后续内容是有帮助的。

注意力机制建模方式如下:

Attention(Q,K,V)=softmax(\frac{QK^{T}}{\sqrt{d_{k}}})V

Q=Q_{f}+Q_{p},K=K_{f}+K_{p},V=V_{f}

其中d_{k}表示维度,f表示内容信息,p表示位置信息。

decoder中包含自注意力交叉注意力

自注意力中K_{f}V_{f}Q_{f}是相同的,K_{p}Q_{p}是相同的,Q_{f}\in \mathbb{R}^{N_{q}\times C}表示decoder前一层的输出,对于decoder第一层而言Q^{init}_{f}\in \mathbb{R}^{N_{q}\times C}可以设置为常数向量,也可以设置为可学习的嵌入表示。query位置部分Q_{p}\in \mathbb{R}^{N_{q}\times C}在DETR中通常用一组可学习的嵌入向量表示,其中N_{q}表示query的数量:

Q_{p}=Embedding(N_{q},C)

交叉注意力的讲解略过,不难理解。

接下来我们可以继续寻找下一个问题的答案。

3. Anchor Points to Object Query 

Q2:如何基于anchor point设计object query?

A2:anchor point可表示为Pos_{q}\in \mathbb{R}^{N_{A}\times 2},其中N_{A}表示点的个数。根据anchor point获得object query只需要确定一种编码方式即可,即Q_{p}=Encode(Pos_{q})。一种很自然的想法就是继续使用位置编码函数进行编码,但作者采用了一个额外的MLP网络对位置编码结果进行微调。

PS:为什么要额外添加一个MLP微调位置编码结果?文中没有进行相应的消融实验,原因未知。

4. Multiple Predictions for Each Anchor Point

Q3:既然作者的想法是说,通过anchor point得到object query,使得每个object query能够关注某个特定的区域。那如果一个位置有多个目标,但这个位置只有一个object query关注这里,即只会有一个预测框,那怎么办?

A3:简单来说,就是让这个地方可以有多个预测框。作者重新回顾了decoder第一层query的内容部分Q^{init}_{f}\in \mathbb{R}^{N_{q}\times C},每个object query只有一种模式(pattern),即Q^{i}_{f}\in \mathbb{R}^{1\times C}。为了使得一个anchor point可以预测多个目标,作者将多模式嵌入(multiple pattern embedding)整合到了每个object query中,以适应一个位置存在多个目标的情况。其中多模式嵌入表示为:

Q^{i}_{j}=Embedding(N_{p},C)

其中N_{p}表示模式的数量(文中N_{p}=3)。

PS:如何理解pattern呢?我个人理解这里的pattern主要指的是预测框的位置和大小。通过增加pattern的数量,可以增加在某个位置预测框的数量,进而实现一个位置多个目标的检测。但具体如何将多个pattern整合到一个object query中,文中没有明确说明,我结合代码看了以下,简单来说就是把pattern embeddings和object query通过reshape和repeat统一到相同维度,再进行相加,相关代码如下:

# ---transformer的init方法---
# 初始化模式嵌入,(3,256)
self.pattern = nn.Embedding(self.num_pattern, d_model)
# 初始化anchor point,(300, 2)
if self.spatial_prior == "learned":
    self.position = nn.Embedding(self.num_position, 2)

# ---transformer的forward方法---
# 调整维度(300, 2)-repeat->(bs, 3*300, 2)
if self.spatial_prior == "learned":
    reference_points = self.position.weight.unsqueeze(0).repeat(bs, self.num_pattern, 1)
# 为每个object query分配3个模式嵌入
# (3, 256)-reshape->(1, 3, 1, 256)-repeat->(bs, 3, 300, 256)-reshape->(bs, 3*300, 256)
tgt = self.pattern.weight.reshape(1, self.num_pattern, 1, c).repeat(bs, 1, self.num_position, 1).reshape(
            bs, self.num_pattern * self.num_position, c)

# ---decoder layer的forward方法---
# 对anchor point进行位置编码并使用MLP微调,(bs, 3*300, 2)-positional embed->(bs, 3*300, 256)
query_pos = adapt_pos2d(pos2posemb2d(reference_points))
# 将pattern embeddings和positional embeddings相加
q = k = self.with_pos_embed(tgt, query_pos)

文中还提到,由于平移不变性,所有object query都共享这些模式(个人理解写在下面)。因此进一步可以得到Q^{init}_{f}\in \mathbb{R}^{N_{p}N_{A}\times C}Q_{p}\in \mathbb{R}^{N_{p}N_{A}\times C},即object query的数量N_{q}=N_{p} \times N_{A}

PS:所谓平移不变性是什么意思呢?举个例子,对于一个检测模型来说,无论目标是在图像中间还是边缘,都应该检测到目标。而图像中每个位置都有可能出现多个目标的情况,所以所有object query应该共享这些模式。

模型预测框可视化结果如下图所示:

每一列表示一个object query在所有图像中预测框的中心点分布情况,其中最后一行的黑点表示anchor point,前三行表示每个pattern对应预测框中心点的分布情况,可以看出预测框都是在anchor point附近。

5. Row-Column Decoupled Attention(RCDA)

作者先说明了现有注意力机制的一些缺点:

  • transformer架构计算量较大,会占用较多的显存。
  • Deformable DETR虽然能降低显存,但会导致内存的随机访问,对硬件不友好(好吧,不懂硬件,说啥是啥)。
  • 其他注意力变体作者实验发现不适用于DETR-like的检测器。

所以,作者提出了一种新的注意力机制变体——行列解耦注意力,以降低显存要求,同时能媲美甚至超越DETR中标准的注意力机制。

大致思路跟深度可分离卷积好像差不多,就是对x和y分别进行计算,最后整合起来。具体的没仔细看,算法复杂度、降低内存啥的这类内容本能的排斥(主要是太菜了看不懂)。主要模型相关的内容已经介绍完了,后续有机会再把这部分内容补上吧。

二、实验结果

文中实验结果都比较好理解,后续补充对实验结果的个人思考。

三、总结

最后做个总结(也是回顾),Anchor DETR的主要贡献是:

  • 根据anchor point得到object query,使其具有明确物理意义,每个object query关注特定区域;
  • 针对第一点可能面临的“一个区域多个目标”的挑战,进一步将多个pattern整合到了一个object query,可实现一个位置多个目标的检测;
  • 提出行列解耦注意力机制,在降低显存使用的同时,性能可媲美甚至超过标准注意力机制。

上述改进使得模型收敛速度提高了10倍,性能也有较为显著提升。

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

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

相关文章

禾川SV-X2E A伺服驱动器参数设置——脉冲型

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!人工智能学习网站 前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任…

PHPOK 4.8.338 后台任意文件上传漏洞(CVE-2018-12941)复现

PHPOK企业站(简称PHPOK)建设系统是一套基于PHP和MySQL构建的高效企业网站建设方案之一,全面针对企业网(以展示为中心)进行合理的设计规划。 PHPOK是一套开源免费的建站系统,可以在遵守LGPL协议的基础上免费使用。系统具…

浅析正交投影矩阵和透视投影矩阵的推导

先上矩阵的内容。在opengl中,分别通过glOrtho函数和glFrustum函数得到正交投影矩阵和透视投影矩阵。 glOrtho 函数描述生成正交投影矩阵。 (左、 下、 近) 和 (右、 上、 近) 参数分别指定近剪裁平面上映射到窗口左下角和右上角的点,假定眼睛位于 (0、0…

Vue104 vue3 组合式API的优势 对比配置式API

笔记 1.Options API 存在的问题 使用传统OptionsAPI中,新增或者修改一个需求,就需要分别在data,methods,computed里修改 。 2.Composition API 的优势 我们可以更加优雅的组织我们的代码,函数。让相关功能的代码更…

三方接口调用设计方案

在为第三方系统提供接口的时候,肯定要考虑接口数据的安全问题,比如数据是否被篡改,数据是否已经过时,数据是否可以重复提交等问题 在设计三方接口调用的方案时,需要考虑到安全性和可用性。以下是一种设计方案的概述&am…

Jenkins + GitLab + Docker实现自动化部署(Java项目)

部署Jenkins 因为Jenkins需要用到git、jdk、maven,后两者我们采取挂载的方式,git采用直接在容器中安装的方式,所以我们要做一个增强版的Jenkins镜像,编写Dockerfile文件 #使用jenkins 镜像作为基础镜像 FROM jenkins/jenkins:lt…

Spring Boot框架下租房管理系统的设计与实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

springboot098基于web的网上摄影工作室的开发与实现(论文+源码)_kaic

网上摄影工作室 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了网上摄影工作室的开发全过程。通过分析网上摄影工作室管理的不足,创建了一个计算机管理网上摄影工作室的方案。文章介绍了网上摄影工…

Kubernetes实战——DevOps集成SpringBoot项目

目录 一、安装Gitlab 1、安装并配置Gitlab 1.1 、下载安装包 1.2、安装 1.3、修改配置文件 1.4、更新配置并重启 2、配置 2.1、修改密码 2.2、禁用注册功能 2.3、取消头像 2.4、修改中文配置 2.5、配置 webhook 3、卸载 二、安装镜像私服Harbor 1、下载安装包 2、…

UE5之5.4 第一人称示例代码阅读1 FirstPersonProjectile

既然如此,这几个文件都看看 先看看FirstPersonProjectile头文件 定义了几个函数 然后是两个component 这个projectilemovement应该是控制物理运动的 看看CPP文件 sphere那个就创建了一个subobject,初始化了一下,然后这里 CollisionComp-&g…

Maven 项目构建打包,如何引入本地 Jar 包?

上一篇讲到 Maven 离线仓库的使用,反响不错很多人收藏,这一篇还是继续聊 Maven 。假如你发现某开源项目有个 bug 影响到自己的系统,但官方还没修复,自己定位到了本地修改打了包先应急用,那么如何在其他项目上使用该包&…

985研一,转嵌入式好还是后端开发好?

有个老铁问,985研一,转嵌入式好还是后端开发好? 我认为,这学历,两个随便挑,我说的,从趋势来看,更建议嵌入式,走供应链上游,芯片原厂、新能源车企、军工或者搞…

Python画图|极坐标下的柱状图输出

【1】引言 前序学习了极坐标下的散点图输出,可通过下述链接直达: 西猫雷婶-CSDN博客 受此启发,我们继续自主探索极坐标下的柱状图输出。 【2】代码探索 其实柱状图和散点图画图的主要区别,可以理解为调用函数不同。 柱状图调…

Golang | Leetcode Golang题解之第515题在每个树行中找最大值

题目: 题解: func largestValues(root *TreeNode) (ans []int) {if root nil {return}q : []*TreeNode{root}for len(q) > 0 {maxVal : math.MinInt32tmp : qq nilfor _, node : range tmp {maxVal max(maxVal, node.Val)if node.Left ! nil {q …

stm32单片机个人学习笔记12(DMA直接存储器存取)

前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…

若依学习 后端传过来的数据在控制台打印为空

导言: 在做若依二次开发时遇到个没见过的bug,用了一些时间排,发现有自己没学过的东西。所以记录一下。后端用的是c#的asp.net core 问题描述: 后端穿过来的有数据的参数(数组)roleIds在控制台打印为空 后端字段定义: 后端数据: 前…

【热门主题】000010 深入 Vue.js 组件开发

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…

初见Linux:权限篇

一.权限的定义: 什么是权限?所谓权限在现实中就是权力限制,是对于人,不同人所扮演的角色有着不同的权限。那么在Linux中也存在权限。权限角色事物属性。那么对于一件事情能否去执行以及完成都需要权限。 二.Linux中的用户 2.1:r…

【SpringMVC】web服务器,访问失败的问题,SpringMVC,建立连接,请求

【web服务器】 web服务器可以对http协议进行封装,程序员不需要直接对http协议进行操作(不需要去写复杂的网络编程代码),让web开发更加便捷,所以它也有「WWW服务器」的称呼 常见的web服务器:Tomcat,Jboss&…

华为配置 之 STP

目录 简介: STP: RSTP: 如何改变根网桥: (1)改变优先级: (2)改变root: 各端口的状态: 总结: 简介: STP(Spanning Tree Protoco…