02- 目标检测基础知识及优化思路汇总 (目标检测)

news2024/11/24 8:17:54

要点:

  • 参考综述:深度学习目标检测最全综述 - 爱码网
  • 参考表达:https://www.cnblogs.com/xjxy/p/13588772.html

一 发展历程

分类网络是目标检测的基础,必须熟练掌握。

1.1 传统算法

  • V.J Detector

    19年前,P. Viola 和 M. Jones提出一个新的检测算法,主要应用在人脸检测方面,运行在主频为700MHz的奔腾CPU上,比当时其他的算法速度提升了上百倍。

  • HOG Detector

    在2005年被提出,因为其特征鲁棒性强,多尺度适应性好,在深度学习出现之前,经常被广泛应用于通用目标检测。

  • DPM

    DPM是传统算法的巅峰,是VOC-07,08,09目标检测比赛的赢家,它是HOG方法的拓展。尽管现在的目标检测算法远远强过了DPM,但是DPM提出的很多东西,现在都在沿用,例如难例挖掘,Bbox 回归。所以其作者被VOC颁发了“终身成就奖”。

二 目标检测中的技术发展

2.1 早期传统方法

2000年之前没有一个统一的检测哲学,检测器通常都是基于一些比较浅层的特征去做设计的,例如组成,形状,边界等等。后来基于机器学习的检测方法发展了一段时间,例如外观统计模型,小波特征表示,梯度表示。在这里就不展开讨论早期的方法了。

2.2早期的CNN做目标检测

最早在1990年,杨乐春(Y.LeCun)就已经开始使用CNN做目标检测了,只是由于当时的硬件计算力水平不行,所以导致设计的CNN结构只能往简单的去设计,不然没有好的硬件去运行完成实验。所以说我一直认为深度学习有今天的成就,很大一部分要归功于英伟达。当时做过一些列的提升性的实验,例如“shared-weight replicated neural network”,这个很像我们现在的全卷积网络FCN。

2.3 多尺度检测的技术发展

目标检测技术两大拦路虎就是多尺度目标小尺寸目标,这两个就是目标检测技术发展到现在一直在解决的问题。下图所示的是多尺度检测的技术发展路线图

多尺度检测经历了好几个阶段:

  • 在2014年以前是特征金字塔加上滑窗

    这个不展开写,感兴趣的去了解下 VJ算法。

  • 在2010-2015是先使用object proposal然后检测

    这种方法一般是将检测分为两个部分,第一个部分先做推选框,第二部分是根据推选框做进一步的分类,基于推选框的算法,一般有以下几个特征:1,召回率比较高;2,时间消耗比较大。在2015年以前,检测算法如果有比较好的精度,基本上都是TwoStage的。

  • 在2013-2016年,直接OneStage的deep regressionyolo最具有代表性;

    随着GPU运算能力的增强,人们对待多尺度目标检测变得越来越直接,越来越暴力,因为使用deep regression的方法去做多尺度检测,这种方法思路很简单,直接使用深度学习的特征去得到BBox的坐标,非常的暴力,类似于MTCNN的单阶段网络的思想。暴力训练,暴力回归。其优点很明显,思路简单,只要有GPU就可以复现,但是也有缺点,那就是定位精度不高,尤其是小目标。

  • 2016年以后,就是Multi-reference/-resolution detection

    对于检测多尺度目标,目前最流行的方法还是Multi-reference,其主要的思想就是预先定义一组reference boxes,例如经常用的anchor box,它们具有不同的尺寸和缩放因子,然后检测器基于这些boxes,去做运算。这种类型算法的loss一般是由两部分组成,第一个是定位loss,另一个是分类loss,两者加权求和之后就是最后的目标检测的loss,如下图。做分类的loss,一般都是交叉熵,定位的loss一般是L2,两者加权求和。

2.4 Bounding Box Regression的技术发展

bbox回归对于目标检测的定位精度的提升至关重要,它主要是为了修正基于proposals的bbox的位置。

如上图所示,BBOX回归也经历了几个阶段

  • 无BBox回归

    在早期的检测算法中,都是不使用bbox回归的,直接使用滑窗的方式来定位。

  • 从特征图得到BBox

    自从fasterRCNN之后,BBox回归不再是一个单独的程序,而是直接可以集成到CNN中进行端到端的训练的,所以才会有从特征图到BBox。例如fasterRCNN的smooth-L1函数

