YOLO原理

YOLO(You Only Look Once)是一种实时目标检测算法,YOLO5是其第五个版本。与传统的目标检测算法使用分类和回归算法不同,YOLO5使用了单个神经网络来直接预测边界框和类别。以下是YOLO5的原理:

  1. 将输入图像分割成网格:YOLO5将输入图像分成S×S个网格,每个网格负责检测一个目标。如果一个目标的中心点在某个网格内,那么就会在该网格内拟合出一个边界框。

  2. 提取特征向量:使用卷积神经网络提取每个网格的特征向量,该特征向量代表了该网格内目标的特征。

  3. 预测边界框和类别:对于每个网格,使用全连接层来预测一个或多个边界框,以及每个边界框可能的类别和置信度得分。

  4. 预测结果的后处理:对于每个目标,选择置信度最高的边界框。然后,根据非极大值抑制(NMS)算法去掉重复边界框并选择最终的目标框。

相对于YOLOv4和其之前的版本,YOLOv5引入了一些新的技术,例如自适应卷积网络和多尺度训练等,以进一步提高性能和结果的准确性。

文章目录

  • 1. YOLO1的模型框架
  • 2. 模型输入
    • 2.1 abel标记
    • 2.2 data文件夹
  • 3. 模型输出
    • 3.1 输出张量
    • 3.2 (x, y, w, h, c)
    • 3.3 置信度 confidence
    • 3.4 训练集里的(x,y)和模型中的(x,y)
  • 4. 损失函数
    • 4.1 损失函数设计思想
    • 具体损失函数
    • 4.2 边界框定位误差
    • 4.3 边界框尺寸误差
    • 4.4 置信度误差
    • 4.5 分类误差
  • 5. YOLO检测流程
    • 5.1 边界框拟合
    • 5.2 视频、摄像头检测
  • 6. 非极大值抑制(NMS)算法
    • 6.1 NMS算法的连续计算
    • 6.2 被移除的框体将被永久移除
    • 6.3 不同类别之间计算NMS
    • 6.4 非极大值抑制算法不参与模型训练过程
    • 6.5 置信度和IOU阈值
  • 参考资料

1. YOLO1的模型框架

YOLO原理_第1张图片

YOLO1中使用了24个卷积层,并在后面连接了两个全连接层
YOLO原理_第2张图片
卷积层的参数:
7764-s-2 表示为 卷积核为7*7,共有64个通道,s-2表示步幅为2,没有填充的情况下

2. 模型输入

2.1 abel标记

给YOLO模型标记数据,可使用LabelImg进行标注,简单易操作

conda install pyqt=5 # 安装依赖包 pyqt
pip install labelimg -i http://pypi.douban.com/simple/  #安装labelimg
labelimg 输入labelimg就可打开labelimg软件

进一步的labelimg操作可以查看该博客
通过labelimg
YOLO原理_第3张图片
每个图像对应一个txt文件,文件每一行为一个目标的信息,包括class, x_center, y_center, width, height格式。

2.2 data文件夹

YOLO进行训练的data文件夹格式
YOLO原理_第4张图片
其中labels是通过imagelabel输出的边界框文件,一个图像对应一个yolo_txt文件,所以YOLO模型的输入是以文件夹的结构进行输入的。然后在images文件夹下进一步放置了train文件夹、val文件夹、test文件夹以及相应的图片数据。而了labels文件夹理解与上面相同。

3. 模型输出

3.1 输出张量

