目标检测 DETR

作者: pdnbplus | 发布时间: 2024/06/18 | 阅读量: 252

目标检测 DETR--潘登同学的深度学习笔记

前言

  • faster-rcnn系列(15年),基于proposal,anchor
  • YOLO(16年),基于anchor,做回归
  • 都使用NMS做proposal的过滤

而DETR不采用上面的思想,转而使用CNN + Transformer的方式来进行目标检测。

DETR的基本思想

  • 编码过程与VIT基本一致,先说VIT

在整体的实现上,原文完全使用原始bert的transformer结构,主要是对图片转换成类似token的处理,原文引入了一个patch的概念,即将输入图片划分为一个个的patch,然后对于每一个patch转换(主要是flatten操作),转换成类似bert的输入结构。整体的框架如下图所示: 在这里插入图片描述

假设输入图片大小是224x224,如果每个patch的大小是16x16,那么就有196个patch。然后将16x16x3的patch展平成$196*768$的输入向量。然后经过一个768x768的FC层,然后在[cls]的位置也有相同长度(1x768)的token,然后将位置的embedding向量与197x768的输入对应相加,输入到transformer中;(这是patch embedding的方法,而还有hybrid的方法,就是先对原图做卷积池化得到14x14的feature map,将feature map展平得到196xC的,再接一层全连接,得到196x768的输入)

  • 解码过程,直接预测100个坐标框(定死的)

decoder的输入就是初始化100个向量,输出也是100个向量,接FC层,得到向量分别表示框的位置,以及框的所属类别(与机器翻译的串行结构不同,这是并行的)

整体网络架构

在这里插入图片描述

Enocder学到了什么?

  • Encoder学到了物体的位置信息,以及前景背景信息,准备好特征,等待Decoder选择

在这里插入图片描述

Decoder怎么初始化?

  • Decoder使用全0对向量做初始化100x768的向量,在全零基础上加上位置编码(100个位置)

Decoder与NLP中Decoder中的区别

  • 不需要做Mask

GT与预测输出的匹配问题?

  • 对于上上图来说,GT只有两个而预测出来的有100个,论文是通过匈牙利算法(目标追踪常用)进行匹配的,具体来说,就是GT与预测目标框进行匹配,目标函数是,匹配好后计算的Loss函数最小(包括回归loss和分类loss)

自注意力机制在重叠目标的表现

DETR的论文中有这些图,成功的把重叠很严重的物体区分开,其中与框颜色相同的表示自注意力关注的位置,可以看出即使是重叠现象如此严重,transformer也能将他们区分开;

在这里插入图片描述

训练的技巧

与Inception一样,为了让Encoder的每一层都能学习到与目标检查相关的信息,在每一层的位置都接了一个FC输出结果进行训练;(Inception是为了解决梯度消失问题,这里更多是为了让模型表现地更好,因为transformer本身有LN层,有残差skip-connection思想)

在这里插入图片描述

因为DETR就是很简单粗暴,所以能讲的东西也不多了...