2.5 NMS的技术发展

nms是一个非常重要的技术手段。如果对于有同一个目标上出现多个检测的框的时候,NMS可以根据每个框的score来进行优化,去除掉一部分的多于的框。

nms有以下三种:

  • Greedy selection

    这是一种具有很悠久历史的nms方法,也是目标检测中应用最普遍的方法。首先对检测器检测到的box根据confidence的得分进行排序,然后分别计算所有的box的相互之间的iou值,然后设置一个阈值,如果高于设置的阈值,则保留confidence高的框,舍弃confidence低的框,以此类推。

  • Learning to NMS

    这种方法的思路是nms的阈值也应该是属于网络训练的一个参数,不能固定的设置为定值。例如有一个文章叫做 soft NMS,仅仅就是将nms算法进行修改,在faster RCNN上应用就可以在测试集上涨点。将nms的阈值也设置为科学习的,在另一个角度上更加符合end2end的思想,理论上也是更优秀的。

2.6 困难样本挖掘的技术发展

困难样本是什么意思? 在目标检测深度学习的训练过程中,正负样本的比例其实不均衡的,因为标注的数据就是正样本,数量肯定是固定的,为了保证正负样本的均衡,所以会选取一定的背景图片作为负样本,但是背景图片的样本集是一个open-set,不可能全部参与训练。所以需要将训练过程中难以训练的样本挖掘出来,给以更高的loss来训练,促进模型的泛化能力。

例如SSD算法中,仅仅是将一小部分的样本做反向传播,这些小部分样本都是loss值比较高的,这就是证明不好训练的样本,多学习几次,增加模型的泛化能力。

三、目标检测的加速

一个算法从被设计出来,其目的就是为了产生价值的,并不是停留在学术界的文章中,必定是要被工业界拿来项目落地的。所以一个目标检测算法的推理时间对于工业界落地至关重要。

算法的加速,归根结底就是计算机的运算次数变少,但是精度不能丢。常用的几种加速方法如下

  • 特征图共享计算

    在目标检测算法中,特征提取阶段往往耗时往往最多。在特征图共享计算里面分为两种,第一种是空间计算冗余加速,第二种是尺度计算冗余加速。这里不展开讲。

  • 分类器加速

    早期目标检测中,是提取特征加上分类器这样一个套路来进行目标检测的,分类器一般是线性分类器,但是线性分类器没有非线性分类器效果好,例如svm就是非线性的,所以加速分类器的运行也是提升检测算法速度的一个方法。

  • 级联检测器

    级联检测器可以很好的将计算耗时固定在一个比较小的范围,采用多个简单的检测,然后将其级联,从粗到细的过滤,例如cascade haar,MTCNN都是级联结构的

  • 网络剪枝和量化

    网络剪枝和量化是目前模型压缩中非常常用的两种方法,也是做加速非常热门的方向。

    • 剪枝的意思就是在原来网络结构的基础上,对于一些网络结构进行修剪,在尽量不影响精度的前提下降低网络的计算量,例如减少通道数,合并网络层参数等等。
    • 网络量化的常用操作就是将原来浮点型的计算量化为定点运算,甚至于变为与或运算,这样大大降低网络的运算量,并且可以非常方便地部署到嵌入式设备上。
    • 网络蒸馏的意思就是将一个比较复杂的网络的学习到的“知识”蒸馏出来,“教给”一个比较小的网络学习,这样小网络的精度比较高,运算耗时也比较小。通俗的理解就是“老师网络”指导“学生网络”训练,然后最后用“学生网络”来部署应用。
  • 轻量级网络设计

    轻量级网络设计是目前最热门的加速方式,我们常见的mobileNet的设计就是这个轻量级网络设计的典型代表。这里也有几种常用的方法

    • 分解卷积,将大卷积核分解为几个小的卷积核,这样其运算参数量就会降低。例如一个7x7的卷积核可以被分解为3个3x3的卷积核,它们的感受野相同,计算量后者要小,例如一个kxk的卷积核可以被分解为一个kx1和一个1xk的卷积核,其输出大小也相同,计算量却不同
    • 分组卷积,在早期硬件显存不够的情况下,经常用分组卷积来进行降低计算量,将特征通道分为不同的n组,然后分别计算
    • Depth-wise Separable Conv,深度可分离卷积,首次是mobileNet中提出来的,大大降低了卷积过程中的计算量。将普通卷积的深度信息分离出来,然后再利用1x1卷积将维度还原,即降低了计算量又在一定程度上使得特征图的通道重组,加速效果非常好
    • Bottle-neck Design,经常被用在轻量级网络的设计上,例如mobileNetV2就使用了反瓶颈层去设计网络。
    • Neural Architecture Search,简称NAS,从2018年AutoML问世以来,NAS发展非常的火,这种小型的网络结构是被训练自动搭建出来的。给机器限定一个搜索空间,让机器自己学习搭建一个高校的网络,总目前的效果来看,NAS搜索出来的结构比人工搭建的网络更加高效。例如mobileNetV3,efficientNet

