【目标检测】DEtection TRansformer (DETR)

一、前言

论文: End-to-End Object Detection with Transformers
作者: Facebook AI
代码: DEtection TRansformer (DETR)
特点: 无proposal(R-CNN系列)、无anchor(YOLO系列)、无NMS的、端到端的目标检测方法。

二、框架

DETR总体框架图如下:

可见,其主要结构包括四个部分:backbone、encoder、decoder、prediction heads。

2.1 Backbone

输入图像先经过backbone进行特征提取,原文使用ResNet-50。此时,通道数变为2048,图像高宽变为原来的 1 32 \frac{1}{32} 321。再经过一个卷积核大小为1*1的卷积层,将通道数降低至256。

尺寸变换情况如下(同一批次的图像会经过padding统一大小):
[ b a t c h _ s i z e , 3 , h e i g h t , w i d t h ] → [ b a t c h _ s i z e , 2048 , h e i g h t / 32 , w i d t h / 32 ] → [ b a t c h _ s i z e , 256 , h e i g h t / 32 , w i d t h / 32 ] [batch \_size,3,height,width]\rightarrow[batch\_size,2048,height/32,width/32]\rightarrow[batch\_size,256,height/32,width/32] [batch_size,3,height,width][batch_size,2048,height/32,width/32][batch_size,256,height/32,width/32]

2.2 Encoder

Encoder结构如下图左侧所示:

可见,Encoder包括 N N N个这样的组件(原文中有6个),每个组件包括Spatial positional encoding、残差结构(当前输出+之前的输入)、Multi-Head Self-Attention、LayerNorm、FNN(全连接+激活+Dropout+全连接+Dropout)。

值得注意的是:
(1) DETR的位置编码采用了正余弦交替表达各像素点横纵坐标的方式,详情见我关于位置编码的博客(Spatial positional encoding)。
(2) DETR的位置编码仅加在了注意力模块中的Q、K上,这表明计算权重时会使用位置信息,但被传递至下一层的数据中不包含位置信息。原注意力模块的位置编码在Q、K、V上均有体现,详情见我关于注意力的博客(Multi-Head Self-Attention)。

2.3 Decoder

Decoder结构如下图右侧所示:

Decoder重复次数 M M M也是6,其包含的组件主要有位置编码、残差结构、Multi-Head Self-Attention、LayerNorm、Multi-Head Attention、FNN(全连接+激活+Dropout+全连接+Dropout)。

需要注意的有以下几点:
(1) Decoder的输入变为Object queries。Object queries是一个大小为100*256、初始全为0的可学习参数。100表示模型最多预测出100个目标框,256与图像特征通道数一致可保证注意力机制的正常运算。Decoder对应Object queries的输出经Prediction heads后将用于计算损失、预测框坐标、预测类别。
(2) Decoder中的位置编码与Object queries尺寸是一致的。没有使用Spatial positional encoding,而是由nn.Embedding随机初始化,全程保持不变。Decoder中的位置编码作用于Multi-Head Self-Attention前的Q、K和Multi-Head Attention前的Q。
(3) Decoder中有两个注意力模块,先通过Multi-Head Self-Attention,再通过Multi-Head Attention。Multi-Head Self-Attention是对Object queries执行自注意力,Decoder中的位置编码仅作用于Q、K。Multi-Head Attention以Object queries为Q,以Encoder的输出为K和V。Decoder中的位置编码作用于Q,Encoder中的位置编码作用于K。

2.4 Prediction heads

Prediction heads结构如下图右上部分所示:

可见,与其他目标检测方法一样,DETR也是对类别和边界框进行预测。

类别预测头的FFN是一层简单的全连接,例如在COCO数据集中为 256 → 92 256\rightarrow 92 25692(92=类别总数91+背景类1,实际COCO为80个有效类但给了91个类)。

边界框预测头的FFN是一个MLP,包括三层全连接和一层激活: 256 → 256 → 256 → 4 → s i g m o i d 256\rightarrow256\rightarrow256\rightarrow4\rightarrow sigmoid 2562562564sigmoid(4=左上角坐标2+右下角坐标2)。预测的坐标是归一化的,实际计算时需要映射至原图。

三、训练

如上所述,预测结果共有100个,每个都有对类别和边界框的预测。但是实际一张图像中目标数量通常不足100,DETR通过二分匹配为每个真实目标寻找一个最匹配的预测用于框相关损失的计算。

3.1 二分匹配

