目标检测新思路:DETR

        Transformer是一种基于自注意力机制的神经网络架构,它能够从序列中提取重要信息,已被广泛应用于自然语言处理和语音识别等领域。随着Transformer的提出和发展,目标检测领域也开始使用Transformer来提高性能。

        DETR是第一篇将Transformer应用于目标检测领域的算法,论文与代码地址如下:

论文地址:[2005.12872] End-to-End Object Detection with Transformers (arxiv.org)

代码地址:GitHub - facebookresearch/detr: End-to-End Object Detection with Transformers

         DETR将Transformer应用至目标检测领域,虽然没有取得当时的SOTA,但其为目标检测打开了一扇新的大门,并且在后续的研究中为目标检测带来了许多创新,在目标检测与实例分割领域持续霸榜。

        DETR论文通篇在强调一个重点:简单。那么它究竟有多简单呢?论文的最后给出了一段代码

import torch
from torch import nn
from torchvision.models import resnet50class 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 modelself.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)

DETR仅用几十行代码即可完成模型的构建,其结构图如下:

按照前向传播的思路,梳理DETR:

       1. 图像先经过卷积骨干网络的处理,得到特征图,随后为了减少计算复杂度,通过conv层对特征图进行降维,此时特征图的维度为:(b,c,w,h)。为了将特征输入进Transformer,需要沿w、h维度将特征图拉平,得到:(b,c,s),其中s=w*h,表示序列长度。随后调整特征维度为(s,b,c),输入进Transformer。

        2.通过Transfomer Encoder的全局建模处理,特征序列被赋予了更多语义信息,论文中将其称为memory。此时将object queries与memory共同输入至Transformer Decoder中。

        3.Decoder通过Cross Attention机制,在memory中提取有助于object queries预测的特征,并输入至分类头与测头中,得到类别与预测框。

        在下文中,我们将详细介绍这三个主要步骤,以更深入地理解DETR的工作原理。

卷积骨干网络

        DETR论文发表于2020年,此时Vision Transformer还没有被提出,因此DETR使用的是卷积骨干网络ResNet50,用于特征提取。

        ResNet50对图像输入进行32倍下采样。当图像尺寸为(batch_size,3,640,640)时,经过ResNet50的处理,得到(batch_size,2048,20,20)的特征图。

        为了减少计算复杂度,使Transformer更高效的处理序列,使用一个1*1卷积,对输出的特征图进行降维,得到(batch_size,256,20,20)的特征图。

        Transfomer Encoder的输入形式为(s,bach_size,c),其中s表示序列长度,c表示特征维度,因此要将特征图拉平为序列,并调整为(s,bach_size,c)形式,再加入位置编码,即可输入至Encoder中。

Transformer Encoder

        Transformer Encoder的作用是特征加强。Encoder可以捕获序列之间的依赖关系,输出仍为(s,batch_size,c)的特征序列。Encoder结构如下,这里不对结构进行讲解。

        之所以说Encoder的作用是特征加强,是因为Encoder不是必须的,论文中给出了不同数量的Encoder对结果的影响,如下表:

从表中可以看出,即使不使用Encoder结构,也能得到36.7的AP。

        下面用一张图来具体演示Encoder的作用:

   

         上图为Encoder中注意力机制的可视化,原理是在目标身上取一像素(上图中的红点),然后将这一像素与图上所有像素的注意力权重进行可视化。可以看出,Encoder中的注意力机制几乎将整个目标都抠了出来,即使是在遮挡严重的情况下也能较好的完成注意力的分配。

        Encoder将ResNet提取的特征进行了加强,捕获了空间层面的依赖关系,使得特征能够更好的表示出目标的轮廓。

 Transformer Decoder

        Decoder的输入有两个:object queries与memory(Encoder的输出)。

        Decoder可以看作是object queries“生长”的过程。

        object queries有些类似于YOLO中的anchor,关于YOLO算法的讲解可以看我的这篇文章YOLOv5深度剖析_yolov5骨干网络-CSDN博客。从object queries到预测框的过程中可以看作是一个生长的过程。有别于标准的Transformer Decoder,object queries首先通过一个不带掩码的多头自注意力机制,以协调object queries之间工作,随后通过Cross Attention机制,在memory中查询待检测物体,最后经过分类头与预测头的处理,输出类别与检测框。

        下面通过可视化的方式来展示Decoder学到了哪些信息: 

         通过上图可知,Decoder的注意力均集中在目标的边缘位置,这说明Decoder学习到了目标的边缘信息,有助于更加精准的定位目标。

