Deformable DETR

本文围绕Deformable DETR模型展开,先指出DETR存在训练周期长、对小目标不友好的问题。接着介绍Deformable DETR的特点,采用可变形注意力和多尺度特征解决问题。还阐述了其模型结构,包括各模块原理。最后对模型进行思考分析,并给出下一步计划。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

DETR提出了Query Based的端到端目标检测算法,把目标检测看成了一个集合预测的问题,巧妙避开目标检测中常用的Anchor和NMS的方法,具有实现简单、拓展性强的优点。但同时DETR也存在一些问题:

  1. 训练周期长,相比faster rcnn慢10-20倍
  2. 对小目标不友好。

Deformable DETR分析了存在上述两个问题的原因,并做出改变以解决上述问题。

1. 模型特点

1.1 分析问题

针对DETR所存在的上述两个问题,分析其原因如下:

  1. Transformer最大的问题就是在初始化时对于特征图上每个像素的权重几乎都是一样的,而且都非常小,这导致很长的训练周期和需要大量数据去学习。实际上,我们只需要关注少数有意义的点即可。
  2. 小目标的分辨率往往很低,而DETR的输入特征图分辨率也很低,先用卷积层降低输入图片的分辨率使参数量下降到可计算的范围。如果提高特征图的分辨率会使计算复杂度呈平方倍上升。

1.2 解决方案

Deformable DETR改进如下:

  1. 采用Deformable Attention,将可变形卷积与Transformer结合,使得注意力机制在小范围中采样,只考虑最有价值的几个点,以降低计算量,加快收敛速度。
  2. 采用多尺度Deformable Attention。在多尺度特征图上做Deformable Attention,在提高对小目标检测效率的同时,有效控制了参数数量。

为什么不直接使用可变形卷积?
可变形卷积参见论文FCOS。可变形卷积问题在于缺少了对元素间整体关系的建模。模型只知道哪几个点最有价值,却不明白为什么这几个点最有价值。改进的关键就在于将可变形卷积与Transformer结合。

2. 模型结构

使用多尺度可变形注意力机制模块,代替Transformer注意力模块处理特征图。
①Deformable Attention模块:加入了采样模块,不管输入图像多大,只关注目标点附近的几个点。
②多尺度特征:多尺度Deformable Attention模块

2.1 Deformable Attention

思路:采样点个数变少了,为了保持较好的效果,训练偏移量,用 K K K个点替代原来的全部点。
在这里插入图片描述
输入特征图 x x x(C x H x W),特征图中每个像素点都是一个C通道的向量 z q z_q zq,每个像素点的索引(Reference Point)也就是二维位置坐标为 p q p_q pq M M M代表多头注意力机制中头的数目(原论文中M=8)。每一个头中只考虑 z q z_q zq附近 K K K个点(K远小于H x W,原论文中为K=4)。 Δ p m q k \Delta p_{mqk} Δpmqk代表采样的位置偏移量,是一个二维的坐标(初始化采样点是固定的,但后续将通过全连接层计算预测更加值得关注的点的坐标)。 A m q k A_{mqk} Amqk代表注意力的权重( ∑ k = 1 A m q k = 1 \sum_{k=1}A_{mqk}=1 k=1Amqk=1)。 W m W_m Wm W ’ m W’_{m} Wm代表两组全连接层的权重参数。
两个需要学习预测的值 A m q k A_{mqk} Amqk Δ p m q k \Delta p_{mqk} Δpmqk都是通过 z q z_q zq计算而来的。

在这里插入图片描述
输入特征图中一向量 z q z_q zq,其坐标#p_q#为 ( p q x , p q y ) (p_{qx}, p_{qy}) (pqx,pqy) z q z_q zq通过全连接层,得到该向量的value。同时 z q z_q zq向量通过全连接层学习得到该向量经过位置偏移后的K个采样点。用这K个采样点去合成 z q z_q zq处向量实际的特征。K个采样点分别贡献了多少权重?同样用 z q z_q zq通过全连接层得到注意力权重。

疑问: z q z_q zq是怎么选取的?随机选取的部分点,还是需要遍历全部点?->源码

2.2 多尺度特征

在这里插入图片描述

{ x l } l = 1 L \lbrace x^l \rbrace{^L_{l=1}} {xl}l=1L是输入多尺度特征图,其中 x l ∈ R C × H l × W l x^l \in \mathbb R^{C \times H_l \times W_l} xlRC×Hl×Wl代表第 l l l层特征图。
p q ^ ∈ [ 0 , 1 ] 2 \hat{p_q} \in [0, 1]^2 pq^[0,1]2代表query元素q的归一化二维坐标。(为什么要归一化?为了让不同尺度的坐标尽可能对齐)。 ϕ l ( p q ^ ) \phi_l(\hat{p_q}) ϕl(pq^)代表将归一化的坐标重新映射到对应层的坐标。

需要注意的是,由于多尺度Deformable Attention本身可以在多尺度特征图之间交换信息,所以这里并没有采用一般惯用的FPN模块。

2.3 整体结构

在这里插入图片描述

