赞
踩
YOLO(You Only Look Once)是一种实时目标检测算法,YOLO5是其第五个版本。与传统的目标检测算法使用分类和回归算法不同,YOLO5使用了单个神经网络来直接预测边界框和类别。以下是YOLO5的原理:
将输入图像分割成网格:YOLO5将输入图像分成S×S个网格,每个网格负责检测一个目标。如果一个目标的中心点在某个网格内,那么就会在该网格内拟合出一个边界框。
提取特征向量:使用卷积神经网络提取每个网格的特征向量,该特征向量代表了该网格内目标的特征。
预测边界框和类别:对于每个网格,使用全连接层来预测一个或多个边界框,以及每个边界框可能的类别和置信度得分。
预测结果的后处理:对于每个目标,选择置信度最高的边界框。然后,根据非极大值抑制(NMS)算法去掉重复边界框并选择最终的目标框。
相对于YOLOv4和其之前的版本,YOLOv5引入了一些新的技术,例如自适应卷积网络和多尺度训练等,以进一步提高性能和结果的准确性。
YOLO1中使用了24个卷积层,并在后面连接了两个全连接层
卷积层的参数:
7764-s-2 表示为 卷积核为7*7,共有64个通道,s-2表示步幅为2,没有填充的情况下
给YOLO模型标记数据,可使用LabelImg进行标注,简单易操作
conda install pyqt=5 # 安装依赖包 pyqt
pip install labelimg -i http://pypi.douban.com/simple/ #安装labelimg
labelimg 输入labelimg就可打开labelimg软件
进一步的labelimg操作可以查看该博客
通过labelimg
每个图像对应一个txt文件,文件每一行为一个目标的信息,包括class, x_center, y_center, width, height格式。
YOLO进行训练的data文件夹格式
其中labels是通过imagelabel输出的边界框文件,一个图像对应一个yolo_txt文件,所以YOLO模型的输入是以文件夹的结构进行输入的。然后在images文件夹下进一步放置了train文件夹、val文件夹、test文件夹以及相应的图片数据。而了labels文件夹理解与上面相同。
YOLO算法的预输出框体个数
YOLO算法中将输入的图像分成了 S x S 个大小相同的网格 (grid),其中每个网格对于整张图像都是固定大小的。对于每个网格而言,模型会输出 B 个边界框 (bounding box) 以及它们对应的置信度和类别预测结果,该边界框会被作为目标物体检测结果的一部分。网络会根据每个边界框的置信度来判断它是否能够预测出正确的目标。相应地,每个边界框的位置是通过相对于当前网格的位置进行预测的,在整张图像中的位置需要根据网格的尺寸和边界框的位置进行计算。如果同一个目标被多个网格分配,模型只处理边界框置信度最高的那个网格所对应的边界框。通过这种方式,YOLO能够快速准确地对图像中的目标进行检测。
在YOLO1中,YOLO的输出是一个SS(B5 + C)的张量
在YOLO1中,作者给出了YOLO1的模型输出具体参数
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,表示该预测框不包含目标。
在YOLO算法中,边界框的中心点是指边界框的中心,即边界框长方形对角线的交点。在物体被检测后,YOLO算法可以通过边界框中心点的位置来确定物体在图像中的位置和大小。
论文中,还有对(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坐标可以带来多方面的优点,包括更好的检测精度和更稳定的训练。
YOLO模型通过学习图像中每个框的置信度和相应的类别概率,然后计算预测边界框与真实边界框之间的坐标误差和置信度误差的平方和作为损失函数。对于每个边界框,模型会预测其中心坐标、宽度、高度和置信度值,同时评估其是否包含图像中的对象。这样,YOLO可以将边界框预测任务转化为一个回归问题,从而在单次前向传递中预测图像中的所有边界框和类别信息。
回归问题通常设计损失函数的方法是构建离差平方和。论文中,作者也是对不同的预测值计算其误差平方和。误差平方和有方便计算,而且导数性质良好的特点。
论文中还有几个假设
存在问题:
解决方案:
一个网格预测多个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预测的越来越好。
对于包含物体的网格,模型采用回归分支输出的bounding box坐标信息、分类分支输出的类别置信度信息以及该bounding box内物体出现的置信度信息共同构成损失函数,而对于不包含物体的网格,只采用该bounding box的置信度信息计算损失函数。
当检测目标物体时,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=0∑S2j=0∑B1i,jobj[(xi−x^i)2+(yi−y^i)2]
其中,
λ
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=0∑S2j=0∑B1ijobj[(wi
−w^i
)2+(hi
−h^i
)2]
其中,
∑ 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=0∑S2j=0∑B1i,jobj[Ci−C^i]2+λnoobji=0∑S2j=0∑B1i,jnoobj[Ci−C^i]2
YOLO是通过模型学习一个置信度然后再根据已规定的置信度计算公式计算预测框体与真实框体之间的置信度,再将学习的置信度与计算得到的置信度计算置信度误差。
在目标检测模型中,实际上并不存在"真实置信度"这个概念,因为置信度这个指标是模型根据训练数据所学习到的。在训练过程中,每个边界框的真实类别和位置信息都是已知的,对于每个预测边界框,可以计算其与最匹配的真实边界框之间的IOU(交并比),如果其IOU高于设定的阈值,则该框被认为是正样例。 在此基础上,可以计算每个边界框的置信度误差,并采用各种优化算法(如基于梯度的反向传播)来更新模型参数,使模型在后续的预测过程中尽可能准确地预测图像中的对象。因此,可以说模型在训练中所学习到的置信度是基于真实标注数据来计算的,而在预测时,模型直接将置信度作为一个输出标记,以衡量一个边界框是否包含物体。同时,对于预测结果中的每一个边界框,如果其IoU高于设定的阈值,则认为该框体是一个正样本,并计算其置信度误差的平方。
所以置信度误差是通过计算预测框体的置信度和真实框体的交并比(IOU)之间的差异,用于衡量预测框体的置信度的准确性。
在损失函数中,还要同时考虑每个网格预测的边界框中是否包含实际目标物体。如果包含,则边界框中包含物体的置信度和真实值之间的误差应该是较小的,否则误差应该是较大的。下面是目标检测部分的损失函数:
∑ 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=0∑S21i,jobjc∈classes∑(pi(c)−p^i(c))2
其中,
在YOLO算法中,如果一个目标的中心点位于某个网格内部,那么算法会在该网格内部拟合一个边界框。边界框是一个矩形,其包含了目标的位置和大小信息。YOLO算法会同时预测每个网格内可能的边界框,因此可能会存在重叠的边界框。在后续处理中,可以使用非极大值抑制(NMS)算法去掉重复的边界框,只保留最可能的那一个,从而得到最终的目标边界框。
当一个物体的边界框跨越了多个网格时,每个包含该边界框中心点的网格都会尝试预测该边界框。在这种情况下,YOLO并不会将该物体视为单个网格上的物体。而是采用一种特殊的处理方式,将该物体的边界框分配给两个网格中置信度最高的那个。这种处理方式称为“跨越边界框(Cross-boundary box)”,它允许处理跨越网格的物体以有效地增加算法的检测能力。
在目标检测的任务中,边界框通常是用来描述目标位置和大小的重要信息,因此完整的边界框是非常重要的。这也是为什么当目标边界框跨越多个网格时,YOLO算法会将其分配给置信度最高的网格,以便尽可能准确地检测出目标的完整边界框。尽管边界框可能跨越多个网格,对于算法来说,一个目标仍然只能被归为一个网格,因为算法需要将其与其他网格中的目标区分开来。
YOLO (You Only Look Once) 模型是一种实时目标检测模型,可以对图像或视频中存在的对象进行实时识别。相比传统的目标检测算法,YOLO模型具有较快的计算速度和较高的准确率。
其能够进行视频内容检测的原因如下:
高效的算法:YOLO模型使用单个神经网络在图像上执行前向传递和预测操作,这个过程比其他基于区域提议的算法(如Faster RCNN等)更加高效。因此YOLO模型设计触目皆是地利用CPU和GPU硬件资源进行加速,大大提高了处理效率。
上下文信息利用:YOLO模型在进行目标检测时,可以利用图像中的上下文信息信息。同时基于YOLO算法的深度卷积神经网络(Convolutional Neural Network,简称CNN)可以有效地提取图像中的特征信息。
多尺度特征提取:YOLO模型可以通过在网络中的多个特征层上进行检测,在多个尺度上执行目标检测。这也为检测视频中的不同物体提供了便利。
总之,YOLO模型结合了高效性、多尺度特征提取以及上下文信息的利用,使其可在实时完成视频内容检测任务。
关于YOLO模型在视频预测任务中高效率数据说明:
YOLOv3模型运行速度:在GTX 1060显卡上,YOLOv3的检测速度为34FPS (Frame Per Second),在Titan X显卡上的检测速度为61FPS,速度非常快。
多目标检测通道:YOLOv4模型可以通过不同的输入通道来检测同一帧中的多个目标,其速度为40FPS,这在实际应用中非常有用。
实时视频检测:YOLOv5的主要贡献是在实时视频检测任务的速度和准确率之间取得平衡。在CPU上,YOLOv5能够实现30FPS的目标检测速度,而在NVIDIA Tesla迈进加速器上能够实现64FPS的目标检测速度。
关于什么是FPS:FPS是“Frames Per Second”的缩写,指的是视频播放或游戏画面连续刷新率的计算单位,意思是“每秒钟显示的画面数目”。它通常用于衡量电脑或设备的性能,以及视频的流畅程度。例如,60FPS表示每秒钟能够显示60幅画面,60Hz的屏幕也就是每秒钟刷新60次。FPS越高,视频或游戏画面就越流畅,反之则越卡顿。在目标检测等实时应用中,FPS也通常被用来表示算法的运行速度和效率。
这些数据说明了YOLO模型在视频预测任务中的高效率和快速性,其可以帮助实时监控、视频监控、交通检测等领域得到更加广泛的应用。
非极大值抑制(Non-Maximum Suppression,简称NMS)是一种常见的目标检测后处理方法,用于移除多余的边界框。NMS算法的原理是,对于每个类别的边界框,按照其置信度(或得分)从高到低进行排序。然后,选择置信度最高的边界框,将其它与之高度重叠的边界框(即IOU(Intersection over Union)重叠率大于某个阈值)从列表中移除。重复这个步骤,选择下一个最高置信度的边界框,直到所有的边界框都被处理完毕。
在YOLO算法中,NMS算法通常是用于筛选检测到的目标边界框,以保留每个目标的最终检测结果。NMS算法可以剔除低于置信度阈值的边界框,同时去除重复的边界框,从而使目标检测结果更准确。通常情况下,NMS算法使用的重叠率阈值为0.5,可以根据具体任务和实验来调整。
“重复这个步骤”指的是从剩余的未处理边界框列表中选择置信度第二高的边界框,然后再次进行非极大值抑制过程,直到所有边界框都被处理完成。
重叠的边界框对于NMS算法来说可能会被移除,而最终保留的边界框是非极大值抑制算法的输出结果。例如,如果两个边界框的重叠率(Intersection over Union,IOU)大于设定的阈值,则只会保留置信度更高的那个边界框,而将置信度较低的边界框进行删除。
在NMS算法中,已经被移除的重叠边界框,在后续处理中不会再次被考虑。当一个边界框被移除后,它在排序列表中就不再存在,也不会再影响后续的计算。因此,在下一次重复计算步骤中,该边界框没有被纳入考虑的范围之内,只会考虑未被删除的边界框。最后保留的所有边界框将构成目标检测算法的输出结果。
NMS算法计算的是同一类别的边界框之间的重叠情况,而不是所有类别的边界框一起计算。在进行NMS处理时,通常只处理同一种类别的边界框,对于不同类别的边界框,需要分别进行处理。
具体来说,如果在进行NMS处理时,需要处理多个类别的边界框,那么每个类别的边界框都需要进行查重处理。不同类别之间的边界框是互不干扰的,不会相互干扰或抵消。因此,在计算IOU值时,只有同一类别的边界框才会被考虑。最终,NMS算法会分别对每个类别输出过滤后的检测结果,从而得到针对每个类别的最终目标检测结果。
在计算训练误差(或损失函数)和反向传播过程中,不会使用到非极大值抑制算法。损失函数的计算和反向传播是在训练数据和模型参数之间进行的,而非在预测框体和非预测框体之间进行的。在前向传输阶段,模型将输入图像作为输入,输出由预测框体、类别置信度以及边界框的坐标信息组成的张量。然后,通过与标注数据对比计算计算损失函数,并使用优化算法调整模型参数。在反向传输过程中,模型根据损失函数的反向传播计算出每个参数的梯度信息,并根据优化算法调整参数的值。因此,在训练过程中,非极大值抑制算法并不参与任何计算过程。
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。