目标检测 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就是很简单粗暴,所以能讲的东西也不多了...