🍇DN-DETR

1 Motivation 论文对DETR的二分图匹配下手,指出二分图匹配是一个动态且不稳定的过程,故影响了训练的效率。众所周知二分图匹配是最优化cost matrix来找到最优匹配(match指query和gt object一一对应),但是训练前期,匹配肯定是瞎猜来着,矩阵内的损失稍有变化,最优匹配也就发生变化了,就导致训练收敛慢了。那为什么匹配变了训练就慢呢? DETR-like的模型基本上是two-stage的,第一阶段就是“learn good anchors“,也就是找到query-gt box的match;第二阶段是”learn relative offsets“,也就是负责微调bounding box。你第一阶段都搞不好,第二阶段也别想搞好了。本来你负责微调query1-gt box1,下一个epoch又去微调query1-gt box2🙄 So 本文提出denoising task作为训练的捷径,基本上就是多一项任务让matching的任务更顺利完成然后就能尽早去学习偏移了吧。 2 Why denosing can help? 2.1 稳定二分图匹配 论文提出了一个指标$IS$来负责表现denoising任务对于稳定二分图匹配是有效的。 假设decoder预测的objects为$\text{O}^\text{i}=\{O_0^i,..,O_{N-1}^i\}$,其中$i$为第i-th个epoch,$N$为预测的objects的个数。又设真实object为$\text{T}=\{T_0,..T_{M-1}\}$,其中$M$为真实objects的个数。计算index vector $\text{V}^\text{i}=\{V_0^i,...,V_{N-1}^i\}$来第i-th epoch的存储匹配结果。 $$ V^i_n = \begin{cases} m, & \text{if } O^i_n \text{ matches } T_m \\ -1, & \text{if } O^i_n \text{ matches nothing} \end{cases} $$ 那么$IS^i=\sum_{j=0}^N\mathbb{1}(V_n^i\not = V_n^{i-1})$ 直白来说,就是第n-1个epoch,预测的$O_{n-1}^i\text{ match }T_5$,既第i个qurey对应第5个gt object,下一轮预测的$O_n^i\text{ match } T_4$,那么 $IS^i$记为 1,既前一轮跟后一轮预测的索引不同。结果如下图所示,denoising任务确实有用,但为什么,unknown.. 2.2 更局部地query search 从DETR的论文可以知道,positional queries有多种operating modes,导致query search是在一个偏大的范围内进行的。DN-DETR在原始anchor(positional queries)和targets之间有更短的平均距离。一种解释就是denosising tasks使得模型能够去重建bounding box,所以可以让query search更局部,这样每个query的关注点也会在附近,减小与其他queries的冲突预测。我感觉是一个毫无解释的解释。...

2024-08-02 · 2 min · 424 words · Jeff

DAB DETR