四、目标检测最新进展

4.1 使用更好的引擎

检测器中非常重要的一个部分就是特征提取的主干网络,如果backbone性能优秀,检测器效果也会不错。例如FasterRCNN,SSD,RFCN其主干网络都是VGG或者resnet,如果对推理时间有要求,一般选取轻量级的网络作为主干网络,例如mobileNet-ssd就是mobileNet作为主干网络的SSD检测算法。所以说主干网络对时间的精度的影响非常大。

  • VGG,在2014年被提出,有两种结构,分别是16层和19层,分别被称为VGG16和VGG19。VGG网络中使用3x3的卷积代替了5x5和7x7
  • GoogleNet,顾名思义这个网络由谷歌提出,将网络层数增到了22层,同时在网络中增加了BN层使得训练更加容易收敛
  • Resnet残差网络结构,在2015年被提出,其结构定制化程度非常高,从10层到152层都可以搭建,主要是解决了网络训练退化的问题,加入残差架构之后网络不会随着层数增加而产生退化现场
  • DenseNet,在残差网络的基础上进行修改,残差是有short cut链接,而denseNet块是前面所有的层都与后面层有链接,所以是稠密链接

4.2 使用更好的特征

特征表达的质量对于目标检测也是起到关键性作用的,目前一些文章都在寻找一种更好的图像特征表达方式。例如特征融合,高分辨率特征

同变性(Equivariance)和不变性(Invariance)是图像特征表达的两个重要指标,同变性在学习语义信息表示的时候非常重要,但是在目标定位的时候不变性又变得非常重要,所以往往需要进行特征融合。

在包含一系列的卷积,池化的深层CNN中,深层的特征往往具有很强的不变性,缺少同变性,尽管这样可以获得很好分类效果,但是定位精度就会损失。很容易理解,那就是浅层的特征虽然学习到的语义信息很少,但是它可以帮助定位,因为他包含了很多关于边界,轮廓的信息,所以需要将浅层特征和深度特征进行融合

特征融合一般有两种方法,第一种是Processing flow,第二种是Element-wise operation。

  • Processing flow,类似于SSD的架构那种,将不同层次上的特征图进行融合,以适应不同大小目标的检测,使用跳跃链接引出然后融合特征
  • Element-wise operation,此种方法非常简单,就是将特征图中的每一个元素进行简单的相加,相乘操作,暴力的进行融合

还有另外一种更好的特征表达方式,那就是增大特征图的分辨率,也就是说特征图在原图上有着更大的感受野,这样对于检测能力也有非常的提升。

4.3 不止于滑窗

很多方法都是基于proposals或者anchor的方法来做目标检测,但是最近非常流行anchor free,也就是将目标检测看成是关键点检测的问题,因为一个目标可以被表示为左上角和右下角的坐标包围的矩形框,所以这类问题可以被转换成不依赖于anchor的定位问题

4.4 目标定位能力的提升

提升定位能力,一般有两种方式:

  • 重新修正bboxbbox refinement经常被用来在cnn中新加入一个分支来重新定位Bbox的位置。
  • 重新设计损失函数,因为目前大部分的损失函数设计都是通过计算IoU来得到定位的loss,这样对于end2end的思想还是相差的有点远,如果能够重新设计一个loss函数来更好的表示定位误差,这样训练过程会更加的好。

