引言

无论是One Stage中的YOLO还是Two-Stage中的Faster-RCNN,其虽然都在目标检测领域有着一席之地,但无一例外都是基于Anchor的模型算法,这就导致其在输出结果时不可避免的进行一些如非极大值抑制等操作来进一步选择最优解,这会带来额外的工作量。而随着ViT的出现,伴随着无数研究者前仆后继夜以继日的研究,Transformer敲开了CV领域的大门,作为NLP领域的中流砥柱,依旧能够在CV领域取得如此瞩目的成果属实令人惊叹,随后DETR模型横空出世,在目标检测领域掀起一阵狂潮。今天我们就来进行该算法的学习,探究其能够在众多的目标检测算法中脱颖而出的奥秘。

模型结构

主要思想

DETR的基本思想是首先使用CNN得到各个patch作为输入,在套用Transformer做编码与解码操作。

其中编码方式基本与VIT一致,重点在于解码器的变化,DETR做出了先验假设,认为一张图片中可能存在几个乃至几十个目标,因此,其设置解码器直接预测100个坐标框。

这个值可以根据我们的实际任务做出调整。此外与先前Transformer在NLP中的预测不同,解码器中后一个向量需要依赖于前一个向量的输出结果,是一种串行结构,而在这里则为并行结构,一次性直接预测100个框。

执行流程

下图为DETR模型的结构图

首先通过backbone来提取特征,随后将特征信息加上位置编码送入encoder,这里的encoder进行特征构造。
在decoder中会首先初始化100个向量(object queries),这些向量会利用encoder构造的特征来进行重构,(即要学习的便是这100个向量,当这100个向量学好后,每个向量便能够较好的输出一个分类值cls与回归值bounding box)

要想理解Transformer,最重要的便是要理解Attention,其核心即为 K,Q,V。

Attention的本质就是加权,以找女朋友为例,Q代表我想要的女生类型,即一些条件,K与V则是一种键值对的表示,K为属性,如女生的相貌,身材等,而V则是对应属性的相应值,即女生的真实特征,那么一个女生越符合标准的我们预设的条件,就会被赋予更高的权重,特征占比也就越大。

那么按照Tranfomer的思想来解释,在encoder中提供的是 K 与 V ,decoder中的每个Q并行去询问encoder中的K与V,如果确定是自己需要负责的部分,那么便会根据这块的特征进行学习,最后连接一个全连接层,输出4个坐标值与一个分类值。至此也就完成了目标检测过程。

可以看到,Encoder的作用是进行特征的提取,那么我么是否可以不要这个Encoder而直接使用一个CNN网络来直接连接Decoder呢?其实理论上也是可行的,但为何仍采用这种方式呢,论文中作者给出解释:
作者认为这种注意力的效果很好,通过self-attention获取到这些特征并加以突出,随后来供Decoder进行挑选。

位置信息初始化Query向量

输出层的结果就是100个object queries的预测结果。这100个向量其实都是想要去学习来做预测的。
那么这100个object queries是如何得到的呢?这里论文中给出的答案是全部初始化为0
同时还要加上位置编码。即初始化的queries为0+位置编码,其相当于用位置编码来做初始化。

为何要使用这种位置编码作为初始化呢?论文中并未给出对应的解释,但按照一位大神的解释:在encoder构造的向量中,其实有用的特征可能就那么几块,其余的都是背景,而在encoder中,这100个向量都是想去学习这些特征的,那么如果是这样的话,基本上这100个向量都会被那几块特征较好的吸引过去,这就造成其多样性变差。而加入了位置编码后,就相当于告诉每一个向量,你不要太离谱,只负责你这一区域的特征学习即可。

注意力机制的作用方法

需要注意的是,在decoder的第一层其实做的是自注意力机制,即每个向量都有自己的Q,K,V,其先进行一下内部分配,最终我们需要的是得到的Q,而K,V值只是一些中间数据,无用也就被丢弃了。

随后便是使用encoder中的K,V来与decoder的Q送入多头注意力机制来重构Q,最终通过连接两个全连接层,分别输出class与bounding box。

即Q首先是随机初始化的(0+位置编码),然后内部进行自注意力机制进行分配,最后与encoder中的K,V作用来完成重构。

按照图中模型可以看到:Encoder共有N层,Decoder有M层,而在模型的训练过程中,使用M层的每层损失,这样做的好处是防止只用最后一层损失而造成一些意外情况。

需要注意的是,在Transformer的传统模型做文本预测时,设计了一个mask机制,即后面的都是需要被掩藏不可见的。而在这里,其是并行的,也就不需要设置mask机制了。

训练过程的策略

GT只有两个,但预测恒为100个,该如何匹配呢?
这里使用的是匈牙利匹配算法,按照loss最小的方法,剩余的98个全部为背景。该算法在目标追踪领域较为火爆。即在训练时计算损失最小即可。

启示

在论文中,作者提到,注意力机制的引入能够很好的解决物体被遮挡问题。如下图:即使面对很严重的遮挡问题,注意力机制都可以很好的解决。

DETR模型的环境配置与调试

DETR模型的调试运行是相对简单的,数据集使用的是COCO2017数据集。具体配置可以参考博主这篇博客:

DETR调试记录