DETR使用匈牙利匹配算法,为每个真实目标寻找一个最匹配的预测。想要进行匹配首先要有对每个预测结果的衡量指标,DETR使用了三种指标:
(1) 在真实目标类上的预测概率(分类头输出经SoftMax后获得)。
(2) 所有预测框坐标与所有真实目标框坐标间的曼哈顿距离(残差的绝对值之和,即L1损失)。
(3) 所有预测框与所有真实目标框间的GIOU(一种改进的IoU指标)。
其中,(1)和(3)越大越好,(2)越小越好,所以衡量指标被定义为 − ( 1 ) + ( 2 ) − ( 3 ) -(1)+(2)-(3) (1)+(2)(3)

匈牙利算法能够根据衡量指标为每个真实目标都找的一个最匹配的预测。所以DETR通过二分匹配而非NMS确定用于计算框相关损失的预测。

3.2 损失

损失包括如下三项:
(1) 交叉熵损失。每张图片有100个预测,未被匹配的预测所对应的真实标签被置为背景类91。
(2) L1损失。残差的绝对值之和。
(3) GIOU损失。 1 − G I O U 1-GIOU 1GIOU
交叉熵损失针对所有预测,L1损失和GIOU损失仅针对与真实目标匹配的预测。交叉熵损失仅针对类别预测,L1损失和GIOU损失仅针对框预测。

四、测试

测试时无需计算损失,也不需要NMS,直接保留类别预测概率大于阈值的预测即可。

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

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

相关文章

C++入门基础(三)

这里写目录标题 引用引用概念例子1例子2例子3例子4 常引用引用的应用做参数做返回值野引用扩展 传值、传引用效率比较引用和指针的区别C对比C语言实现顺序表 内联函数概念特性 🐒🐒🐒 个人主页 🥸🥸🥸 C语…

分布式八股文

什么是分布式系统? 集中式系统,可以理解为将一整个系统的所有功能,包括数据库各种都部署在一起,统一向外提供服务。分布式就是将集中式系统拆分成多个系统,每一个系统单独对外提供服务,整一个提供一整套服务。意味着能够采用更多的服务器,CPU、内存、存储资源增加,能够…

[方法] Unity 解决类《原神》角色移动方向问题

第三人称视角类的游戏有很多,比如《原神》、《崩坏:星穹铁道》、《剑星》、《绝地求生》等。这些游戏中,角色的移动方向取决于玩家的输入和相机的方向,例如玩家在键盘上按下D键,则角色会相对于相机方向向右移动,本篇文…

dnf游戏攻略:保姆级游戏攻略!

欢迎来到DNF,一个扣人心弦的2D横版格斗游戏世界!无论你是新手还是老玩家,这篇攻略都将为你提供宝贵的游戏技巧和策略,助你在游戏中大展身手,成为一名强大的冒险者。 一、角色选择 在DNF中,角色的选择至关重…

K8S join 证书过期 节点报错:certificate has expired or is not yet valid

问题场景: 我是因为虚拟机,挂起了几天,再打开join节点的时候报错: 证书过期报错 ...其他输出 I0427 15:33:56.626776 93338 token.go:215] [discovery] Failed to request cluster-info, will try again: Get "https://…

量子城域网建设案例分析(一):广西量子通信技术试验平台

对量子城域网的讨论已经有一段时间了,经过近期系列文章的讨论,我们对城域网的整体情况、关键技术以及核心设备等都有了一些基本的认识,今天我计划对广西量子通信技术试验平台构建与应用研究服务采购项目进行讨论,通过对实际案例的…

IoTDB 入门教程⑤——数据模型和基础概念

文章目录 一、前文二、数据模型2.1 关系型数据库MySQL。2.2 时序数据库TDengine2.3 时序数据库InfluxDB2.4 时序数据库IoTDB(本专栏的正主) 三、基础概念3.1 数据库(Database)3.2 设备模板(元数据模板)3.3 …

asp爬虫代码简单示例

要创建一个ASP爬虫&#xff0c;你可以使用ASP内置的对象XMLHTTP或ServerXMLHTTP来发送HTTP请求&#xff0c;获取网页内容&#xff0c;然后使用ASP的内置对象HTMLFILE来解析HTML内容。以下是一个简单的ASP爬虫示例代码&#xff1a; <%初始化变量 Dim http Dim url Dim html …

C语言——小知识和小细节17

一、未能给指针成功赋值 #include <stdio.h> #include <stdlib.h> #include <string.h>void GetMemory(char* p) {p (char*)malloc(20 * sizeof(char)); }void Test() {char* str NULL;GetMemory(str);strcpy(str, "Hello World!");printf(&quo…

