DETR 采用 transformer 的 encoder-decoder 结构和在预测与 ground truth 间使用二分图匹配算法来实现检测,易于实现并且很容易就可以扩展到分割任务上。
DETR 检测大物体效果不错的原因是 transformer 的 non-local 的计算架构,对小物体的检测效果不好可以尝试在 FPN 上做文章,就像 FPN 之于 Faster Rcnn。
Learnable NMS methods [15,4] and relation networks [16] explicitly model relations between different predictions with attention.
4:《Soft-NMS — improving object detection with one line of code》
15:《Learning non-maximum suppression》
16:《Relation networks for object detection》
DEtection with TRansformers
将目标检测看作是一个 set prediction 问题,每一个 set 包含 bounding boxes 和对应的标签。只要包含 CNN 的 backbone 和 transformer 结构的网络都可以很容易的实现 DETR,PyTorch 中的推理代码也只有不到50行。

结构如上图,主要包含:backbone、encoder-decoder transformer 和 FNN。
backbone
就是一个传统的 CNN,文章中采用的是 ResNet。
encoder-decoder transformer & FNN

和经典的 Transformer 差别不大,用 attention 的好处就是,attention 可以看到全局信息,大框小框,不管什么奇形怪状的框,分分钟搞出来。
decoder 的输入包含三个部分,encoder 的输出,positional encodings 和 object queries。这个 object queries 是个比较神奇的东西,它是学出来的。我们先来看一下在这些object queries下,预测出来的框是什么样子的。
上图中,每个图都是一个 object query 在 COCO 2017 val 预测出来的框的结果。图中的每个点都是一个框的中心点,绿色表示小框,红色表示横向的大框,蓝色表示纵向的大框。可见每个 query 都有自己的特点,比如第一个 query 会一直问左边的小框里是什么,第二个会问中间的大框是什么,等等。我们可以把每个 object query看成一个关注于某个区域,某些大小物体的提问者。然后这些提问者就是模型训练出来的提问者,各有所长。
比如我们数据集总共有100个类别的物体需要预测,decoder 部分是输入是 100 个 object queries,那么这 100 object queries 经过 decoder 之后会预测出若干类别的物体和位置信息。
encoder 中的包含 positional encoding 是因为 transformer 结构是置换不变形的。
Since the decoder is also permutation-invariant, the N input embeddings must be different to produce different results.
decoder 输出的 embedding 融合了 object queries(是一个 output positional encoding)空间编码,之后被 FFN 处理成 label 和 bounding box。FFN 是由一个包含 ReLU 的三层感知机和一个全连接层组成的,输出还包含了一个 no object 类,跟 background 类起的作用相同。每一个 decoder layer 都被一个共享权重的层归一化,之后送到 prediction heads(classification 和 box prediction,即 FNN)中。
encoder 更多关注的是 global attention,而 decoder 更多关注 local。
loss function

DETR 一次可以推断 N 个 fixed-size set,这个 N 比一张图片内物体的数量要大得多。有两个关键点:一是 predicted 和 ground truth 之间要对应,二是修正 bounding box。
- Object detection set prediction loss
matching cost。在这 N 个 set 的排列中找到损失最小的排列 :

采用匈牙利算法来实现最优分配, 是索引。这里的匈牙利算法和下面的 Hungarian loss 不是一回事,只是为了实现预测和 gt 的最优分配,这里的 Lmatch 匈牙利算法的损失函数。Lmatch 是两两匹配的损失:
![]()
Hungarian loss。而这里是模型训练使用的 loss。 是排列索引
中对
类的可能性,在 Lmatch 找到了损失最小的排列
后,固定这个排列。将损失的第一项变为 -log,上面的损失函数没有采用 -log 的原因是使得损失中的类预测项(第一项)与框回归项(第二项)的权重基本相等,因为实验中更好的性能。再来优化如下损失函数:

In practice, we down-weight the log-probability term when ci = ∅ by a factor 10 to account for class imbalance. This is analogous to how Faster R-CNN training procedure balances positive/negative proposals by subsampling.
- Bounding box loss
因为 L1 损失对 large box 和 small box 有不同的尺度,即使它们的相对误差差不多。因此采用 L1 损失和 IoU 损失结合起来组成 Lbox:
![]()
两个是超参数,这两个损失项是根据 batch 内 object 的数量来完成归一化的。
- Auxiliary decoding losses
在训练时的 decoder 中使用 auxiliary losses,用来帮助模型输出正确的每一类物体的数量。
auxiliary losses 出自《Character-level language modeling with deeper self-attention》。
Experiments

