07 目标检测-YOLO的基本原理详解

news2024/11/27 4:00:23

一、YOLO的背景及分类模型

1、YOLO的背景

        上图中是手机中的一个app,在任何场景下(工业场景,生活场景等等)都可以试试这个app和这个算法,这个app中间还有一个button,来调节app使用的模型的大小,更大的模型实时性差但精度高,更小的模型实时性好但精度差

        而YOLO v5其实一开始是以这一款app进入人们的视野的,就是上图的这个,叫:i detection(图上标的是YOLO v4,但其实算法是YOLO v5),值得一提的是,这款app就是YOLO v5的作者亲自完成的。

       读到这里,你觉得YOLO v5的最大特点是什么?

       答案就是:一个字:快,应用于移动端,模型小,速度快。

       我们再看一张图:

        从图中可以看出YOLO的最大特点是速度快。YOLO在精度上仍然落后于目前最先进的检测系统。虽然它可以快速识别图像中的目标,但它在定位某些物体尤其是小的物体上精度不高。进入到真正端到端的目标检测:直接在网络中提取特征来预测物体分类和位置。因此YOLO的主要特点:

  • 速度快,能够达到实时的要求。在 Titan X 的 GPU 上 能够达到 45 帧每秒。
  • 使用全图作为 Context 信息,背景错误(把背景错认为物体)比较少。
  • 泛化能力强。

2、分类模型

       在进入目标检测任务之前首先得学会图像分类任务,这个任务的特点是输入一张图片,输出是它的类别。

       对于输入图片,我们一般用一个矩阵表示

       对于输出结果,我们一般用一个one-hot vector表示: 【0,0,1,0,0,0】 ,例如我们有6个类别(猫、狗、人、马、鸡、猪),哪一维是1(人这一维是1),就代表图片属于哪一类(人)。

       所以,在设计神经网络时,结构大致应该长这样:

       这里的cbrp指的是conv,bn,relu,pooling的串联。

       由于输入要是one-hot形式,所以最后我们设计了2个fc层(fully connencted layer),我们称之为“分类头”或者“决策层”。

二、YOLO系列思想的雏形:YOLO v0

1、框的表示方式

  • x,y,w,h(如图)

  • p1,p2,p3,p4(4个点坐标)

  • cx,cy,w,h(cx,cy为中心点坐标)

  • x,y,w,h,angle(还有的目标是有角度的,这时叫做Rotated Bounding Box)

  • ......

       所以框Bounding Box表示的方法很多,但输出的结果一定是一个vector。

2、分类器和检测器

       上面我提到了分类器模型用来分类,分类器的输出是一个one-hot vector,而检测器的输出是一个框(Bounding Box),也是一个向量,是我们标注的结果。但二者的共同特点是结果都是向量。因此分类模型可以用来做检测,用分类模型可以把检测的任务当做是遍历性的分类任务,只是输出的结果是一个个one-hot vector而已。

3、遍历性的分类任务

        如何遍历?首先我们先预设一个框的大小,然后在图片上用这个框遍历,每遍历1次,都对边框的区域进行二分类:属于脸或者不属于脸。

          这种方法其实就是RCNN全家桶的初衷,专业术语叫做:滑动窗口分类方法。

          但问题是:检测的耗时非常大。

4、改进思路

       既然分类器输出一个one-hot vector:【0,0,1,0,0,0】,那我们把它换成(x,y,w,h,c),c表示confidence置信度,此时输出是Bounding Box的位置(x,y,w,h,c),因此就把检测问题转化成一个回归问题,而分类器也就可以变成了一个检测器。因此分类器变化如下:

       此时我们会发现,这种方法比刚才的滑动窗口分类方法简单太多了。这一版的思路我把它叫做YOLO v0,因为它是You Only Look Once最简单的版本。 

      因此YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。

5、YOLO v0的进化(YOLO v1)

5.1、问题分析

       YOLO v0只能输出一个目标,那比如下图多个目标怎么办呢?为了保证所有目标都被检测到,我们应该输出尽量多的目标。所以我们的模型需要进行改进。

 

       我们进一步的改进,让每个(c,x,y,w,h)去负责image某个区域的目标。因此我们需要对图片进行区域划分,如上图中我们可以将图片划分成4x4=16个小的区域,每个小的区域由1个(c,x,y,w,h)去负责image对应区域的目标。

        因为conv操作是位置强相关的,原来的目标在哪里,卷积之后的feature map上还在哪里,所以图片划分为16个区域,结果也应该分布在16个区域上,所以我们的结果(Tensor)的维度size是:(5,4,4)。如下图所示:

