End-to-End Object Detection with Transformers论文阅读笔记
摘要
作者提出了一种新的基于Transformer的目标检测模型DETR,将检测视为集合预测问题,无需进行nms以及anchor generation等操作。同时,对模型进行简单的修改就可以应用到全景分割任务中。
方法
Object detection set prediction loss
DETR给出的是N个预测,N为预先设定的远大于GT目标框数量的一个值,难点在于根据GT对这些预测框进行评分。作者在这里对预测框与GT进行二分图匹配,从而计算损失。具体来说,设\(y\)为GT集合,\(\hat{y}=\{\hat{y_i}\}_{i=1}^N\)为N个预测结果,为了满足二分图完美匹配的条件,作者将GT集合的大小同样扩充为N,多出来的部分用no object来补足。之后,使用匈牙利算法找到一组完美匹配(完美匹配一定是最大匹配),用这一组匹配计算损失(这里的目的实际上是找到一组最小的损失,进行取负之类的操作就可以转换成求最大匹配了)。
匹配的损失需要同时考虑类别分数以及预测框和GT的相似度。对于GT集合中的每个边界框,可以将其看作\(y_i=(c_i,b_i)\),\(c_i\)表示类别标签,\(b_i\in [0,1]^4\)表示边界框的相对图像的中心坐标和长宽。对于下标为\(\sigma(i)\)的预测结果,设其预测为\(c_i\)类别的概率为\(\hat{p}_{\sigma(i)}(c_i)\),预测框为\(\hat{b}_{\sigma(i)}\),\(\mathcal{L}_{match}(y_i,\hat{y}_{\sigma(i)})\)可以表示为\(-\mathbb{1}_{c_i\neq ∅}\hat{p}_{\sigma (i)}(c_i)+\mathbb{1}_{c_i\neq ∅}\mathcal{L}_{box}(b_i,\hat{b}_{\sigma(i)})\),最终的匈牙利损失可以表示为:
\(\mathcal{L}_{Hungarian}(y,\hat{y})=\sum_{i=1}^N[-\log\hat{p}_{\sigma (i)}(c_i)+\mathbb{1}_{c_i\neq ∅}\mathcal{L}_{box}(b_i,\hat{b}_{\sigma(i)})]\)。在实际训练时,对于\(c_i=\)no object的对数概率的权重设置为原来的1/10,从而避免类别不平衡的问题。需要注意的是,如果一个预测框匹配到no object,这个匹配的损失是常数0。对于bounding box的损失\(\mathcal{L}_{box}(b_i,\hat{b}_{\sigma(i)})\)定义为\(\lambda_{iou}\mathcal{L}_{iou}(b_i,\hat{b}_{\sigma(i)})+\lambda_{L1}||b_i-\hat{b}_{\sigma(i)}||\),这是因为直接计算两个框中心的L1 loss的话,两个框即便中心相近,大小很有可能存在较大差异,因此作者选择使用IoU loss与L1 loss的线性组合。
DETR architecture
网络使用了一个CNN作为特征提取器,使用Transformer对特征进行编码/解码,将输出送入FFN进行预测。
Backbone
backbone为CNN,对三通道RGB图像\(x_{img}\in \mathbb{R}^{3\times H_0\times W_0}\)提取得到大小为\(2048\times \frac{H_0}{32}\times \frac{W_0}{32}\)的特征。
Transformer encoder
首先通过1x1卷积将输入特征的通道维度降为d,之后将其维度转换为\(d\times HW\),与位置编码相加后送入标准的Transformer。
Transformer decoder
decoder同样是标准的Transformer,只不过解码的是N个可学习的query,这些query经过解码后送入FFN就得到了N个预测的box。使用这N个query以及image feature计算注意力可以使模型捕捉到每两个query之间的关系,同时引入了整个图像的上下文信息。
Prediction feed-forward networks (FFNs)
最终的预测通过一个三层的FFN实现。FFN分为两种,一种预测类别概率,一种预测边界框回归参数。类别概率中包含一个no object类,起到的作用类似background。
Auxiliary decoding losses
在训练时作者还使用了辅助损失,可以参考https://ojs.aaai.org/index.php/AAAI/article/view/4182
实验
实验比较有趣的是DETR在全景分割中的应用。作者首先训练模型分辨每个边界框属于stuff还是things,之后使用mask head对于每个框预测一个mask,对于每个像素的所有mask scores求argmax就能得到最终的结果:
具体过程可以看官方代码https://github.com/facebookresearch/detr/blob/main/models/segmentation.py的PostProcessPanoptic函数。