DETR系列文章之–Conditional DETR
文章目录
前言
Conditional DETR将信息解耦为空间信息和内容信息。 通过Conditional Spatial Query显示地寻找物体的区域范围,从而缩小物体搜索范围,仅仅通过Cross Attention中的微小改动就可以将收敛速度提高6-10倍。
1、知乎解读
2、代码地址
3、论文地址
4、优快云解读
一、论文介绍
1.1 研究问题
Conditional DETR*主要解决DETR收敛速度慢问题,其中DETR收敛慢原因分析:
- encoder–只负责提取特征;
- decoder_self-attention–只涉及query之间的去重;
- 只有可能是cross-attention导致收敛慢!
cross-attention中query=content query(来自encoder)+ position query(来自decoder_self-attention),去掉第二层object query基本不掉点,顾收敛慢由content query引起!
1.2 可视化空间注意力热图
可视化DETR和Condition DETR中decoder_cross-attention的空间注意力热图:(content query + position query)*pk
在50 epoch时 DETR不能很好预测物体边界,收敛慢。Condition DETR可以很好预测物体边界,收敛快。进一步验证Condition DETR的有效性!可视化空间注意力热图代码
1.3 conditional cross attn
分析Detr的交叉注意力计算方式,发现(cq、pq)同时与(ck、pk)交互容易使网络产生困惑,
故考虑将c和p解耦,即内容注意和空间注意分开:
1.4 结构图
首先 position query[N,256]
映射成参考点s[N,2]
,将s映射成和pk(来自encoder)一直的sin编码:
将cq(来自decoder_self-attention)经过FFN得到T,和ps做点积,得到pq
然后,pq与经过self-attention的cq拼接,作为cross-attention的输入q
预测阶段,借助参考点s和预测出偏移量
二、代码解读
2.1 代码解读
只改动了Detr的交叉注意力部分,Detr代码解读
2.2 核心代码
代码如下(示例):
#-------------------#
# 对应结构图中FFN
#-------------------#
class MLP(nn.Module):
""" Very simple multi-layer perceptron (also called FFN)"""
def __init__(self, input_dim, hidden_dim, output_dim, num_layers):
super().__init__()
self.num_layers = num_layers
h = [hidden_dim] * (num_layers - 1)
self.layers = nn.ModuleList(nn.Linear(n, k) for n, k in zip([