Yolov1算法原理

Yolov1算法原理

YOLOv1(You Only Look Once version 1)是一种用于目标检测的深度学习算法。它由Joseph Redmon等人于2016年提出,是一种基于单个卷积神经网络的实时目标检测算法。

相比于传统的目标检测算法,YOLOv1具有更快的检测速度和更高的准确性。它将目标检测任务转化为一个回归问题,通过在图像上划分网格并预测每个网格中是否包含目标以及目标的位置和类别来实现目标检测。

YOLOv1的主要特点包括快速的检测速度、端到端的训练和预测、对多个目标的同时检测以及对小目标的检测效果较好。它在目标检测领域取得了较大的成功,并成为了后续YOLO系列算法的基础。

总的来说呢,相比于传统的图像分类任务。yolo的特点就是输入一张图片后能够非常快的检测出图片上的不同的物体并且画出检测框。特点就是快,一秒能处理几十 帧图片。

首先看一下yolov1的网络结构图

img

很明显就是一堆卷积池化卷积池化,然后加一个全连接层。不过中间的部分都不重要,就当成黑盒子。

我们只需要关注它的输入和输出是什么。

先看输入

img

  1. 我们可以看到输入图片尺寸为448x448x3(注意图片的尺寸是固定的)。然后将输入图片平均划分为SxS个网格(grid)。论文中S=7为7x7总共49个网格。

  2. 然后每一个网格会预测出B个检测框(bounding box)(论文中B=2)。每个检测框由5个值组成(x, y, w, h, confidence)。前面就不用说了,confidence代表该检测框中是否含有对象的置信度(0或1)和该检测框框住的内容与真实的标注框吻合度有多高(IOU重合度)两重信息。

  3. 每一个网格(注意是网格不是检测框)会预测出一共有C个类别的概率分数。这个分数基于网格与检测框无关。

我们再看输出

【目标检测】(5) YOLOV1 目标检测原理解析_yolov1原理-CSDN博客

可以看到输出为一个7x7x30的张量。而7x7就是那49个网格,那30代表什么呢?我们取出其中一个网格的向量来看:

在这里插入图片描述

前面为box1和box2都包含了(x, y, w, h, confidence)五个信息,后面20个则为该网格预测的二十个类别的分数(比如猫,狗,汽车,自行车等20个类别的概率)。

总结来说yolov1网络输出就是一个7x7x30的张量。用公式表达就是SxSx(B * B + C)的张量。

在讲下一部分前我简单说一下刚开始学习原理可能存在的困惑。我们看到下图中最后那个输出结果的三个检测框。刚开始我以为检测框是中间多个单元格组合而成的,其实并不是。一个检测框就是上述所说的其中一个单元格其中一个bounding box而已。而每个单元格是独立的,它所预测的检测框可大可小,但是检测框的几何中心一定在该单元格内。如果某一个预测框刚好最接近真实标注框时,则会保留到最后我们看到的样子。

可以看到中上图总共有49x2=98个预测框,而框的粗细的代表了confidence的大小。

喜欢抠细节的童鞋可以继续看:

  • 首先一个预测框为(x, y, w, h, confidence),其中x, y为预测框中心位置坐标,并且这个坐标是相对于所在单元格左上角的偏移量,大小为单元格相对大小。w, h为预测框的宽高,大小为整张图片的占比。所以(x, y, w, h, confidence)值理论上都在[0,1]的。
  • 其次是20类别的分类是相对于每个单元格的概率分数。也就是说该单元格(grid)无论预测出多少个预测框,都只有一组类别概率值。
  • 什么是 I O U pred truth IOU^{\text{truth}}_{\text{pred}} IOUpredtruth,通俗来讲就是预测框和真实框的重叠层度,重叠度越高就说明预测得越好。
  • 还有就是那二十个类别的概率是条件概率,也就是在预测框预测物体的条件下某一类别的条件概率。也就是各个预测框的置信度下的类别概率,即Pr(class|object)。然后把预测框的置信度(confidence)与该单元格的类别概率相乘,就是各个预测框的类别置信度(class-specific confidence score): P r ( c l a s s ∣ o b j e c t ) ∗ P r ( o b j e c t ) ∗ I O U pred truth = P r ( c l a s s ) ∗ I O U pred truth Pr(class|object)*Pr(object)*IOU^{\text{truth}}_{\text{pred}}=Pr(class)*IOU^{\text{truth}}_{\text{pred}} Pr(classobject)Pr(object)IOUpredtruth=Pr(class)IOUpredtruth。所以相乘后就是目标物体的全概率。

