YOLOv1
首次提出实时目标检测的概念,通过一个神经网络来在一张图像上实现目标定位和分类的任务。将输入图像分割成SXS网格(论文中S=7),每个网格负责检测该区域内中心点落在此网格内的物体。每个网格需要预测出B个bbox、对应的置信度、属于各个类别的概率(一共是C个类别),论文中B=2,此处的置信度是「有object的概率*预测框和真实框的IOU」,如果此处没有object,这个置信度应该为0,并且类别的概率只针对有object的网格进行预测,没有object则不进行预测,主要体现在loss上。由于训练集中没有object的区域太多,为了让模型更容易学习预测object,此处在loss中增加对于object检测的损失权重,减小没有object的损失权重。对于每一个bbox而言,需要预测四个值——x,y,w,h。为了便于网络训练,这里使用「相对值」,即x,y是相对于网格边缘的距离,w,h为相对于整张图像的大小。预测的时候,输出的类别概率是「原始训练的类别概率*有object的概率*预测框和真实框的IOU」。
对于此模型而言,作者是对于网络的前20个卷积层先在ImageNet 1000类别数据集上进行预训练,使用的图片尺寸是224x224。后面在此预训练网络基础上增加4个卷积层和2个全连接层,使用448x448尺寸训练目标检测任务。
关于这里使用224*224图片进行预训练,之后使用448*448进行训练:卷积、池化的参数是可以固定不变的(卷积核固定),输入尺寸的变化只会影响输出维度的变化,在目标检测任务中,通过增加新的卷积层和全连接层,网络可以专门针对新的任务进行调整,而无需重新训练整个网络。
卷积层的参数是通用的,因为它们在局部区域内提取特征,输入图像的尺寸变化不会影响卷积层的参数。全连接层的参数与输入维度密切相关,当输入图像尺寸变化导致卷积层输出的特征图大小发生变化时,全连接层的输入维度也会变化,因此全连接层的参数必须相应调整。
虽然每个grid会预测2个bbox,但是为了让每个bbox都有其擅长的地方,比如擅长预测object的大小、角度、类别,在实际训练的过程中,只使用最大IOU对应的bbox参与损失计算。
训练过程中使用的数据增强方式主要有:0.5的比例进行dropout、以原始图像的20%进行随机缩放和平移、以1.5倍的比例在HSV空间中随机调整图像的曝光和饱和度。
实时性好,速度快。可以基于全局信息进行检测,可以学习泛化性更好的图像表示,在背景上出现的错误更少。
对 小物体和密集物体的检测效果较差。整体精度没有达到sota。
YOLOv2 (2017)
特点:引入了批处理标准化(Batch Normalization)来提高收敛速度,并使用了高分辨率分类器来帮助检测小物体。
架构:增加了锚点框(anchor boxes)来提高检测精度,同时引入了多尺度训练来增强模型的泛化能力。
为了提升检测的精度,使用了当时出现的各种trick、包括Batch Normalization、高精度的分类器(之前是224x224,现在是448x448)、使用锚框进行检测(之前YOLO1没有锚框的概念)、直接的定位预测(YOLO1中是预测相对值)、更加细粒度的特征(将原来26 × 26 × 512的特征转换为13 × 13 × 2048特征,从而可以更加容易预测小物体)、多尺度训练(不同阶段使用不同尺度的图片进行训练)。
多尺度训练的形式:
锚框(anchor boxes)在 YOLOv2 中是针对不同分辨率下的输入图像提供的固定形状和大小的框架。然而,无论输入图像的分辨率如何,锚框的大小实际上是相对于输入图像的比例来定义的,而不是绝对的像素值。这意味着锚框的大小会根据输入图像的分辨率进行缩放,因此锚框可以适应不同分辨率的图像,而不会产生锚框大于图像的情况。
使用聚类定义锚框,首先使用训练集中的object的宽高进行聚类,本文使用k-means聚类算法,得到k个聚类中心(本文k=5),作为锚框的大小。并且在聚类的距离定义上,不再采用常规化的距离计算方式,例如欧式距离,而是采用IOU的方式进行计算,作者认为欧式距离对于框的大小的敏感性太强,大的框在聚类上带来的损失会更强。
这里的目的是找到合适的anchor box作为目标检测的先验。选择IOU能让那些能与真实目标框产生高 IOU 的 anchor box 具有更小的距离,进而优先选择这些 anchor box 进行聚类和优化。如果是欧氏距离的话,相同的差距大框会产生更大的误差(类似于12-10和120-100),这会导致大尺寸的边界框会因为其欧氏距离较大而在损失计算中占更大的权重。因此,聚类过程会倾向于选择大尺寸的框来更好地缩小这些距离。
作者发现之前预测相对值的方式会导致模型训练不稳定,特别是在训练早期,因此在此论文中,作者使用sigmoid函数直接对值进行预测。
YOLO 网络中常见的下采样倍数是 32,也就是说,输入图像的宽度和高度必须是 32 的倍数,才能保持特征图尺寸的整除性。例如,使用 448×448 分辨率输入时,经过下采样后的特征图尺寸会变为 14×14(448/32=14)。
改用 416×416 分辨率的输入图像后,经过下采样后,特征图的尺寸会是 13×13(416/32=13)。这样可以使网络结构更加对称和整齐。
锚框是什么? 锚框是事先定义的一组固定形状的边界框,用来帮助网络预测目标的大小和位置。通过引入锚框,网络不再需要直接回归目标的绝对位置和尺寸,而是预测相对于锚框的偏移量。这大大简化了预测过程,并且允许网络在每个网格单元中预测多个目标。
为什么锚框有助于使用 416×416 的分辨率? 使用锚框之后,网络的设计变得更加灵活,因为每个网格单元不再只负责一个目标,而是可以预测多个目标(每个锚框对应一个)。这意味着即使使用较小的输入分辨率,锚框机制依然可以确保对各种大小的目标进行有效检测。由于锚框可以有效预测目标的尺寸和位置,网络不再需要依赖更高的分辨率(如 448×448)来捕捉更精细的细节,因此可以安全地将输入分辨率减少到 416×416,而不会显著影响检测性能。
其次为了提升模型的速度,引入了新的网络结构Darknet-19,其相对于YOLO1中的网络结构,速度回更快。其主要包括19个卷积层和5个maxpooling层。
最后,作者想要联合训练分类和检测任务,但是对于检测任务,可以直接使用检测损失优化整个模型,对于分类任务,只能优化分类的那一部分模型。并且对于分类数据集和检测数据集来说,其存在交叉度较高的类别,例如检测数据集中存在"dog" or "boat"这种粗粒度的类别,分类数据集中为 “Norfolk terrier”, "Yorkshire terrier"细粒度的类别。如果要一起训练,需要融合这些类别。
因此,作者设计了一种新的计算类别概率的方式,即层次分类(和层次softmax类似)。首先根据类别构造一颗树结构,然后在训练的时候对于同层级的类别进行softmax,最终类别的概率是从root节点到那个节点最短路径上的节点的所有概率之和。
在训练的其他策略上,和YOLO1一样,损失函数还是均方误差。
优点:检测精度提高,已经接近当时现有的SOTA,仍然保持了较快的速度。
YOLOv3 (2018)
进一步提高了检测精度,特别是在小物体检测方面有所改进。首先进一步优化了模型结构,使用新的网络结构Darknet-53。不管在精度还是在速度上都有了较高的提升。其次,引入特征金字塔网络,采用多尺度预测,本文是3个尺度,锚框的设定依旧采用YOLO2中的方式,使用聚类得到9个锚框,分别给3个尺度各三个锚框。最后,将分类损失softmax改成了二分类交叉熵损失,以解决有些数据集存在类别重叠的问题。
优点:在保持速度的同时,显著提升了检测精度。
YOLOv4 (2020)
特点:集成了许多先进的技术,如CSPNet、Mish激活函数、SPP模块等,旨在最大化检测性能。
架构:使用了改进的骨干网络CSPDarknet53,并加入了注意力机制来增强特征表示。
优点:在准确性和速度之间达到了很好的平衡。
首先,更新了网络架构,选择CSPDarknet53为backbone,在这个基础上加入SPP 模块(Spatial Pyramid Pooling), PANet path-aggregation neck(是由FPN+PAN网络组成),以及YOLO3中head。作者认为一个好的backbone应该具备较大的感受野和更多的网络参数,其次,作者提出了两个新的概念:Bag of Freebies (BoF) 和Bag of Specials (BoS) ,前者为「在训练的过程中加入一些技巧,例如数据增强,以得到更优的指标」,后者为「在测试阶段加入一些技巧,只增加推理消耗,例如更大推理的感受野,后处理等」。此论文在backbone和detector中都分别引入了这两种策略。
【Bag of Freebies (BoF) for backbone】
此处主要有CutMix、Mosaic数据增强、DropBlock正则化、标签平滑。很多技巧都是来源于其他人的工作,具体可以参考其他文章,这里只介绍一下新的技巧。例如对于DropBlock正则化来说,其类似于dropout,不同点在于其作用于卷积层,对卷积核的一整个区域置零。对于Mosaic数据增强来说,起源于CutMix,CutMix是对两张图片进行增强,这里的Mosaic是随机选择4张图片拼接在一起,这样可以起到增大batch,以及增大图片尺度的作用。
【Bag of Specials (BoS) for backbone】
此处主要有Mish激活函数、Cross-stage partial connections (CSP)、Multiinput weighted residual connections (MiWRC)。
【Bag of Freebies (BoF) for detector】
此处主要有CIoU-loss, CmBN, DropBlock 正则化, Mosaic数据增强, Self-Adversarial Training, Eliminate grid sensitivity, 针对每个ground truth使用多个 anchors, Cosine annealing scheduler, 最优超参数, 随机训练形状。
其中Self-Adversarial Training主要分为两个前向阶段,第一个阶段模型不做参数更新,但对原图进行改变,然后第二个阶段模型使用被改变的图片进行参数更新,从而做到自我对抗训练。
【Bag of Specials (BoS) for detector】
此处主要有Mish 激活函数, SPP-block, SAM-block, PAN path-aggregation block, DIoU-NMS。
YOLOv5 (2020)
YOLO系列中,可以针对数据集设置初始的Anchor。在网络训练中,网络在Anchor的基础上输出预测框,进而和GT框进行比较,计算loss,在反向更新,迭代网络参数。在YOLOv3、4版本中,设置初始Anchor的大小都是通过单独的程序使用K-means算法得到,但是在YOLOv5中,将此功能嵌入到代码中,每次训练数据集之前,都会自动计算该数据集最合适的Anchor尺寸,该功能可以在代码中设置超参数进行关闭。
YOLOv4 和 YOLOv5 都使用 CSPDarknet作为BackBone,从输入图像中提取丰富的特征信息。CSPNet叫做Cross Stage Partial Network,跨阶段局部网络。其解决了其他大型卷积网络结构中的重复梯度问题,减少模型参数和FLOPS。这对 YOLO 有重要的意义,即保证了推理速度和准确率,又减小了模型尺寸。
YOLOv4只有主干网络中使用了CSP结构,而YOLOv5中设计了两种CSP结构,CSP1_X应用于BackBone主干网络,另一种CSP_2X结构则应用于Neck中。
focus结构减少FLOPs,提高速度。
YOLOv6 (2022)
特点:进一步优化了模型架构,专注于提高实时性能。
架构:引入了新的骨干网络和颈部网络设计。
优点:在保持高速的同时,提供了良好的检测精度。
YOLOv7 (2022)
特点:结合了Transformer架构,引入了Efficient Attention机制来提高特征提取能力。
架构:使用了Efficient Channel Attention(ECA)和Spatial Attention(SA)来增强特征表达。
优点:在多种基准测试中表现优异。
YOLOv8 (2023+)
特点:最新的版本,提供了统一的框架来支持多种视觉任务,如目标检测、实例分割等。
架构:继续优化模型设计,简化使用流程。
优点:功能全面,易用性强,适用于多种应用场景。
Q:介绍一下yolo系列
A:yolov1首次提出实时目标检测的概念,之前都是两阶段的,这个是端到端的,通过一个神经网络实现定位和分类任务。它将输入图像分割成SXS的网格,每个网格负责预测中心点落在此网格内的物体。速度快,但对小物体和密集物体的检测效果差。yolov2使用批处理提高收敛速度,引入了锚框,对训练集中物体的宽高进行k-means聚类得到k个聚类中心作为锚框的大小。yolov1中预测相对值会导致训练不稳定,所以v2改成sigmoid函数。yolov3优化了模型结构,使用新的网络结构Darknet-53。在精度和速度上都有了较高的提升。其次,引入特征金字塔网络,采用多尺度预测,锚框的设定依旧采用YOLO2中的方式,使用聚类得到9个锚框,分别给3个尺度各三个锚框。最后,将分类损失softmax改成了二分类交叉熵损失,以解决有些数据集存在类别重叠的问题。yolov4更新了网络架构,选择CSPDarknet53为backbone,在这个基础上加入SPP 模块(Spatial Pyramid Pooling), PANet path-aggregation neck(是由FPN+PAN网络组成),以及YOLO3中head。yolo
v5输入端:Mosaic数据增强、自适应锚框计算、Backbone:Focus结构,CSP结构、Neck:FPN+PAN结构、Prediction:GIOU_Loss。Yolov4的Neck结构中,采用的都是普通的卷积操作。而Yolov5的Neck结构中,采用借鉴CSPnet设计的CSP2_X结构,加强网络特征融合的能力。Yolov5中采用其中的GIOU_Loss做Bounding box的损失函数。而Yolov4中采用CIOU_Loss作为目标Bounding box的损失。