5.2、c的真值设置

        c的真值如何设置呢?c的真值取决于区域的中心点,如大娃脸部跨了4个区域(grid),但4个区域(grid)只能某一个grid的c=1,其他的3个区域c=0。那么该让哪一个grid的c=1呢?就看他的脸的中心落在了哪个grid里面。根据这一原则,c的真值为下图所示:

5.3、NMS(非极大值抑制)

      上图中会发现7个葫芦娃,c的真值只有6个1,原因是第三行第三列的grid有2个目标。如何解决一个区域有多个目标的情况?

       解决方案:

       NMS(非极大值抑制)解决多目标检测。2个框重合度很高,大概率是一个目标,那就只取一个框。重合度的计算方法:交并比IOU=两个框的交集面积/两个框的并集面积。(推荐)

      或者使用聚类,但聚类容易将2个目标本身比较近聚成了1个类。(不推荐)

      或者细化网格:将网格细化,如将 4x4 区域变成 40x40 或者更大,使区域更密集,就可以缓解多个目标的问题,但无法从根本上去解决。(不推荐)

5.4、多类的目标

      上面我将一直讲的是单类目标,如检测葫芦娃的脸,如果是多类目标如检测葫芦娃的脸,且检测葫芦,此时我们的设计改变为如下,多个类的问题也解决了。

5.5、小目标检测

        小目标总是检测不佳,所以我们专门设计神经元去拟合小目标。对于每个区域,我们用2个五元组(c,x,y,w,h),一个负责回归大目标,一个负责回归小目标,同样添加one-hot vector,one-hot就是[0,1],[1,0]这样子,来表示属于哪一类(葫芦娃的头or葫芦娃的葫芦)。此时设计的检测器其实就是YOLO v1思路,只是参数不同。

三、YOLO核心思想

       YOLO是一种新的目标检测方法。以前的目标检测方法通过重新利用分类器来执行检测。后来使用深度学习算法,从R-CNN到Fast R-CNN一直采用的思路是proposal+分类 (proposal 提供位置信息, 分类提供类别信息)精度已经很高,但是速度还不行。

       YOLO提供了另一种更为直接的思路: 直接在输出层回归bounding box的位置和bounding box所属的类别(整张图作为网络的输入,把 Object Detection 的问题转化成一个 Regression 问题)。   

       YOLO将目标检测看作回归问题,从空间上定位边界框(bounding box)并预测该框的类别概率。使用单个神经网络,在一次评估中直接从完整图像上预测边界框和类别概率。由于整个检测流程仅用一个网络,所以可以直接对检测性能进行端到端的优化。

四、YOLO算法系列的演变过程

       YOLO算法系列的演变过程:YOLO->YOLO9000->YOLOv2->YOLOv3

五、YOLO结构

       YOLO整体结构就是三部分组成:GoogleNet+4个卷积+2个FC,思路彩用的就是上面YOLO v0的进化思路,只是参数不同而已。

六、YOLO流程

       通过结构图中我们可以看到,输入图片是4448x448,输出结构是7x7x30,YOLO(是很简单直观的图像处理系统)整体流程大体分为三步:

  • 1、把图像缩放到448X448,图片分成7x7个网格(grid cell)

  • 2、在图上运行卷积网络

  • 3、根据模型的置信度对检测结果进行阈值处理

1、原始图片resize到448x448,图片分成7x7个网格(grid cell)

       原始图片resize到448x448,图片分成7x7个网格(grid cell),某个目标物体的中心落在这些网格中的一个当中,这个网格就负责预测这个物体。例如狗的中心点就落到这些网格中的红色的框(5,2)位置,那么这个红色的框就负责狗这个物体的检测。

       假如我们只检测一个目标狗,此时红框(5,2)这个格子所对应的物体置信度标签为1,而那些没有物体中心点落进来的格子,对应的物体置信度标签为0。这个设定就好比该网络在一开始,就将整个图片上的预测任务进行了分工,一共设定7x7个按照方阵列队的检测人员,每个人员负责检测一个物体,大家的分工界线,就是看被检测物体的中心点落在谁负责的格子里。当然,是7x7还是9x9参数可以自己修改,精度和性能会随之有些变化。