1 Query的角色 先来回顾一下query是什么,上图是encoder中self-attention和decoder中cross-attention的对比图,可以发现唯一的区别在于query的组成。对于encoder的self-attention,query=image features(内容) + positional embeddings(位置),所以对应到decoder来说,decoder embeddings就是content,learnable queries就是position。 对于decoder embedding,它担当一个“语义载体”的身份,它是不可学习的,它通过cross attention和image feature进行交互,并将注意力施加到values中(也是image features),从而抽取语义信息。 对于learnable queries,它是可学习的,也是通过cross attention进行交互(不断地看图像中的某个东西),最后由目标损失函数反向传播回来的梯度进行更新,理应要学习到物体的所在位置。 1.1 Query的不好 Encoder中的query是图像特征+正余弦编码,我们知道decoder embedding初始化为0,learnable queries又没有显示提供位置先验,因此刚开始做注意力时,大多数decoder embeddings都会被project到图像特征的同一空间位置(learnable queries没有约束之),DETR势必要经过多轮才能训练得当。 错在learnable queries,但是到底是learnable queries难以学习,还是说它没有提供显示位置先验,才让整个训练过程漫长呢? 由改图可知,拿了已训练好的DETR的learnable queries并将其固定住,然后重新训练DETR的其他部分,除了在前几个epochs的loss会小一点,整体过程都后面跟原始learnable queries的DETR差不多。所以说learnable queries容易学习(后面的过程大家都差不多,说明以及学习得很像了),但也拦不住DETR训练慢。所以不免猜测为第二个原因:没有提供显式位置先验。 将learnable queries与encoder中的positional embedding进行点乘,然后可视化之,可以发现,注意力图中要不会出现多个中心点,要不就是注意力面积过大或过小,也就说明learnable queries并没有很好的在位置上进行约束。既比如如果图中有多个objects,那么query就不知道该看哪个。又或者是看的不全或看的太杂,总之一点用都没有。图(b)则是加入了位置先验后的点乘得出的注意力图,可以发现注意力明显好多了。 所以可以推出:queries的多模式(multiple mode)是导致训练漫长的罪魁祸首,并且加入位置先验是可以有效提高训练速度的。 但是图(b)也有不合理的地方,因为不同的objects的尺度必然是不同的,因此加入尺度信息也是应该的,如图(c)所示。 2 Anchor boxes/Reference points 所以本文提出了anchor boxes作为learnable queries,既$A_q=(x_q,y_q,w_q,h_q)$表示第q个anchor box。整体模型如图所示 2.1 各个组件 Decoder中self-attention的Q、K的位置编码 它由reference points(也就是anchor boxes)经过Anchor Sine Encoding(源码中的gen_sineembed_for_position)得到四个方向独立的正余弦编码后,在经过一层MLP(主要作用是变换维度,源码中的ref_point_head)得到。需要注意的是,这里的温度还是10000. Decoder中self-attention的输入 if not self.rm_self_attn_decoder: # Apply projections here # shape: num_queries x batch_size x 256 q_content = self....

2024-07-31 · 2 min · 345 words · Jeff

Deformable DETR

1 回顾DETR以及问题指出 1.1 DETR中transformer回顾 先来简单回顾一下DETR的transformer作用是什么: Encoder的输入是特征图的某个像素点向量(又叫token),通过self-attention,得到其与other tokens的相似度(similarity),通俗理解就是,位于🐱头的token理应和位于🐱jio的token相似度高,而与狗头或者牛马等不相同类别的物体的token相似度低。由下图的attention map可见,encoder的某一个token遍历其他所有token(包括自己)来学习自己应该关注哪些tokens,不该关注哪些tokens。可以说encoder的目的是掌握全局信息,是一种粗理解。 如何可视化attention map: 计算出来的attention_weights有[H*W]个,reshape回 [H,W],然后再按照attention_weights去高亮每个像素点就会得到attention map Decoder的输入object query同样可以理解为特征图的某一个像素点,只不过它是随机的,这些像素点可以理解为检测框的质心。在训练过程中,这些质心不断调整自己的位置和区域,从而学习到自己应该关注的部分。由下图可知,每个object query学习的是自己应该关注的检测框的范围。 1.2 DETR两个重要问题 DETR存在两个重要问题: (1) 训练时间太长(300 epochs training on coco2017) (2) 难以检测小物体 已知transformer的计算公式为: $$ Attn = \sum_{m=1}^M \{W_m [\sum_{k\in\Omega_k}exp(\frac{x_q^TW_q^TW_kx_k}{\sqrt{D_k}})]W_vx_v\} $$ 如果$x_q:(N_q,C); W_q:(C,C)$,那么$Wq*x_q$的计算复杂度为$O(N_qC^2)$,所以我们可以得知attention的计算复杂度为$O(N_qC^2+N_kC^2+N_qN_kC)$,又$N_q=N_k>>C$,故最终的复杂度可以表示为$O(N_qN_kC)$ 在DETR中,$N_q=N_k =H*W$,所以复杂度为$O(H^2W^2C)$,复杂度和特征图的面积成平方比例。而且这是个全局attention,一个token就必须和H*W个tokens做注意力计算,这也就预示着特征图的尺寸不能太大,而且也不能使用多尺度特征图(多个特征图),不然计算开销吃不消。且初始化时,Q和V遵循均值为0,方差为1的均匀分布 所以分子$exp(0) = 1, Attn =\frac{1}{N_k}$ ,因为$N_k$很大,所以Attn约等于0,会导致在训练初期的梯度随机,且需要很长时间才能让某一个token能关注到特殊的keys上。 而不能检测小物体通常是因为特征图尺寸不够大的问题,比如一个遥控器在某一个特征图上可能就一个点,一个点当然很难区分。若是可以用更大的特征图,遥控器的表达可能就是一个区域了。 2 Deformable DETR改进 针对以上两个问题,deformable提出两个改进方案: (1)全局attention改为局部attention (2)采用多尺度特征图 2.1 局部attention 借鉴deformable convolution的思想,一个reference point(红点,也是token)只需要跟周围的sample points(绿点)做attention,这样可以加快收敛以及缓解特征图分辨率的问题。且理想情况也是,只需要关注物体周围的区域,就可以大致知道物体的shape以及label了。 既然如此,我们怎么规定reference points以及sample points呢?对于sample points,我们可以以reference points为中心的分8个方位(n_heads=8,约束方向),每个方向采样4个sample points(n_points=4),对于每个sample point,只要根据reference point去学习其偏移量(offsets),既可以由reference point和offsets得到sample points,然后该reference point和这些sample points去做注意力计算即可。模型不断学习update,改变周围的sample points的位置,这样的机制叫deformable attention。其实本质上这是限制其只与其周围像素点做attention的一种手段。不同的方向则有不同的head去构成。...