二分图匹配

        DETR除了检测流程上的创新,还将二分图匹配应用至检测框的匹配上,使得模型无需非极大值抑制,实现端到端的输出检测框

        DETR的输出是一个集合,无论输入什么样的图像,模型最后都会输出固定数量的集合,这个集合就是预测框与类别。在训练过程中,如何完成输入框与Ground Truth(真实框)的匹配,也成为了训练的核心问题。

        假设现在有4个object query,和3个Ground Truth

Ground Truth 1Ground Truth 2Ground Truth 3
object query 10.130.540.22
object query 20.450.670.12
object query 30.450.120.73
object query 40.250.460.57

上面的矩阵记录了每种匹配方式产生的损失,而二分图匹配的任务就是找到一种方式,使得匹配产生的损失最小,一种时间复杂度较小的二分图匹配的方式叫做匈牙利算法,匈牙利算法能够在时间复杂度较低的情况下很好的解决二分图匹配问题。

        DETR的源码中,直接使用了scipy库中提供的匈牙利算法函数linear_sum_assignment来解决二分图匹配的问题。

总结

        DETR(Detection Transformer)是一种基于Transformer架构的目标检测器,为目标检测领域打开了一扇新的大门。但值得注意的是,DETR在COCO数据集上的AP并没有达到SOTA水平,并且存在着难以收敛的问题。

        随着后续的不断改进,DETR在目标检测任务中越来越好,解决了AP不高和难以收敛等问题。COCO数据集也被DETR后续的不同改进霸榜。期待DETR涌现更多优秀的后续工作。

         

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

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

相关文章

Cocos Creator3.8 项目实战(八)2D UI DrawCall优化详解(上)

游戏开发的朋友都知道,在游戏开发过程中,DrawCall 是我们优化性能的一个非常重要的指标,直接影响游戏的整体性能表现,DrawCall数量越多,帧率会降低,能明显感觉到卡顿。 那今天我们就来聊一聊,2D…

零售超市商家怎么做微信小程序

随着互联网的发展,越来越多的零售超市商家开始关注如何借助微信小程序引流,以提高销售额和客户满意度。下面将介绍几个策略,帮助零售超市商家借助微信小程序实现引流。 首先,商家需要开发一款适合自己的微信小程序。小程序是一种轻…

pyqt 划线标注工具

效果图: 代码: import osfrom PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QPushButton, QLabel from PyQt5.QtGui import QPainter, QPen, QColor, QImage, QPixmap from PyQt5.QtCore import Qt, QPoint import sys import jsonclass ImageLabel(QLabel)…

centos7下 编译coreboot生成真机可用的bios固件, 并在真机上演示 (上篇)

看了国内的corebot相关文章以及b站的corebot视频, 大不部分都是编译 用于虚拟机(qemu)或者模拟器上运行的 很少有编译corebot项目 出可以再真机上使用的的 bios 本教程应该是全网最详细的了, 真机版的coreboot bios固件, 所以有点长, 希望对你有帮助 #coreboot编译总说明文档…

论文阅读——Large Selective Kernel Network for Remote Sensing Object Detection

目录 基本信息标题目前存在的问题改进网络结构另一个写的好的参考 基本信息 期刊CVPR年份2023论文地址https://arxiv.org/pdf/2303.09030.pdf代码地址https://github.com/zcablii/LSKNet 标题 遥感目标检测的大选择核网络 目前存在的问题 相对较少的工作考虑到强大的先验知…

深度学习基础知识 使用torchsummary、netron、tensorboardX查看模参数结构

深度学习基础知识 使用torchsummary、netron、tensorboardX查看模参数结构 1、直接打印网络参数结构2、采用torchsummary检测、查看模型参数结构3、采用netron检测、查看模型参数结构3、使用tensorboardX 1、直接打印网络参数结构 import torch.nn as nn from torchsummary im…

从裸机启动开始运行一个C++程序(七)

前序文章请看: 从裸机启动开始运行一个C程序(六) 从裸机启动开始运行一个C程序(五) 从裸机启动开始运行一个C程序(四) 从裸机启动开始运行一个C程序(三) 从裸机启动开始运…

