目标检测新思路:DETR

news2024/11/19 18:22:08

        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 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)

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.coloradmin.cn/o/1081632.html

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

相关文章

点击弹窗页面右侧缩小问题

主页面是由header和下面的tabel&#xff0c;2个组件构成&#xff0c;需要在css里使用flex布局&#xff0c; 就解决了弹窗导致的页面右侧缩小问题。 display: flex; flex-direction: column; <template><div class"main"><div class"header"…

局域网远程控制

被控制端电脑设置 1开启服务 Romate Desktop Services 2设置允许远程控制&#xff0c;并且添加被控制的用户 3检查用户组管理用户名是否一致 我的电脑>管理>本地用户和组>用户 4在控制电脑端WinR 输入 mstsc出现如下界面 输入被控制电脑IP和用户名 然后输入被控制端…

第十届蓝桥杯省赛C++C/研究生组,第十届蓝桥杯省赛JAVAC/研究生组——扫地机器人题解(二分)

题目描述 小明公司的办公区有一条长长的走廊&#xff0c;由 N个方格区域组成&#xff0c;如下图所示。 走廊内部署了 K台扫地机器人&#xff0c;其中第 i台在第 A i A_i Ai​ 个方格区域中。 已知扫地机器人每分钟可以移动到左右相邻的方格中&#xff0c;并将该区域清扫干净…

Android组件通信(二十四)

1. Activity生命周期 1.1 知识点 &#xff08;1&#xff09;掌握Activity的生命周期及操作方法&#xff1b; 1.2 具体内容 范例&#xff1a; 第一个配置文件 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http…

C语言常见题目(1)交换两个变量的值,数的逆序输出,猜数游戏,两个数比较大小等

我的个人主页&#xff1a;☆光之梦☆的博客_CSDN博客-C语言基础语法&#xff08;超详细&#xff09;领域博主 欢迎各位 &#x1f44d;点赞 ⭐收藏 &#x1f4dd;评论 特别标注&#xff1a;本博主将会长期更新c语言的语法知识&#xff0c;初学c语言的朋友们&#xff0c;可以收藏…

面试经典 150 题 3 —(双指针)— 167. 两数之和 II - 输入有序数组

167. 两数之和 II - 输入有序数组 方法一 class Solution { public:vector<int> twoSum(vector<int>& numbers, int target) {unordered_map<int,int> hashtable;for(int i 1; i < numbers.size(); i){auto item hashtable.find(target - numbers[…

Allegro基本规则设置指导书之Spacing规则设置

进入规则设置界面 1.设置Line 到其他的之间规则: 2.设置Pins 到其他的之间规则: 3.设置Vias 到其他的之间规则:

微软开源 windows-drivers-rs,用 Rust 开发 Windows 驱动程序

Microsoft Azure 首席技术官兼著名 Windows 软件开发人员 Mark Russinovich 在社交平台上宣布&#xff0c;启动了一个名为 windows-drivers-rs 的新开源项目。 该项目可帮助开发人员使用 Rust 开发 Windows 驱动程序&#xff0c;旨在支持 WDM (Windows Driver Model) 和 WDF (…

Pandas将两个Excel表格找出不同之处-对比两个文件-merge合并查询

Demo示例&#xff1a; 现有两个Excel表格&#xff0c;SKU不同&#xff0c;需要找出不同之处 代码结果演示&#xff1a; 代码&#xff1a; import pandastest1_path rC:\Users\Administrator\Desktop\新建文件夹 (2)\test1.xlsx test2_path rC:\Users\Administrator\Deskto…

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)…

接口自动化测试 —— 协议、请求流程

一、架构 CRM客户关系管理系统 SAAS Software As A Service 软件即服务 PAAS Platform AS A Service 平台即服务 快速交付→ 快&#xff1a;自己去干、有结果、事事有回音、持续改进 单体架构——》垂直架构——》面向服务架构——》微服务架构&#xff08;分布式&#xf…

(学习笔记)U-net++代码解读

U-net 声明&#xff1a;本文只提供代码部分。声明&#xff1a;内容为题主学习时的疑问&#xff0c;仅供初学者参考。python&#xff1a; 3.10 U-net结构图遇到的问题1. albumentations包安装的问题2. AttributeError: module albumentations.augmentations.transforms has no a…

0.在Linux Centos7下安装MySQL及其配置

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 1.检查是否已有MySQL 2. 检查系统安装包 3. 卸载这些默认安装包 4. 获取mysql官⽅yum源 5.安装mysql的yum源&#xff0c;对⽐前后yum源 6.看看能不能正常⼯作 7. 安装mysql服务 8.查看配置⽂件和数据存储位置 …

【编程必备知识】文件操作

文章目录 前言1. 认识文件1.1 树型结构组织和目录1.2 文件路径1.2.1 绝对路径1.2.2 相对路径 1.3 文件类型 2. Java 中操作文件2.1 File 概述2.1.1 构造方法2.1.2 成员方法 2. 2 代码示例示例1: 观察 get 系列的特点和差异示例2: 普通文件的创建示例3: 普通文件的删除示例4: 观…

手写Spring系列【一】IOC的简单实现笔记

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;项目专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;…

uni-app:文本超出部分用省略号表示

效果 前 后 核心代码 white-space: nowrap; /* 强制不换行 */ text-overflow: ellipsis; /* 超过部分省略号代替 */ overflow: hidden; /* 必须同时设置overflow:hidden才能生效 */ 完整代码 <template><view><view class"all_style"><view c…

「才得吹嘘身渐稳」,也来谈谈大模型

要问2023年的科技领域什么消息最博人眼球&#xff0c;那么22年底发布、23年迅速跻身顶流的ChatGPT一定占有一席之地。随着ChatGPT的“爆火出圈”&#xff0c;国内外大厂纷纷布局「生成式语言模型」研发赛道&#xff0c;各类应用也如雨后春笋般层出不穷&#xff0c;让人眼花缭乱…

SpringBoot的配置文件——.yml和.properties

目录 1. Spring Boot 配置文件的使用场景 2. 配置文件的两种格式 2.0 特殊说明&#xff1a; 2.1 .properties 2.1.1 格式 2.2.2 缺陷 2.2.3 解决中文乱码的问题 2.2 .yml 2.2.3 格式 配置数据库连接 注意转义字符 ​编辑 ​编辑 配置null 配置对象 从.yml读取文件举例 Stud…

v-on/@ 事件处理指令修饰符-stop、prevent、once

v-on/事件修饰符&#xff1a; 一、.stop 阻止单机事件继续传播 event.stopProgagetion() eg: <h3>事件修饰符</h3> <div click"todo"> <div click.stop"doThis"> 单机事件会继续传递 </div> </div> 点击 单机事…

【Java 进阶篇】Java Web 编写注册页面案例

当涉及到创建一个Java Web注册页面时&#xff0c;你将需要涵盖很多不同的主题&#xff0c;包括HTML、CSS、Java Servlet和数据库连接。在这篇文章中&#xff0c;我们将详细介绍每个步骤&#xff0c;以帮助你创建一个完整的注册页面。 1. 介绍 注册页面是许多Web应用程序的关键…