在这里插入图片描述

接着我们来说一个7x7x30的张量是怎么转换到最终呈现的结果的

在这里插入图片描述
你看如果我们每一个单元格(grid)都预测出两个框,那就会产生出很多框,而框的颜色代表不同类别。那么我们就需要把那些没用的检测框给过滤掉,只需要保留我们需要的框就可以了。

而如何过滤掉没用的检测框呢。就要用到非极大阈值算法(NMS)。

我们首先得到了是7x7x30的张量。

在这里插入图片描述

我们取出每一个单元格(grid cell)。前面已经知道每个单元格包含2个bounding box和20个类别概率分数。把每一个bounding box的置信度(confidence)和20个类别条件概率相乘。就得到类别置信度,也就是该预测框20个类别的全概率。可以看到就是图中20x1的长条。然后每个单元格有两个预测框(bounding box)都这样操作。总共就得到98个长条。每个长条就代表每一个预测框20个类别的概率是多少。

在这里插入图片描述

可视化每一个长条就是以下的每一个检测框:

在这里插入图片描述
然后我们拿到这98个长条就要开始把多余的检测框毙掉。接下来进入正题(非极大阈值算法(NMS)):

首先我们看一下什么是NMS

目标检测入门之非最大值抑制(NMS)算法 - 墨天轮

也就是说如果同一个目标同时预测出多个检测框,那我们就需要保留置信度最高的检测框,毙掉重复的检测框。看下图,对于每一个向量,从上到下有20个类别概率。先看第一个类别,也就是说每一个预测框的第一个数值就是第一个类别概率。我们先假设一个阈值为0.2,低于0.2的概率直接设为0。然后从高到低进行排序。

在这里插入图片描述
然后我们取出每个长条的第一个值,也就是第一个类别(假设第一个类别为狗)。取出概率最高的预测框。然后把后面每一列的预测框都和最高的这个进行IOU比对。

在这里插入图片描述

如果IOU大于某一个阈值(默认0.5),也就是说重叠度过高,相对于重复检测了同一个物体,就把概率低的预测框毙掉,永远设为0。直到后续所有框都和第一个框对比完。当然如果其中某一些框和第一个框IOU没用超过阈值,那它就会暂时保留,然后再拿该框(概率第二高、第三高…)后面所有的框和它进行比对,去除重叠框,以此类推。直到所有框都被处理完毕。

这个方法就可以有效去除对于同一个目标重复的检测框。当然如果图片中有同一类别多个物体,也能够同时被检测出来。

在这里插入图片描述

上述呢只是对狗这一个类别的预测框去除。接下来还有20个类别每一个类别的操作都和上面一样。最终就得出检测算法的结果。也就是最终呈现的结果。

在这里插入图片描述

值得注意的是,NMS算法中已经被去除的框则永远打入冷宫,就不会影响后续的计算了。

NMS算法是针对同一类别预测框的重叠情况。不同类别的预测框是相互独立的,分别计算的。不同类别的预测框是互不干扰的。

NMS不参与模型训练的反向传播过程。也就是说这仅限于预测阶段才会使用到NMS去剔除框,训练时每一个框都需要参与反向传播,不能随便剔除,所以训练阶段不使用NMS算法。具体看后面的损失函数详解。

通过上述讲解呢可以比较清晰认识yolo是如何检测出目标并且呈现出最终结果的
接下来就是yolov1训练过程

注意训练过程和预测过程要分开理解,区别还是有的。

我们都知道yolo是典型的监督学习,训练阶段都需要人工标注好真实框和它的类别,也就是下面的绿框。而算法就是让预测框尽可能去拟合这个绿框,让损失函数最小化。

