首页 > 其他分享 >DETR:End-to-End Object Detection with Transformers

DETR:End-to-End Object Detection with Transformers

时间:2024-11-26 20:29:22浏览次数:13  
标签:Box Transformer End self Object Detection 100 256 物体

【DETR 论文精读【论文精读】-哔哩哔哩】 https://b23.tv/Iy9k4O2

 摘要:

将目标检测看作一个集合预测的问题

任务:给定一张图片,预测一组框,每个框需要得到坐标信息和包含的物体类别信息,将框可以视为集合,不同图片所对应的框不同,则所对应的集合就不同

去除:NMS、生成anchor

创新:

①提出一个目标函数,通过二分图匹配的方式强制模型输出一组独一无二的预测(去除冗余框,每个物体的理想状态下就会生成一个框)

②使用Transformer 的encoder、decoder架构:

(1)在Transformer解码器中提出learned object query,它可以和全局图像信息结合,通过不停做注意力操作,让模型直接输出一组预测框

(2)并行出框

导言:

背景:

大部分目标检测器采用间接方式预测,或用回归和分类替代目标检测问题

性能受限于后处理(NMS)操作,处理大量冗余框

流程:

①用卷积神经网络提取特征

②将特征拉直,送入Transformer的encoder、decoder,进一步学习全局信息,将每一个点的信息与全局做交互

③生成框输出,通过object query限制框的个数

④使用二分图匹配计算Loss,计算预测框和GT Box的matching loss决定预测框中对应GT Box的框;选择后计算分类损失、Bounding Box Loss;没有匹配上的框被标记为背景

相关工作:

两阶段目标检测:proposal

单阶段目标检测:anchor、center

基于集合:

关系型网络、Learnable NMS利用类似于自注意力的方法去处理物体间联系

无需后处理

性能低,使用了人工干预

基于Encoder Decoder:

得到更全局的信息

并行输出目标框,时效性增强

改进后的Encoder Decoder:

解码器部分的第一部分用到的是Multi-Head Self-Attention ,而第二部分用到的则是Multi-Head Attention 

原因:

Queries 内部先进行协同工作(通过 MHSA)。

然后再与图像特征交互提取有用的信息(通过 MHA)。

DETR:

基于集合的目标函数:

使用cost matrix:类似于三个工人分配三个工作,使每个工人被分配其最擅长的工作

使用scipy包中提供的linear-sum-assignment函数,将cost matrix作为函数输入

a、b、c看作100个框,x、y、z看作GT框 

损失函数:

包含分类Loss和出框Loss

为了使两个Loss在相近的取值空间,将log去除,得到更好的效果

在Bounding Box中,使用L_1 Loss可能会产生问题,于是加入了genralized IoU Loss(与框大小无关)

细节:为了让模型收敛更快,训练的更稳定,在Decoder后加入很多auxiliary loss(额外的目标函数);在6个(重复六次)Decoder后都加了FFN(共享参数),去得到目标检测输出从而得到Loss

网络框架:

模型创建:

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

 前向过程:

 ①输入图像[3*800*1066],通过卷积网络得到一些特征

# 模型定义
self.backbone = nn.Sequential(*list(resnet50(pretrained=True).children())[:-2])
# 前向传播
x = self.backbone(inputs)

 ② 走到卷积网络最后一层(conv5)时得到[2048*25*34],而25和34分别为800和1066的1/32,2048为对应的通道数

③输入Transformer时需要一个降维操作,通过[1*1*256]的卷积核降维得到[256*25*34]

# 投射层 将2048变为256
self.conv = nn.Conv2d(2048, hidden_dim, 1)
# 前向传播
h = self.conv(x)

 ④Transformer无位置信息,为其加入位置编码,固定位置编码大小为[256*25*34],保持维度一致

