2D: 传统目标检测算法综述_2d目标检测sota方法-程序员宅基地

技术标签: 自动驾驶  tensorflow  # 二维目标检测  机器学习  深度学习  pytorch  

一. 目标检测的发展历程

1. 2001年,V-J检测器诞生,主要用于人脸的检测;
2. 2006年,HOG + SVM的方法出现,主要用于行人的检测;
3. 2008年,rgb大神(记住这个人,后面的R-CNN系列检测算法也是出自他之手)研究出了著名的DPM算法,在深度学习方法成熟之前的很长一段时间里,就是这个算法一直在目标检测中发挥作用;

以上算法是属于传统目标检测的算法,都是基于图像处理和计算机视觉的!

------------------------------------------------------------------分割线------------------------------------------------

到了2012年CNN的崛起,开始了深度学习和计算机视觉结合的旅程!

4. 2013年,出现了Overfeat;
5. 2014年,rgb大神提出了大名鼎鼎的R-CNN检测算法,开始了two-stage的旅程;
6. 2014年,SPPNet诞生;
7. 2015年,R-CNN的快速版Fast RCNN 和 Faster RCNN,以及yolo,yolo的到来标志着one-stage检测算法的开启;
8. 2016年,大家都爱的SSD到来;
9. 2017-2018年,Pyramid Networks,还有Retina-Net。 

二. 什么是目标检测?

  1. 目标检测就是找出图像中所有感兴趣的目标,识别他们的类别和位置。
    (1)什么是类别?
    类别就是一个分类的标签,即感兴趣的目标属于什么种类,猫,狗,羊等。
    (2)什么是位置?
    位置用矩形框表示,目标检测的位置信息一般有两种格式(以图片左上角为原点(0, 0)):

        极坐标表示:(xmin, ymin, xmax, ymax)
                              xmin,ymin: 矩形框的左上角坐标
                              xmax,ymax: 矩形框的右下角坐标
                              
        中心点坐标:(x_center, y_center, w, h)
                              x_center, y_center: 目标检测框的中心点坐标
                              w, h: 目标检测框的宽、高
    
  2. 目标检测的输出是一个列表,其中的每一项都会给出检出目标的类别和位置。类别就是一个分类的标签,而位置用矩形框表示。
    (1)比较:
    分类的输出是一个类别标签。对单分类来说,它就是一个整数,表示属于某一个类别;对多分类而言,它就是一个向量。

三. 什么是传统目标检测?

  1. 传统目标检测和深度学习目标检测的区别:
    传统目标检测:很多任务不是一次性就可以解决,需要多个步骤;
    深度学习目标检测:很多任务都采用end-to-end方案,即输入一张图,输出最终想要的结果。算法细节和学习过程全部交给了神经网络。

  2. 完成一个目标检测任务一般分为三个步骤:
    第一步选择检测窗口;
    第二步提取图像特征;
    第三部设计分类器。
    如下图所示:
    在这里插入图片描述

四. V-J人脸检测算法

  1. 候选框选取:
    V-J框架使用的就是最简单的滑动窗口法(穷举窗口扫描),它的训练尺度是24*24的滑动窗口。

  2. Haar特征提取:
    关于Haar特征,通俗点讲就是白色像素点于黑色像素点的差分,即value = 白 - 黑,是一种纹理特征。
    (1)V-J算法特征提取矩形框图:
    包括三种特征,分为两矩形特征、三矩形特征、对角特征。如下图所示:
    在这里插入图片描述

    (2)使用积分图加速计算特征:
    积分图的特点就是,该图像中的任何一点,等于位于该点左上角的所有像素之和,这可以被看成是一种积分,因此称之为积分图。

    (3)计算方块内的像素和:
    为了理解如何计算任意矩形内的像素值,我们画出四个区域A、B、C、D,并且图中有四个位置分别为1、2、3、4。如下图所示:在这里插入图片描述
    我们要计算D区域内部的像素和该怎么计算?

    记位置4的左上的所有像素为rectsum(4),那么D位置的像素之和就是rectsum(1)+rectsum(4)−rectsum(2)−rectsum(3)。
    
    我们前面提到有三种类型的Haar特征。其中二矩形特征需要6次查找积分图中的值,而三矩形特征需要8次查找积分图中的值,而对角的特征需要9次。
    
  3. 训练人脸分类器:
    V-J采用的是Adaboost算法,原理如下:
    a. 初始化样本的权重w, 权重之和为1;
    b. 训练弱分类器;
    c. 更新样本权重;
    d. 重复步骤b
    e. 最后结合多个弱分类器的结果进行投票。
    将多个弱分类器组合成一个强分类器,这就是AdaBoost方法的核心理念。

五. HOG + SVM行人检测算法