2、在图上运行卷积网络

       CNN提取特征和预测,卷积部分负责提特征。全链接部分负责预测。

       在CNN提取特征后,我们得到 feature maps ,利用Anchor思想,对 feature maps 中每个锚点(对应原图中的某个区域)都预定义 B 个 boublding box,此处为了方便,之后全链接部分负责预测每个网格单元都会预测B个边界框和这些框的置信度分数(confidence scores)。

3、根据模型的置信度对检测结果进行阈值处理

       虽然通过CNN提取特征和预测,但还是会有很多  boublding box,但并不是每个都是我们需要的,所以此时需要根据模型的置信度对检测结果进行阈值处理。

4、图示流程及概述

       原始图片resize到448x448,经过前面卷积网络之后,将图片输出成了一个7x7x30的结构。

       为了方便理解,以图示的方式演示,默认7 x 7个单元格,这里用3 x 3的单元格图演示。

01、每个网格单元都会预测B个(此处让B=2)边界框和这些框的置信度分数(confidence scores) 

02、进行NMS筛选,筛选概率以及IOU

5、概念详解

单元格(grid cell)

       上面第二步是理解YOLO网络的关键。图片输入到YOLO之后只会得到7 x 7 x 30的输出结果。每个网格单元都会预测B个边界框和这些框的置信度分数(confidence scores),这些置信度分数反映了该模型对那个框内是否包含目标的信心,以及它对自己的预测的准确度的估量。

       那么网络输出的 7 x 7 x 30 的特征图怎么理解?

7x7x30

       7x7=49个像素值,理解成49个单元格,也可以理解成 49个 1*1*30,而每个1*1*30维度包含有类别预测和bbox坐标预测。


单元格需要做的两件事:

        每个单元格负责预测一个物体的类别,并且直接预测物体的概率值
        每个单元格预测两个(默认)bbox位置,两个bbox有两个置信度(confidence)

30 的组成:

       30 =  2个 bbox + 20个类别信息
        1个bbox =4个坐标+1个置信度:xmin、ymin、xmax、ymax、confidence
        2个bbox:4 + 1 + 4 + 1 = 10(4个位置信息,1个置信度)
        30 =(4 + 1 + 4 + 1) + 20个类别信息(预测概率结果)

注意:20代表 20类类别的预测概率结果     

           2个bounding box共10个值,对应 1*1*30维度特征中的前10个。

           1个置信度(confidence)代表一个bbox的结果

           xmin、ymin相对于对应的网格归一化到0-1之间,xmax、ymax即 w,h用图像的width和height归一化到0-1之间

小结:(7*7)*30的维度。每个 1*1*30的维度对应原图7*7个cell中的一个,1*1*30中含有类别预测和bbox坐标预测。总得来讲就是让网格负责类别信息,bounding box主要负责坐标信息(部分负责类别信息:confidence也算类别信息)。

6、网格输出筛选

  • 01 置信度比较
  • 02 预测位置大小-回归offset代替直接回归坐标

01、置信度比较

     Pascal VOC上评估YOLO,使用最终大小S=7,预测数量B=2。

一个网格会预测两个Bbox,在训练时我们只有一个Bbox专门负责(一个Object 一个Bbox),那么如何对每个位置预测的两个bbox进行筛选?通过置信度大小比较

        因为每个单元格有两个Bbox,上面评估计算是为了设置两个bbox的目标值,如果该单元格有物体,那么其中一个bbox的位置坐标与GT计算IOU值大的就是1。就由这个Bbox负责预测这个单元格的物体坐标。

        下图是网络真实输出的置信度score和我们设置的目标值进行比较如下图对比。