2024-07-31 · 2 min · 389 words · Jeff

DETR

数学公式 1 总体(太长不看版) DETR的模型包括三部分:CNN backbone提取图像特征、transformer增强图像特征、FFN利用图像特征进行预测。DETR将目标检测视作是集合预测问题(set prediction problems),摒弃了传统方法中手工设计部分(如区域提议网络RPN、非极大值抑制NMS等,idk啊我不懂啊~~)。 DETR使用二分图匹配,设计了一个loss,并且设计了object query的embedding控制生成预测的数目。将每一个预测的边界框(class,boxes)与唯一一个真实物体框相对应,通过这种方法DETR可以实现端到端的检测框架(什么含金量啊~~)。且DETR结合了当下最流行的transformer架构,自注意力机制能够使模型更全面了解到图像的上下文和全局关系,从而增强模型的检测效果。 2 DETR的Loss 2.1 集合预测Loss 前提:假设我们知道DETR有N个object queries(N=100),可以预测得到100个边界框,而我们的GT物体也有N个(可能真实的GT只有几个,但最后被填充到N个,填充的类别即为"no object")。 (那么我们怎么知道哪个预测的边界框是和哪个GT框一一对应的的呢?)答案就是用二分图匹配,举个例子,假如矩阵的横纵轴分别是任务以及工人,其中的值是时间,每个工人只能去做一项任务且不同的工人必须做不同的任务,那么如何分配工人和任务才能使得时间成本最低就是二分图匹配要做的事儿。我们可以用暴力穷举,也可以用其他算法,此处论文使用了匈牙利算法。其中任务和工人分别是GT和预测,而矩阵的值则是论文设定的集合预测loss。 先梳理一下数据前提: $$ \begin{aligned} y_i &= \langle c, b_i \rangle \text{ 为真实边界框的类别和boxes}\\ \hat{y_i} &= \langle \hat{c}, \hat{b_i} \rangle \text{ 为预测边界框的类别和boxes}\\ b_i &= \langle x, y, h, w \rangle \in [0,1] \text{ 表示boxes的中心坐标和相较于原图尺寸的H、W比例, 均归一化}\\ p &\text{ 为预测的类别经过softmax后得到的概率} \end{aligned} $$ 那么集合预测loss就为: $$ \mathcal{L}_{\text{match}}(y, \hat{y}) = -\mathbb{1}_{\{c_i \neq \emptyset\}} \hat{p}_{\hat{\sigma}(i)}(c_i) + \mathbb{1}_{\{c_i \neq \emptyset\}} \mathcal{L}_{\text{box}}(b_i, \hat{b}_{\hat{\sigma}(i)}) $$ 新插入: $$ \hat{fuck_{you}} = \frac{1}{2} $$ $$ \begin{Bmatrix} a & b \\ c & d \end{Bmatrix} $$ 而我们的目标就是找到这样一个matcher $\hat{\sigma}$ 使得最后cost matrix矩阵里的集合预测Loss总和最小。...

2024-07-29 · 6 min · 1108 words · Jeff