4.5 带语义监督信号学习

在训练过程中,我们标注的都是矩形框,矩形框中或多或少都会标有一部分背景信息,如果没有语义信息,那么这种训练其实是不完美的。甚至于有些目标的外形比较奇怪,例如一个猫和一个非常长的火车,如果计算IoU的话,这样计算结果就不能很好的表示定位误差。如果带有语义信息的训练,然后使用多任务的损失函数,这样可以帮助到网络进行很好的学习。

4.6 Training from Scratch

现在的深度学习的网路训练之前,都是将主干网路在imageNet上进行预训练的,因为ImageNet数据集足够大,预训练之后再在目标检测的数据集上进行微调,这样会容易收敛。但是ImageNet是分类任务的,可能会和目标检测适应的不是那么好。最近有文章研究怎么去重头开始训练并提升精度,例如DSOD就是一个非常好的例子。

4.7 对抗训练

将GAN思想应用到目标检测中,特别是可以提高小目标和重叠目标的检出率,通过缩小小目标和大目标之间的表达范围,对抗网络生成拥挤的对象掩模,直接在特征层缩小拥挤程度,造成对抗攻击,提升网络学习能力。

4.8 弱监督学习

目标检测的数据集整理非常耗费人力去标注,通过弱监督学习训练目标检测,只需要在图片层面进行标注,不需要bbox层的标注就可以训练一个目标检测器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/498997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统——文件管理

0.关注博主有更多知识 操作系统入门知识合集 目录 9.1文件系统概念 思考题: 9.2文件的物理结构 思考题: 9.3文件存储和目录 9.1文件系统概念 文件的定义: 文件是计算机信息存取的一种重要组织形式,文件由若干信息项有序构…

多项式时间验证与NP完全性

多项式时间的验证 对语言的“验证”算法: 验证与求解花费时间一样长:最短路径问题的一个实例的证书很容易能在多项式时间内被验证。实际上最短路径问题本身可以在多项式时间内求解。因此,根据指定的证书来验证与从头开始求解这个问题的时间…

Docker安装常用软件-Nacos

一、单机部署 官方网站:什么是 Nacos 1、下载最新nacos镜像 docker pull nacos/nacos-server 2、新建映射文件夹 --nacos/conf/application.properties --nacos/logs --nacos/sql ①application文件 # # Copyright 1999-2021 Alibaba Group Holding Ltd. #…

Ajax -- from表单与模板引擎

1. from表单的基本使用 1.1 什么是表单 表单在网页中主要负责数据采集功能。HTML中的标签,就是用于采集用户输入的信息,并通过标签的提交操作,把采集到的信息提交到服务器端进行处理。 1.2 表单的组成部分 表单由三个基本部分组成&#…

MySQL基础(七)单行函数

1. 函数的理解 1.1 什么是函数 函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?它可以把我们经常使用的代码封装起来,需要的时候直接调用即可。这样既提高了代码效率,又提高了可维护性。在 SQL 中我们也可以使用函数对检…

GUN C编译器拓展语法学习笔记(一)GNU C特殊语法部分详解

GNU C特殊语法部分详解 一、指定初始化1、数组初始化2、指定初始化结构体成员3、指定初始化的好处 二、宏构造利器:语句表达式1、表达式、语句和代码块2、语句表达式3、宏定义中的语句表达式 三、typeof 与container_of 宏1、typeof 关键字宏2、Linux内核中的contai…

提示词的天花板来了- ChatGPT 指导学习知识点

https://github.com/JushBJJ/Mr.-Ranedeer-AI-Tutor/ 访问 ChatGPT网站选择 GPT-4(或更高版本)模型将 Mr_Ranedeer.json 的内容复制粘贴到 ChatGPT让 Mr. Ranedeer 带领您完成配置过程 开始学习吧! 支持以下命令: /feedback&…

Golang每日一练(leetDay0055) 最长子串、相交链表

目录 159.至多包含两个不同字符的最长子串 Longest-substring-with-at-most-two-distinct-characters 🌟🌟 160. 相交链表 Intersection-of-two-linked-lists 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 …

【C++初阶】类与对象(中)

