DERT目标检测—End-to-End Object Detection with Transformers

news2025/4/16 17:13:08

DERT:使用Transformer的端到端目标检测

论文题目:End-to-End Object Detection with Transformers
官方代码:https://github.com/facebookresearch/detr

论文题目中包括的一个创新点End to End(端到端的方法)简单的理解就是没有使用到NMS等后处理操作来处理生成的多个重复的框

简单的端到端的目标检测系统

引言与概述

We present a new method that views object detection as a
direct set prediction problem.

将目标检测任务直接看成是集合预测的问题。

  1. 提出了一个全局的二分图匹配的损失函数:a set-based global loss that forces unique predictions via bipartite matching
  2. 结合了Transformer结构,在解码器的部分进行并行的出框。

在引言的部分论文中简单概括了之前的目标检测所用到的一些方法。

  • 双阶段目标检测的算法: FasterRcnn
  • 单阶段目标检测的算法:Yolo
  • 基于中心点进行生成的算法:CenterNet

在这里插入图片描述

在没有深入的学习目标检测网络具体的细节之前。对这一个过程进行一.个直观的信息描述,

  1. 首先经过一个CNN网络提取一部分的特征得到对应的特征图,并将得到的特征进行拉直处理。准备送入之后的Transformer结构中去。

  2. 将拉直之后的token送入编码器的结构部分,(endcode去进一步学习全局的特征信息。为我们decode出预测框的部分做铺垫。)使用endcode可以认为是将图片中的每一个点和其他的点之间就有交互信息了。就可以知道大概那一块是那个物体。

  3. 对同一个物体就出一个检测框的结果。通过query和我们的特征就可以确定要出多少检测框(论文中固定出框数为100)

  4. 最后一步就是我得出的这100个框,如何和我的Ground Truth框之间做一个关联匹配问题呢 计算loss 没有匹配的框则会标记为没有物体。

目标检测相关工作

Most modern object detection methods make predictions relative to some ini-tial guesses. Two-stage detectors [37,5] predict boxes w.r.t. proposals, whereas single-stage methods make predictions w.r.t. anchors [23] or a grid of possible object centers [53,46]. Recent work [52] demonstrate that the final performance of these systems heavily depends on the exact way these initial guesses are set.

在之前的目标检测的相关工作中作者就提到了,之前相关的目标检测的工作,取决于我们的先验猜测,双阶段的候选框proposals,单阶段的anchors于 centernet的中心点检测取决于,中心点选取的位置。

从而提出了一种新的方法,基于集合的方式来做这个目标检测的任务。

目标函数

DETR infers a fixed-size set of N predictions, in a single pass through the decoder, where N is set to be significantly larger than the typical number of objects in an image N=100

