5.2 单阶段目标检测模型YOLOv3

简介: 这篇文章详细介绍了单阶段目标检测模型YOLOv3的基本原理和网络结构,包括如何生成候选区域、锚框的设计、预测框的生成以及如何对这些候选区域进行标注,并通过卷积神经网络进行特征提取和预测。

5.2 单阶段目标检测模型YOLOv3

前面介绍了单阶段目标检测算法具有代表性的是YOLO系列,目前已经发展多个版本:YOLOv、YOLOv2、YOLOv3、YOLOv4、PP-YOLO、PP-YOLOv2等。

YOLOv3在之前模型的基础上通过改变模型结构、Anchor设计来权衡速度与精度,因此我们先以经典的YOLOv3模型为例讲解单阶段目标检测模型方便快速了解YOLO模型,并在下一节进行基于YOLOv3进行实践。

YOLOv3算法基本思想可以分成两部分:

  • 按一定规则在图片上产生一系列的候选区域,然后根据这些候选区域与图片上物体真实框之间的位置关系对候选区域进行标注。跟真实框足够接近的那些候选区域会被标注为正样本,同时将真实框的位置作为正样本的位置目标偏离真实框较大的那些候选区域则会被标注为负样本,负样本不需要预测位置或者类别。
  • 使用卷积神经网络提取图片特征并对候选区域的位置和类别进行预测。这样每个预测框就可以看成是一个样本,根据真实框相对它的位置和类别进行了标注而获得标签值,通过网络模型预测其位置和类别,将网络预测值和标签值进行比较,就可以建立起损失函数

YOLOv3算法预测过程的流程图如图1所示,预测图片经过一系列预处理(resize、normalization等)输入到YOLOv3模型,根据预先设定的Anchor和提取到的图片特征得到目标预测框,最后通过非极大值抑制(NMS)消除重叠较大的冗余预测框,得到最终预测结果。

图1:YOLOv3算法预测流程图

YOLOv3网络结构大致分为3个部分:Backbone、Neck、Head,如图2所示:

图2:YOLOv3网络结构

  • Backbone:骨干网络,主要用于特征提取
  • Neck:在Backbone和Head之间提取不同阶段中特征图
  • Head:检测头,用于预测目标的类别和位置

5.2.1 产生候选区域

如何产生候选区域,是检测模型的核心设计方案。目前大多数基于卷积神经网络的模型所采用的方式大体如下:

  • 按一定的规则在图片上生成一系列位置固定的锚框,将这些锚框看作是可能的候选区域
  • 锚框是否包含目标物体进行预测,如果包含目标物体,还需要预测所包含物体的类别,以及预测框相对于锚框位置需要调整的幅度。

5.2.1.1 生成锚框

将原始图片划分成m×n个区域,如下图所示,原始图片高度H=640, 宽度W=480,如果我们选择小块区域的尺寸为32×32,则m和n分别为:

m=640/32=20 n=480/32=15

图3所示,将原始图像分成了20行15列小方块区域。

图3:将图片划分成多个32x32的小方块

YOLOv3算法会在每个区域的中心,生成一系列锚框。为了展示方便,我们先在图中第十行第四列的小方块位置附近画出生成的锚框,如图4所示。


注意:

这里为了跟程序中的编号对应,最上面的行号是第0行,最左边的列号是第0列。

图4:在第10行第4列的小方块区域生成3个锚框

图5展示在每个区域附近都生成3个锚框,很多锚框堆叠在一起可能不太容易看清楚,但过程跟上面类似,只是需要以每个区域的中心点为中心,分别生成3个锚框。

图5:在每个小方块区域生成3个锚框

5.2.1.2 生成预测框

在前面已经指出,锚框的位置都是固定好的,不可能刚好跟物体边界框重合,需要在锚框的基础上进行位置的微调以生成预测框。预测框相对于锚框会有不同的中心位置和大小,采用什么方式能得到预测框呢?我们先来考虑如何生成其中心位置坐标。

比如上面图中在第10行第4列的小方块区域中心生成的一个锚框,如绿色虚线框所示。以小方格的宽度为单位长度,此小方块区域左上角的位置坐标是:

c_x = 4 c_y = 10

此锚框的区域中心坐标是:

由于Sigmoid的函数值在0∼1之间,因此由上面公式计算出来的预测框的中心点总是落在第十行第四列的小区域内部。

当t_x=t_y=0时,b_x = c_x + 0.5,b_y = c_y + 0.5,预测框中心与锚框中心重合,都是小区域的中心。

锚框的大小是预先设定好的,在模型中可以当作是超参数,下图中画出的锚框尺寸是

p_h = 350 p_w = 250

通过下面的公式生成预测框的大小:

则可以得到预测框的坐标是(154.98, 357.44, 276.29, 310.42),如图6中蓝色框所示。


****说明:****这里坐标采用xywh的格式。

图6:生成预测框

这里我们会问:当t_x, t_y, t_w, t_h取值为多少的时候,预测框能够跟真实框重合?为了回答问题,只需要将上面预测框坐标中的b_x, b_y, b_h, b_w设置为真实框的位置,即可求解出t的数值。

令:

如果t是网络预测的输出值,将t^*作为目标值,以他们之间的差距作为损失函数,则可以建立起一个回归问题,通过学习网络参数,使得t足够接近t^*,从而能够求解出预测框的位置坐标和大小。

预测框可以看作是在锚框基础上的一个微调,每个锚框会有一个跟它对应的预测框,我们需要确定上面计算式中的t_x, t_y, t_w, t_h,从而计算出与锚框对应的预测框的位置和形状。

5.2.1.3 对候选区域进行标注

每个区域可以产生3种不同形状的锚框,每个锚框都是一个可能的候选区域,对这些候选区域我们需要了解如下几件事情:

  • 锚框是否包含物体,这可以看成是一个二分类问题,使用标签objectness来表示。当锚框包含了物体时,objectness=1,表示预测框属于正类;当锚框不包含物体时,设置objectness=0,表示锚框属于负类。
  • 如果锚框包含了物体,那么它对应的预测框的中心位置和大小应该是多少,或者说上面计算式中的t_x, t_y, t_w, t_h 应该是多少,使用location标签。
  • 如果锚框包含了物体,那么具体类别是什么,这里使用变量label来表示其所属类别的标签。

选取任意一个锚框对它进行标注,也就是需要确定其对应的objectness,(t_x, t_y, t_w, t_h)和label,下面将分别讲述如何确定这三个标签的值。

标注锚框是否包含物体objectness

图13所示,这里一共有3个目标,以最左边的人像为例,其真实框是(133.96,328.42,186.06,374.63)。

图13:选出与真实框中心位于同一区域的锚框

真实框的中心点坐标是:

center_x=133.96 center_y=328.42

i = 133.96 / 32 = 4.18625 j = 328.42 / 32 = 10.263125

它落在了第10行第4列的小方块内,如图13所示。此小方块区域可以生成3个不同形状的锚框,其在图上的编号和大小分别是A_1(116, 90), A_2(156, 198), A_3(373, 326)。

用这3个不同形状的锚框跟真实框计算IoU,选出IoU最大的锚框。这里为了简化计算,只考虑锚框的形状,不考虑其跟真实框中心之间的偏移,具体计算结果如图14所示。

图14:选出与真实框与锚框的IoU

其中跟真实框IoU最大的是锚框A_3,形状是(373,326),将它所对应的预测框的objectness标签设置为1,其所包括的物体类别就是真实框里面的物体所属类别。

依次可以找出其他几个真实框对应的IoU最大的锚框,然后将它们的预测框的objectness标签也都设置为1。这里一共有20×15×3=900个锚框,只有3个预测框会被标注为正。

由于每个真实框只对应一个objectness标签为正的预测框,如果有些预测框跟真实框之间的IoU很大,但并不是最大的那个,那么直接将其objectness标签设置为0当作负样本,可能并不妥当。

为了避免这种情况,YOLOv3算法设置了一个IoU阈值iou_threshold,当预测框的objectness不为1,但是其与某个真实框的IoU大于iou_threshold时,就将其objectness标签设置为-1,不参与损失函数的计算

所有其他的预测框,其objectness标签均设置为0,表示负类。

对于objectness=1的预测框,需要进一步确定其位置和包含物体的具体分类标签,但是对于objectness=0或者-1的预测框,则不用管他们的位置和类别。

标注预测框的位置坐标标签

当锚框objectness=1时,需要确定预测框位置相对于它微调的幅度,也就是锚框的位置标签。