# 模型定义
self.row_embed = nn.Parameter(torch.rand(50, hidden_dim // 2))
self.col_embed = nn.Parameter(torch.rand(50, hidden_dim // 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与w拉直变为一个数值,变为[850*256],850为序列长度,256为head dimension

# 拉直
h = self.transformer(pos + h.flatten(2).permute(2, 0, 1),self.query_pos.unsqueeze(1))

 ⑥进入Transformer Encoder层,输入为[850,256],输出也为[850*256],在DETR中使用了6个Encoder进行叠加

# 进入Transformer进行一系列操作
# 最终得到100*256 
self.transformer = nn.Transformer(hidden_dim, nheads,num_encoder_layers,num_decoder_layers)

⑦进入Transformer Decoder层,进行框的输出,将输入1和输入2反复做自注意力操作,得到[100*256]的特征;在DETR中使用了6个Decoder进行叠加

# 前向传播时叠加两个输入
h = self.transformer(pos + h.flatten(2).permute(2, 0, 1),self.query_pos.unsqueeze(1))

 输入1:创新点object queries,它是一个learnable positional embedding,维度[100*256],其中的256是与encoder中的256相互对应,便于一起做乘法,100代表模型最终为100输出(条件)

# object queries设置为100 最终出100个框
self.query_pos = nn.Parameter(torch.rand(100, hidden_dim))

细节:但是在第一层Decoder中没有做object queries自注意力机制,为了移除冗余框

输入2:图像端得出的全局特征,维度[850*256]

⑧ 将特征给全连接层,全连接层做物体类别的预测和出框的预测:

类别若是COCO则为91类:

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

框为4个值(x、y、w、h):

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

⑨将得到的100个框与GT框进行匈牙利匹配

logits, bboxes = detr(inputs)

实验:

与Faster-RCNN对比:

训练策略的改变对模型提升效果很大,DETR对大物体检测效果较好,但小物体处理效果一般

Transformer Encoder:

Encoder主要学习的是全局特征,尽可能让物体和物体之间分得开

自注意力的可视化,使用Transformer Encoder让图片里的物体分的很开,在此基础上做目标检测和分割相对而言就会简单很多

随着Transformer编码器层数增加,学到的全局特征越多,性能一直在提升,但带来了参数增长和速度变慢 

Transformer Decoder:

Decoder将注意力分给学习边缘,更好的区分物体和解决遮挡问题

Object Queries:

 每一个正方形代表一个object queries,绿色的点代表小的Bounding Box,红色的点代表大的横向的Bounding Box,蓝色的点代表大的纵向的Bounding Box

object queries 与anchor类似:

anchor:提前定义好一些Bounding Box,最后将预测和提前订好的Bounding Box做对比

object queries:可学习;类似于问问题的“人”,用图片自己的方式去问,得到答案,而答案就是对应的Bounding Box,而未找到答案就无结果

每次学习后看到一张图片都会问左下角是否看到一些小物体,中间是否看到大的横向物体 

每次学习后看到一张图片都会问右边是否看到一些小物体,中间是否看到大的横向或纵向物体 

总结:

优点:

提出了一个全新的用于目标检测的DETR框架

利用了Transformer和二分图匹配,使框架是一个端到端可学习网络

在COCO数据集和全景分割上达到了很好的效果

自注意力带来的全局信息使之在大物体上效果更好

缺点:

训练时间长

不好优化

小物体性能差

 

 

标签:Box,Transformer,End,self,Object,Detection,100,256,物体
From: https://blog.csdn.net/m0_61595251/article/details/144061986

相关文章

  • 汽车渲染领域:Blender 和 UE5 哪款更适用?两者区别?
    在汽车渲染领域,选择合适的工具对于实现高质量的视觉效果至关重要。Blender和UE5(UnrealEngine5)作为两大主流3D软件,各自在渲染动画方面有着显著的差异。本文将从核心定位与用途、工作流程、渲染技术和灵活性、后期处理与合成四个方面,说明下这两款软件在汽车渲染领域的适用性。核......
  • OpenGL 进阶系列16 - Multisample Framebuffer Object 介绍
    一:概述        MultisampleFramebufferObject(FBO)是OpenGL提供的一种机制,用于在自定义的帧缓冲中实现多重采样抗锯齿(MultisampleAnti-Aliasing,MSAA)。它允许开发者创建一个多重采样的渲染目标,在对场景进行高质量渲染后再解析(resolve)为单一采样的图像。二:相......
  • AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘.
    plt.figure(figsize=(12,6))File"D:\anaconda\Lib\site-packages\matplotlib\pyplot.py",line1027,infiguremanager=new_figure_manager(^^^^^^^^^^^^^^^^^^^File"D:\anaconda\Lib\site-packages\matplotlib\pyplot.py",line549......
  • [Javascript] About private access (Object.getOwnPropertySymbols)
    Wehaveamodule:constkey=Symbol('key')exportclassA{[key]=1value(){console.log(this[key])}}Itseemsthat keyisnotexposetooutsideofmodule,butstillweareabletogetit.import{A}from'./mod......
  • Online Anomalous Subtrajectory Detection onRoad Networks with Deep Reinforcement
    用到的数据集以下是对文中实验数据的解读:数据集概况来源:数据来自滴滴出行的两个真实世界的出租车轨迹数据集,分别是成都和西安。使用了开放地图项目(OpenStreetMap)获取两地的道路网络。轨迹数量:成都:677,492条轨迹。西安:373,054条轨迹。道路网络:道路段数量(segmen......
  • OpenDaylight安装和配置
    环境:Ubuntu14.04.6LTS(GNU/Linux4.4.0-142-genericx86_64)注意,需要确保虚拟机中安装有jdkroot@UbuntuDesktop:~#java-versionjavaversion"1.8.0_151"Java(TM)SERuntimeEnvironment(build1.8.0_151-b12)JavaHotSpot(TM)64-BitServerVM(build25.151-b12,......
  • Learn to Develop an Inventory System in Unity 6 & Blender
    MP4创建|视频:h264、1280×720|音频:AAC,44.1KHz,2通道类型:在线学习|语言:英语|持续时间:108讲座(15h48m)|大小:11.1GB使用Unity6和Blender制作库存系统:ScriptableObjects,3D资产和交互式UI设计学习内容了解并使用Unity6实现一个有序的库存系统,包括项目类别和自......
  • [Vue] Use render function
    Sometimewhendoingthingisharderintemplatesyntax,youcanswitchtousingrenderfunctionintead.Forexample,wehaves Stackcomponent,itdynamicallywrappingchildelementwithadivandsomedefaultstylingapplied.<!DOCTYPEhtml><htm......
  • 【GPTs】Front-end Expert:助力前端开发的智能工具
    博客主页:[小ᶻZ࿆]本文专栏:AIGC|GPTs应用实例文章目录......
  • Scaffold-GS: Structured 3D Gaussians for View-Adaptive Rendering (Related work)
    MLP-basedNeuralFieldsandRenderingEarlyneuralfieldstypicallyadoptamulti-layerperceptron(MLP)astheglobalapproximatorof3Dscenegeometryandappearance.Theydirectlyusespatialcoordinatesandviewingdirection asinputtotheMLPandpr......