IDA pro动态调试so层初级教程

一、开启服务 adb push D:\MyApp\IDA_Pro_7.7\dbgsrv\android_server64 /data/local/tmpadb shell cd /data/local/tmp chmod 777 android_server64 ./android_server64二、IDA附加进程 十万个注意&#xff1a;IDA打开的so文件路径不能有中文 手机打开要调试的app 附加成功

合泰杯(HT32F52352)RTC的应用(计时)--->掉电不丢失VBAT(代码已经实现附带源码)

摘要 在HT32F52352合泰单片机开发中&#xff0c;rtc在网上还是挺少人应用的&#xff0c;找了很久没什么资料&#xff0c;现在我根据手册和官方的代码进行配置理解。 RTC在嵌入式单片机中是一个很重要的应用资源。 记录事件时间戳&#xff1a;RTC可以记录事件发生的精确时间&…

Rust move

一、move有什么用 当你在闭包前加上 move 关键字时&#xff0c;闭包会强制获取其所需变量的所有权。这意味着即使在闭包外部变量的所有权被转移给闭包&#xff0c;闭包之外的代码也不能再使用这些变量 看两段代码 fn main() {let x String::from("value");let cl…

DRF解析器源码分析

DRF解析器源码分析 1 解析器 解析请求者发来的数据&#xff08;JSON&#xff09; 使用 request.data 获取请求体中的数据。 这个 reqeust.data 的数据怎么来的呢&#xff1f;其实在drf内部是由解析器&#xff0c;根据请求者传入的数据格式 请求头来进行处理。 drf默认的解…

计算机408备考-数据结构重要知识点-数据结构的定义

请关注一下B站账号&#xff1a;谭同学很nice&#xff01;后期更新发布在这个账号上。。【计算机408备考-数据结构重要知识点-数据结构的定义-哔哩哔哩】https://b23.tv/x7shjNf 数据是信息的载体。数据元素是数据的基本单位。一个数据元素可由若干数据项组成&#xff0c;数据项…

在离线环境中将 CentOS 7.5 原地升级并迁移至 RHEL 7.9

《OpenShift / RHEL / DevSecOps 汇总目录》 说明 本文将说明如何在离线环境中将 CentOS 7.5 升级并迁移至 RHEL 7.9。为了简化准备过程&#xff0c;本文前面将在在线环境中安装用到的各种所需验证软件&#xff0c;而在后面升级迁移的时候再切换到由 ISO 构成的离线 Yum Repo…

实现优先队列——C++

目录 1.优先队列的类模板 2.仿函数的讲解 3.成员变量 4.构造函数 5。判空&#xff0c;返回size&#xff0c;返回队头 6.插入 7.删除 1.优先队列的类模板 我们先通过模板来进行初步了解 由上图可知&#xff0c;我们的模板里有三个参数&#xff0c;第一个参数自然就是你要存储的数…

使用Android Studio 搭建AOSP FrameWork 源码阅读开发环境

文章目录 概述安装Android Studio编译源码使用Android Studio打开源码制作ipr文件直接编译成功后自动打开Android Studio 修改SystemUI验证开发环境 概述 我们都知道Android的系统源码量非常之大&#xff0c;大致有frameworka层源码&#xff0c;硬件层(HAL)源码&#xff0c;内…

【华为OD机试】数组连续和(C++/Java/Python)

【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录 【华为OD机试】-(C卷+D卷)-2024最新真题目录 题目描述 给定一个含有N个正整数的数组, 求出有多少个连续区间(包括单个正整数), 它们的和大于等于x。 输入描述 第一行两个整数N x(0 < N <= 100000, 0 <= x <…

Java高阶私房菜:JVM分代收集算法介绍和各垃圾收集器原理分解

目录 什么是分代收集算法 GC的分类和专业术语 什么是垃圾收集器 垃圾收集器的分类及组合 ​编辑 应关注的核心指标 Serial和ParNew收集器原理 Serial收集器 ParNew收集器 Parallel和CMS收集器原理 Parallel 收集器 CMS收集器 新一代垃圾收集器G1和ZGC G1垃圾收集器…

iframe隐藏scrollbar并且还能够继续滚动

查了好久的文档&#xff0c;太累了&#xff0c;目前暂时使用了直接把scrollbar隐藏的策略。太难了。 直接隐藏的策略&#xff1a; frame 有个属性 scrolling&#xff0c;直接设置 scrolling‘no’ 即可隐藏scrollbar。 <iframe src"xxx" scrolling"no"…