02 预测位置大小-回归offset代替直接回归坐标 

       每个 bbox 包含5个预测值 (bx,by,bw,bh,bc),不直接回归中心点坐标数值,而是回归相对于格点左上角坐标的偏移量

  • (bx,by) 表示 box 的中心相对于 grid cell 原点的偏移值(原点, 即每个 grid cell 的 top-left 顶点, yolo 将之设置为(0, 0), bottom-right顶点设置为(1, 1), 所以(bx,by) 取值范围一定在(0,1)之内)。

  • (bw,bh) 为相对于整张图片的宽和高, 即使用图片的宽和高标准化自己, 使之取值范围也在(0, 1)之间。

       预测相对于网格单元位置的位置坐标,这使得真实值的界限在0到1之间。由于我们限制位置预测,从而使网络因此参数化更容易学习,更加稳定。

       举例理解:

       如前所述,bx、by、bh、bw是相对于正在处理的网格单元计算而言的。下面通过一个例子来说明这一点。以包含汽车的网格为例,由于bx、by、bh、bw将仅相对于该网格计算。此网格的y标签将为(假设总共只有3个类别,分别是行人(c1)、汽车(c2)和摩托车(c3))y=(1, bx, by, bh, bw, 0, 1, 0),由于这个网格中有一个对象为汽车,所以pc=1, c2=1,现在我们看看如何决定bx,by,bw,bh的取值,论文中分配给所有网格的坐标如下图所示:

        bh是边界框的高度与相应单元网格的高度之比,如图中假设bh=0.9,同理bw=0.5。所以最后预测的结果应该为:y=(1, 0.4, 0.3, 0.9, 0.5, 0, 1, 0)

        注:bx和by将始终介于0和1之间,因为中心点始终位于网格内,而在边界框的尺寸大于网格尺寸的情况下,bh和bw可以大于1。同时关于 yolo 的预测的 bbox 中心坐标是相对于 grid cell 左上角的偏移值, 不是直接预测而是预测偏移值, 但是, 预测的 x, y 可能为负数啊, 这样 (x, y) 就不在该 cell 中了, yolo v2 通过 (sigmoid(x), sigmoid(y)) 来解决这个问题。

7、测试阶段

       yolo 预测的不是类的概率而是类的条件概率,即条件为如果这个 cell 中包含物体(条件),那么这个物体是N 类前景中每一类的概率,即每个框有20个概率值,但是并不会直接使用这个值,这个概率可以理解为不属于任何一个bbox,而是属于这个单元格所预测的值。
       最终: 测试的时候,条件类概率和每个框的预测的置信度值相乘得到每个框特定类别的置信度分数这些分数体现了该类出现在框中的概率以及预测框拟合目标的程度。

       理解:这个乘积即 encode 了预测的 box 属于某一类的概率,也有该 box 准确度的信息。得到每个 box 的 class-specific confidence score 以后,设置阈值,滤掉得分低的 boxes,对保留的 boxes 进行 NMS 处理,就得到最终的检测结果。

非最大抑制(NMS)

      每个Bbox的Class-Specific Confidence Score以后,设置阈值,滤掉概率的低的bbox,对每个类别过滤IoU,就得到最终的检测结果

 

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

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

相关文章

计算机竞赛 机器学习股票大数据量化分析与预测系统 - python 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 机器学习股票大数据量化分析与预测系统 该项目较为新颖&am…

佳节发好文,详细解读HTTP错误状态码产生原因及解决办法

文章目录 HTTP的错误状态码同样适用于HTTPS网页客户端HTTP报错代码服务端原因HTTP错误状态码访问成功状态码访问错误状态码 客户端和服务器端都共同有的报错代码推荐阅读 HTTP(Hypertext Transfer Protocol)是用于在客户端和服务器之间传输数据的协议。当…

【校招VIP】测试算法考点之智力分析

考点介绍: 智力题(逻辑分析题)准备校招的同学们好好准备下,测试笔试中经常遇到。 测试算法考点之智力分析-相关题目及解析内容可点击文章末尾链接查看! 一、考点试题 1.5个囚犯在装有100颗豆子的袋子里摸,他们谁的存活几率大? 5个囚犯,分…

竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 🔥 优质竞赛项目系列,今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖,适合作为竞赛课…

实时显示当前文件夹下的文件大小,shell脚本实现

图片来源于网络,如果侵权请联系博主删除! 需求: 写一个shell终端命令,实时显示当前文件夹下的文件大小 实现: 您可以使用以下的Shell脚本命令来实时显示当前文件夹下的文件大小: while true; docleardu …

【网络教程】超越平凡:一文揭示SSH-keygen的神秘世界

SSH(Secure Shell)是一种网络协议,用于安全地连接到远程计算机。SSH-keygen 是 SSH 协议的一部分,用于生成、管理和转换身份验证密钥对。 SSH-keygen 命令的基本语法如下: ssh-keygen [选项]以下是 ssh-keygen 命令的一些常用选项和参数: -t:指定要生成的密钥类型。例如…

基于传统的三维点云补全方法

目前,三维视觉受到了学术界和工业界的广泛关注,在目标检测、语义分割、三维重建等领域都取得了突破性的进展。然而,一个固有的问题是由于物体遮挡、镜面反射、物体自遮挡、视角变换和传感器分辨率的限制,传感器在真实场景下所获取…