1. HOG算法
HOG是一种在计算机视觉和图像处理中用来进行物体检测的描述子。通过计算和统计局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。
主要思想:在一幅图像中,局部目标的表象和形状能够利用梯度或边缘的方向密度分布来进行描述。其本质是梯度的统计信息,而梯度主要存在于边缘所在的地方。
算法优点:与其他的特征描述方法相比,HOG具有较多优点。由于HOG是在图像的局部方格单元上进行操作的,所以它对图像的几何和光学形变都能保持很好的不变性,这两种形变只会出现在更大的空间领域上。其次,在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。因此HOG特征特别适合于做图像中的人体检测。
实现步骤及流程图如下:
步骤1. 读取待检测的图片;
步骤2. 将输入图像灰度化(将输入的彩色图像的r,g,b值通过特定公式转换为灰度值);
步骤3. 采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);
步骤4. 计算图像中每个像素的梯度值(包括大小和方向),捕获轮廓信息;
步骤5. 统计每个cell内的梯度直方图(不同梯度的个数),形成每个cell的特征描述子;
步骤6. 将每几个cell组成一个block(以3*3为例),一个block内所有cell的特征串联起来得到该block的HOG特征描述子;
步骤7. 将图像image内所有block块的HOG特征描述子串联起来得到该image(检测目标)的HOG特征描述子,这就是最终分类的特征向量。
在这里插入图片描述
2. SVM算法
支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。
SVM的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。
具体的算法实现原理参考:https://zhuanlan.zhihu.com/p/31886934

3. 基于HOG+SVM的目标检测算法训练流程
步骤1. 从训练数据集中获取P个正样本块,并计算这P个正样本块的HOG特征描述子;
步骤2. 从训练数据集中获取N个负样本块,并计算这N个负样本块的HOG特征描述子,其中N>>P;
步骤3. 在这些正样本和负样本块上面训练一个SVM分类器模型;
步骤4. 应用hard-negative-mining。对于负面训练集中的每个图像和每个可能的图像比例,在图像上面应用滑动窗口。在每个窗口中计算相应的HOG特征描述符并应用分类器。如果您的分类器(错误地)将给定窗口分类为一个对象(它将绝对存在误报),记录与误报补丁相关的特征向量以及分类的概率。这种方法被称为hard-negative-mining。具体效果如下图所示:
在这里插入图片描述
步骤5. 首先获取使用hard-negative-mining技术获取到的错误的正样本块,然后按照概率值对它们进行排序;接着使用这些样本块重新训练分类器模型;
步骤6. 将训练好的模型应用到测试图片中;
步骤7. 对预测的结果使用NMS去除冗余的bbox。

4. 知识点hard negative mining的含义
假设给你一堆包含一个或多个人物的图片,并且每一个人都给你一个bounding box做标记,如果要训练一个分类器去做分类的话,你的分类器需要既包含正训练样本(人)和负训练样本(背景)。
你通过观察bounding box去创建一个有用的正训练样本,那么怎么做才能创建一个有用的负训练样本呢?
一个很好的方式就是去在开始时随机创建一堆的bounding box候选框,并且不能与你的正样本有任何的重叠,把这些未与正样本重叠的新的bounding box作为你的负样本。
好了,这样你的正负样本都有了,可以训练可以用的分类器了,你用滑动窗口在你的训练图片上进行运行,但是你会发现你的分类器并不是很好用,分类的效果并不是很好,因为它会抛出一堆的错误的正样本(当检测到人时实际上却并不是实际的人),这就问题来了,你训练了一个用于分类的分类器,然而这个分类器却并不能达到你想要的效果,那么应该怎么办呢?
这个时候就要用的hard negative了,hard negative就是当你得到错误的检测patch时,会明确的从这个patch中创建一个负样本,并把这个负样本添加到你的训练集中去。当你重新训练你的分类器后,分类器会表现的更好,并且不会像之前那样产生多的错误的正样本。

参考网页
https://blog.csdn.net/WZZ18191171661/article/details/91305466
https://zhuanlan.zhihu.com/p/94934407

六. DPM检测算法

1. 什么是DPM算法
DPM(Deformable Parts Models)翻译成中文是可变型部件模型,是一种用于目标探测的方法。DPM方法在2012年之前在目标探测领域都是应用非常广泛的一种方法,但是在12年之后,这种方法逐渐走下没落。