目录 一.类的6个默认成员函数二、构造函数特性 三、析构函数概念特性 四、拷贝构造函数概念特性 五、赋值运算符重载5.1 运算符重载5.2 赋值运算符重载 一.类的6个默认成员函数 在C中,一个类中并没有实现任何属性和方法,被叫做空类,但是一个…

《Linux 内核设计与实现》05. 系统调用

文章目录 内核通信API、POSIX、C库 系统调用系统调用号系统调用的性能 系统调用处理程序指定恰当的系统调用参数传递 系统调用的实现实现系统调用参数验证 系统调用上下文绑定一个系统调用的最后步骤从用户空间绯闻系统调用 内核通信 系统调用在用户空间进程和硬件设备之间添加…

【疯狂造轮子-iOS】JSON转Model系列之一

1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗忘。这段时间准备自己造一些轮子,主要目的还是为了提升自身实力,总不能一遇到问题就Google 。 之前写i博客园客户端的时候&#xff0…

借助PLC-Recorder,西门子PLC S7-200SMART实现2ms周期采集的方法(带时间戳采集)

目录 1、测试条件 2、测试结论 3、PLC的发送程序 4、PLC-Recorder侧的通讯设置 5、PLC-Recorder的通道配置 6、PLC-Recorder的变量配置 7、记录数据的情况 8、再说时间戳 9、小结 高速数据采集要保证速度,也要保证时刻的准确性。在windows系统里&#xff0…

ESP32学习笔记22-TWAI-CAN

22.TWAI-CAN 22.1概述 22.1.1参考博客 ESP32 基于自带控制器实现CAN总线通信(上) - 知乎 (zhihu.com) ESP32 基于自带控制器实现CAN总线通信(下) - 知乎 (zhihu.com) 22.1.2 ESP32 TWAI/CAN外设说明 可以支持标准帧格式(11位ID)和扩展帧格式(29位ID)ESP32 包含 1 个 T…

生信刷题之ROSALIND——Part 4 (MPRT, MRNA, ORF)

目录 写在前面1、Finding a Protein MotifProblemSample DatasetSample OutputCodeOutput 2、Inferring mRNA from ProteinProblemSample DatasetSample OutputexampleCodeOutput 3、Open Reading FramesProblemSample DatasetSample OutputCodeOutput 写在前面 本来打算每周更…

3.Hive基础命令练习

创建表格如下: 部门表: create table if not exists dept(deptno int, -- 部门编号dname string, -- 部门名称loc int -- 部门位置 ) row format delimited fields terminated by \t; 员工表: create table if not exists emp(empno int,…

AI 工具合辑盘点(十三)持续更新 之 面向宠物爱好者的 AI 工具和面向电影爱好者的 AI 工具

亲爱的宠物爱好者,这个部分是专门为你准备的。🐾 不论你是爱狗人士还是铲屎官,AI 都能满足你。 访问地址: This Cat Does Not Exist 猫咪生成器 你知道喜欢猫的爱好有个专门的名字吗?在国外被称为ailurophilia&…

操作系统考试复习——第四章 对换 分页存储管理方式

对换技术也成为交换技术,由于当时计算机的内存都非常小,为了使该系统能分时运行多个用户程序而引入了对换技术。 1.对换的引入: 所谓“对换”,是指把内存中暂时不能运行的进程或者暂时不用的程序和数据调出到外存上,…

zk之数据的发布与订阅

数据的发布和订阅: (1)数据的发布与订阅是一个一对多的关系。多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态发生变化时,会通知所有的订阅者对象,使它们能够自动的更新自己的状态。发布和订阅可以让发…

SpringBoot项目修改application.yml,application-prod.yml配置文件中的端口,数据库链接等信息后,项目突然不能运行

SpringBoot项目修改application.yml,application-prod.yml配置文件中的端口,数据库链接等信息后,项目突然不能运行 问题记录 ,SpringBoot项目修改application.yml,application-prod.yml配置文件中的端口,数…

跟姥爷深度学习5 浅用卷积网络做mnist数字识别

一、前言 前面用TensorFlow浅做了一个温度预测,使用的是全连接网络,同时我们还对网上的示例做了调试和修改,使得预测结果还能看。本篇我们更进一步使用CNN(卷积)网络,不过再预测温度就有点大材小用&#x…