二分图匹配问题+匈牙利算法。找到一个唯一解使得最后可以完成最后的一个分配。(代价矩阵的构建就可以看成是,将100个预测框和Ground Truth框之间进行二分图匹配

σ ^ = arg ⁡ min ⁡ σ ∈ S N ∑ i N L match  ( y i , y ^ σ ( i ) ) \hat{\sigma}=\underset{\sigma \in \mathfrak{S}_{N}}{\arg \min } \sum_{i}^{N} \mathcal{L}_{\text {match }}\left(y_{i}, \hat{y}_{\sigma(i)}\right) σ^=σSNargminiNLmatch (yi,y^σ(i))

最后匹配完成之后就可以和之后的目标检测差不多的损失函数。

L Hungarian  ( y , y ^ ) = ∑ i = 1 N [ − log ⁡ p ^ σ ^ ( i ) ( c i ) + 1 { c i ≠ ∅ } L box  ( b i , b ^ σ ^ ( i ) ) ] \mathcal{L}_{\text {Hungarian }}(y, \hat{y})=\sum_{i=1}^{N}\left[-\log \hat{p}_{\hat{\sigma}(i)}\left(c_{i}\right)+\mathbb{1}_{\left\{c_{i} \neq \varnothing\right\}} \mathcal{L}_{\text {box }}\left(b_{i}, \hat{b}_{\hat{\sigma}}(i)\right)\right] LHungarian (y,y^)=i=1N[logp^σ^(i)(ci)+1{ci=}Lbox (bi,b^σ^(i))]

简单的看也就是分类损失加上回归损失的表达形式。

在这里插入图片描述
这一个更为详细的图里面就引出了另外的一个十分重要的概念object Queries(是一个可学习的参数在经过学习之后就可以确定出哪些查询会对应哪些目标,从而避免重复的操作。

连接一个分类头完成最终的结果的一个预测。论文中给出的简化的版本代码编写。

import torch
from torch import nn
from torchvision.models import resnet50
class DETR(nn.Module):
def __init__(self, num_classes, hidden_dim, nheads,
num_encoder_layers, num_decoder_layers):
super().__init__()
# We take only convolutional layers from ResNet-50 model
self.backbone=nn.Sequential(*list(resnet50(pretrained=True).children())[:-2])
self.conv = nn.Conv2d(2048, hidden_dim, 1)

self.transformer = nn.Transformer(hidden_dim, nheads,

num_encoder_layers, num_decoder_layers)

self.linear_class = nn.Linear(hidden_dim, num_classes + 1)

self.linear_bbox = nn.Linear(hidden_dim, 4)

self.query_pos = nn.Parameter(torch.rand(100, hidden_dim))

self.row_embed = nn.Parameter(torch.rand(50, hidden_dim // 2))

self.col_embed = nn.Parameter(torch.rand(50, hidden_dim // 2))

def forward(self, inputs):

x = self.backbone(inputs)

h = self.conv(x)

H, W = h.shape[-2:]
pos = torch.cat([

self.col_embed[:W].unsqueeze(0).repeat(H, 1, 1),

self.row_embed[:H].unsqueeze(1).repeat(1, W, 1),

], dim=-1).flatten(0, 1).unsqueeze(1)

h = self.transformer(pos + h.flatten(2).permute(2, 0, 1),

self.query_pos.unsqueeze(1))

return self.linear_class(h), self.linear_bbox(h).sigmoid()

detr = DETR(num_classes=91, hidden_dim=256, nheads=8, num_encoder_layers=6, num_decoder_layers=6)

detr.eval()

inputs = torch.randn(1, 3, 800, 1200)

logits, bboxes = detr(inputs)

网络模型结构

在这里插入图片描述

主干网络与预处理的部分

根据论文官方的代码对模型的结构进行说明:

  1. 输入时一个800 x 1066的三通道图片,将其输入到主干网络提取器ResNet50中进行特征的提取 得到的特征图大小是 25x34(下采样了32倍) 将通道数拓展为2048。

  2. 将得到的特征图经过一个1x1的卷积层输入的通道数是2048 输出的通道数是 256得到了**[ 25 34 256]的结构**

  3. 将最后的两个维度进行一个展平的操作步骤得到了 [850 ,256]的结构

在这里插入图片描述

其中的850就是我们后面使用的Transformer中token的个数,256即为特征向量的长度。

Transformer结构部分

论文中也给出了一个改进之后的Transformer结构。结构之前的Transfomer结构给出类比的结果。

在这里插入图片描述
在标准的Transformer中位置编码只作用在输入的位置处,并且只作用一次。而在DERT的Transformer中位置编码是在每一个编码器,和解码器的部分都需要操作一次的。

学习这个网络模型的难点就在需要注意,模型之间的连线来确定好各个Q K V是通过哪些变量的计算来生成的(结合源码)

在这里插入图片描述

解读细节

Encoder完成的任务得到各个目标的注意力结果,准备好特征,等解码器来选

一组参考点的编码器自注意力。 编码器能够分离各个实例。 使用基线 DETR 模型对验证集图像进行预测。

在这里插入图片描述

在论文的结构图中解码器的部分也需要注意一些实现的细节步骤。

在这里插入图片描述

解码器部分虽然用到了两个自注意力机制,但是第一部分用到的是多头自注意力机制,而第二部分用到的则是,多头注意力机制 原因第二部分的Q来自下面一层的一个输出,而K和V的部分则来自编码器的输出,因此不能称为自注意力机制。

解码器的第一部分:个人感觉可以简单的理解为通过我们初始化的Object Queries查询向量 这一个可以学习的参数来整合查询的过程,告诉第二部分,每一个查询向量应该对应那一部分的区域信息。

将它作为一个查询向量Q输入到下一层和编码器中包括的信息(如上图所示)进行整合 最后进行分类和回归得到最后的结果。得到的长度为100

损失函数

  1. 从100个预测框中,找出和真实标注框所匹配的N个框(图中对应的是两个框),也就是说我们在训练集样本中标注了几个框,就需要在那100个得到的预测框中筛选出几个框(N)来进行匹配

在这里插入图片描述

我们需要做的任务就是向代价矩阵中进行填值使得匹配的结果最为合适

− 1 { c i ≠ ∅ } p ^ σ ( i ) ( c i ) + 1 { c i ≠ ∅ } L box  ( b i , b ^ σ ( i ) ) . -\mathbb{1}_{\left\{c_{i} \neq \varnothing\right\}} \hat{p}_{\sigma(i)}\left(c_{i}\right)+\mathbb{1}_{\left\{c_{i} \neq \varnothing\right\}} \mathcal{L}_{\text {box }}\left(b_{i}, \hat{b}_{\sigma(i)}\right) . 1{ci=}p^σ(i)(ci)+1{ci=}Lbox (bi,b^σ(i)).
在这里插入图片描述
我们首先看公式的前半部分:即为对应的类别损失:Class Cost

− 1 { c i ≠ ∅ } p ^ σ ( i ) ( c i ) -\mathbb{1}_{\left\{c_{i} \neq \varnothing\right\}} \hat{p}_{\sigma(i)}\left(c_{i}\right) 1{ci=}p^σ(i)(ci)

在这里插入图片描述

  • 首先要提取出GT中的坐标框对应的类别信息(第一张图有两个框,第二张图中有四个框。值为类别编号

  • 对应两个图片给出的200个预测框的值(2N)我们将其进行拼接,计算出包含真实类别的概率值。

在这里插入图片描述
在计算的时候Cost class这个张量需要加符号用来计算损失函数的值

  • 第二部分我们对应的是边界框回归的一个损失。

1 { c i ≠ ∅ } L box  ( b i , b ^ σ ( i ) ) \mathbb{1}_{\left\{c_{i} \neq \varnothing\right\}} \mathcal{L}_{\text {box }}\left(b_{i}, \hat{b}_{\sigma(i)}\right) 1{ci=}Lbox (bi,b^σ(i))

论文中关于回归损失函数的描述信息为:
Bounding box loss. The second part of the matching cost and the Hungarian
loss is Lbox(·) that scores the bounding boxes. Unlike many detectors that do box
predictions as a ∆ w.r.t. some initial guesses, we make box predictions directly.
While such approach simplify the implementation it poses an issue with relative
scaling of the loss. The most commonly-used 1 loss will have different scales for
small and large boxes even if their relative errors are similar. To mitigate this
issue we use a linear combination of the 1 loss and the generalized IoU loss [38]
Liou(·, ·) that is scale-invariant. Overall, our box loss is Lbox(bi, ˆbσ(i)) defined as
λiouLiou(bi, ˆbσ(i)) + λL1||bi − ˆbσ(i)||1 where λiou, λL1 ∈ R are hyperparameters.
These two losses are normalized by the number of objects inside the batch.

总结一下:也就如果和之前一样使用常规的L1损失来作为回归损失,可能会导致,大小检测框的相对计算一致。因此在这个基础上引出了GIOU损失与L1损失相结合的最终回归损失部分。

λ iou  L iou  ( b i , b ^ σ ( i ) ) + λ L 1 ∥ b i − b ^ σ ( i ) ∥ 1 \lambda_{\text {iou }} \mathcal{L}_{\text {iou }}\left(b_{i}, \hat{b}_{\sigma(i)}\right)+\lambda_{\mathrm{L} 1}\left\|b_{i}-\hat{b}_{\sigma(i)}\right\|_{1} λiou Liou (bi,b^σ(i))+λL1 bib^σ(i) 1

在这里插入图片描述

match操作

− 1 { c i ≠ ∅ } p ^ σ ( i ) ( c i ) + 1 { c i ≠ ∅ } L box  ( b i , b ^ σ ( i ) ) -\mathbb{1}_{\left\{c_{i} \neq \varnothing\right\}} \hat{p}_{\sigma(i)}\left(c_{i}\right)+\mathbb{1}_{\left\{c_{i} \neq \varnothing\right\}} \mathcal{L}_{\text {box }}\left(b_{i}, \hat{b}_{\sigma(i)}\right) 1{ci=}p^σ(i)(ci)+1{ci=}Lbox (bi,b^σ(i))

L box  ( ⋅ ) = λ iou  L iou  ( b i , b ^ σ ( i ) ) + λ L1  ∥ b i − b ^ σ ( i ) ∥ 1 \mathcal{L}_{\text {box }}(\cdot)=\lambda_{\text {iou }} \mathcal{L}_{\text {iou }}\left(b_{i}, \hat{b}_{\sigma(i)}\right)+\lambda_{\text {L1 }}\left\|b_{i}-\hat{b}_{\sigma(i)}\right\|_{1} Lbox ()=λiou Liou (bi,b^σ(i))+λL1  bib^σ(i) 1

  • 我们对应代码部分实际的计算步骤就是:cost = -cost_class + 5 × cost_bbor - 2 × cost_GIoUs

  • 把计算得到的结果填写入矩阵之中,就可以得到两个图片总的代价矩阵,我们在使用split操作将其分开得到两个代价矩阵的结果。

(分别进行匈牙利匹配)

在这里插入图片描述

计算损失并反向传播

在这个地方论文中提出了一个新的损失函数。—匈牙利损失函数。使用筛选出的预测框与真实标注框计算损失。

L Hungarian  ( y , y ^ ) = ∑ i = 1 N [ − log ⁡ p ^ σ ^ ( i ) ( c i ) + 1 { c i ≠ ∅ } L box  ( b i , b ^ σ ^ ( i ) ) ] \mathcal{L}_{\text {Hungarian }}(y, \hat{y})=\sum_{i=1}^{N}\left[-\log \hat{p}_{\hat{\sigma}(i)}\left(c_{i}\right)+\mathbb{1}_{\left\{c_{i} \neq \varnothing\right\}} \mathcal{L}_{\text {box }}\left(b_{i}, \hat{b}_{\hat{\sigma}}(i)\right)\right] LHungarian (y,y^)=i=1N[logp^σ^(i)(ci)+1{ci=}Lbox (bi,b^σ^(i))]

和之前代价矩阵计算所用的那个函数其实差不多(类别损失+坐标损失)。区别主要在于一下几点。

  1. 这里在计算类别损失的时候我们是使用N也就是100个预测框来参与运算。而不是只计算标注类别的损失。
  2. 加了 log也就是使用交叉熵损失函数(计算平均值)
  3. 中间层的输出也是参与了损失计算的。(主网络损失+网络中间层的损失)

在这里插入图片描述

用预测结果与真实的结果计算交叉熵损失(所有的框 92代表背景)

在回归损失中,公式也给出了只使用真实的标注框不含背景。

1 { c i ≠ ∅ } L box  ( b i , b ^ σ ^ ( i ) ) \mathbb{1}_{\left\{c_{i} \neq \varnothing\right\}} \mathcal{L}_{\text {box }}\left(b_{i}, \hat{b}_{\hat{\sigma}}(i)\right) 1{ci=}Lbox (bi,b^σ^(i))

最后就可以得到最终的结果了:结合反向传播对整个网络进行训练和优化

L Hungarian  ( y , y ^ ) = ∑ i = 1 N [ − log ⁡ p ^ σ ^ ( i ) ( c i ) + 1 { c i ≠ ∅ } L box  ( b i , b ^ σ ^ ( i ) ) ] \mathcal{L}_{\text {Hungarian }}(y, \hat{y})=\sum_{i=1}^{N}\left[-\log \hat{p}_{\hat{\sigma}(i)}\left(c_{i}\right)+\mathbb{1}_{\left\{c_{i} \neq \varnothing\right\}} \mathcal{L}_{\text {box }}\left(b_{i}, \hat{b}_{\hat{\sigma}}(i)\right)\right] LHungarian (y,y^)=i=1N[logp^σ^(i)(ci)+1{ci=}Lbox (bi,b^σ^(i))]

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

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

相关文章

Elixir求解螺旋矩阵问题

题目是构造一个 n 维的顺时针螺旋矩阵,那么什么是螺旋矩阵呢?就是从左上角开始按顺时针方向从外向内依次递增的二维矩阵。一个3维螺旋矩阵示例如下: 我们是在 elixir 中求解,没有变量,没有循环,但是我们有…

中国篆刻—孙溟㠭浅析碑帖《张黑女墓志》

中国篆刻——孙溟㠭浅析碑帖《张黑女墓志》 《张黑女墓志》 《张黑女墓志》全称是《魏南阳张玄墓志》,又称《张玄墓志》,是北魏时期的墓志,属正书体,北魏普泰元年(公元531年)立碑。原碑已经丢失&#xf…

5个最佳开源RPA框架之一UI.Vision介绍

博主介绍: 大家好,我是Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。技术范围: 目前专注java体系,以及golang、.Net、…

【ADC】SAR 型 ADC 和 ΔΣ ADC 的选型决策方法

本文学习于TI 高精度实验室课程,介绍如何选择 SAR 或 delta-sigma 型 ADC。 文章目录 一、选型决策树二、特定传感器的应用三、需要 DC 精度但分辨率较低的应用四、需要 DC 精度且分辨率较高的应用五、极低噪声的 DC 精密测量六、需要捕获瞬态信号值的应用七、需要高…

产品需求-聊天框中发送的文件,要求文件名过长是保留后缀名省略中间的文字部分

介绍一下之前做过的一个需求,是要实现pc的一个聊天软件的消息引用功能。对于文件的引用,产品是这样做要求的: 消息框无固定长度,根据回复的文字长度决定消息框长度对于一个pc项目,当页面窗口变化时要实现响应式文件名…

个人账号(学校+个人)申请专利过程中遇见的问题

一、请指定一位申请人作为代表人 因为是拿个人账号申请的专利,同时要求学校是第一申请人,所以可以再添加一个第二申请人,然后勾选第二申请人为代表人就可以提交申请了(注意:两个申请人只能减免75%,也就是要…

Kubernetes配置管理(kubernetes)

实验环境: 在所有节点上拉取镜像;然后把资源清单拉取到第一个master节点上; 同步会话,导入镜像: configmap/secret 配置文件的映射 变量: 基于valuefrom的方式 cm--》pod 特点:变量的名称可…

109.游戏安全项目:信息显示二-利用游戏通知辅助计算基址

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:易道云信息技术研究院 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信…

C++之二叉搜索

1.二叉搜索树的概念 二叉搜索树又称为二叉排序树,它有以下的特点。 1.如果它的左子树不为空,则左子树上所以结点的值都小于等于根结点的值 2.如果它的右子树不为空,则右子树上所有结点都大于等于根结点的值 3.它的左右子树也分别为二叉搜…

Lab1:虚拟机kolla安装部署openstack,并创建实例

实验内容: 创建并配置虚拟机安装OpenStack创建镜像创建实例类型选择网络配置创建实例 1、选择一个适合你的系统的虚拟机管理软件: VirtualBox (推荐) VMWare 其他 2、下载 .iso 镜像文件 openstack S 版本 iso 链接&#xff1…

Llama系列迈向多模态新时代:3.2版本开源超越闭源,并携手Arm推出手机优化版

在多模态领域,开源模型也超闭源了! 就在刚刚结束的 Meta 开发者大会上,Llama 3.2 闪亮登场: 这回不仅具备了多模态能力,还和 Arm 等联手,推出了专门为高通和联发科硬件优化的 “移动” 版本。 具体来说&a…

jmeter压测常见报错总结

address already in use:connect 报错原因: 1、windows系统为了保护本机,限制了其他机器到本机的连接数. 2、TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间。关闭和释放之间的此时间间隔通称 TIME_WAIT 状态或两倍最大段生命周期&#xff08…

javaJUC基础

JUC基础知识 多线程 管程 Monitor,也就是平时所说的锁。Monitor其实是一种同步机制,它的义务是保证(同一时间)只有一个线程可以访问被保护的数据和代码块,JVM中同步是基于进入和退出监视器(Monitor管程对…

【MySQL】数据库表的基本查询——增删查改

W...Y的主页 😊 代码仓库分享💕 目录 表的增删改查 Create 单行数据 全列插入 多行数据 指定列插入 插入否则更新 替换 Retrieve SELECT 列 全列查询 指定列查询 查询字段为表达式 为查询结果指定别名 结果去重 WHERE 条件 结果排序 筛选…

ETLCloud携手ClickHouse:高效的数据查询效率

自从大数据处理技术走进大众视野、开源项目Hadoop的出现,以前受制于数据库处理能力的大数据技术蓬勃发展,传统关系型数据库所构建的数据仓库,被以Hive为代表的大数据技术所取代,随着技术不断发展,Hadoop虽然带来了诸多…

Harbor的安装与使用

任务分析 一、规划节点 IP地址 主机名 节点 192.168.20.20 master 容器master节点 192.168.20.21 node 容器worker节点 二、基础准备 镜像使用CentOS7.9(主机配置自定义,推荐配置4vCPU/12G内存/100G硬盘),使用这两台云…

韦东山FreeRTOS笔记

介绍 这篇文章是我学习FreeRTOS的笔记 学的是哔哩哔哩韦东山老师的课程 在学习FreeRTOS之前已经学习过江协的标准库和一丢丢的超子说物联网的HAL了。他们讲的都很不错 正在更新, 大家可以在我的Gitee仓库中下载笔记源文件、项目资料等 笔记源文件可以在Notion…

鸿蒙OS开发之动画相关示例分享, 关于弹出倒计时动画的实战案例源码分享

基础动画案例 Entry Component struct Index {StatebtnWidth:number 200 // 按钮的宽度StatebtnHeight:number 100 // 按钮的高度build() {Row(){Column(){Button("测试").width(this.btnWidth).height(this.btnHeight)// 按钮: 用来启动动画Button("动画开始…

USB2.0主机设备检测过程以及信号分析

一,USB协议发展 USB接口自1994年推出以来,经过30年的发展,从USB1.0发展到了现在的USB4.0,传输速率也从最开始的1.5Mbps,大幅提高到了最新的40Gbps。 USB协议按照速度等级和连接方式分可分为7个版本,但是从…

docker -私有镜像仓库 - harbor安装

文章目录 1、镜像仓库简介2、Harbor简介3、下载与安装3.1、下载3.2、安装3.2.1、上传harbor-offline-installer-v2.8.2.tgz到虚拟机中解压并修改配置文件3.2.2、解压tgz包3.2.3、切换到解压缩后的目录下3.2.4、准备配置文件3.2.5、修改配置文件 4、启动Harbor5、启动关闭命令6、…