DETR : End-to-End Object Detection with Transformers

Paper : https://arxiv.org/abs/2005.12872

Code : https://github.com/facebookresearch/detr

预备知识

Transformer,二分图匹配(匈牙利算法),GIoU 损失

整体思路

通过 CNN 提取目标特征 ( C×H×WC×H×W ),使用 1x1 卷积降维 d×H×Wd×H×W, 随后把特征转换为序列 ( d×HWd×HW ) 输入到 Transformer Encoder 中,使用学习的 N 个 object query 和 Encoder 的输出作为 Transformer Decoder 的输入得到 N 解码结果,然后把这 N 个解码结果通过前馈网络直接得到相对坐标的预测以及类别。

创新点

  1. 真正的端到端,没有复杂的 anchor 设计和 后处理 NMS
  2. 使用学习的 object query 加到解码器的每一个 Attention 层
  3. 在 Decoder 部分直接固定输入和输出的长度 N,可以并行处理
  4. 最后预测的文本框与标注框使用匈牙利算法得到最佳二分图匹配,然后计算损失

缺点 在小目标上的检测效果不佳,需要改进

应用 这样的结构在文本检测方面是否可行,可以尝试一下

DETR : End-to-End Object Detection with TransformersDETR : End-to-End Object Detection with Transformers

1. Object detection set prediction loss

N 个预测,N 大于一张图像中的目标的数量。在预测和标注之间产生一个最优二分匹配,然后优化特征目标(bbox)的损失。

  1. 首先找到最优二分匹配,一个预测框对应一个GT框

    yy 是 N 个 GT 目标集,没有目标的用 \emptyset 表示,y^\hat{y} 是 N 个预测目标集,寻找最优二分匹配
    σ^=arg minσSNiKLmatch(yi,y^σ(i))(1) \hat{\sigma} = \mathop{\text{arg min}}_{\sigma \in \mathfrak{S}_N} \sum_i^K \mathcal{L}_{match} (y_i, \hat{y}_{\sigma(i)}) \tag{1}
    Lmatch(yi,y^σ(i))\mathcal{L}_{match}(y_i,\hat{y}_{\sigma(i)}) 是在GT yiy_i 和索引为 σ(i)\sigma(i) 预测的匹配损失,最优匹配使用匈牙利(Hungarian)算法计算。

    匹配损失同时考虑了类别预测以及预测的和 GT 的相似性。GT 的每一个元素 ii 都可以看做 yi=(ci,bi)y_i = (c_i, b_i)cic_i 是类标签(可能为空),bi[0,1]4b_i \in [0,1]^4 是一个向量,使用 GT box 相对图像大小的中心坐标和高宽表示。对于 σ(i)\sigma(i) 的预测,类标签 cic_i 概率定义为 p^σ(i)(ci)\hat{p}_{\sigma(i)}(c_i) ,预测框为 b^σ(i)\hat{b}_{\sigma(i)}Lmatch(yi,y^σ(i))\mathcal{L}_{match} (y_i, \hat{y}_{\sigma(i)}) 定义为 DETR : End-to-End Object Detection with Transformers

  2. 计算对应框的损失

    DETR : End-to-End Object Detection with Transformers

    Lbox()\mathcal{L}_{box}(\cdot) 使用 L1 损失和 广义 IoU 损失 Liou(,)\mathcal{L}_{iou}(\cdot, \cdot) ,则
    Lbox(bi,b^σ(i))=λiouLiou(bi,b^σ(i))+λL1bib^σ(i)1(3) \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)}||_1 \tag{3}
    这两个损失通过批次内的目标数量标准化。

2. DETR architecture

一个CNN backbone提取特征表示,Transformer,前馈网络做最终的预测

Backbone

使用 CNN backbone 生成低分辨率的特征图 f=RC×H×W,C=2048,H,W=H032,W032f = \Bbb{R}^{C×H×W}, C=2048, H,W=\frac{H_0}{32}, \frac{W_0}{32}

Transformer encoder

使用 1×11×1 卷积减少特征图 ff 的通道数,从 CC 减少到 dd,得到新特征图 z0Rd×H×Wz_0 \in \Bbb{R}^{d×H×W} . 由于encoder的输入需要是序列,所以把 z0z_0 的空间维度折叠到一个维度上,得到 d×HWd×HW 的特征图。

由于 transformer 的体系结构是置换不变性 ( permutation-invariant ),所以给每个 attention 层的输入加上固定的位置编码

Transformer decode

与原始模型的区别在于论文的模型在每个解码器层并行解码 N 个目标。

因为解码器也是置换不变的,所以 N 个输入也加上了位置编码,不过这里的位置编码是通过学习的,论文中叫 object query,也是在每个 attention 层上都加。

Prediction feed-forward networks ( FFNs )

预测框相对于输入图像的中心点坐标,高和宽。线性层使用 softmax 函数预测类别。

DETR’s transformer

DETR : End-to-End Object Detection with Transformers

预测目标的可视化解码注意力

DETR : End-to-End Object Detection with Transformers

3. DETR for panoptic segmentation

DETR : End-to-End Object Detection with Transformers

每个目标的 transformer 解码器的输出作为输入,在编码器的输出上计算该嵌入的多头(M头)注意力得分,为每个目标生成 M 个低分辨率的注意力热图。为了生成最后的预测和增加分辨率,使用了类 FPN 的结构。为了预测全景分割,简单的在每个像素上使用了 argmax 计算掩模分数,把对应的类别用于结果掩模。

在推理阶段,首先过滤掉置信度小于 0.85 的检测框,然后再计算每个像素的 argmax,决定每个像素属于哪个mask。然后把属于同一类别的不同 mask 合并,过滤掉空 mask (少于4个像素)。