2. DPM算法思想
输入一幅图像,对图像提取图像特征,针对某个物件制作出相应的激励模板,在原始的图像中计算,得到该激励效果图,根据激励的分布,确定目标位置。
制作激励模板就相当于人为地设计一个卷积核,一个比较复杂的卷积核,拿这个卷积核与原图像进行卷积运算得到一幅特征图。比如拿一个静止站立的人的HOG特征形成的卷积核,与原图像的梯度图像进行一个卷积运算,那么目标区域就会被加密。如下图所示:
在这里插入图片描述
那么说到这里就会出现一个问题,人在图像中可能有各种的姿态,比如躺着,趴着,坐着等等,我们只用一个静止站立状态的人的激励模板去做探测就会失败。也就是说图像中的物件可能会发生形变,那么我们用固定的激励模板去探测目标物件的时候就不再适用,那么该如何解决这一问题呢,这就引出了局部模板,也就是说,我们不做一个整体的人的激励模板,转而去做人的部分组件的模板,比如头、胳膊、腿等,其实这就是DPM算法。

3. DPM算法的步骤
(1)产生多个模板,整体模板以及不同的局部模板;
(2)拿这些不同的模板同输入图像“卷积”产生特征图;
(3)将这些特征图组合形成融合特征;
(4)对融合特征进行传统分类,回归得到目标位置。

4. DPM算法优点
(1)方法直观简单;
(2)运算速度块;
(3)适应动物变形。

5. DPM算法缺点
(1)性能一般
(2)激励特征人为设计,工作量大;
这种方法不具有普适性,因为用来检测人的激励模板不能拿去检测小猫或者小狗,所以在每做一种物件的探测的时候,都需要人工来设计激励模板,为了获得比较好的探测效果,需要花大量时间去做一些设计,工作量很大。
(3)无法适应大幅度的旋转,稳定性很差。

七. NMS算法

全名叫非极大值抑制算法,该算法的主要目的是为了消除检测得到的多余框,找到目标物体的最佳位置。
该算法具体的步骤如下:

  1. 假定有6个带置信率的region proposals,并预设一个IOU的阈值如0.7。
  2. 按置信率大小对6个框排序: 0.95, 0.9, 0.9, 0.8, 0.7, 0.7。
  3. 设定置信率为0.95的region proposals为一个物体框;
  4. 在剩下5个region proposals中,去掉与0.95物体框IOU大于0.7的。
  5. 重复2~4的步骤,直到没有region proposals为止。
  6. 每次获取到的最大置信率的region proposals就是我们筛选出来的目标。

参考文献:https://blog.csdn.net/leeyisong/article/details/96422963

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yangguidewxx/article/details/108186012

智能推荐

Springboot/java/node/python/php基于springboot+vue手机售后管理系统【2024年毕设】-程序员宅基地

文章浏览阅读779次,点赞19次,收藏24次。springboot微信小程序的小疾病问诊服务系统的设计与实现。springboot基于spring的物业管理系统的设计与实现。springboot基于Java的高校学生请假系统。ssm基于Android的购物商场APP设计与实现。springboot基于微信小程序的智慧校园系统。ssm基于Android的英语词典的设计与开发。ssm基于SSM+Vue的学生实践管理平台开发。ssm基于android的企业员工考勤系统。ssm基于web的暗香小店系统的设计与实现。ssm基于Web的高等学校公费医疗管理系统。

css中hover属性的使用技巧_css hover的用法-程序员宅基地

