使用transformer做目标检测
论文:https://arxiv.org/pdf/2005.12872.pdf
code:https://github.com/facebookresearch/detr
代码解析:https://blog.csdn.net/feng__shuai/article/details/106625695

  1. Faster RCNN
    faster rcnn
  2. 本文的pipeline
    使用CNN提取特征,将特征图送入Transformer中的encoder,decoder输出送入一系列前馈神经网络,进行box和label的预测。
    图片说明
    相比原本的transformer而言,大体上主要有以下的细节要注意:
    图片说明
  3. encoder 的输入

Input: CNN输出的feature maps: 𝑓∈R^(𝐶×𝐻×𝑊) 例如 2048×7×8, 通过1×1卷积把通道数C(也就是上面的2048)降维到d.(本文d=256),将二维图直接打平展开为一维,得到d×HW的sequence.(相当于transformer里的X矩阵.
Position encoding:利用三角函数对位置进行编码[H,W] —> pos=p×HW, 在X上加上pos最后的input = X+pos
这部分主要看代码解析,我的理解是,对feature map的横纵坐标(x,y)进行编码得到p(x,y),直接加到提取出来的feature 展开的向量上。
关于位置编码的补充,原来的transformer肯定是用了三角函数得到一个与X元素个数相同,且每一个元素维度一致的向量。对于本文,我们是二维的位置(x,y),分别在x轴和y轴上进行计算最后进行一个连接操作,返回合适的维度位置编码1,位置编码
4. decoder:
decoder的输入:来自encoder的输出+pos(x,y)+Obejct query
原本decoder的query来自前层,且在decoder的self-attention部分只使用已经输出的部分,也就是计算i的时候要用到0~i-1的结果,在本文中,实现了并行化处理。这就是Object Query的作用,作者使用了N个object query,随机初始化,且可学习。这里的N作者取100,总之大于页面上最大的物体数。
5. 训练用的loss
我们的模型最终会有N组输出,(每一个decoder的输出都输出到单独的FFN中,输出label和box),我们使用二分匹配将每一个输出与GroundTruth进行匹配,再进一步计算loss用于模型的优化。
图片说明
整个流程如下:(图来自上面代码解析的文章)
图片说明
网络结构图:
图片说明
6. 而后是一些实验细节,可看看PPT
图片说明
上图是与Faster RCNN的对比,可以看到效果可与Faster RCNN匹敌,但是在小目标上表现较差,这大概是因为本模型没有关注更低的特征,高层的特征分辨率较低,不足以识别小物体。
其余的可视化结果和对比实验可看论文。