那么用哪个预测框去拟合标注框呢?就是标注框的中心点落在哪个单元格内(grid cell),就由这个单元格的其中一个预测框去拟合标注框。也就是图中绿色小圆点所在的单元格。

在这里插入图片描述

并且该单元格预测的类别(就是那20个条件概率*confidence)中标志类别应该是最大的。换句话说每一个单元格只能预测出一个类别,也就是20个类别概率最大的值就是该单元格预测出的类别。所以49个单元格最多能预测出49个物体。

前面已经说过每个单元格(grid cell)会预测出两个框,那么由哪个去拟合标注框呢。肯定使用和标注框IOU较大的预测框去拟合。也就是和标注框更接近的预测框。那另一个就会打入冷宫(不过这里和前面意思不太一样,因为即使它不预测物体,也要参与损失函数计算,让其置信度尽可能小)

在这里插入图片描述
那么那些背景板的单元格,它预测出的两个框就都打入冷宫,在梯度下降时让其置信度尽可能小就行了。

在这里插入图片描述

损失函数

通过上面的讲解我们大概知道了训练的流程。在讲损失函数的公式前。我们可以先思考一下在训练时需要更新那些参数才能让预测框慢慢逼近标注框呢。我们知道一个单元格的向量为两个预测框(bounding box)的参数(x, y, w, h, confidence)与20个类别概率。

  • 首先是位置误差:就是预测框(bounding box)和标注框(ground truth)的中心坐标(x, y)的误差,还有他们的大小也就是(w, h)的误差。

  • confidence误差:值得注意的是,首先一张图片有多个单元格(grid cell),并不是每一个单元格都包含有目标物体,所以就分为包含物体(coord)和不包含物体(noobj)两种情况。所以confidence标签值有两个值:包含object(1),不包含object(0)。并且上面也说到,一个grid cell有两个bbox,我们只取其中和ground truth的IOU较大的bbox进行误差计算,并且预测值confidence就是这个IOU。

  • 分类误差

先看损失函数:

img

看起来很复杂,其实拆开看就很简单,分别就是

  1. 坐标预测(包括预测框定位误差、预测框尺寸误差)

  2. confidence预测误差。可以看到包含object和不包含object是分开计算的

  3. 类别预测误差

很明显他们采用的都是均方差误差计算损失函数,所以可以当作回归问题。

里面有几个细节提一下,首先可以看到一些公式前有权重参数 λ coord \lambda_{\text{coord}} λcoord λ n o o b j \lambda_{noobj} λnoobj。那么这些值的大小有上面影响呢?

我们知道在一张图片里大多数情况下大部分单元格里是没有任何目标物体(object)的。**而这些不包含任何物体的网格的bbox就不关心它的坐标损失,因为根本没坐标给它收敛,所以只计算它的confidence,让其尽可能小。**这些网格预测框就会将confidence推向0,就会影响到那些少数包含物体的网格的confidence的更新。可能会造成梯度消失,影响模型收敛等问题。所以进行加权,增加包含目标物体预测框的惩罚力度,降低不包含目标物体预测框的惩罚力度。让模型更加关注正确的目标。

在这里插入图片描述
其次就是在计算宽高误差时为什么要开平方根呢?这是为了让小框对误差更加敏感。比如说同样的偏差,让小框造成的损失函数比大框更大。通俗来讲在更新预测框时让大框少变化一点,小框多变化一点。

在这里插入图片描述

结语

到这里yolov1的算法基本已经了解差不多啦,包括它的前向推理和损失函数的的计算。其实现在yolo发展得非常快,也有非常多的学者在yolo上面做出了很多改进去应用到目标检测中。所以要对yolo进行改进的话,yolov1的本质思想是绕不开的话题。希望本篇文章对于大家了解yolo的算法有帮助。

参考b站视频:

https://www.bilibili.com/video/BV15w411Z7LG/?spm_id_from=333.999.0.0&vd_source=a63f559953dd220f07d649ea188d78a2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜀黍鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值