Closed JunnHan closed 3 years ago
关键要素:基于集合的损失函数,使得预测与GT实现一一对应;通过单次传播实现对目标的预测以及关系建模。 结构示意图如下图所示:
Object detection set prediction loss DETR利用decoder在单次传播计算中预测固定N个目标,N要大于图像中可能出现的最大目标数量。 loss中的二分匹配:考虑有y个GT,将其扩充为长度为N的集合(填充空集),转换为预测集合和GT集合之间的最优组合问题,利用匈牙利算法求解使得二分匹配代价最小(经典指派问题,可能这也是将其推广至MOT的一个重要点)
匹配代价的计算方面,同时将类别预测以及预测框和GT框之间的相似程度,计算公式如下 :
注意到此处针对的是非空集合,后面也会讲到这一点。
Hungarian loss:类别预测的负对数似然和边框损失的线性组合,如下式:
这里是针对匈牙利算法求解出来的最优组合计算的loss,目的就是使得挑选出的预测-GT组合的匹配代价最小,同样的,loss也会最小,实现了loss的减小并收敛。
为了应对类别的不平衡问题,对于空集部分将对数似然项的权重除10.同时注意到,结合前面提到的,空集的匹配代价并不依赖于预测结果,意味着这种情况下的代价是一个常值。此外,将预测类别的概率采用对数形式,是为了和边框损失相称成比例,在同一个量级上,具有更好的性能。
在边框损失方面,不同于其他的目标检测算法在回归部分预测偏差,DETR采用直接预测边框的形式,这就带来了尺度上的问题。L1 loss在处理大小不一的边框时,尽管他们的相对误差类似,但由于尺度上的绝对差异,也会造成损失函数大小的变化,因此作者提出在边框损失函数部分将IoU loss和L1 loss做一个线性组合来缓解这个问题。IoU交并比对于边框的尺度是不敏感的,具有不变性。计算公式如下:
基本组成:CNN backbone + encoder-decoder的Transformer结构 + FFN前向计算网络
Backbone 平平无奇的backbone,文中用了ResNet50和101.
Transformer encoder 首先利用一个1×1的卷积将特征图的通道数从C=2048降维到d维,特征图从C×H×W→d×H×W;由于Transformer结构最初是针对序列的问题提出的,因此encoder的输入是希望得到序列化的输入,因此希望将特征图的空间维度转换为1维,所以特征图又从d×H×W→d×HW 在encoder的组成上,和Transfromer一致,由多头注意力机制和前向网络两个子层组成。由于transformer结构是与排列组合方式无关的,因此作者对每个注意力层的输入都加上了固定的positional encodings。(此处好像和Transformer结构不一样,Transformer应该是仅在encoder的输入上加positional encoding,而不是每一个注意力层的输入都加)
Transformer decoder 在结构组成上依然保持是和transformer一致的结构,多头注意力机制+处理encoder输出的注意力机制+前向网络。不同的是,这里不再处理序列化的机器翻译任务,而是在decoder的输出时并行计算同时输出N个目标,而没有自回归的属性。 同样由于排列组合的无关性,decoder的N个输入特征一定要不同,这样来得到不同的N个目标的输出结果。输入是learnt positional encodings,作者称其为object queries,和encoder类似,同样也是将positional encodings加在每一层attention的输入上。(这难道就是我加我自己??) N个输入特征在经过decoder的操作处理后,通过前向计算网络(下一部分介绍)得到边框坐标及分类信息,其中可以有空集(no object)。通过自注意力操作以及encoder-decoder间的注意力操作,可以充分学习目标之间的成对关系,同时也能利用整幅图像的信息。
Prediction feed-forward networks (FFNs) 最终的检测结果由3层感知机(ReLU+d维隐层)和1层的线性变换层计算得到,FFN预测中心点坐标以及边框的宽高、线性变换层利用softmax函数预测目标类别。由于输出为固定的N个,且N大于图像中可能存在的最大目标数,因此会存在一定的空集,空集实际上代表背景信息。
Auxiliary decoding losses 训练时,在decoder中加入auxiliary losses有助于输出不同类别的正确的目标数量。作者在每个decoder layer增加了prediction FFNs和Hungarian loss,其中FFNs参数共享,并利用了额外的shared layer-norm来归一化不同decoder layers的FFN的输入。
在参数设置上,encoder和decoder的子层组成都是6,N=M=6,多头注意力机制采用的是8路并行。
在backbone的最后一个阶段增加dilation以提升特征分辨率,并从这个阶段的第一个卷积中取出一个stride,因此在一定程度上改善了小目标的检测性能。但小目标的检测性能仍是DETR的一个尚未很好解决的问题。 训练COCO数据集,16卡的V100,训练300轮用了3天。(一般人玩不太起这种,但考虑到如果仅在MOT数据集上训练,时间还是能接受的,若放到Towards-Real-Time-MOT的多个数据集的综合,估计不太顶得住)