Transformer学习之DETR

1.算法简介

Detection Transformer(DETR) 首次将Transformer拓展到目标检测领域中,DETR抛弃了几乎所有的前处理和后处理操作,不需要进行设计锚框来提供参考,或者利用非极大值(NMS)抑制来筛除多余的框,使模型做到了真正的End-to-End检测,即对于输入的任意图像统一输出N个带有类别和置信度的Box结果。
参考链接1:沐神论文精读
参考链接2:搞懂DEtection TRanformer(DETR)
参考链接3:详细解读DETR
参考链接4:Transformer中的position encoding

1.1 算法主要贡献

  1. 提出一种新的目标函数,通过二分图匹配的方式为每个目标输出独一无二的预测,避免更多冗余检测框的出现
  2. 首次将Transformer拓展到目标检测领域
  3. 在Decoder部分设计一种可学习的object queries,将其和全局图像信息结合在一起,通过不断地进行注意力操作,使得模型可以直接并行地输出最后一组预测框
  4. 可以简单的拓展到其他任务(如全景分割),只需要修改预测头(prediction heads)即可

1.2 算法网络结构

在这里插入图片描述
如上图所示,DETR主要包括以下几个部分:

  1. Backbone模块:将输入图像利用卷积神经网络(CNN)映射为特征图
  2. Transformer Encoder模块:输入特征向量和空间位置编码,输出相同维度的全局特征向量,描述了每个patch或者像素与全局图像下的其他patch之间的关系
  3. Transformer Decoder模块
    1. 输入Encoder模块得到的特征向量空间位置编码和固定数量 N = 100 N=100 N=100Object queries,输出 N = 100 N=100 N=100个固定的预测结果
    2. 二分图匹配:对Object queries和真实的标签GroundTruth,利用二分图匹配筛选出和GroundTruth对应的object query用于计算损失(在推理时,会设置一个阈值,将大于阈值的object query作为检测结果)
  4. 利用计算的损失(计算类别和预测框的损失)反向更新卷积神经网络(CNN)和Transformer模型的参数。
  5. 预测头Prediction heads: FFN 是由具有 ReLU 激活函数且具有隐藏层的3层线性层计算的,或者说就是 1 × 1 1\times1 1×1卷积。FFN 预测框标准化中心坐标高度和宽度,然后使用 softmax 函数激活获得预测类标签。

2.损失函数设计

前面提到,在训练过程中Transformer Decoder模块会创建𝑁=100个object queries,但是正常情况下检测目标的数量会小于100这个值,如果想要计算损失函数必须有一一对应的预测值和GroundTruth。

本文使用了一种二分图匹配方法,在object queries集合中寻找和GroundTruth对应的object query,然后再计算损失。

2.1 二分图匹配(匈牙利算法)

想要计算Loss,必须找到一组一一对应的预测值和真值,假设我们现在有两个sets:

  • 左边的sets是模型预测得到的N个object query,每个元素里有一个bbox和对这个bbox预测的类别的概率分布,预测的类别可以是空,用 ϕ \phi ϕ来表示;
  • 右边的sets是我们的ground truth,每个元素里有一个标签的类别和对应的bbox,如果标签的数量不足N 则用 ϕ \phi ϕ来补充, ϕ \phi ϕ可以认为是background。

两边sets的元素数量都是N,所以我们是可以做一个配对的操作,让左边的元素都能找到右边的一个配对元素,每个左边元素找到的右边元素都是不同的,也就是一一对应。这样的组合可以有 N ! N! N!

在这里插入图片描述
对每一组匹配都可以根据class概率和bbox计算得到一个损失,匈牙利算法就是寻找使得总得损失最小时对应的一组object query和ground truth,代码中使用linear_sum_assignment函数来完成这项任务。

2.2 二分图匹配Loss_match

要注意:训练时使用的Loss_match和寻找最优匹配时的Loss_Hungarian不是同一个!!!

在寻找最优匹配关系时,需要提前计算好object query和ground truth之间的损失,这里的损失主要包括两部分:类别损失和bbox损失
在这里插入图片描述

  • 类别损失: 前者表示类别预测部分,和Loss_Hungarian不同之处在于取消了-log操作,目的是为了让计算值区间和bbox损失保持一致
  • bbox损失: 由于文章中所使用的方法是没有预先设计好的anchor的,是直接预测bbox的,所以如果像其他方法那样直接计算 L 1 L_1 L1loss的话,就会导致对于大的框和小的框的惩罚力度不一致,所以文章在使用 L 1 L_1 L1loss的同时,也使用了scale-invariant的IoU loss
    在这里插入图片描述
    最后使用匈牙利算法找到使得上述损失最小时对应的匹配关系。

2.3 训练Loss_Hungarian

要注意:训练时使用的Loss和寻找最优匹配时的Loss不是同一个!!!

训练时使用的Loss同样也是包括类别损失和bbox损失两个部分,区别在于在计算类别损失中保留了−log操作

在这里插入图片描述
也就是说我们在找match的时候,把和ground truth类别一致的,且bbox最接近的预测结果对应上就完事了,其他那些 ϕ \phi ϕ,模型预测出来啥,我match并不关心。但是在算训练模型的Hungarian loss时,就不一样了,我不希望模型会预测出乱七八糟的结果, ϕ \phi ϕ就是 ϕ \phi ϕ,没有就是没有,别整得似有似无的,该 ϕ \phi ϕ的时候预测出东西了,就要惩罚你。因为我预测的时候可是没有ground truth的,我没法知道哪几个是对的了。

3.网络核心模块

在这里插入图片描述

3.1 BackBone模块

BackBone模块主要包括一个CNN卷积层和一次 1 × 1 1 \times 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值