需要注意的是该模型在8xV100 GPU上训练 300 epochs的时间大概为6天,可以说是非常的吃配置了,而且模型在训练时所占用的显存较大,具体大家可以自行实验。

当然在我们实验时,DETR的效果与当前的一些主流目标检测算法相比还是稍逊一筹的,但这并不影响我们学习他们,因为这些基于CNN的模型在CV领域经过长期的耕耘,其已经非常成熟了。可以说基本没有什么再去改进的空间了。而Transformer作为后起之秀,在初涉该领域便取得如此效果已实属不易,而且博主也相信,随着Transformer模型在CV领域继续深耕,其一定最终能取得较好的效果。

代码解析

数据处理与dataloader

在DETR模型中,其使用的标注数据集格式为COCO,我们在运行自己的数据集时只需要将其转换为COCO格式即可。

DETR目标检测算法学习记录相关推荐

  1. YOLO目标检测算法轻量化改进的过程记录

    一.前言 本文主要记录了在毕设期间关于将目标检测算法部署至嵌入式设备(jetson nano)上的过程及对YOLO算法轻量化及精度提升的一些修改策略(改的并不多,基本都是重复组合,毕竟我是个菜鸡). ...

  2. DETR系列大盘点 | 端到端Transformer目标检测算法汇总!

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[目标检测]技术交流群 后台回复[2D检测综述]获取鱼眼检测.实时检测.通用2D检测等近 ...

  3. 目标检测算法(传统基于深度学习的)

    目标检测算法 最近在学目标检测各类算法,主要分为传统的目标检测方法和基于深度学习的目标检测算法,这里记录了一些基本的算法介绍.下图是目标检测算法的发展历程 传统目标检测方法 分三部分:区域选择–> ...

  4. 基于深度学习的目标检测算法思维导图

    在计算机视觉领域,目标检测一直是一种处于非常火热 的状态,尤其是卷积神经网络CNN出现后,出现了各种基于CNN的目标检测算法,在此根据所看到或者所了解的论文进行个人汇总,以思维导图的模式进行记录整理, ...

  5. 【学习笔记】目标检测算法总结

    [学习笔记]目标检测算法总结 说明 MacOS操作系统. MindNote思维导图软件. B站学习视频+原论文学习. 初学者 笔记 如有问题请多多指教 记录 Overfeat模型.R-CNN.Fast ...

  6. 病虫害模型算法_基于深度学习的目标检测算法综述

    sigai 基于深度学习的目标检测算法综述 导言 目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一.由于各类物体有不同的外观,形状,姿态,加上成像 ...

  7. 综述 | 基于深度学习的目标检测算法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:计算机视觉life 导读:目标检测(Object Det ...

  8. AI综述专栏 | 基于深度学习的目标检测算法综述

    https://www.toutiao.com/a6685618909275488780/ 2019-04-30 17:35:53 关注微信公众号:人工智能前沿讲习, 重磅干货,第一时间送达 AI综述 ...

  9. 基于深度学习的目标检测算法综述(从R-CNN到Mask R-CNN)

    深度学习目标检测模型全面综述:Faster R-CNN.R-FCN和SSD 从RCNN到SSD,这应该是最全的一份目标检测算法盘点 基于深度学习的目标检测算法综述(一) 基于深度学习的目标检测算法综述 ...

最新文章

  1. 【Python】实现将testlink上的用例指定格式保存至Excel,用于修改上传
  2. 怎么从0开始学python_如何从零开始学python
  3. /dev/tty /dev/ttyS0 /dev/tty0区别
  4. 互联网协议 — TCP — 性能问题解析
  5. 《编程之美》(Java实现) :让CPU占用率画直线和正弦曲线(Java实现)
  6. Eclipse debug neutron-server
  7. 网页转图片 java_java-网页转图片
  8. 数据科学家 数据工程师_发展数据科学家和工程师
  9. synchronized实现
  10. solaris10上修改最大文件句柄数
  11. 键盘上每个键作用!!! (史上最全的)­
  12. 前端开发工程师面试题
  13. JS中的window对象和document对象是什么?有什么区别?
  14. x平方检验计算_x2检验或卡方检验和校正卡方检验计算
  15. Windows下如何批量重命名
  16. AtCoder abc256全题解(区间合并模板、矩阵快速幂优化dp、线段树……)
  17. 《算法导论》学习(十七)----动态规划之钢条切割(C语言)
  18. 雷电网络(一):厘清雷电网络的原理
  19. MATLAB绘制堆叠形柱状图
  20. 华为自研系统鸿蒙为什么也要基于linux来开发?

热门文章

  1. 副业应该做什么?副业应该怎么做?带你简单了解副业思维
  2. Java常用工具类之异常、包装类、字符串处理类、集合框架实现类、输入输出流、多线程
  3. Captura音频录制测试结论
  4. 蓝桥杯java试题 基础练习 杨辉三角形
  5. 拼多多继续ALL IN
  6. 美食博主应该注意的点
  7. 成都锦城学院期末成绩
  8. 华为nova5i计算机在哪,IT教程:华为nova5与nova5i的区别
  9. 血腥大地-第二季(资源破解与管理)-张立铜-专题视频课程
  10. UE5引擎源码小记 -- UGameEngine::Tick