元宇宙安全与著作权相关市场与技术动态:韩国视角

元宇宙市场动态 元宇宙安全与著作权维护技术现状 元宇宙有可能为商业创造巨大价值,尤其是在零售和时尚领域。时尚产品的象征性价值不仅在物理空间中得以保持,在虚拟空间中也是如此。通过元宇宙平台,企业可以开发虚拟产品,降低供…

指针扩展之——数组指针

前言:小伙伴们好久不见,因为刚刚开学事情比较多,所以好久没有更新,还请大家见谅。 那么从今天开始,博主承诺每周至少会出1-2篇博客,感谢小伙伴们的支持! 今天这篇文章,我们一起来了…

06-Redis缓存高可用集群

上一篇:05-Redis高可用集群之水平扩展 1.集群方案比较 哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master&#xff0c…

C++之ostream操作函数operator<<、operator=、put、write、tellp、seekp、flush、swap总结(二百零八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

数据结构 > 算法的时间复杂度(1)

目录 1.算法效率 1.1如何衡量一个算法的好坏 1.2算法的复杂度 1.3复杂度在校招中的考察 2.时间复杂度 2.1时间复杂度的概念 2.2大O的渐进表示法 2.3特殊情况 1.算法效率 1.1如何衡量一个算法的好坏 如何衡量一个算法的好坏呢?比如对于以下斐波那契数列&…

定积分的性质:不等式性质与中值定理

目录 定积分的不等式性质 定积分的中值定理 定积分的常用计算公式 定积分的不等式性质 定积分的不等式性质主要包含两个方面:定积分的绝对值性质和估值定理。 首先,定积分的绝对值性质可以表述为:如果函数f(x)在区间[a,b]上可积&#xff…

Talk | 北京通用人工智能研究院黄思远:让通用智能体理解三维世界

本期为TechBeat人工智能社区第530期线上Talk! 北京时间9月13日(周三)20:00,北京通用人工智能研究院研究科学家—黄思远的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “让通用智能体理解三维世界”,他分享了现有…

基于Pandas+余弦相似度+大数据智能护肤品推荐系统——机器学习算法应用(含Python工程源码)+数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Pycharm 环境 模块实现1. 文件读入2. 推荐算法1)数据预处理2)计算相似度3)排序并提取产品4)组合推荐算法 3. 应用模块1)得到最终产品2)筛选过…

【JavaEE】多线程(一)

多线程(一) 文章目录 多线程(一)进程操作系统进程PCB属性进程的状态进程的优先级进程的上下文CPU寄存器 进程的记账信息虚拟地址空间 线程线程与进程的区别 Java进行多线程编程 在了解多线程之前,我们先聊聊进程 进程 …

IO day6

1->x.mind 2-> #include <myhead.h> char c; ssize_t res1; //互斥锁 pthread_mutex_t mutexPTHREAD_MUTEX_INITIALIZER; //创建条件变量 pthread_cond_t condPTHREAD_COND_INITIALIZER; int flag0;//0:打印 1&#xff1a;倒置 void* callBack1(void* arg) { …

Python爬虫:获取必应图片的下载链接

文章目录 1. 前言2. 实现思路3. 运行结果 1. 前言 首先&#xff0c;说明一下&#xff0c;本篇博客内容可能涉及到版权问题&#xff0c;为此&#xff0c;小编只说明一下实现思路&#xff0c;至于全部参考代码&#xff0c;小编不粘贴出来。不过&#xff0c;小编会说明详细一些&a…

Mybatis系列之核心分析

文章目录 一、Mybatis的前世1、简述&#xff1a;2、什么是JDBC&#xff1a;3、什么是驱动&#xff1a;4、JDBC的开发步骤&#xff1a;《1》注册和加载数据库驱动《2》获得数据库连接《3》获得语句执行对象&#xff0c;然后执行SQL语句&#xff0c;获取执行结果&#xff0c;最后…

问道管理:机器人产业迎催化 黄金价格或将突破前高

昨日&#xff0c;沪指盘中震动下探&#xff0c;一度跌近1%逼近3100点&#xff0c;尾盘逐步止跌&#xff1b;深成指、创业板指均跌超1%。截至收盘&#xff0c;沪指跌0.45%报3123.07点&#xff0c;深成指跌1.14%报10255.87点&#xff0c;创业板指跌1.14%报2027.73点&#xff0c;科…