在Encoder中,使用Deformable Attention替代了DETR中处理特征图的Transformer模块,其输入和输出都是相同分辨率的多尺度特征图。以ResNet为backbone,从其第三层到第五层的输出特征图中提取多尺度特征图。特征图中的每个像素点即作为一个Query,将Query的一部分通过线性层计算预测偏移点的二维坐标。每个偏移点都是特征图中的一个像素(偏移点即为Key)。对于多尺度Deformable Attention,则每个Query找 L × K L \times K L×K个Keys。重复做多次Deformable Self-Attention操作,最后得到特征图中每个像素对应的注意力特征向量。

考虑要不要在Encoder中加位置编码?
答:一定要加。但是在多尺度特征中,不同层级里相同位置的位置编码应当有所差异。源码实现:相对位置编码+level位置编码(可学习的位置编码)。

Decoder由cross-attention、self-attention组成,两组attention使用的query相同。其中self-attention是object query之间彼此交互,k与q相同;而cross-attention是从encoder输出的特征图中提取特征(key和value),每一个query在特征图中逐L层,每层提取K个Key,通过Deformable Attention回归 L × K L \times K L×K个位置偏移坐标。最后在query的基础上根据位置偏移坐标聚合特征,作为value。

最后的预测头利用object queries生成预测的anchor,与Ground Truth计算IOU,进行label assign(分类+出框)。

3. 思考分析

虽然Deformable DETR在一定程度上解决了DETR中存在的两个问题,但是其本身的设计也并非十全十美。

  1. 没有设计特别的采样策略,只采样了周围的点而已。只认为关注点周围的点是重要的,真的是这样吗?在informer论文中提及了对采样策略的设计。
  2. 特征对齐是否对语义分割有价值?Deformable DETR没有选择使用FPN,并且使用归一化位置编码的方法一定程度上改善了FPN特征没有对齐的缺陷,但是,仅通过归一化位置编码似乎并没有完美解决特征对齐的问题。(最短路径优先算法实现特征对齐)
  3. 在多尺度Deformable attention模块中,每一个query都是逐L层,每层计算预测K个Keys。是否可以打破层之间的隔阂,在L层中一起预测 L × K L \times K L×K个Keys,以进一步加强不同尺度之间的信息流通。

4. 下一步计划

  1. 训练FCN网络,分析模型效果
  2. 学习DeepLab系列网络,看源码并训练
  3. 回归Query based的分割任务,粗读Cell-DETR、VisTR和QueryInst论文

5. 参考

  1. Deformable DETR原论文
  2. Deformable DETR目标检测新范式
  3. Deformable DETR论文讲解
### Deformable DETR 的算法原理与实现 #### 背景介绍 Deformable DETR 是一种改进版的目标检测模型,它基于 DETR (Detection Transformer),并通过引入可变形注意力机制来提升效率和性能。相比于原始的 DETRDeformable DETR 显著减少了计算复杂度并提高了收敛速度[^1]。 #### 可变形注意力机制的核心概念 可变形注意力机制允许网络动态调整采样位置,从而专注于图像中的重要区域。这种设计使得模型能够更高效地提取特征,而无需在整个输入分辨率上进行全面计算。具体来说,可变形注意力模块通过学习一组偏移量(offsets) 来控制采样的空间位置,这些偏移量由先前层的输出预测得出。 #### 实现细节 以下是 Deformable DETR 中的关键组件及其功能: 1. **多尺度特征提取**: 使用 FPN(Feature Pyramid Network)结构从不同层次的卷积特征图中获取多尺度表示。这有助于捕捉从小到大的物体信息。 2. **编码器-解码器架构**: 编码器部分负责处理来自 backbone 提取的空间特征;解码器则生成最终的对象查询(query embeddings),并与参考点(reference points) 结合用于定位目标边界框。 3. **可变形注意力建模**: 解码器内部集成了多个自定义的 deformable attention layers,它们替代了标准 transformer 层内的固定网格采样策略。每个 layer 都会依据当前 query 和 key-value pairs 计算出适应性的 offset 值,并据此选取最相关的像素作为输入参与后续运算过程。 4. **训练优化技巧**: - 引入辅助 loss 函数促进早期阶段稳定; - 应用两阶段方法缓解 one-stage detector 存在的小物体漏检现象等问题。 #### Python代码示例 下面提供了一个简化版本的 Deformable Attention Layer 定义以及如何将其嵌套进整个 DETR framework 当中的示范片段: ```python import torch.nn as nn from torchvision.ops import MultiheadAttention, DeformConv2d class DeformableTransformerDecoderLayer(nn.Module): def __init__(self, d_model=256, n_heads=8, dim_feedforward=1024, dropout=0.1): super().__init__() self.self_attn = MultiheadAttention(d_model, n_heads, dropout=dropout) self.multihead_attn = MultiheadAttention(d_model, n_heads, dropout=dropout) # Deformable Attention Module Initialization self.deform_attn = DeformAttnModule(...) self.linear1 = nn.Linear(d_model, dim_feedforward) self.dropout = nn.Dropout(dropout) self.linear2 = nn.Linear(dim_feedforward, d_model) self.norm1 = nn.LayerNorm(d_model) self.norm2 = nn.LayerNorm(d_model) self.norm3 = nn.LayerNorm(d_model) def forward(self, tgt, memory, ... ): """Forward pass logic.""" ... ``` 上述代码仅展示核心思想,实际部署时需参照官方仓库或论文补充完整参数配置及初始化逻辑。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值