采用了空洞卷积(图中的 DC5)来增加特征图分辨率,增加了对小目标的精度,但是有计算开销,一个 trick。训练时采用 random crop augmentations,精度涨了1AP左右。用16张 V100 训练了三天。。。还有一个 trick:
At inference time, some slots predict empty class. To optimize for AP, we override the prediction of these slots with the second highest scoring class, using the corresponding confidence. This improves AP by 2 points compared to filtering out empty slots.
测试了一点小样本的性能,比如 COCO 中只包含13张长颈鹿的图片,但是仍然找到了其他数据集中全部24张图片内包含的长颈鹿。

Ablations
- encoder layers
去掉 encoder,AP 会降低。并且 encoder 对解码重叠的物体很有用,下图是 encoder 最后一层的特征图:

- decoder layers
对比了如果加上 NMS 后的精度,随着层数的增加,NMS 带来的增益逐渐降低,因为它排除了很多 positive 的 predication。

decoder 跟 encoder 比起来,更关注也只需要关注局部,来提取 boundbox 和类别:

- positional encodings
一共有两种 positional encoding:encoder 中的 spatial positional encodings 和 decoder 中的 output positional encodings (object queries),这里与 Transformer 中的编码方式不太一样。文中尝试了不同的编码方式与编码组合,精度均有降低。
DETR for panoptic segmentation
全景分割任务,与 Faster Rcnn 一样,DETR 也可以在 decoder 中增加一个 mask head 来完成分割任务,并且可以同时分割 COCO 数据集中的 stuff 和 thing。
Predicting boxes is required for the training to be possible, since the Hungarian matching is computed using distances between boxes.
具体的网络结构如下:

其输入是 decoder 的输出,之后通过一个多头注意力模块,产生每一个待分割物体的注意力热力图。并且增加了一个类似 FPN 的卷积网络来提升精度,这个卷积网络输出的 mask 分辨率是原图的1/4。
The final resolution of the masks has stride 4 and each mask is supervised independently using the DICE/F-1 loss and Focal loss.
为了得到最后的分割预测,对 mask 中每一个像素点使用了一个 argmax 操作:
compute the per-pixel argmax to determine in which mask each pixel belongs.
模型的分割效果如下:

采用 Panoptic Quality(PQ)来评价,将其拆分为 th(thing)和 st(stuff)。
The result break-down shows that DETR is especially dominant on stuff classes, and we hypothesize that the global reasoning allowed by the encoder attention is the key element to this result.
附加
匈牙利匹配算法是离散数学中图论部分的一个经典算法,描述的问题是一个二分图的最大匹配。就是这个二分图分成两部分,一部分是我们对100种 object query 预测的结果,另一部分是实际的标签。由于我们一开始是不知道这100 个 object query 输入的时候应该预测那些类别的物体,有可能一开始第一个 token 预测的是 A 物体,第二个 token 预测的是 C 物体,总而言之是无序的。我们就要根据实际的 label,找到预测结果中和他最接近的计算 loss。其他没匹配上的则不计算 loss回传梯度:

- 全景分割
语义分割(semantic segmentation),常用来识别天空、草地、道路等没有固定形状的不可数事物(stuff)。语义分割的标记方法通常是给每个像素加上标签。
实例分割(instance segmentation),人、动物或工具等可数的、独立的明显物体(things)。实例分割通常用包围盒或分割掩码标记目标。
全景分割(Panoptic Segmentation)其实就是把这两个方向结合起来,生成统一的、全局的分割图像,既识别事物,也识别物体。
- PQ
全景分割的评价指标。首先是常规的 IoU > 0.5,然后结合 TF、FN、FP 搞出了一个 PQ 标准。(PQ 是 Panoptic Quality,即全景质量的简称。)
PQ 的具体公式为:

另外,PQ可以分解为分割质量(segmentation quality,SQ)和识别质量(recognition quality,RQ)的乘积,便于进一步评估分割和识别环节的表现。

即 PQ = SQ * RQ。

8367



被折叠的 条评论
为什么被折叠?