YOLO算法的预输出框体个数
YOLO算法中将输入的图像分成了 S x S 个大小相同的网格 (grid),其中每个网格对于整张图像都是固定大小的。对于每个网格而言,模型会输出 B 个边界框 (bounding box) 以及它们对应的置信度和类别预测结果,该边界框会被作为目标物体检测结果的一部分。网络会根据每个边界框的置信度来判断它是否能够预测出正确的目标。相应地,每个边界框的位置是通过相对于当前网格的位置进行预测的,在整张图像中的位置需要根据网格的尺寸和边界框的位置进行计算。如果同一个目标被多个网格分配,模型只处理边界框置信度最高的那个网格所对应的边界框。通过这种方式,YOLO能够快速准确地对图像中的目标进行检测。
YOLO原理_第5张图片
在YOLO1中,YOLO的输出是一个SS(B5 + C)的张量

  • S*S 模型最初将整个图像数据切分为S * S的网格图像,也就是长和宽都分别分成S分,从而获得SS个网格子图像。**那模型是如何控制输出SS格的预测的呢,是通过设置最后输出张量的第1,2数轴为S实现的。**
  • B 模型的一个超参数,通过设置每个网格需要输出多少个边界框
  • 5 模型每个边界框有5个参数,(x , y , w, h, confs)
  • C 模型需要学习的分类类别,因为机器学习里都是将分类类别独热化处理(one-hot),因此模型需要全局学习多少个类别,C就是多少。需要注意的是,论文中指出每个网格只预测一组类别,无论对于每个网格需要预测多少个边界框B,也就是默认该网格中的输出B个边界框都是相同的类别。 每个网格单元只负责检测一个物体,因此只需要为每个网格单元预测一个class probabilities(类别概率),而不是为每个边界框都预测。 这样可以避免模型过度接近于较容易检测到的对象,而忽略了更难以检测到的对象。同时,这也减少了前向传播过程中的计算量,从而提高了模型的效率。

在YOLO1中,作者给出了YOLO1的模型输出具体参数

  • S = 7
  • B = 2
  • C = 20
  • 输出 为 7 * 7 * 30 的张量

3.2 (x, y, w, h, c)

  • (x, y) 坐标位置代表边界框相对于网格边界的位置
  • (w, h) 检测目标的长宽是相对于整个图像的长宽,即归一化后的
  • confidence 置信度是预测边界框和实际中的框体之间的IOU

3.3 置信度 confidence

YOLO算法中的置信度是通过训练网络模型来学习得到的。具体来说,在训练过程中,对于每个边界框,YOLO会计算其是否包含物体以及其与真实边界框之间的IOU(Intersection Over Union)重合度,即判断该框是否能够准确地覆盖住目标物体。根据这些计算结果,可以通过二分类模型(即物体是否存在的判断)和回归模型(即边界框的位置和尺寸)来预测每个边界框的置信度。

在YOLO算法中,置信度被定义为包含物体的概率与IOU得分的乘积,即objectness score = Pr(object) × IOU。其中,Pr(object) 表示一个给定边界框所包含的物体的概率,它是通过对数据集进行标注来得到的,而 IOU 分数则是通过预测的边界框与真实边界框之间的IOU值计算得出的。 对于每个边界框,如果其 IOU 值大于一定阈值 (一般使用0.5),则认为此边界框与其对应的物体高度匹配,否则,该边界框被视为负样本(即不包含物体)。至此,我们就可以在训练过程中计算出每个边界框的置信度,从而可以对识别结果进行排序和筛选,保留置信度最高的预测结果作为最终的检测结果。

Pr(object) 表示一个给定边界框所包含的物体的概率,是根据数据集中的标注信息来进行计算的。对于数据集中的每个目标物体,我们将其标注为一个矩形框,并将目标物体的类别、矩形框的位置和尺寸都记录下来。在模型训练过程中,最终的目标是让网络能够根据图像中的像素信息,同时预测出每个物体所属的类别、物体的矩形框位置以及每个矩形框所包含物体的概率。

因此,在训练过程中,对于每个矩形框而言,我们需要在数据集中检查该矩形框所属的物体类别是否与当前训练的模型所预测的类别匹配。如果不匹配,则该矩形框被视为背景,属于负样本(不包含目标);如果匹配,则该矩形框被视为正样本(包含目标)。对于每个正样本,我们需要计算该矩形框所包含物体的概率,即 Pr(object) 值。在YOLO算法中,Pr(object) 由两部分组成:一部分是矩形框中心所属的网格单元格所负责的边界框数目的倒数,另一部分则是目标物体中心点与矩形框中心点之间的距离(按单元格大小归一化)。具体地,对于每个正样本矩形框而言,其 Pr(object) 值由如下公式计算:

P r ( o b j e c t ) = 1 S 2 + α × I O U p r e d t r u t h Pr(object) = \frac{1}{S^2} + \alpha \times IOU^{truth}_{pred} \\ Pr(object)=S21+α×IOUpredtruth

α \alpha α是一个超参数,通常为1, I O U p r e d t r u t h IOU^{truth}_{pred} IOUpredtruth则是预测边界框和真实边界框之间的IOU得分。这些正样本矩形框的 Pr(object) 值都是通过标注信息来计算得到,在训练过程中反向传播梯度进行训练,从而让模型能够自适应地学习到每个矩形框是否包含物体这一信息。

这个公式是YOLOv1算法中计算目标置信度(objectness score)的公式,其中 S S S是图像的网格数量, α \alpha α是一个超参数, I O U t r u t h p r e d IOU_{truth}^{pred} IOUtruthpred是预测框和真实框之间的交并比(IoU)。

具体而言,此公式的含义是,网络预测的每个边界框中都有一个对象的概率和框的位置和大小有关,即 P r ( o b j e c t ) = I O U t r u t h p r e d × P ( o b j e c t ) Pr(object) = IOU_{truth}^{pred} \times P(object) Pr(object)=IOUtruthpred×P(object)。在YOLOv1中, P ( o b j e c t ) P(object) P(object)这一项的计算方法是基于边界框的大小和位置,以及其是否与实际对象一致等因素综合计算得出。具体而言,这部分的计算公式为 1 S 2 + α × I O U p r e d t r u t h \frac{1}{S^2} + \alpha \times IOU^{truth}_{pred} S21+α×IOUpredtruth。其中,第一项 1 S 2 \frac{1}{S^2} S21表示网络预测的该边界框是否包含目标的先验概率,也就是说,如果没有目标,在采样一张图片中预测出包含目标的边界框的概率也是很小的,因此引入一个先验概率。第二项 α × I O U p r e d t r u t h \alpha \times IOU^{truth}_{pred} α×IOUpredtruth为IoU的置信度值,它用来表示边界框是否与目标框相似。其中, α \alpha α是一个超参数,用来平衡先验概率和IoU的贡献。

在YOLOv2及之后的版本中,目标置信度的计算方式被改进为只考虑交并比的影响。具体而言,目标置信度的计算公式为 P r ( o b j e c t ) = I O U t r u t h p r e d Pr(object) = IOU_{truth}^{pred} Pr(object)=IOUtruthpred,其中, I O U t r u t h p r e d IOU_{truth}^{pred} IOUtruthpred为预测框与真实框之间的交并比。如果 I O U t r u t h p r e d IOU_{truth}^{pred} IOUtruthpred大于某个设定的阈值,则被认为这个预测框框住的区域内存在一个物体。如果 I O U t r u t h p r e d IOU_{truth}^{pred} IOUtruthpred小于阈值,则将其置信度设为0,表示该预测框不包含目标。

3.4 训练集里的(x,y)和模型中的(x,y)

在YOLO算法中,边界框的中心点是指边界框的中心,即边界框长方形对角线的交点。在物体被检测后,YOLO算法可以通过边界框中心点的位置来确定物体在图像中的位置和大小。
YOLO原理_第6张图片
论文中,还有对(x,y)说是相对于网格Grid的坐标。这个该如何理解呢?参考博客
训练集里的(x,y)
手动大框的是我们人工识别出来的物体,相对于整个图像的中心位置的信息
模型中的(x,y)
会根据Grid的位置进一步计算相对坐标,其中上图的S/width(注:这里的S并不是切分图片的S个的S,而是作者假设每个Grid的长度S,应该等于width/S个,或者说S/width = 1/S个)
在YOLO中,使用相对于网格的坐标位置作为输出的x,y坐标可以帮助提升检测的精度。