Httpd(一)

介绍 httpd是apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。 特性 高度模块化:core modules DSO:Dynamic Shared Object 动态加载/卸载 MPM:multi-p…

【工作流引擎】Activiti的使用03

流程定义查询 // 获取部署时的信息ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine();RepositoryService repositoryService processEngine.getRepositoryService();ProcessDefinitionQuery processDefinitionQuery repositoryService.createProcessDe…

人工智能在教育上的应用2-基于大模型的未来数学教育的情况与实际应用

大家好,我是微学AI ,今天给大家介绍一下人工智能在教育上的应用2-基于大模型的未来数学教育的情况与实际应用,随着人工智能(AI)和深度学习技术的发展,大模型已经开始渗透到各个领域,包括数学教育。本文将详细介绍基于大模型在数学…

【ARM AMBA5 CHI 入门 12.1 -- CHI 链路层详细介绍 】

文章目录 CHI 版本介绍1.1 CHI 链路层介绍1.1.1 Flit 切片介绍1.1.2 link layer credit(L-Credit)机制1.1.3 Channel1.1.4 Port1.1. RN Node 接口定义1.1.6 SN Node 接口定义1.2 Channel interface signals1.2.1 Request, REQ, channel1.2.2 Response, RSP, channel1.2.3 Snoop…

MongoDB 笔记

1 insert 、create、save区别 insert: 主键不存在则正常插入;主键已存在,抛出DuplicateKeyException 异常 save: 主键不存在则正常插入;主键已存在则更新 insertMany:批量插入,等同于批量执行 insert create&#x…

PowerShell pnpm : 无法加载文件 C:\Users\lenovo\AppData\Roaming\npm\pnpm.ps1

1、右键点击【开始】,打开Windows PowerShell(管理员) 2、运行命令set-ExecutionPolicy RemoteSigned 3、根据提示,输入A,回车 此时管理员权限已经可以运行pnpm 如果vsCode还报该错误 继续输入 4、右键点击【开始】,打…

【gmail注册教程】手把手教你注册Google邮箱账号

手把手教你注册Google邮箱账号 写在前面: 要注意,注册Google邮箱必须要确保自己能够 科学上网,如果暂时做不到,请先进行相关学习。使用的手机号是大陆(86)的。 在保证自己能够科学上网后,在浏…

基于ChatGPT+词向量/词嵌入实现相似商品推荐系统

最近一个项目有个业务场景是相似商品推荐,给一个商品描述(比如 WIENER A/B 7IN 5/LB FZN ),系统给出商品库中最相似的TOP 5种商品,这种单纯的推荐系统用词向量就可以实现,不过,这个项目特点是商品库巨大,有…

上海亚商投顾:沪指探底回升 华为汽车概念股集体大涨

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 三大指数昨日探底回升,早盘一度集体跌超1%,随后震荡回暖,深成指、创业板指…

idea 插件推荐(持续更新)

文章目录 Material Theme UIcodeium(建议有梯子的使用)Key Promoter XCodeGlanceRainbow BracketsMarkdown NavigatorRestfulToolkitString Manipulation Material Theme UI 谁不想拥有一款狂拽炫酷 吊炸天 的编码主题呢,给你推荐Material Theme UI Plugin Material Theme UI是…

地产三维实景vr展示的功能及特点

随着科技的不断发展,VR(虚拟现实)技术也越来越成熟。VR技术的广泛应用,已经逐渐渗透到各个领域,其中引人注目的就是虚拟展馆。虚拟展馆是一种利用VR技术构建的线上展示空间,让观众可以在家中就能参观展览,带来了极大地…

那些年,我们一起发现的Bug

一、背景 在这篇文章中,分享一些自己在工作中或别人发现的一些常见Bug,与大家共同成长~ 二、常见Bug分类 1、前后命名不一致 举个例子 接口入参中的名称是:aslrboot Java代码中使用的名称是:aslrBoot Codis中存储的名称是&…

[硬件基础]-双稳态多谐振荡器配置

双稳态多谐振荡器配置 文章目录 双稳态多谐振荡器配置1、概述2、双稳态多谐振荡器的内部运行原理 在上一篇文章中,我们深入了解了555定时器在单稳态模式下的内部工作原理。 如果您已经理解了上一篇文章,那么本文对您来说将会非常简单。 我们将研究 555 定…