在前面我们已经问过这样一个问题:当_x, t_y, t_w, t_h取值为多少的时候,预测框能够跟真实框重合?其做法是将预测框坐标中的b_x, b_y, b_h, b_w设置为真实框的坐标,即可求解出t的数值。

令:

标注锚框包含物体类别的标签

对于objectness=1的锚框,需要确定其具体类别。正如上面所说,objectness标注为1的锚框,会有一个真实框跟它对应,该锚框所属物体类别,即是其所对应的真实框包含的物体类别。这里使用one-hot向量来表示类别标签label。比如一共有10个分类,而真实框里面包含的物体类别是第2类,则label为(0,1,0,0,0,0,0,0,0,0)

对上述步骤进行总结,标注的流程如图15所示。

图15:标注流程示意图

通过这种方式,我们在每个小方块区域都生成了一系列的锚框作为候选区域,并且根据图片上真实物体的位置,标注出了每个候选区域对应的objectness标签、位置需要调整的幅度以及包含的物体所属的类别。位置需要调整的幅度由4个变量描述(t_x, t_y, t_w, t_h),objectness标签需要用一个变量描述obj,描述所属类别的变量长度等于类别数C。

对于每个锚框,模型需要预测输出(tx,ty,tw,th,Pobj,P1,P2,...,PC),其中Pobj是锚框是否包含物体的概率,P_1, P_2,... , P_C则是锚框包含的物体属于每个类别的概率。接下来让我们一起学习如何通过卷积神经网络输出这样的预测值。

相关文章
|
6月前
|
机器学习/深度学习 算法 固态存储
最强DETR+YOLO | 三阶段的端到端目标检测器的DEYOv2正式来啦,性能炸裂!!!
最强DETR+YOLO | 三阶段的端到端目标检测器的DEYOv2正式来啦,性能炸裂!!!
224 0
|
机器学习/深度学习 算法 数据挖掘
目标检测算法——YOLOv3
目标检测算法——YOLOv3
348 0
目标检测算法——YOLOv3
|
算法 Go 计算机视觉
【YOLO系列】YOLOv8算法(尖端SOTA模型)
Ultralytics YOLOv8 是由 Ultralytics开发的一个前沿 SOTA 模型。它在以前 YOLO 版本的成功基础上,引入了新的功能和改进,进一步提升了性能和灵活性。YOLOv8 基于快速、准确和易于使用的理念设计,使其成为广泛的物体检测、图像分割和图像分类任务的绝佳选择。
2880 0
【YOLO系列】YOLOv8算法(尖端SOTA模型)
|
机器学习/深度学习 算法 固态存储
基于单阶段的目标检测
随着深度学习的不断发展,目标检测技术逐步从基于传统的手工检测方法向基于深度神经网络的检测方法转变。在众多基于深度学习的目标检测方法中,基于深度学习的单阶段目标检测方法因其网络结构较简单、运行速度较快以及具有更高的检测效率而被广泛运用。
771 0
基于单阶段的目标检测
|
17天前
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
386 1
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
16天前
|
机器学习/深度学习 监控 计算机视觉
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
本文介绍了如何使用YOLOv7进行目标检测,包括环境搭建、数据集准备、模型训练、验证、测试以及常见错误的解决方法。YOLOv7以其高效性能和准确率在目标检测领域受到关注,适用于自动驾驶、安防监控等场景。文中提供了源码和论文链接,以及详细的步骤说明,适合深度学习实践者参考。
139 0
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
17天前
|
机器学习/深度学习 XML 并行计算
目标检测实战(七): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用YOLOX完成图像目标检测任务的完整流程,包括数据准备、模型训练、验证和测试。
79 0
目标检测实战(七): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
5月前
|
机器学习/深度学习 分布式计算 并行计算
基于YOLO和Darknet预训练模型的对象检测
【6月更文挑战第6天】基于YOLO和Darknet预训练模型的对象检测。
51 2
|
5月前
|
固态存储
【YOLO系列】YOLOv10模型结构详解与推理部署实现
【YOLO系列】YOLOv10模型结构详解与推理部署实现
842 0
|
6月前
|
机器学习/深度学习 算法 Serverless
YoLo_V4模型训练过程
YoLo_V4模型训练过程
88 0