那么YOLO中的输出x,y为什么是相对于网格的相对坐标位置,而不直接用预测相对于整张图像的相对坐标位置
将bounding box的位置表示为相对于网格的坐标位置,相对于图像绝对位置的变化对网络输出的影响就会更小。这意味着模型会更加关注局部特征,而不会受到图像中不同目标之间的绝对位置关系的影响,从而可以更好地进行物体检测。

此外,使用相对于网格的坐标位置也有助于缩小目标的坐标范围,从而使坐标值的范围集中在0到1之间,避免了模型输出极大值或极小值导致训练不稳定的问题。

总之,在YOLO中使用相对于网格的坐标位置作为输出的x,y坐标可以带来多方面的优点,包括更好的检测精度和更稳定的训练。

4. 损失函数

4.1 损失函数设计思想

YOLO模型通过学习图像中每个框的置信度和相应的类别概率,然后计算预测边界框与真实边界框之间的坐标误差和置信度误差的平方和作为损失函数。对于每个边界框,模型会预测其中心坐标、宽度、高度和置信度值,同时评估其是否包含图像中的对象。这样,YOLO可以将边界框预测任务转化为一个回归问题,从而在单次前向传递中预测图像中的所有边界框和类别信息。

回归问题通常设计损失函数的方法是构建离差平方和。论文中,作者也是对不同的预测值计算其误差平方和。误差平方和有方便计算,而且导数性质良好的特点。
论文中还有几个假设

存在问题:

  1. 位置预测误差和置信度误差是等权重的,这显然是不合理的。8维(B * 4) 的位置信息 与20维©的类别信息的重视程度是不一样的
  2. 在每张图片中,许多网格单元格都不包含任何物体。这会将这些单元格的“置信度”得分推向零,常常压制那些确实包含物体的单元格的梯度。也就是说这些零的置信度会在方向传播的过程中影响权重的更新,因为没有物体的网格的目标值是0。一方面,不包含任何物体的网格单元数量多,从而其对误差的影响大。另一方面,置信度 confidence 等于0, 可能会使模型存在梯度消失的问题。 进而压制包含物体的单元格的权重更新。
    这里为什么不对不包含任何物体的网格的坐标信息也加以限制呢,他们应该也是0之类的值?因为对于包含物体的网格,模型采用回归分支输出的bounding box坐标信息、分类分支输出的类别置信度信息以及该bounding box内物体出现的置信度信息共同构成损失函数,而对于不包含物体的网格,只采用该bounding box的置信度信息计算损失函数。该怎么理解呢,当我们知道一个框体的置信度为0之后,我们就不会去关注他的坐标信息了。所以在损失函数中,对于不包含具体物体的框体,我们只计算其置信度误差 confidence error。
  3. 由于图片中的边界框(Boundary box) 往往大小不一。对于大框来说,比如10单位的大框,0.5的位置偏差是能够接受的(1/20);但是对于小框来说,比如2单位的小框,0.5的位置偏差就会代买明显的视觉偏差了(5/20)。也就是说大方框中的小偏差比小方框中的小偏差更不重要。 为了部分地解决这个问题,我们预测边界框宽度和高度的平方根,而不是直接预测宽度和高度。

解决方案:

  1. 对于问题1和问题2,论文中通过对不同误差来源进行加权处理,从而使更重要的部分的误差对模型的影响更大。增加了边界框坐标预测的损失并减少了不包含物体的框的置信度预测的损失。 使用两个参数,λcoord和λnoobj来完成这个过程。设置λcoord = 5和λnoobj= .5。如果将所有的损失函数都设置为相同的权重,模型很容易受到这些值为0的bounding box的损失函数的影响,从而无法有效地往其他方向调整,导致训练不稳定以及收敛困难。因此,YOLO1中采用的这个不对称的损失函数来平衡这个问题。在这种方式下,当不包含物体的网格的预测置信度为0时,该网格的损失函数权重为λnoobj,远远小于包含物体的网格的损失函数权重λcoord。这种不对称的权重设置有效地平衡了这个问题,提高了训练的稳定性。
  2. 对于问题3,论文中,通过将box的width和height取平方根代替原本的height和width。 如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。
    YOLO原理_第7张图片
