YOLO 全面回顾
- 综述
- 评估指标
- YOLO v1
- YOLO v2
- YOLO v3
- YOLO v4
- YOLOv5 与 Scaled-YOLOv4
- YOLOR
- YOLOX
- YOLOv6
- YOLOv7
- DAMO-YOLO
- YOLOv8
- PP-YOLO, PP-YOLOv2, and PP-YOLOE
- YOLO-NAS
- YOLO with Transformers
综述
论文:https://arxiv.org/pdf/2304.00501.pdf
代码:github 搜索 YOLO 具体版本
主要是看看每个版本是怎么解决特定问题的。
首先,问题一就是在速度和准确度之间找到一个平衡。
-
最开始的 YOLO架构 为了快速处理图像,采用了一个单独的神经网络直接在整张图上进行对象检测。
-
目的就是要快,但也不能太牺牲准确度。
然后,问题二是关于提高准确度的。
- 原来的 YOLOv1 准确度还不够高,所以在 YOLOv2 和后面的版本中,他们改进了网络设计,比如加入了anchor boxes(一种框架技术),还修改了损失函数。
- 这些改进就是为了让检测更准确。
第三个问题是如何有效地处理不同大小的对象。
- 在 YOLOv3 及其后续版本中,他们采用了多尺度检测策略,这样就能更好地在不同大小的图像上检测到对象。
第四个问题涉及到计算效率。
- YOLOv4 和后续版本中,为了解决计算资源和效率的问题,进行了网络架构的改进和优化,像是权重剪枝和更高效的卷积操作。
- 这样一来,模型就更轻量了,适合在资源有限的设备上运行。
第五个问题是关于网络架构的自动化搜索,也就是 YOLO-NAS。
- 因为手动设计网络结构有其局限性,通过神经架构搜索(NAS),可以自动找到最优的网络结构,从而提升性能。
第六个问题是关于引入变换器(Transformers)。
- 这是为了改善模型对图像中对象之间复杂空间关系的理解能力。
每个版本都在针对某些特定的挑战进行优化和改进。
评估指标
用于评估模型性能的两个关键方面:对象检测指标和非极大值抑制(NMS)。
-
对象检测模型性能评估 - 平均精度(AP)
- 子问题: 如何客观评估对象检测模型的性能。
- 子解法: 使用平均精度(AP),一种基于精确度和召回率的指标。
- 目的: 通过精确度和召回率的平衡,提供一个综合评估模型性能的单一值。
- 特性: 在不同的类别和置信度阈值下评估模型,确保了全面性和可比性。
-
处理多个对象类别 - 类别平均精度(mAP)
- 子问题: 在包含多个对象类别的情况下,评估模型性能。
- 子解法: 计算每个类别的平均精度(AP),然后取这些AP的平均值(称为mAP)。
- 目的: 确保模型在每个类别上的表现都得到评估,提供更全面的性能指标。
- 特性: 适用于处理具有多个对象类别的复杂数据集,如PASCAL VOC和COCO。
-
准确的对象定位 - 交并比(IoU)
- 子问题: 如何评估模型预测的边界框与真实边界框的匹配程度。
- 子解法: 使用交并比(IoU)作为评估边界框质量的标准。
- 目的: 精确测量模型预测的边界框与实际对象的重叠程度,确保定位准确性。
- 特性: 是评估对象检测模型在精准定位对象方面表现的关键指标。
-
减少重叠边界框 - 非极大值抑制(NMS)
- 子问题: 如何处理模型产生的重叠边界框。
- 子解法: 应用非极大值抑制(NMS)技术过滤掉冗余和不准确的边界框。
- 目的: 减少重叠边界框,保留最准确的预测,提高整体检测质量。
- 特性: 用于在多个重叠预测中选择最佳预测,常用于对象检测算法的后处理。
对象检测领域中模型性能评估和优化 =
- 对象检测模型性能评估 - 平均精度 AP +
- 处理多个对象类别 - 类别平均精度 mAP +
- 准确的对象定位 - 交并比 IoU +
- 减少重叠边界框 - 非极大值抑制 NMS
YOLO v1
-
子问题与解法1: 实时对象检测的一体化方法 - YOLO的端到端架构
- 子问题: 如何在单次网络传递中完成对象检测任务?
- 子解法: YOLO采用了一种端到端的方法,通过将图像分割成网格并对每个网格预测边界框和类别概率。
- 目的: 减少计算复杂度,提高对象检测的速度。
- 特性: 通过一次性处理整个图像实现快速检测,与传统的滑动窗口或区域提案方法相比,大大加快了速度。
-
子问题与解法2: 对象定位和分类 - 网格划分和边界框预测
- 子问题: 如何在一次网络传递中确定对象的位置和类别?
- 子解法: 将输入图像划分为S×S的网格,每个网格预测B个边界框和C个类别的概率。
- 目的: 同时实现对象的定位和分类,确保检测的准确性。
- 特性: 通过在每个网格中预测多个边界框和类别概率,YOLO能够捕捉到图像中的不同对象。
-
子问题与解法3: 训练与网络设计 - YOLOv1的卷积架构
- 子问题: 如何设计一个高效的网络架构进行对象检测?
- 子解法: YOLOv1使用24个卷积层和两个全连接层,通过预训练和微调来优化模型。
- 目的: 通过卷积层捕捉特征,全连接层预测边界框和类别,以实现准确的对象检测。
- 特性: 使用1×1卷积层降低特征图数量,保持参数数量相对较低,从而提高效率。
-
子问题与解法4: 性能优化和过拟合防止 - 预训练和数据增强
- 子问题: 如何提高模型的泛化能力和检测精度?
- 子解法: YOLOv1首先在ImageNet数据集上预训练,然后在PASCAL VOC数据集上进行微调,并使用数据增强技术。
- 目的: 提高模型对新图像的适应能力,并在不同的变换下保持检测的准确性。
- 特性: 数据增强通过缩放、平移、曝光度和饱和度调整增加了训练数据的多样性。
-
子问题与解法5: 损失函数设计 - 多部分损失函数
- 子问题: 如何定义一个合适的损失函数来训练YOLO模型?
- 子解法: YOLOv1的损失函数由多个平方误差项组成,包括定位损失、置信度损失和分类损失。
- 目的: 精确度量模型在边界框预测和类别预测方面的表现,并通过不同的权重来平衡它们。
- 特性: 通过调整λcoord和λnoobj,增强模型对于边界框预测的关注,降低对没有对象的格子的关注。
-
子问题与解法6: 预测后处理 - 非极大值抑制(NMS)
- 子问题: 如何在模型预测出多个重叠边界框时选择最佳的框?
- 子解法: 应用非极大值抑制(NMS)来消除重叠的预测,只保留具有最高置信度的边界框。
- 目的: 减少冗余的检测框,提高检测的质量和准确性。
- 特性: NMS通过保留最佳预测并移除重叠的、次优的预测,优化了最终的检测结果。
-
子问题与解法7: 优化和局限性处理 - 改进YOLOv1
- 子问题: YOLOv1在哪些方面存在限制,以及如何进行优化?
- 子解法: 分析YOLOv1的局限性,包括对相同类别的对象在同一网格中的检测限制、对特定宽高比对象的检测问题,以及下采样层导致的粗糙特征学习。
- 目的: 通过识别这些问题,为未来版本的YOLO提供了改进方向。
- 特性: YOLOv1的简单架构和一次回归检测虽然快速,但在对象定位精度方面不如当时的先进方法,这促使后续版本进行了优化。
上图是一个采用3x3网格的YOLO模型,用于检测三个类别,每个网格元素预测一个类别,产生一个包含八个值的向量。
-
存在性(Existence of object): 对于每个网格单元,模型预测一个对象是否存在。
在这个例子中,只有中间和右边的网格单元预测到对象存在(值为1),其他网格的值为0,表示没有检测到对象。
-
边界框(Bounding box): 对于中间网格单元,模型预测了边界框的参数,包括:
- ( b_x ) 和 ( b_y ) 是边界框中心相对于网格单元的位置坐标。
- ( b_h ) 和 ( b_w ) 是边界框的高度和宽度相对于整个图像的比例。
-
类别标签(Class labels): 模型还预测了三个可能的类别(c1, c2, c3),其中c1为1,表示该模型预测中间网格单元包含的对象属于第一个类别。
这张图里的数字代表了模型预测的概率值或者坐标偏移值。
例如,中间网格单元的( P_c )值为1,意味着模型非常确信该网格中存在一个对象。
而( b_x = 0.82 ) 和 ( b_y = 0.60 ) 表示边界框的中心位置,( b_h = 0.25 ) 和 ( b_w = 0.48 ) 表示边界框的高度和宽度。
这种方法允许模型以单次前向传播来检测图像中的多个对象及其位置。
更具体过程:YOLO系列:YOLO v1-v8、YOLOx、PP-YOLOE、DAMO-YOLO、YOLOX-PAI 设计思路
YOLO v2
YOLOv1是一个革命性的对象检测模型,它以其速度和效率在计算机视觉领域引起了轰动。然而,尽管它的性能令人印象深刻,但它在一些关键方面仍有局限性。
例如,它在处理小物体、靠近的物体以及那些与训练数据中的形状和尺寸差异很大的物体时,表现不尽人意。
此外,YOLOv1在精确定位物体方面也存在一些挑战,特别是在复杂的背景中。
为了克服这些问题,YOLOv2引入了一系列改进措施,使得模型不仅保持了YOLOv1的快速性能,同时在准确性、灵活性和鲁棒性方面都有显著提升。
-
改善训练稳定性 - 批量归一化:
- 为什么引入:批量归一化通过规范化层的输入,可以加速训练过程并减少过拟合。
- 改进原因:YOLOv1在训练过程中可能会遇到收敛问题,批量归一化有助于缓解这一问题,提高模型的泛化能力。
-
高分辨率分类 - 分辨率提升:
- 为什么提升分辨率:高分辨率可以帮助模型捕捉到更细致的图像特征,从而提高检测的准确性。
- 改进原因:YOLOv1在处理高分辨率图像时可能不够准确,提高分辨率可以使模型更好地学习和识别详细特征。
-
结构简化 - 全卷积网络:
- 为什么使用全卷积:全卷积网络能够处理任意大小的输入图像,而不是限制在特定的输入尺寸。
- 改进原因:YOLOv1使用了全连接层,这限制了输入图像的尺寸,全卷积网络的使用提高了模型的灵活性。
-
边界框预测 - 使用锚点框:
- 为什么使用锚点框:锚点框能够为模型提供一系列预定义的边界框形状,以适应不同形状的物体。
- 改进原因:YOLOv1在预测靠近的物体或者不常见比例的物体时可能会出错,锚点框提供了一种更好的先验知识。
-
精确预测 - 维度聚类:
- 为什么使用维度聚类:通过聚类分析实际数据中的边界框,可以找到更适合的锚点框尺寸。
- 改进原因:YOLOv1可能无法很好地预测实际中的边界框尺寸,维度聚类帮助模型更准确地估计边界框。
-
直接位置预测 - 网格单元相对坐标:
- 为什么直接预测位置:这简化了预测过程,使模型可以直接预测边界框相对于网格单元的位置。
- 改进原因:YOLOv1在进行边界框定位时,对于每个网格单元中的对象,只能预测边界框的中心相对于网格单元的偏移,并且限制了每个单元只能检测一定数量的对象(通常是两个)。
这种方法在面对多个密集排列的小尺寸对象时会遇到问题,因为它可能无法准确区分紧邻的多个对象。
直接位置预测使YOLOv2能够更准确地定位每个网格单元中的多个对象,特别是当这些对象彼此非常接近时。
这一改进让模型对于小物体的检测更加敏感,并且改善了对于对象群体的定位能力。
改进原因:YOLOv1预测边界框时依赖于整个图像的全局信息,这可能导致对小物体或紧密排列的物体的位置预测不够精确。直接在网格单元内预测位置可以提高这些情况下的定位准确性。
-
更细粒度特征 - 去除一个池化层:
- 为什么去除池化层:减少池化层可以保留更多的空间信息,这对于定位小物体特别重要。
- 改进原因:YOLOv1通过池化层减少了特征图的维度,这虽然有助于减少计算量,但同时也丢失了一些细节信息。减少池化层的数量,YOLOv2能够保留更多的细节信息,提高对小对象的识别能力。
-
多尺度训练 - 灵活的输入尺寸:
- 为什么进行多尺度训练:多尺度训练使模型能够适应不同大小的输入图像,这样模型就能够更好地泛化到各种分辨率的图像上。
- 改进原因:YOLOv1在训练和测试时使用的是固定尺寸的图像,这可能限制了模型在不同尺寸输入上的表现。通过对模型进行多尺度训练,YOLOv2能够更好地适应不同尺寸的图像,从而提高了在实际应用中的适用性和鲁棒性。
通过这些改进,YOLOv2不仅在处理各种尺寸和比例的对象方面更加灵活,而且还提高了整体的检测精度,尤其是在复杂场景和高分辨率图像中的表现。
v2 损失函数,由三部分组成:
-
定位损失(Localization Loss): 这部分损失负责测量模型预测的边界框与真实边界框(Ground Truth, GT)之间的差异。
它使用平方和误差来计算边界框的中心位置 ( x, y ) 和尺寸 ( w, h ) 的预测误差。
如果一个对象确实在网格单元内被检测到(表示为 ( 1_{ij}^{obj} )),则会计算这部分损失。
-
置信度损失(Confidence Loss): 这部分损失衡量模型对存在对象的边界框的置信度预测的准确性。
它包括两部分:当一个对象被检测到时的置信度误差(对应于 ( 1 i j o b j ( 1_{ij}^{obj} (1ijobj),以及当一个对象未被检测到时的置信度误差(对应于 1 i j n o o b j 1_{ij}^{noobj} 1ijnoobj), λ n o o b j \lambda_{noobj} λnoobj 是一个缩放因子,用于调整不包含对象的边界框的损失权重。
-
分类损失(Classification Loss): 这部分损失负责测量模型对每个类别预测概率的准确性。只有当一个对象在网格单元内出现时,才会计算这部分损失。
整个损失函数结合了这三个部分,使得模型在训练时能够同时学习如何准确地定位对象、如何判断对象的存在,并且正确分类对象,减少各种类型的预测误差。
v2 中用于预测边界框的锚点框(Anchor Boxes)机制和边界框的预测方式:
-
图7(Anchor boxes): YOLOv2为每个网格单元定义了多个锚点框。
这些锚点框是具有预定义宽高比的矩形框,设计用来捕捉训练数据中常见的对象形状。
在预测时,每个网格单元可以使用这些锚点框来预测对象的位置和尺寸,而每个锚点框都有一个预测值集合,包括边界框的中心、宽度、高度和对象类别。
-
图8(Bounding boxes prediction): 这张图详细展示了如何从预测值 t x , t y , t w , t h t_x, t_y, t_w, t_h tx,ty,tw,th 计算最终的边界框坐标。
t x t_x tx 和 t y t_y ty 通过一个sigmoid函数得到,确保输出值在 0 到 1 之间,表示边界框中心相对于网格单元的位置。
这些值然后与网格单元的偏移量 c x , c y c_x, c_y cx,cy 相加,得到边界框中心的最终位置。
边界框的宽度 b w b_w bw 和高度 b h b_h bh 是通过对预测值 t w t_w tw 和 t h t_h th 应用指数函数并乘以锚点框的原始宽度 p w p_w pw 和高度 p h p_h ph 来计算的,以获得最终的尺寸。
这种方法允许YOLOv2根据网格单元的位置动态调整边界框的尺寸,同时通过锚点框处理各种形状和大小的对象,在提高模型的灵活性和准确性方面是很重要的。
更具体过程:YOLO系列:YOLO v1-v8、YOLOx、PP-YOLOE、DAMO-YOLO、YOLOX-PAI 设计思路
YOLO v3
YOLOv3引入的改进针对的是提高检测精度、加强小物体识别和优化模型的泛化能力,同时保持实时性能。
YOLOv3在继承了YOLOv2的基础上进行了显著的改进,目的是为了与当时的最先进技术相匹配(跳跃链接),并保持实时性能:
-
子问题与解法1: 边界框预测的改进 - 对象性得分的引入
- 为什么使用对象性得分:通过逻辑回归为每个边界框预测一个对象性得分,这个得分对于与真实边界框重叠最多的锚点框为1,其余为0。
- 改进原因:这是因为在YOLOv2中,边界框可能会缺乏区分真实对象与背景的明确信号,通过引入对象性得分,YOLOv3能够更准确地判断边界框中是否包含对象。
-
子问题与解法2: 类别预测的改进 - 独立逻辑分类器的使用
- 为什么使用独立逻辑分类器:使用二元交叉熵训练独立的逻辑分类器,将问题构建为多标签分类。
- 改进原因:与YOLOv2不同,这样可以在同一个边界框上分配多个标签,这在某些具有重叠标签的复杂数据集上非常有用,例如同一个对象既可以标为“人”也可以标为“男人”。
-
子问题与解法3: 主干网络的改进 - Darknet-53的引入
- 为什么引入Darknet-53:YOLOv3引入了包含53个卷积层的更大特征提取器,且带有残差连接。
- 改进原因:这是为了捕获更复杂的特征表示,并加速网络的训练过程,同时与更大的ResNet-152相比提供了几乎两倍的速度。
-
子问题与解法4: 特征提取的改进 - 空间金字塔池化 (SPP)
- 为什么使用SPP:YOLOv3在主干网络中加入了修改过的SPP块,它使用不同大小的池化核来扩大感受野。
- 改进原因:这是为了提升网络在没有下采样的情况下对大范围特征的把握能力,尤其是对AP50指标的提升有显著帮助。
-
子问题与解法5: 多尺度预测的引入
- 为什么使用多尺度预测:YOLOv3在三个不同的尺度上预测三个不同大小的边界框。
- 改进原因:这有助于获取更精细的边界框,并显著提高了对小物体的预测能力,这是以往版本的主要弱点。
-
子问题与解法6: 边界框先验的改进 - 使用不同尺度的锚点框
- 为什么调整锚点框:与YOLOv2不同,YOLOv3为三个不同的尺度使用了三个先验框。
- 改进原因:这是为了在多个尺度上提供更准确的边界框预测,并且可以更好地适应不同大小的物体。
更具体过程:YOLO系列:YOLO v1-v8、YOLOx、PP-YOLOE、DAMO-YOLO、YOLOX-PAI 设计思路
YOLO v4
YOLOv4的改进是为了解决之前版本YOLO系列模型在某些方面的限制,并进一步增强其检测能力。
-
子问题与解法1: 网络架构的增强 - CSPDarknet53
- 以前的问题: YOLOv3的Darknet-53虽然性能强大,但计算量较大。
- 改进的解法: 使用CSPNet结构优化Darknet-53,减少计算量。
- 为什么使用: CSPNet通过在不同阶段的连接中减少参数,既减轻了计算负担,又保持了模型的准确率。
-
子问题与解法2: 训练策略的优化 - 高级数据增强
- 以前的问题: 以前的YOLO版本在训练数据多样性和正则化方面有限。
- 改进的解法: 引入马赛克数据增强和DropBlock正则化。
- 为什么使用: 通过更复杂的数据增强提高模型泛化能力,DropBlock更适合于卷积网络的结构,提升了正则化效果。
-
子问题与解法3: 对抗性鲁棒性的提升 - 自适应对抗训练
- 以前的问题: 早期版本的YOLO可能对输入扰动不够鲁棒。
- 改进的解法: 通过自适应对抗训练增加模型鲁棒性。
- 为什么使用: 使模型在面对输入扰动时保持性能,增加了模型对抗不利条件的适应性。
-
子问题与解法4: 超参数的优化 - 遗传算法
- 以前的问题: 之前YOLO版本的超参数选择可能不是最优的。
- 改进的解法: 使用遗传算法来优化超参数选择。
- 为什么使用: 遗传算法可以系统地探索参数空间,找到最优的训练超参数组合。
综上,YOLOv4的改进主要集中在四个方面:
- 提升架构效率:通过CSPDarknet53减少了计算量,同时保持了性能。
- 增强训练策略:引入新的数据增强和正则化技术,提高了模型的泛化能力和准确率。
- 增加模型鲁棒性:自适应对抗训练提高了模型对输入变化的适应能力。
- 优化超参数选择:遗传算法确保了训练过程使用最佳的超参数。
这些改进解决了以前版本中的特定问题,例如提高模型对多样化训练数据的适应能力、提升对抗性攻击的鲁棒性,以及通过精细调整超参数来优化训练效果。
通过这些集成的改进措施,YOLOv4在不牺牲实时性能的前提下实现。
- CSPDarknet53:作为特征提取器或主干网络(backbone),它包含多个卷积层和跨阶段部分连接(cross-stage partial connections),以及用于特征提取的残差网络结构。
- CMB:代表卷积层(Convolution)+ 批量归一化(Batch Normalization)+ Mish激活函数,这是在整个网络中广泛使用的基础模块。
- CBL:这是一个包含卷积层(Convolution)、批量归一化(Batch Normalization)和Leaky ReLU激活函数的组合模块。
- SPP:空间金字塔池化(Spatial Pyramid Pooling),用于聚合不同尺度的特征,以提高感受野,并改善检测性能。
- PANet:路径聚合网络(Path Aggregation Network),用于增强不同层间的特征连接和信息流,以改善特征的表示能力。
- UP:上采样(upsampling),它将特征图的尺寸增加到更高分辨率,以用于多尺度预测。
- YOLO Head:检测头部分,它负责根据主干网络和颈部网络提供的特征进行目标的分类和定位。
网络输出是三个不同尺度的特征图,每个特征图都包含了物体的边界框(bounding box)信息和类别预测。
这些特征图的尺寸分别为 13x13
、26x26
和 52x52
,代表不同尺度的预测,以便在不同大小的图像区域中检测对象。
更具体过程:YOLO系列:YOLO v1-v8、YOLOx、PP-YOLOE、DAMO-YOLO、YOLOX-PAI 设计思路
YOLOv5 与 Scaled-YOLOv4
YOLO v5:
YOLOv5 和 Scaled-YOLOv4 的改进点是为了解决以前版本在特定场景下的局限性,如小物体检测不准确、实时性能不足等问题。
- YOLO v5 上图:CSPDarknet53主干网络与SPPF和PANet,加上对YOLOv3头部风格的引用以及SiLU激活函数
这些改进使得YOLO系列在保持实时性能的同时,也能在更多场景下提供更高的准确性和适应性。
YOLOv5的改进和特性:
-
子问题与解法1: 锚点框自适应调整 - AutoAnchor
- 为什么使用AutoAnchor: 因为传统的锚点框可能不适合所有数据集和训练配置。
- 目的: 自动调整锚点框以提高模型对特定数据集的准确性和召回率。
-
子问题与解法2: 架构优化 - 修改后的CSPDarknet53
- 为什么使用修改后的CSPDarknet53: 为了在不牺牲准确性的情况下降低计算成本。
- 目的: 提供一个强大而高效的特征提取器,加速特征提取并处理不同尺度的特征。
-
子问题与解法3: 特征金字塔网络优化 - SPPF和CSP-PAN
- 为什么使用SPPF和CSP-PAN: 为了提高网络的特征处理能力和解析度。
- 目的: 允许网络捕获更详细的信息,尤其是小尺寸的物体。
-
子问题与解法4: 数据增强策略 - Mosaic和其他增强
- 为什么使用Mosaic等增强: 为了提高网络对不同环境下物体的检测能力。
- 目的: 增强模型的泛化能力,使其对各种变化和干扰更为鲁棒。
Scaled-YOLOv4的改进和特性:
-
子问题与解法1: 模型缩放技术 - Scaling-up和Scaling-down
- 为什么使用Scaling-up和Scaling-down: 为了在准确性和速度之间找到最佳平衡。
- 目的: 提供不同性能级别的模型,以适应从嵌入式设备到高端GPU的不同计算资源。
-
子问题与解法2: 轻量级模型 - YOLOv4-tiny
- 为什么使用YOLOv4-tiny: 为了在低端设备上提供实时性能。
- 目的: 创建一个运行快速但准确度较低的模型,适合计算资源受限的场景。
-
子问题与解法3: 高性能模型 - YOLOv4-large
- 为什么使用YOLOv4-large: 为了在服务器级硬件上实现最先进的性能。
- 目的: 提供一个准确度高的模型,虽然速度较慢,但能在高资源环境中达到最好的检测效果。
YOLOR
YOLOR其实是基于YOLO之上的一个进阶版,目的是要打造一个能够同时搞定好几个任务的全能模型,就像是分类啦、发现物体啦、还有估计姿态啦这些。
要做到这一点,研究者们采取了两个主要的策略:
-
多任务学习方法 - 通用表征学习:这个想法就是让模型学到一种能通用于多个任务的知识,这样一来,不同的任务可以共享一些学到的特点,就像我们人类学习自行车骑行和滑冰时共享平衡的技能一样。
-
隐式知识编码 - 多任务表征增强:在我们的大脑里,有些知识是我们潜意识中学到的,我们可能没法清楚地解释它们,但这些知识对解决问题超有帮助。
YOLOR就是想让模型也能这样,通过编码这些隐式的知识,让模型在处理多个不同的任务时都能有更好的表现。
总的来说,YOLOR的大动作就是打通任督二脉,让模型不仅仅是单打独斗,而是能够在多个领域都发挥出色,更像一个多面手。
这种方法让模型在多个任务上都能受益,变得更聪明也更能适应不同的挑战。
YOLOX
YOLOX 是一个在YOLOv3基础上改进的对象检测模型,主要是为了提高准确性并简化训练过程。
在YOLOv3中,分类和定位任务是通过耦合的头部(coupled head)执行的,这意味着相同的特征图被用于这两种任务。
具体来说,它使用了 1x1
卷积层来降低特征通道,然后通过 3x3
卷积层来进行类别置信度(分类)和定位(回归)的预测。
相比之下,YOLOX采用了解耦的头部设计(decoupled head),它首先使用 1x1
卷积层将特征通道减少到256,然后添加了两个平行的分支,每个分支都有两个 3x3
卷积层,分别用于类别置信度(分类)和定位(回归)任务。
在这种设计中,定位任务还包括了交并比(IoU)的分支,这是为了提高边界框定位的准确性。
解耦的头部允许模型分别学习分类和定位的最优特征,助于提高整体检测性能。
通过这种方式,YOLOX可以更准确地区分不同的对象,并更精确地定位它们。
YOLOX 的改进点:
-
无锚点架构:这是从YOLOv2起就一直用的锚点(anchor-based)检测器的一个大转变。
YOLOX 借鉴了 CornerNet、CenterNet 和 FCOS 这些无锚点的先进对象检测器的思路,摒弃了锚点。
去掉锚点之后,训练和解码过程都简化了不少,而且还提升了模型的准确率。
-
多正样本:为了解决去掉锚点后产生的大量不平衡问题,YOLOX使用了中心采样技术,通过将中心区域的3×3面积定义为正样本,来增强模型的学习能力。
-
解耦头部:之前的研究表明,分类置信度和定位准确性之间可能存在不一致。
YOLOX就把这两个任务分开,用两个不同的头部来处理,一个负责分类,另一个负责回归,这样做不仅提升了模型的准确率,还加快了模型的收敛速度。
-
高级标签分配:有研究表明,当多个对象的边界框重叠时,标签分配可能会出现歧义。
YOLOX受到这些研究的启发,提出了一种简化的分配方法simOTA,通过解决一个最优传输问题来分配标签,有效提高了模型的性能。
-
强化增强:YOLOX采用了MixUp和Mosaic这样的强化数据增强方法。
作者发现,在使用这些增强方法后,在ImageNet上的预训练就不再那么有益了,但这些强化的增强技术显著提高了模型的准确率。
通过这些改进,YOLOX在速度和准确性之间找到了一个最优平衡点,达到了2021年的最先进水平。
YOLOv6
YOLOv6 是由美团视觉AI部门在2022年发布的一种新的对象检测模型,设计目的是为了提高检测速度和准确性。
-
背部(Backbone):它使用了一种新的以RepVGG模块为基础的结构,用于从输入图像中提取特征。
这些模块有助于网络学习到复杂的视觉模式,而且它们是层级排列的,以捕捉从低级到高级的特征。
-
脖子(Neck):它包括空间金字塔池化快速(SPPF)模块和多个卷积模块(Conv Modules),这些模块处理来自背部的特征并通过上采样(Upsample)和连接(Concat)操作将特征结合起来,以增强网络对不同尺度的特征感知。
-
头部(Head):头部则负责对分类和边界框回归任务进行预测。
YOLOv6采用了与YOLOv5类似的卷积模块,但使用了解耦头部,与YOLOv5的耦合头部不同,这样做可以更有效地分离这两个任务。
整个架构的目的是提高目标检测的准确性和效率,YOLOv6在保持YOLO系列快速实时检测的优势的同时,通过新的结构和技术提升了模型的性能。
图中还展示了特定的网络层如何连接,以及每个部分如何贡献于最终的损失计算,这对于模型训练和优化至关重要。
YOLOv6的创新点:
-
新的背景网络(Backbone):基于RepVGG的EfficientRep,使用高度并行结构,提高了处理速度。这种结构对比之前的YOLO背景网络有更高的并行度。
之所以使用这种结构,是为了增强模型处理大规模数据的能力。
-
标签分配:采用了TOOD中介绍的任务对齐学习方法。
改进了标签分配的准确性,提高了模型识别对象的能力。
-
新的分类和回归损失函数:使用了分类的VariFocal损失和SIoU/GIoU回归损失。
新的损失函数有助于提升模型预测边界框的准确性和分类的可信度。
-
自我蒸馏策略:用于回归和分类任务,以增强模型的泛化能力和准确性。
-
检测用量化方案:使用RepOptimizer和通道级蒸馏,这有助于模型在不牺牲准确性的前提下提高检测速度。
YOLOv6提供了从YOLOv6-N到YOLOv6-L6的八种不同规模的模型版本,以适应不同的应用场景和硬件要求。
在MS COCO数据集上的评估结果显示,最大的模型在NVIDIA Tesla T4上可以达到57.2%的AP和大约29FPS的速度。
YOLOv6的目的是在保持YOLO系列实时检测的传统的同时,通过创新的网络结构和训练策略,提升模型的性能和效率。
更具体过程:YOLO系列:YOLO v1-v8、YOLOx、PP-YOLOE、DAMO-YOLO、YOLOX-PAI 设计思路
YOLOv7
YOLOv7 是由 YOLOv4 和 YOLOR 的原作者在 2022 年发布的目标检测模型。
它在速度和准确性上超越了所有已知的目标检测器,同时没有使用预训练的模型,仅仅依赖于 MS COCO 数据集进行训练。
YOLOv7 提出了一些架构上的改变和一系列的“免费好处”(bag-of-freebies),这些改变提高了准确性,但只增加了训练时间,而不影响推断速度。
YOLOv7 的架构,它在网络设计中引入了 ELAN(Efficient Layer Aggregation Network)块,以增强模型的学习和代表性能力,并修改了RepVGG,去除了身份连接。
从输入图像到最终损失计算的整个流程,包括如下几个部分:
- 主干(Backbone):使用ELANBlock和ConvModule构建,以提取图像特征。
- 颈部(Neck):包含上采样(Upsample)和连接(Concat)操作,以及ELANBlock和RepVGG,用于融合和加工不同尺度的特征。
- 头部(Head):利用隐式的组件(ImplicitA和ImplicitM)来处理特定的任务,例如分类和边界框回归。
解决方案与改进点:
-
扩展高效层聚合网络(E-ELAN):
- 使用E-ELAN的原因:它通过控制最短的最长梯度路径来允许深度模型更有效地学习和收敛,E-ELAN适用于具有无限堆叠计算块的模型。
- 改进目的:在不破坏原始梯度路径的情况下,通过洗牌和合并基数来组合不同组的特征,增强网络的学习能力。
-
基于连接的模型的模型缩放:
- 使用模型缩放的原因:标准的缩放技术(如深度缩放)会导致过渡层的输入通道和输出通道之间的比率变化,进而导致模型的硬件利用率下降。
- 改进目的:提出了一种新的缩放策略,通过相同的因子缩放模块的深度和宽度,以保持模型的最佳结构。
-
计划重参数化卷积:
- 使用重参数化卷积的原因:身份连接在RepConv中破坏了ResNet中的残差和DenseNet中的连接。
- 改进目的:去除身份连接并称其为RepConvN,以保持残差结构。
-
辅助头的粗标签分配和主头的精细标签分配:
- 标签分配的原因:主头负责最终输出,而辅助头协助训练。
- 改进目的:提高模型的训练效率和准确性。
-
卷积-批量标准化-激活中的批量标准化:
- 使用批量标准化的原因:在推理阶段将批量标准化的均值和方差整合到卷积层的偏置和权重中。
- 改进目的:简化推理阶段的计算过程。
-
YOLOR中的隐式知识:
- 使用隐式知识的原因:隐式知识可以帮助神经网络更好地应用于多任务,类似于人类如何使用过去的经验来处理新问题。
- 改进目的:将隐式知识引入神经网络,以提升所有任务的性能。
-
指数移动平均作为最终推理模型:
- 使用指数移动平均的原因:提供稳定的模型性能。
- 改进目的:在不牺牲准确性的情况下提供更稳定的推理结果。
与YOLOv4和YOLOR的对比:
- 与YOLOv4相比,YOLOv7在参数数量减少了75%,计算量减少了36%,同时平均精度(AP)提高了1.5%。
- 与YOLOv4-tiny相比,YOLOv7-tiny在参数数量上减少了39%,计算量减少了49%,同时保持了相同的AP。
- 与YOLOR相比,YOLOv7在参数数量上减少了43%,计算量减少了15%,同时AP略有0.4%的提升。
YOLO v7 在不牺牲检测速度的前提下,通过一系列的架构优化和训练策略的改进,实现了对于早期版本的显著提升。
改进包括提高了模型的学习效率、简化了模型结构以适应不同的硬件需求,并且增强了模型对于各种数据分布的适应能力。
更具体过程:YOLO系列:YOLO v1-v8、YOLOx、PP-YOLOE、DAMO-YOLO、YOLOX-PAI 设计思路
DAMO-YOLO
DAMO-YOLO 是阿里巴巴集团在2022年发布的目标检测模型,结合了那时候的技术进步,旨在解决以前YOLO版本的不足并提升性能。
改进点:
-
神经架构搜索(NAS):
- 使用NAS的原因:为了自动找到一个高效的网络架构。
- 改进目的:通过MAE-NAS方法,自动化地探索并选择最佳的网络结构,以提升性能。
-
大型颈部(Neck):
- 设计大颈部的原因:借鉴GiraffeDet、CSPNet和ELAN的设计,以实现实时处理。
- 改进目的:创建一个称为Efficient-RepGFPN的实时工作颈部,以提升整体模型性能。
-
小型头部(Head):
- 采用小头部的原因:发现大颈部配合小头部可以获得更好的性能。
- 改进目的:通过ZeroHead方法简化分类和回归的层次,以提高效率和精度。
-
AlignedOTA标签分配:
- 使用AlignedOTA的原因:为了解决分类和回归之间的不对齐问题。
- 改进目的:通过引入焦点损失到分类成本,并使用预测和真实框的IoU作为软标签,从全局视角解决问题。
-
知识蒸馏:
- 采用知识蒸馏的原因:为了让学生模型在老师模型的指导下学习,然后独立细化。
- 改进目的:实现两阶段策略,先有老师指导,后学生独立微调,并通过Align Module和通道动态温度调节增强蒸馏效果。
与之前的YOLO模型的对比:
- DAMO-YOLO 通过 NAS 寻找高效架构,而先前的 YOLO 版本可能没有利用这种自动化搜索。
- 通过设计更大的 Neck 和更小的 Head,DAMO-YOLO 在结构上进行了优化,以前的 YOLO 版本可能在这两个部分的设计上没有这样的重点。
- 引入 AlignedOTA 和知识蒸馏的方法是对以往 YOLO 版本在标签分配和模型泛化方面的改进。
组成 =
- 网络架构搜索、MAE-NAS
- 颈部设计、Efficient-RepGFPN
- 头部设计、ZeroHead
- 标签分配、AlignedOTA
- 知识蒸馏、两阶段策略、Align Module、通道动态温度调节
在整体解决方案中,每种改进都旨在提高模型的性能,无论是在准确性、速度还是适应性方面。这些改进让 DAMO-YOLO 在目标检测任务中取得了显著的成绩。
YOLOv8
YOLOv8 是 Ultralytics 公司开发的目标检测模型,它在 YOLOv5 的基础上进行了改进,并提供了多个版本以支持不同的视觉任务。
改进点:
-
改进的CSPLayer(现称为C2f模块):
- 使用C2f模块的原因:结合高级特征和上下文信息以提高检测精度。
- 改进目的:通过C2f模块的使用,提升模型的特征融合能力和检测精度。
-
锚点无关模型与解耦头部:
- 采用锚点无关模型的原因:允许独立处理对象性、分类和回归任务,提高模型的总体精确度。
- 改进目的:让每个分支专注于其任务,提高模型的整体准确性和效率。
-
使用CIoU和DFL损失函数:
- 选择CIoU和DFL损失函数的原因:改善特别是在处理较小物体时的目标检测性能。
- 改进目的:通过这些损失函数,提高对小物体检测的准确性。
-
YOLOv8-Seg语义分割模型:
- 开发YOLOv8-Seg的原因:提供一个在不同目标检测和语义分割基准上都能取得最先进结果的模型,同时保持高速度和效率。
- 改进目的:增加模型的应用范围,使其能够在语义分割等额外的任务上也能取得良好表现。
与之前的YOLO模型的对比:
- YOLOv8在保持YOLOv5的背景知识的同时,对模型的某些部分进行了改进,比如C2f模块的引入。
- YOLOv8引入了锚点无关模型和解耦头部,这是在以往的YOLO模型中不常见的。
- YOLOv8采用了CIoU和DFL等新的损失函数,而以前的YOLO模型可能没有使用这些方法。
组成 =
- CSPLayer的改进、C2f模块
- 锚点无关模型和解耦头部
- 损失函数的选择、CIoU和DFL
- 增加语义分割功能、YOLOv8-Seg
更具体过程:YOLO系列:YOLO v1-v8、YOLOx、PP-YOLOE、DAMO-YOLO、YOLOX-PAI 设计思路
PP-YOLO, PP-YOLOv2, and PP-YOLOE
首先,PP-YOLO 是在 2020 年由百度的研究人员基于 YOLOv3 开发出来的。
这个模型使用了 PaddlePaddle 这个深度学习平台,所以有了 PP 这个名字。
PP-YOLO 引入了好几个提升检测器准确率的技巧,但它保持了原来的速度不变。
作者的目标不是发明一个全新的检测器,而是通过一步一步的改进来展示如何构建一个更好的检测器。
PP-YOLO 在很多方面都进行了创新,但也有一些是借鉴了 YOLOv4 的技巧,只是实现方式有所不同。
PP-YOLO 的变化主要包括:
- 更换了主干网络,从 DarkNet-53 切换到了 ResNet50-vd,还引入了一种叫做可变形卷积的新结构。
- 为了提升训练稳定性,它增加了批量大小,并更新了训练计划和学习率。
- 使用了训练参数的移动平均值,而不是最终的训练值。
- 引入了一个新的 IoU 预测分支,以及 IoU 感知损失,这在推断时能够考虑定位的准确性。
- 采用了一种叫做 Matrix NMS 的新方法,这个方法更快,因为它可以并行运行。
- 使用了 CoordConv 和空间金字塔池化来提高模型对小物体的检测性能。
然后是 PP-YOLOv2,这个模型在 2021 年发布,它在 PP-YOLO 的基础上做了四点改进,这些改进使得性能从 45.9% 的 AP 提升到了 49.5%。这些改进包括:
- 主干网络从 ResNet50 更换到了 ResNet101。
- 使用路径聚合网络(PAN)代替了 FPN,这点和 YOLOv4 类似。
- 引入了 Mish 激活函数,但只在检测颈部使用,以保持主干网络的 ReLU 不变。
- 扩大了输入尺寸范围,这有助于提高对小物体的检测性能。
最后,PP-YOLOE 是在 2022 年发布的,它在 PP-YOLOv2 的基础上又做了进一步的提升,实现了 51.4% 的 AP 和更快的检测速度。
PP-YOLOE 的主要改进点包括:
- 采用了无锚点(anchor-free)架构。
- 采用了全新的主干网络和颈部结构,这些受到了 TreeNet 的启发,并结合了残差和密集连接。
- 实施了任务对齐学习(TAL)和有效的任务对齐头部(ET-head),以减少任务不一致问题,并提高速度和准确性。
- 引入了 Varifocal (VFL) 和 Distribution focal loss (DFL),这两种损失函数能在训练期间优先考虑高质量样本,同时在推断时保持一致性。
每一次迭代和新版本的 YOLO 模型,都是为了解决之前版本中存在的问题,如提高对小物体的检测准确性、加速模型的训练和推理速度,以及优化模型的整体结构以提高准确率。
就像以前的 YOLO 版本一样,作者通过调整主干网络和颈部的宽度和深度,生成了多个不同规模的模型。
这些模型被命名为 PP-YOLOE-s(小型)、PP-YOLOE-m(中型)、PP-YOLOE-l(大型)和 PP-YOLOE-x(超大型),以适应不同的应用场景和硬件需求。
这些模型的目的是为了在保持高效的同时,提供各种规模的解决方案,以满足不同性能和资源限制的需求。
例如,小型和中型模型可能更适合资源受限的环境,而大型和超大型模型则旨在实现最高的性能,尽管这可能意味着需要更多的计算资源。
YOLO-NAS
YOLO-NAS 是由 Deci 公司发布的目标检测模型,专为检测小型物体、提高定位准确性和提升性能与计算比率而设计
改进点:
-
量化感知模块:
- 使用原因:通过重参数化实现 8 位量化,减少后训练量化中的准确度损失。
- 改进目的:在量化后保持模型的性能,尤其是在边缘设备上的实时应用中。
-
自动架构设计:
- 使用原因:Deci 的 AutoNAC 技术可以自动找到最高效的模型结构。
- 改进目的:为了自动化模型优化流程,确保在特定应用场景中达到最佳性能和速度的平衡。
-
混合量化方法:
- 使用原因:选择性地量化模型的特定部分,而不是标准量化的全面影响。
- 改进目的:平衡延迟和准确性,特别是在对速度和精度都有要求的场景中。
-
自动标记数据的预训练:
- 使用原因:利用自动标记的大数据集和自我蒸馏技术。
- 改进目的:利用大量的数据进行预训练,以提高模型的泛化能力和准确性。
具体的架构和训练过程:
- RepVGG 块被整合到模型中,以兼容后训练量化(PTQ)。
- 三种架构:通过变化 QSP 和 QCI 块的深度和位置,生成了三种不同规模的模型:YOLO-NASS、YOLO-NASM 和 YOLO-NASL(分别代表小型、中型和大型)。
训练数据:
- 模型首先在包含两百万图像和 365 个类别的 Objects365 数据集上进行预训练。
- 然后使用 COCO 数据集生成伪标签。
- 最后,模型使用 COCO 数据集原始的 118k 训练图像进行训练。
发布的模型和性能:
- 目前已发布三种精度的 YOLO-NAS 模型:FP32、FP16 和 INT8,其中 16 位精度的模型在 MS COCO 上实现了 52.2% 的 AP。
YOLO-NAS 的目的是提供一个高性能的模型,能够在实时边缘设备上准确地检测小型物体,同时具有高效的性能计算比。
通过 AutoNAC 系统的帮助,用户可以找到最适合他们特定用途的结构,这项技术不仅考虑了数据和硬件,还考虑了推理过程中的其他因素,如编译器和量化。
这些模型的发布,展示了 Deci 在构建、优化和部署深度学习模型方面的专业能力。
YOLO with Transformers
在深度学习的多个领域,包括视觉在内,Transformer模型已经取得了突破性的进展。
因此,自然会有尝试将Transformer与YOLO结合起来用于目标检测。
YOLO结合Transformer技术的几个尝试:
-
YOLOS:
- 使用Transformer的原因:它在处理序列化数据时表现出的强大能力,这对于目标检测有潜在的好处。
- 具体解法:将用于图像分类的预训练Vision Transformer(ViT)修改为目标检测模型,通过替换[CLS]标记为[DET]标记,并用类似DETR的双边匹配损失替代图像分类损失。
-
ViT-YOLO:
- 使用ViT-YOLO的原因:对于无人机图像中的目标检测,需要捕获全局特征并对遮挡、干扰和领域变换具有鲁棒性。
- 具体解法:结合了CSP-Darknet和多头自注意力机制作为主干网络,以及双向特征金字塔网络(BiFPN)作为网络的颈部,类似YOLOv3的多尺度检测头。
-
MSFT-YOLO:
- 使用MSFT-YOLO的原因:为了在钢材表面检测缺陷,需要在主干网络和检测头中添加基于Transformer的模块。
- 具体解法:在YOLO的基础上引入Transformer模块,以改进特征提取并提高缺陷检测的准确性。
-
NRT-YOLO:
- 使用NRT-YOLO的原因:在遥感图像中处理微小物体时,需要特殊的注意力和特征融合机制。
- 具体解法:增加了额外的预测头、特征融合层和残差Transformer模块,从而在DOTA数据集上提高了YOLOv5l的性能。
-
YOLO-SD:
- 使用YOLO-SD的原因:为了提高合成孔径雷达(SAR)图像中小型船舶的检测精度。
- 具体解法:结合YOLOX和多尺度卷积(MSC)以及特征Transformer模块,提高不同尺度下的检测能力。
-
DEYO:
- 使用DEYO的原因:需要快速收敛和在COCO检测基准上的高性能。
- 具体解法:首先使用基于YOLOv5的模型生成高质量的查询和锚点,然后输入到类似DETR的第二阶段模型中。
每个子解法都是为了在特定的应用场景中提高YOLO模型的表现,通过引入Transformer的全局特征提取能力和注意力机制来强化模型对复杂数据的理解能力,最终提高目标检测的准确性和鲁棒性。
ViT-YOLO:
-
MHSA-Darknet Backbone:这是模型的主干网络,结合了多头自注意力机制(Multi-Head Self-Attention, MHSA)和跨阶段部分连接(Cross-Stage Partial, CSP)的块。这种设计旨在捕获全局特征并提高模型的表示能力。
-
BiFPN Neck:该网络使用双向特征金字塔网络(Bi-directional Feature Pyramid Network, BiFPN)来整合来自不同阶段的特征。BiFPN 有助于在不同的尺度上改善特征的融合,从而提高对对象的定位和分类能力。
-
Detection Head:头部包括多个多尺度检测头,用于在不同分辨率上进行目标检测。这样的设计允许模型在不同尺寸的特征图上检测不同大小的物体。
整个架构旨在提高目标检测的准确性,特别是在复杂场景中,同时保持对小物体的高敏感性。
通过在不同层次上融合特征,模型能够更好地理解图像内容,实现更精确的检测。
这种架构通常需要较大的计算资源,但它提供了更精细的视觉理解能力。