文章浏览阅读2.3w次,点赞15次,收藏63次。hover属性用不同的书写方式,来改变不同关系的元素样式。元素:hover 表示聚焦后改变自己元素:hover 元素 表示聚焦后改变其子元素元素:hover + 元素 表示聚焦后改变其指定的“亲兄弟”(条件是该兄弟元素与其相邻)元素元素:hover ~ 元素 表示聚焦后改变其指定的兄弟元素,两个元素相不相邻都行。示例:.first:hover {color: white;}/* 聚焦我改变自己 */.three:hover .three-son {font-size: 20px._css hover的用法

coursera-斯坦福-机器学习-吴恩达-第8周笔记-无监督学习_pca反向压缩-程序员宅基地

文章浏览阅读6k次,点赞3次,收藏15次。coursera-斯坦福-机器学习-吴恩达-第8周笔记-无监督学习coursera-斯坦福-机器学习-吴恩达-第8周笔记-无监督学习1聚类算法clutering1聚类算法简介2K-means21kmeans的目标函数22随机初始化23选择类别数3考试quiz维数约减 dimensionality reduction1数据压缩2数据可视化3维度约简-主成分分析法PCA1 PCA_pca反向压缩

vim插件安装及常用技巧_bxbx.vim-程序员宅基地

文章浏览阅读5.2k次。一、插件安装Vundle是vim的一个插件管理器, 同时它本身也是vim的一个插件。插件管理器用于方便、快速的安装、删除、Vim更新插件。mkdir -p ~/.vim/bundlegit clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim管理器安装完成后,vim ~/.vimrc命令创建.vimrc文件syntax on" tab宽度和缩进同样设置为4set tabstop=4set softta_bxbx.vim

java.lang.ClassNotFoundException:如何解决-程序员宅基地

文章浏览阅读7.2w次,点赞10次,收藏41次。本文适用于当前面临java.lang.ClassNotFoundException挑战的Java初学者。 它将为您提供此常见Java异常的概述,这是一个示例Java程序,可支持您的学习过程和解决策略。 如果您对与更高级的类加载器相关的问题感兴趣,我建议您复习有关java.lang.NoClassDefFoundError的文章系列,因为这些Java异常密切相关。 java.lang..._java.lang.classnotfoundexception:

串口通信数据帧_一帧数据-程序员宅基地

文章浏览阅读1.2k次,点赞9次,收藏17次。不同的设备间建立连接往往需要通信,而串口通信是十分常用的一种。UART串口通信需要两根线来实现,一根用于串口发送,另外一更用于串口接收。UART串口发送或者接收过程中一帧数据包括1位起始位、8位数据位、1位停止位,为了提高数据的可靠性可以在停止位前加上1位奇偶校验位。串口通信虽然十分简单,但是在不同设备间发送的数据往往不止1个字节,往往需要多个字节组成的数据包。当我们按照数据包发送时我们需要考虑到以及,因此我们可以采用定义数据帧的方式解决上述两个问题。_一帧数据

随便推点

【图像去噪】偏微分方程PDE图像去噪(含SNR)【含Matlab源码 1890期】_pdnet 深度学习 偏微分方程 去噪-程序员宅基地

文章浏览阅读987次,点赞20次,收藏19次。偏微分方程PDE图像去噪(含SNR)完整的代码,方可运行;可提供运行操作视频!适合小白!_pdnet 深度学习 偏微分方程 去噪

Ubuntu18.04安装教程(很详细)_ubuntu18安装-程序员宅基地

文章浏览阅读6.6w次,点赞128次,收藏962次。Ubuntu18.0详尽版安装教程下载Ubuntu18.04下载VMware Workstation安装虚拟机下载Ubuntu18.04官方网站:http://old-releases.ubuntu.com/releases/18.04.4/?_ga=2.44113060.1243545826.1617173008-2055924693.1608557140下载VMware Workstation这个在网上有很多教程下载,这里我就不写了,我用的版本是14 pro。如下图:安装虚拟机1、打开_ubuntu18安装

Android四大组件之Activity--管理方式_android activityrecord中的activitytype-程序员宅基地

文章浏览阅读1.7k次。1. 概览Activity的管理有静态和动态两层涵义: 静态是指Activity的代码组织结构,即Application中声明的Activity的集合,这些Activity被组织在一个APK中,有特定的包名。 在编写应用程序时,Activity对应到用户界面,它定义了用户界面的布局、交互行为、启动方式等,最重要的,是Activity的生命周期函数。 在应用进程看来,只需要按照Android定义的规范,实现生命周期函数的具体逻辑即可,所有的用户界面都遵循同一个规范。 编写完一个应用程序的所有用户界面_android activityrecord中的activitytype

[LINUX]sed查找不包含某个字符串的行,并进行替换_sed不包含字符串-程序员宅基地

文章浏览阅读5.5k次,点赞3次,收藏7次。sed 查找不包含某个特性 sed -i "/src/!s/xxx/bbb/g" xxx将不包含src的行中的xxx替换为bbb_sed不包含字符串

问题解决:shared_ptr Assertion px != 0 failed 及debug经验分享_typename boost::detail::sp_dereference<t>::type bo-程序员宅基地

文章浏览阅读6.8k次,点赞11次,收藏18次。问题解决:shared_ptr Assertion px != 0 failed及debug经验分享问题详细描述:/usr/include/boost/smart_ptr/shared_ptr.hpp:646: typename boost::detail::sp_dereference::type boost::shared_ptr::operator*() const [with T = pcl::PointCloudpcl::pointxyz; typename boost::detail::sp_typename boost::detail::sp_dereference::type boost::shared_ptr::operat

看不见的“网” ,一文读懂阿里云基础设施网络_阿里云网络基线理解-程序员宅基地

文章浏览阅读553次。编者按:在这个万物智联的时代,无论是在线网络购物,还是网络强国、数字中国建设,都离不开一张“看不见的网”——基础设施网络。2009年,首届双11每秒交易订单创建峰值400;2021年,双11每秒交易订单创建峰值58.3万,12年交易数字量猛增的背后,是阿里云在庞大分布式系统上计算和IO能力的飞跃,更离不开阿里云基础设施底层网络技术的支撑。图|阿里云全球基础设施网络系统作为阿里云基础设施的重要组成部分,阿里云基础设施网络团队负责整个阿里云全球基础设施网络,包括大规模高性能数据中心网络,全球数据中心互联_阿里云网络基线理解

推荐文章

热门文章

相关标签