DETR学习

DETR

DETR 论文精读【论文精读】

前置知识

Anchor Boxes

ground truth: 真值/标准答案

集合预测问题:

二分匹配

二值图像由黑色和白色像素组成,每个像素只有两种可能的取值。
二值匹配的目标是确定两个二值图像之间的相似度或匹配度。
在这里插入图片描述
x、y、z三个人他们都有自己擅长的工作,怎么样才能让他们都获取到自己擅长的工作,并且花费最少
Solution-1:遍历算法
Solution-2:匈牙利算法(scipy当中的linear-sum-assignment)
那么我其实就可以把这种思想转移到“如何从100个框框当中选择出最合适的m(m<=100)个bounding box?”上

L1 loss 、 L2 loss

https://blog.csdn.net/qq_37925923/article/details/127368635

matching loss
single stage
two stage

位置编码
自注意力操作

关键词:

  • End-to-End : 不要先验知识、不要NMS
  • DETR非常简单 50行代码over

文章贡献:

  1. 把目标检测看成集合预测的问题
    没有了nms、没有anchor => 没有那么多超参数要调
    这意味着,一个物体就一个框,他没有那么多框了。

  2. 使用了Transformer encoder decode 的架构
    decoder 使用了另外一个输入:learned object query

  • 然后将learned object query 和 全局的信息结合起来,不停地做注意力操作
  • 并行出框 => 快

DETR 好处

简单、不需要特殊的 deep learning library.
性能不是最强的,但是想法很好,解决了目标检测当中的很多的痛点,写作也很好。
全景分割搞得很好。

DETR的流程是什么?

在这里插入图片描述
为什么要用transformer-encoder-decoder?
encoder 能够给我们更加全局的信息
decoder 能够生成框框
encoder 通过将当前像素点于其他位置的像素点进行联系,使得模型能够理解,当前框框圈住的是这个东西,旁边框框圈住的是另一个东西。

注意:上面的图当中缺少了 object query
这个东西还是挺重要的,通过query和特征不停地去交互,从而得到了最后的框框。
object query大小默认为100,这意味这图像生成的框框的数量其实是固定的,就是100个

但是我图像当中只有两个东西的话,剩下的两个框框去哪里了呢?
在这里插入图片描述
就比如文章当中的这两张图片,他原本是生成了100个框框,然后剩下的98个框框
but how?
计算100个框框和ground truth框框的matching loss来确定这100个框框当中,哪两个框框是独一无二的对应到红色和黄色的ground truth框的。 (此时,我就找到了我的目标)
接下来就可以在算分类的loss & bounding box的loss

出的100框框,怎么和ground truth的框框做匹配去计算loss呢?
文章当中把这个问题看成是集合预测的问题 => 作者可以使用二分图匹配的方式去算loss

推理的时候,DETR是怎么做的呢?
在这里插入图片描述
cnn抽特征。
transformer encoder decoder 生成最后的输出。
用一个阈值去卡一下输出的置信度。
那就比如说我的置信度卡到0.7,那么我模型预测之后高于0.7的框框,我就保留下来,作为实体;低于70%的框框我就标注为背景。

结果
DETR 和 fast-rcnn的性能其实是差不多的。
优点:DETR的大物体的目标检测是比较好的(作者归功于Transformer)
缺点:训练慢、Epoch多,DETR他在小物体上面的目标检测不太好用。(Deformable DETR出来了,解决了问题。)

相关工作

大纲:

  • 集合预测
  • Transformer Decoder
  • 目标检测相关工作

目标检测相关工作

现在主流的方法是 先猜测,通过猜测来做预测
对于 two stage的方法来说 => 那就是用proposal来预测
对于 single stage的方法来说 => 那就是用anchor来预测
but,最近的研究表明,他们的这种先猜测,后预测的方法,很大程度上决定了预测的准确程度。

Solution-1: 基于集合的目标检测
比如: learnable NMS method,前人有做过这个东西。 但是他需要人工干预。
DETR 的目标就是更简单,我不需要人工进行干预了。 (这是DETR与其余的基于集合的目标检测之间的区别)

Solution-2:Recurrent detectors
之前的人也用了Encoder-Decoder的结构去生成bounding boxes.
但是效果不好,作者把他归因于之前的那帮人没有使用Transformers.

DETR模型架构

有两个东西非常重要:

  • 基于集合的目标函数
  • DETR的结构

基于集合的目标函数

问题: DETR他会固定输出N个框框(默认是100个),那么我怎么知道哪几个框框是ground truth呢?
作者的思路:将这一个问题转换成一个二分图匹配问题
在这里插入图片描述
这个矩阵的格子里面,原本是放工人的花费,那么现在就放上loss值
子问题:loss值如何计算呢?
在这里插入图片描述
至此呢,我就找到了哪几个框框大概率是我的ground truth。
那我这直接找到了可能的ground truth,就省略了NMS的操作。

我框住的东西,他是有型的,我现在只是去掉了背景框框,这个东西很easy。
那我框住的东西其实还是有偏差的,这个时候,我就可以计算loss,然后梯度回传,来逐渐调整我的模型。
在这里插入图片描述

DETR是怎么工作的?

在这里插入图片描述
学习方法:作者提供了一些notebook,可以去玩。
工作步骤:

  1. 3×800×1066 -> 20482534 经过了5层卷积
  2. 20482534 -> 258 * 25 * 34 使用了258个1*1的卷积核进行降维操作(为了进Transformer)
  3. Transformers是没有位置信息的,所以加了positional encoding(位置编码) (Tip:2,3的这俩维度是一致的,能够加在一起,所以维度必须)
  4. 2、3加到一起之后,又有了图像,又有了位置的信息,这下就可以给Transformers让它处理了。
  5. 输入Transformers的时候,需要将向量拉直,变成850 * 256 维度的输入信息。
  6. 信息经过6个 Transfomers里面的encoder 然后输出到decoder当中。
  7. 输出的信息(100 * 256 其中100代表100个框框;256是和之前的256对应),又传送到object queries当中。(这个object queries是一个 learnable positional embedding)
  8. Transformer decoder当中也用了6个decoder (然后就得到了输出信息)
  9. 有了输出信息之后,就要进行预测了,就是在上面加一点检测头(Solution: 加一个FFN(就是MLP)),这些检测头能得到 物体类别、出框预测(x,y,w,h)。
    10.有了预测框之后,就可以和ground truth进行最优匹配了,然后反向传播 更新模型的参数。

细节工作

在每个object decoder 当中都会做一个object query的自注意力操作(目的:移除冗余框框)。
但其实在第一层decoder当中可以不做。

最后算loss的时候,为了让模型训练的快一点,在decoder的最后边加了很多额外的目标函数。(很常见的trick,检测和分割里面常用)

代码理解

colab网页

DETR的表现相比于当时其他的检测器其实没有那么好,作者是怎么吹的?

  1. 大物体检测上面有很大的优势(Transformer的功劳)
    在这里插入图片描述

  2. 重叠问题,分割的比较好(Transformer decoder的威力)
    在这里插入图片描述

  3. Transformers encoder的层数对于性能的提升
    层数越深 ===> 模型更能看到全局的特征 ,物体之间分的越开

  4. decoder到底有什么用捏?
    对于物体外围的特征,比如头、尾巴还需要decoder去学习辨认。
    看下面的图片,会发现大象皮肤很接近,又重叠,但是分的还是很好!(区分边缘)
    在这里插入图片描述

  5. object query的可视化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值