问题3的图解,图片来自网络

具体损失函数

一个网格预测多个bounding box,在训练时我们希望每个object(ground true box)只有一个bounding box专门负责(一个object 一个bbox)。具体做法是与ground true box(object)的IOU最大的bounding box 负责该ground true box(object)的预测。这种做法称作bounding box predictor的specialization(专职化)。每个预测器会对特定(sizes,aspect ratio or classed of object)的ground true box预测的越来越好。

  • λcoord
    更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为在pascal VOC训练中取5。
  • λnoobj
    对没有object的box的confidence loss,赋予小的loss weight,记为在pascal VOC训练中取0.5。
  • 类别权重等于1
    有object的box的confidence loss和类别的loss的loss weight正常取1。

YOLO原理_第8张图片
对于包含物体的网格,模型采用回归分支输出的bounding box坐标信息、分类分支输出的类别置信度信息以及该bounding box内物体出现的置信度信息共同构成损失函数,而对于不包含物体的网格,只采用该bounding box的置信度信息计算损失函数。
YOLO原理_第9张图片

图片来自网络

4.2 边界框定位误差

当检测目标物体时,YOLO v1中使用的损失函数包括定位误差,分类误差和是否包含物体的误差。如果一个网格中包含物体,则它的中心点预测会影响定位误差和是否包含物体的误差。下面是符号表示的损失函数:

λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i , j o b j [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] \lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^B \mathbb{1}_{i,j}^{obj}\left[(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2\right] λcoordi=0S2j=0B1i,jobj[(xix^i)2+(yiy^i)2]

其中,

  • λ c o o r d \lambda_{coord} λcoord是定位误差的权重系数,
  • S S S是输入图像中每行列分割的网格数,
  • B B B是每个网格预测的边界框数,
  • 1 i , j o b j \mathbb{1}_{i,j}^{obj} 1i,jobj是一个指示函数,如果第 i i i个网格中的第 j j j个边界框与实际包围框重叠,其值为1,否则为0。
  • x i , y i x_i, y_i xi,yi是第 i i i个网格的中心点的真实值, x ^ i , y ^ i \hat{x}_i, \hat{y}_i x^i,y^i是它们的预测值。

4.3 边界框尺寸误差

λ coord ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] \lambda_{\text{coord}}\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^{\text{obj}}\left[ (\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2\right] λcoordi=0S2j=0B1ijobj[(wi w^i )2+(hi h^i )2]
其中,

  • λ coord \lambda_{\text{coord}} λcoord是定位误差的权重系数,
  • S S S是输入图像划分为的网格数,
  • B B B是每个网格预测的边界框数,
  • 1 i j obj \mathbb{1}_{ij}^{\text{obj}} 1ijobj是指示函数,如果第 i i i j j j列包含物体,其值为1,否则为0。
  • w i , h i w_i,h_i wi,hi是第 i i i j j j列的边界框的宽和高, w ^ i , h ^ i \hat{w}_i,\hat{h}_i w^i,h^i是它们的真实值。 ⋅ \sqrt{\cdot} 是对应项开方。

4.4 置信度误差

∑ i = 0 S 2 ∑ j = 0 B 1 i , j o b j [ C i − C ^ i ] 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B 1 i , j n o o b j [ C i − C ^ i ] 2 \sum_{i=0}^{S^2}\sum_{j=0}^B \mathbb{1}_{i,j}^{obj}\left[C_i-\hat{C}_i\right]^2+\lambda_{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^B \mathbb{1}_{i,j}^{noobj}\left[C_i-\hat{C}_i\right]^2 i=0S2j=0B1i,jobj[CiC^i]2+λnoobji=0S2j=0B1i,jnoobj[CiC^i]2

  • λ n o o b j \lambda_{noobj} λnoobj是不包含物体网格的置信度误差的权重系数,
  • S S S是输入图像中每行列分割的网格数,
  • B B B是每个网格预测的边界框数,
  • 1 i , j o b j \mathbb{1}_{i,j}^{obj} 1i,jobj是一个指示函数,如果第 i i i个网格中的第 j j j个边界框与实际包围框重叠,其值为1,否则为0。
  • 1 i , j n o o b j \mathbb{1}_{i,j}^{noobj} 1i,jnoobj是一个指示函数,如果第 i i i个网格中的第 j j j个边界框与实际包围框重叠,其值为0,否则为1。
  • C i C_i Ci是第 i i i个网格的预测框体的置信度真实值,其实通过计算每个预测边界框与最匹配的真实边界框之间的IOU(交并比) C ^ i , \hat{C}_i, C^i,是它们的预测值。

YOLO是通过模型学习一个置信度然后再根据已规定的置信度计算公式计算预测框体与真实框体之间的置信度,再将学习的置信度与计算得到的置信度计算置信度误差。
在目标检测模型中,实际上并不存在"真实置信度"这个概念,因为置信度这个指标是模型根据训练数据所学习到的。在训练过程中,每个边界框的真实类别和位置信息都是已知的,对于每个预测边界框,可以计算其与最匹配的真实边界框之间的IOU(交并比),如果其IOU高于设定的阈值,则该框被认为是正样例。 在此基础上,可以计算每个边界框的置信度误差,并采用各种优化算法(如基于梯度的反向传播)来更新模型参数,使模型在后续的预测过程中尽可能准确地预测图像中的对象。因此,可以说模型在训练中所学习到的置信度是基于真实标注数据来计算的,而在预测时,模型直接将置信度作为一个输出标记,以衡量一个边界框是否包含物体。同时,对于预测结果中的每一个边界框,如果其IoU高于设定的阈值,则认为该框体是一个正样本,并计算其置信度误差的平方。
所以置信度误差是通过计算预测框体的置信度和真实框体的交并比(IOU)之间的差异,用于衡量预测框体的置信度的准确性。

4.5 分类误差

在损失函数中,还要同时考虑每个网格预测的边界框中是否包含实际目标物体。如果包含,则边界框中包含物体的置信度和真实值之间的误差应该是较小的,否则误差应该是较大的。下面是目标检测部分的损失函数:

∑ i = 0 S 2 1 i , j o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p ^ i ( c ) ) 2 \sum_{i=0}^{S^2}\mathbb{1}_{i,j}^{obj}\sum_{c\in classes}\left(p_i(c)-\hat{p}_i(c)\right)^2 i=0S21i,jobjcclasses(pi(c)p^i(c))2

其中,

  • p i ( c ) p_i(c) pi(c)是在第 i i i个网格中预测的边界框中包含对象类别 c c c的的概率, p ^ i ( c ) \hat{p}_i(c) p^i(c)是它们的真实值。
  • i , j i,j i,j是指向包含物体的窗口时, 1 i , j o b j = 1 \mathbb{1}_{i,j}^{obj}=1 1i,jobj=1,否则为0
  • 此外,为什么没有对每个网格内的预测框体B求和呢?也就是没有 ∑ j = 0 B \sum_{j=0}^B j=0B这项?因为,如前面提到过,论文中设定每个网格只负者一个具体类别的预测,无论每个网格需要预测多少个框体B。

5. YOLO检测流程

YOLO原理_第10张图片

  • 对图像进行尺寸调整,统一尺寸
  • 将数据传入到卷积模型(YOLO)
  • 对输出的结果进行非极大值抑制

5.1 边界框拟合

在YOLO算法中,如果一个目标的中心点位于某个网格内部,那么算法会在该网格内部拟合一个边界框。边界框是一个矩形,其包含了目标的位置和大小信息。YOLO算法会同时预测每个网格内可能的边界框,因此可能会存在重叠的边界框。在后续处理中,可以使用非极大值抑制(NMS)算法去掉重复的边界框,只保留最可能的那一个,从而得到最终的目标边界框。

当一个物体的边界框跨越了多个网格时,每个包含该边界框中心点的网格都会尝试预测该边界框。在这种情况下,YOLO并不会将该物体视为单个网格上的物体。而是采用一种特殊的处理方式,将该物体的边界框分配给两个网格中置信度最高的那个。这种处理方式称为“跨越边界框(Cross-boundary box)”,它允许处理跨越网格的物体以有效地增加算法的检测能力。

在目标检测的任务中,边界框通常是用来描述目标位置和大小的重要信息,因此完整的边界框是非常重要的。这也是为什么当目标边界框跨越多个网格时,YOLO算法会将其分配给置信度最高的网格,以便尽可能准确地检测出目标的完整边界框。尽管边界框可能跨越多个网格,对于算法来说,一个目标仍然只能被归为一个网格,因为算法需要将其与其他网格中的目标区分开来。

5.2 视频、摄像头检测

YOLO (You Only Look Once) 模型是一种实时目标检测模型,可以对图像或视频中存在的对象进行实时识别。相比传统的目标检测算法,YOLO模型具有较快的计算速度和较高的准确率。
其能够进行视频内容检测的原因如下:

  1. 高效的算法:YOLO模型使用单个神经网络在图像上执行前向传递和预测操作,这个过程比其他基于区域提议的算法(如Faster RCNN等)更加高效。因此YOLO模型设计触目皆是地利用CPU和GPU硬件资源进行加速,大大提高了处理效率。

  2. 上下文信息利用:YOLO模型在进行目标检测时,可以利用图像中的上下文信息信息。同时基于YOLO算法的深度卷积神经网络(Convolutional Neural Network,简称CNN)可以有效地提取图像中的特征信息。

  3. 多尺度特征提取:YOLO模型可以通过在网络中的多个特征层上进行检测,在多个尺度上执行目标检测。这也为检测视频中的不同物体提供了便利。

总之,YOLO模型结合了高效性、多尺度特征提取以及上下文信息的利用,使其可在实时完成视频内容检测任务。

关于YOLO模型在视频预测任务中高效率数据说明:

  1. YOLOv3模型运行速度:在GTX 1060显卡上,YOLOv3的检测速度为34FPS (Frame Per Second),在Titan X显卡上的检测速度为61FPS,速度非常快。

  2. 多目标检测通道:YOLOv4模型可以通过不同的输入通道来检测同一帧中的多个目标,其速度为40FPS,这在实际应用中非常有用。

  3. 实时视频检测:YOLOv5的主要贡献是在实时视频检测任务的速度和准确率之间取得平衡。在CPU上,YOLOv5能够实现30FPS的目标检测速度,而在NVIDIA Tesla迈进加速器上能够实现64FPS的目标检测速度。

  4. 关于什么是FPS:FPS是“Frames Per Second”的缩写,指的是视频播放或游戏画面连续刷新率的计算单位,意思是“每秒钟显示的画面数目”。它通常用于衡量电脑或设备的性能,以及视频的流畅程度。例如,60FPS表示每秒钟能够显示60幅画面,60Hz的屏幕也就是每秒钟刷新60次。FPS越高,视频或游戏画面就越流畅,反之则越卡顿。在目标检测等实时应用中,FPS也通常被用来表示算法的运行速度和效率。

这些数据说明了YOLO模型在视频预测任务中的高效率和快速性,其可以帮助实时监控、视频监控、交通检测等领域得到更加广泛的应用。

6. 非极大值抑制(NMS)算法

非极大值抑制(Non-Maximum Suppression,简称NMS)是一种常见的目标检测后处理方法,用于移除多余的边界框。NMS算法的原理是,对于每个类别的边界框,按照其置信度(或得分)从高到低进行排序。然后,选择置信度最高的边界框,将其它与之高度重叠的边界框(即IOU(Intersection over Union)重叠率大于某个阈值)从列表中移除。重复这个步骤,选择下一个最高置信度的边界框,直到所有的边界框都被处理完毕。

在YOLO算法中,NMS算法通常是用于筛选检测到的目标边界框,以保留每个目标的最终检测结果。NMS算法可以剔除低于置信度阈值的边界框,同时去除重复的边界框,从而使目标检测结果更准确。通常情况下,NMS算法使用的重叠率阈值为0.5,可以根据具体任务和实验来调整。

6.1 NMS算法的连续计算

“重复这个步骤”指的是从剩余的未处理边界框列表中选择置信度第二高的边界框,然后再次进行非极大值抑制过程,直到所有边界框都被处理完成。
重叠的边界框对于NMS算法来说可能会被移除,而最终保留的边界框是非极大值抑制算法的输出结果。例如,如果两个边界框的重叠率(Intersection over Union,IOU)大于设定的阈值,则只会保留置信度更高的那个边界框,而将置信度较低的边界框进行删除。

6.2 被移除的框体将被永久移除

在NMS算法中,已经被移除的重叠边界框,在后续处理中不会再次被考虑。当一个边界框被移除后,它在排序列表中就不再存在,也不会再影响后续的计算。因此,在下一次重复计算步骤中,该边界框没有被纳入考虑的范围之内,只会考虑未被删除的边界框。最后保留的所有边界框将构成目标检测算法的输出结果。

6.3 不同类别之间计算NMS

NMS算法计算的是同一类别的边界框之间的重叠情况,而不是所有类别的边界框一起计算。在进行NMS处理时,通常只处理同一种类别的边界框,对于不同类别的边界框,需要分别进行处理。

具体来说,如果在进行NMS处理时,需要处理多个类别的边界框,那么每个类别的边界框都需要进行查重处理。不同类别之间的边界框是互不干扰的,不会相互干扰或抵消。因此,在计算IOU值时,只有同一类别的边界框才会被考虑。最终,NMS算法会分别对每个类别输出过滤后的检测结果,从而得到针对每个类别的最终目标检测结果。

6.4 非极大值抑制算法不参与模型训练过程

在计算训练误差(或损失函数)和反向传播过程中,不会使用到非极大值抑制算法。损失函数的计算和反向传播是在训练数据和模型参数之间进行的,而非在预测框体和非预测框体之间进行的。在前向传输阶段,模型将输入图像作为输入,输出由预测框体、类别置信度以及边界框的坐标信息组成的张量。然后,通过与标注数据对比计算计算损失函数,并使用优化算法调整模型参数。在反向传输过程中,模型根据损失函数的反向传播计算出每个参数的梯度信息,并根据优化算法调整参数的值。因此,在训练过程中,非极大值抑制算法并不参与任何计算过程。

6.5 置信度和IOU阈值

NMS算法中,置信度(confidence)和IOU阈值(IOU threshold)是调节模型性能的两个关键超参数。

在YOLO5中,默认的置信度阈值为0.25,即只有检测到的物体置信度高于0.25时,才会将其视为真正的检测结果。如果将此参数调低,则模型会更加敏感,但可能会导致一些误检和漏检。
而IOU阈值则默认为0.45,即只有检测框之间的重叠程度大于0.45时,才会将其视为同一个目标的不同检测结果。这个参数能够控制模型的准确性和召回率。
当然,具体的置信度和IOU阈值也会根据具体的应用场景和任务需求进行调整。
越小的置信度,表明将会有更多的框体被预测出来,所以模型将会更敏感,但是是建立在损失了置信度的情况上的,可能结果会乱打框
越大的IOU,表明将会有更多的框体被保留,但是会出现框体重叠严重的情况,对于本身图像重叠严重的场景,比如地铁口拥挤的佩戴口罩的人群,如果检测目标是口罩配搭情况,则可以根据拥挤的场景,适当的调高IOU的值。

参考资料

https://blog.csdn.net/qq_40716944/article/details/104908692
论文地址: https://arxiv.org/pdf/1506.02640.pdf

你可能感兴趣的:(宠物狗嘴套检测系统,深度学习,目标检测,计算机视觉)