本周主要讲了目标检测与YOLO。
目标检测(Object Detection)是计算机视觉中的一个重要任务,它的目的是从图像或视频中检测出物体的位置、类别和数量。与图像分类只需要给出图像中是否包含某个类别的输出不同,目标检测需要给出每个检测到的物体的位置信息,通常是一个矩形框,以及该物体的类别标签。
目标检测有许多不同的算法,其中包括传统的基于特征提取和分类器的方法,以及现代的基于深度学习的方法,如卷积神经网络(CNN)和循环神经网络(RNN)。常见的基于深度学习的目标检测算法包括 RCNN、Fast RCNN、Faster RCNN、YOLO、SSD 等。
目标检测的应用非常广泛,如自动驾驶、视频监控、智能安防、物体识别等。它不仅可以提高人工智能系统的自主决策能力,而且也可以提高人类在生产生活中的效率。
YOLO(You Only Look Once)是一种基于深度学习的目标检测算法,其特点是快速、简单、高效,并且可以实现实时目标检测。YOLO算法最早由美国约翰霍普金斯大学的研究者在2016年提出,目前已经有了多个版本。
YOLO的核心思想是将目标检测任务转化为一个回归问题,即对图像的每个像素点进行预测,预测其所属的类别以及包含该像素点的物体的位置和大小。为了实现这个任务,YOLO使用了一个基于卷积神经网络(CNN)的模型,该模型在整张图片上进行卷积运算,输出一个固定大小的特征图,并在这个特征图上进行预测。
相较于其他基于深度学习的目标检测算法,YOLO算法的优势在于速度快、准确率高。YOLO使用了一种联合训练的方法,可以同时对目标类别和位置进行优化,使得模型在运行速度和检测精度方面都表现出色。同时,YOLO还可以处理多个目标,并且能够处理不同尺寸的物体,这使得它在实际应用中具有很大的优势。
近年来,YOLO算法的改进版本也不断涌现,如YOLOv2、YOLOv3、YOLOv4等,它们在准确率、速度等方面都有所提升,并且被广泛应用于自动驾驶、智能安防、视频监控等领域。
YOLO网络结构可以分为两个部分,一个是特征提取网络,另一个是检测网络。
特征提取网络通常采用一个卷积神经网络(CNN)来提取图像的特征表示。这个网络的作用是将原始图像转换为一个固定尺寸的特征图,以便后续的检测网络进行处理。YOLO中采用了Darknet作为特征提取网络,Darknet是一种轻量级的卷积神经网络,它的主要特点是速度快、模型小、训练容易,非常适合用于实时目标检测。
检测网络是YOLO最核心的部分,它的作用是在特征图上进行目标检测。检测网络通常由多个卷积层和全连接层组成,其中全连接层用于将特征图中的信息转换为目标的位置和类别。在YOLO中,检测网络主要由三个部分组成:卷积层、池化层和全连接层。其中,卷积层和池化层用于提取图像特征,全连接层则用于将特征转换为目标的位置和类别。
YOLO的检测网络采用了多尺度预测的方法,即在不同的特征图上进行目标检测,以适应不同大小的物体。同时,YOLO还引入了锚点框的概念,将目标的位置预测转化为相对于锚点框的偏移量,以提高目标位置的精度。
YOLO算法中的包围框(bounding box)是指用矩形框来包围目标物体的位置。YOLO使用矩形框来表示物体的位置和大小,以便在检测时对目标进行定位和识别。
YOLO的包围框包含了四个参数,分别是 x , y , w , h x, y, w, h x,y,w,h,其中 x x x和 y y y表示矩形框的中心点坐标, w w w和 h h h表示矩形框的宽度和高度。在YOLO算法中,矩形框的坐标和尺寸是相对于图像大小的比例而不是绝对像素值,这样可以使得算法更加通用。
在YOLO中,每个矩形框都与一个特定的目标类别相关联,这个类别信息也被包含在矩形框的预测结果中。当矩形框与目标类别匹配时,算法会将其作为有效的检测结果输出。
YOLO算法的包围框与其他目标检测算法的不同之处在于,它的检测结果是通过对整张图像进行一次前向传播计算得出的,而不是通过在图像上滑动窗口来进行检测的。这种方式使得YOLO算法在速度上有很大的优势,可以实现实时的目标检测。同时,YOLO算法还采用了多尺度检测和锚点框等技术,使得其在检测精度上也表现出色。
在YOLO算法中,每个包围框的预测结果都会伴随着一个置信度(confidence)值。这个置信度值反映了算法对于该包围框是否包含一个物体的预测的可信程度。通常来说,置信度越高,说明预测结果越可信。
在YOLO中,每个包围框的置信度是由两部分组成的:类别置信度和框置信度。类别置信度表示该包围框中物体属于某个特定类别的可能性,框置信度表示该包围框的位置和尺寸预测的可靠程度。
具体来说,在YOLO的检测网络中,每个包围框的预测结果都会包含一个类别置信度和一个框置信度。在目标检测过程中,首先根据类别置信度选择概率最大的类别标签,并将对应的置信度作为检测结果的置信度。然后,对于每个包围框,根据框置信度进行筛选,去除低置信度的框,只保留高置信度的框作为最终的检测结果。
在YOLO中,置信度是判断检测结果是否可信的重要指标之一。通过调节置信度的阈值,可以控制检测结果的精度和召回率,使得算法在不同场景下具有更好的适应性。
YOLO的损失函数是一种综合考虑分类和回归误差的多任务损失函数,通常被称为YOLO损失(YOLO loss)。其主要目标是最小化预测结果与真实标签之间的差距,从而提高目标检测的准确性。
YOLO损失由三个部分组成:分类损失、坐标损失和置信度损失。具体来说,分类损失用于度量预测类别标签的错误率,坐标损失用于度量预测边界框位置和大小的误差,置信度损失则用于度量预测边界框是否包含物体的误差。
分类损失和置信度损失都是采用逻辑回归损失函数来计算,而坐标损失则采用平方误差损失函数。在YOLO损失中,分类损失和置信度损失对于所有的预测框都进行了计算,而坐标损失只对包含物体的预测框进行计算。
总的损失函数可以表示为:
L = λ 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 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i , j o b j [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] + ∑ i = 0 S 2 ∑ j = 0 B 1 i , j o b j C i j log ( C ^ i j ) + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B 1 i , j n o o b j log ( 1 − C ^ i j ) + ∑ i = 0 S 2 1 i o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p ^ i ( c ) ) 2 L=\lambda_{coord} \sum_{i=0}^{S^2}\sum_{j=0}^{B} \mathbb{1}_{i,j}^{obj} [(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2] +\lambda_{coord} \sum_{i=0}^{S^2}\sum_{j=0}^{B} \mathbb{1}_{i,j}^{obj} [(w_i-\hat{w}_i)^2+(h_i-\hat{h}_i)^2] + \sum_{i=0}^{S^2}\sum_{j=0}^{B} \mathbb{1}_{i,j}^{obj} C_i^j\log(\hat{C}_i^j) + \lambda_{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B} \mathbb{1}_{i,j}^{noobj}\log(1-\hat{C}_i^j) + \sum_{i=0}^{S^2}\mathbb{1}_{i}^{obj}\sum_{c\in classes} (p_i(c)-\hat{p}_i(c))^2 L=λcoordi=0∑S2j=0∑B1i,jobj[(xi−x^i)2+(yi−y^i)2]+λcoordi=0∑S2j=0∑B1i,jobj[(wi−w^i)2+(hi−h^i)2]+i=0∑S2j=0∑B1i,jobjCijlog(C^ij)+λnoobji=0∑S2j=0∑B1i,jnoobjlog(1−C^ij)+i=0∑S21iobjc∈classes∑(pi(c)−p^i(c))2
其中, S S S表示网格单元的数量, B B B表示每个网格单元中预测的边界框数量, C i j C_i^j Cij表示第 i i i个网格单元中第 j j j个边界框属于各个类别的概率, C ^ i j \hat{C}_i^j C^ij表示对应的预测值, 1 i , j o b j \mathbb{1}_{i,j}^{obj} 1i,jobj表示第 i i i个网格单元中第 j j j个边界框是否包含物体的指示函数, 1 i , j n o o b j \mathbb{1}_{i,j}^{noobj} 1i,jnoobj表示第 i i i个网格单元中第 j j j个边界框是否不包含物体的指示函数, p i ( c ) p_i(c) pi(c)表示第 i i i个网格单元中物体属于类别 c c c的概率, p ^ i ( c ) \hat{p}_i(c) p^i(c)表示对应的预测值, λ c o o r d \lambda_{coord} λcoord和 λ n o o b j \lambda_{noobj} λnoobj是平衡坐标损失和置信度损失的超参数。
在计算过程中,YOLO首先将每个真实边界框分配给与其重叠最多的预测框,然后将分配的预测框标记为“有物体”( 1 i , j o b j = 1 \mathbb{1}_{i,j}^{obj}=1 1i,jobj=1),其余预测框标记为“无物体”( 1 i , j n o o b j = 1 \mathbb{1}_{i,j}^{noobj}=1 1i,jnoobj=1)。接下来,YOLO计算每个预测框的分类损失和置信度损失,以及每个包含物体的预测框的坐标损失。最后,将所有损失项加权求和,得到总的损失函数值。通过反向传播算法,可以根据损失函数值对模型参数进行更新,从而提高模型的预测准确率。
之后介绍了NMS算法。
非极大值抑制(Non-Maximum Suppression,NMS)是目标检测中常用的一种算法,用于抑制重叠框,保留置信度最高的框,从而提高检测结果的准确性。
NMS算法的主要思想是遍历所有的预测框,并选择置信度最高的框作为基准框。然后,计算其余预测框与基准框的重叠面积,并根据重叠面积的大小,逐个剔除与基准框重叠面积大于一定阈值的预测框。剔除后,再从剩下的预测框中选择置信度最高的框作为新的基准框,重复以上步骤,直到所有的预测框都被处理完毕。
具体来说,NMS算法的流程如下:
- 对所有的预测框按照置信度进行降序排列,选择置信度最高的框作为基准框。
- 遍历剩下的预测框,计算它们与基准框的重叠面积。
- 如果重叠面积大于一定阈值(如0.5),则剔除该预测框。
- 选择剩下的置信度最高的预测框作为新的基准框,重复步骤2-3,直到所有的预测框都被处理完毕。
NMS算法可以有效地抑制重叠框,避免重复检测同一个目标,提高检测结果的准确性。但是需要注意的是,NMS算法的阈值需要根据具体的应用场景进行调整,否则可能会导致误检或漏检。