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

要点:

  • 参考综述:深度学习目标检测最全综述 - 爱码网
  • 参考表达: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层的标注就可以训练一个目标检测器

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【java】Java 异常处理的十个建议

文章目录 前言一、尽量不要使用e.printStackTrace(),而是使用log打印。二、catch了异常,但是没有打印出具体的exception,无法更好定位问题三、不要用一个Exception捕捉所有可能的异常四、记得使用finally关闭流资源或者直接使用try-with-resource五、捕获…

全注解下的SpringIoc 续4-条件装配bean

Spring Boot默认启动时会加载bean,如果加载失败,则应用就会启动失败。但是部分场景下,我们希望某个bean只有满足一定的条件下,才允许Spring Boot加载,所以,这里就需要使用Conditional注解来协助我们达到这样…

Java面试题总结 | Java面试题总结10- Feign和设计模式模块(持续更新)

文章目录 Feign项目中如何进行通信Feign原理简述 设计模式spring用到的设计模式项目的场景中运用了哪些设计模式写单例的时候需要注意什么工厂模式的理解设计模式了解么工厂设计模式单例设计模式代理设计模式策略模式**模板方法模式**观察者模式**适配器模式**观察者模式**适配…

HNU-操作系统OS-实验Lab2

OS_Lab2_Experimental report 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 前言 实验一过后大家做出来了一个可以启动的系统,实验二主要涉及操作系统的物理内存管理。操作系统为了使用内存,还需高效地管理…

【算法与数据结构】顺序表

顺序表 数据结构 结构定义结构操作 顺序表:结构定义 一个数组,添加额外的几个属性:size, count等 size: 数组有多大 count: 数组中当前存储了多少元素 顺序表三部分: 一段连续的存储区:顺序表存储元素的地方整型…

利用css实现视差滚动和抖动效果

背景: 前端的设计效果,越来越炫酷,而这些炫酷的效果,利用css3的动画效果和js就可以实现,简单的代码就能实现非常炫酷的效果。 原理: 利用 js监控scrollTop的位置,通过 top定位图片的位置&#x…

HDOJ 1022 Train Problem Ⅰ 模拟栈操作

🍑 OJ专栏 🍑 HDOJ 1022 Train Problem Ⅰ 输入 3 123 321 3 123 312输出 Yes. in in in out out out FINISH No. FINISH🍑 思路 🍤 栈顶元素与目标元素不匹配就进栈,匹配就出栈 🍤 匹配完:y…

『python爬虫』10. 数据解析之xpath解析(保姆级图文)

目录 安装库xpath入门怎么快速得到xpath路径xpath节点的关系xpath方法小型实战总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 安装库 pip install lxmlxpath入门 怎么快速得到xpath路径 (相对路…

webpack plugin原理以及自定义plugin

通过插件我们可以拓展webpack,加入自定义的构建行为,使webpack可以执行更广泛的任务。 plugin工作原理: webpack工作就像是生产流水线,要通过一系列处理流程后才能将源文件转为输出结果,在不同阶段做不同的事&#x…

二、PEMFC基础之电化学与反应动力学

二、PEMFC基础之电化学与反应动力学 1.电流、电流密度2.反应速率常数3.交换电流密度4.电化学动力学奠基石B-V方程5.活化损失计算Tafel公式6.计算案例 1.电流、电流密度 由法拉第定律 i d Q d t n F d N d t i\frac{dQ}{dt}\frac{nFdN}{dt} idtdQ​dtnFdN​ j i A j\frac{…

【五一创作】ERP实施-委外业务-委外采购业务

委外业务主要有两种业务形态:委外采购和工序外协,委外采购主要是在MM模块中实现,工序外协主要由PP模块实现,工序外协中的采购订单创建和采购收货由MM模块实现。 委外采购概念 委外采购,有些企业也称为带料委外或者分包…

牛客刷SQL题Day5

SQL69 返回产品并且按照价格排序 select prod_name , prod_price from Products where prod_price between 3 and 6 select prod_name , prod_price from Products where 6>prod_price and prod_price >3 踩坑1: between......and.......包括边界。 踩坑2&am…

网卡丢失导致集群异常

假期晚上有个电话,说集群故障,应用无法连接,节点一可以ssh登录,节点二已无法正常登录了,在节点一上需要ssh 私网ip地址才可以登录节点二,虽不是重点客户,有问题还是需要积极处理。 首先看集群状…

Cartesi 2023 年 4 月回顾

查看你不想错过的更新 2023年5月1日,感谢Cartesi生态系统中所有了不起的构建者! 在一个激动人心的旅程之后,我们的首届全球线上黑客马拉松正式结束了!有超过200名注册建造者参加,见证了所有参与者展示的巨大才华和奉献…

有必要给孩子买台灯吗?分享四款高品质的护眼台灯

有必要使用护眼台灯,尤其是有近视现象的孩子们。 现在很多孩子小学就开始近视了,保护视力刻不容缓呀! 很多人不知道,其实劣质光线是最大的眼睛杀手 给孩子随便买便宜的台灯,看着一样能用,其实时间久了 对孩子眼睛的…

SpringCloud:ElasticSearch之RestClient查询文档

文档的查询同样适用RestHighLevelClient对象,基本步骤包括: 1)准备Request对象2)准备请求参数3)发起请求4)解析响应 1.快速入门 我们以match_all查询为例 1.1.发起查询请求 代码解读: 第一步…

【《中国工业经济》数据复现】数字化转型与企业分工:专业化还是纵向一体化

一.研究内容 本文使用机器学习方法刻画微观企业数字化水平,并在构建数理模型的基础上实证考察了企业数字化转型对企业分工的影响及其机理。结果表明,企业数字化转型显著提升了中国上市企业专业化分工水平。机制分析表明,数字化转型对企业专业…

ReentrantLock原理剖析

前言 本文主要讲解底层逻辑,基本不会贴代码,目的是让大家能够真正的知晓原理,对照着逻辑去理解代码看代码也会很快就能看懂。 在讲ReentrantLock原理之前,我们先回顾下ReentrantLock的基本用法。ReentrantLock是一个锁编程api&am…

考研机试刷题第二天:任意进制转任意进制【高进度短除法】

理一下思路&#xff1a; 看了y总的视频之后我觉得这道题其实只需要对上次写的进制转换微微做一下调整即可。 于是我写出了下面的代码 #include <iostream> #include <vector> #include <algorithm> #include <cstring>using namespace std;vector<…

Moonbeam操作指南|如何使用Gelato创建自动化任务

Gelato是一个Web3去中心化自动化网络&#xff0c;允许开发者横跨多个基于EVM兼容区块链上自动化和连接任意的智能合约执行。&#x1f4d1;阅读中文版详细操作教程 举例来说&#xff0c;我们将使用MetaMask作为钱包。同时&#xff0c;您的钱包余额中需要有一些GLMR用于支付自动…