一、YOLO算法的核心思想
YOLO系列的核心思想是将目标检测转变为回归问题,利用整张图片作为网络的输入,通过神经网络,得到边界框的位置及其所属的标签。
1、YOLO系列算法的步骤
(1)划分图像:YOLO将输入图像划分为一个固定大小的网络
(2)预测边界框和类别:对于每个网络,YOLO预测出固定数量(通常为5个或3个)的边界框。每个边界框由5个主要属性描述:边界框的位置(中心坐标和宽高)和边界框包含的目标的置信度(confinence和类别)
(3)单次前向传递:YOLO通过一个卷积神经网络(CNN)进行单词前向传递,同时预测所有边界框的位置和类别。相比于其他目标检测算法,如基于华东窗口或区域提议的方法,YOLO具有更快的速度,因为它只需要一次前向传递即可完成预测。
(4)损失函数:YOLO使用多任务损失函数来训练网络。该损失函数包括位置损失、置信度损失和类别损失。位置损失衡量预测边界框和真实边界框之间的位置差异。置信度损失衡量边界框是否正确地预测了目标,并惩罚背景框的置信度。类别损失衡量目标类别的预测准确性。
(5)非最大抑制:在预测的边界框中,可能存在多个相互重叠的框,代表同一个目标。为例消除冗余的边界框,YOLO使用非最大抑制算法,根据置信度和重叠程度筛选出最佳的边界框。
2.Backbone、Neck和Head
物体检测器的结构开始被描述为三个部分:Backbone、Neck和Head。下图显示了一个高层次的Backbone、Neck和Head图。
Backbone负责从输入图像中提取有用的特征。它通常是一个卷积神经网络(CNN),在大规模的图像分类任务中训练,如ImageNet。骨干网络在不同尺度上捕捉层次化的特征,在较早的层中提取层次的特征(如边缘和纹理),在较深的层中提取高层次的特征(如物体部分和语义信息)。
Neck是连接Bakcbone和Head的一个中间部件。它聚集并细化骨干网提取的特征,通常侧重于加强不同尺度的空间和语义信息。颈部可能包括额外的卷积层、特征金字塔(FPN)或其他机制,以提高特征的代表性。
Head是物体检测器的最后组成部分。它负责根据Backbone和Neck提供的特征进行预测。它通常由一个或多个特定任务的子网络组成,执行分类、定位,以及最近的实例分割和姿态估计。头部处理颈部提供的特征,为每个候选物产生预测。最后,一个后处理步骤,如非极大值抑制(NMS),过滤掉重叠的预测,只保留置信度最高的检测。
二、YOLO系列的算法
1、YOLOv1(2016)
论文地址:https://arxiv.org/pdf/1506.02640.pdf
1.1 模型介绍
在YOLOv1提出之前,R-CNN系列算法在目标检测领域中独占鳌头。R-CNN系列检测精度高,但是由于其网络结构是双阶段的特点,使得它的检测速度不能满足实时性,饱受诟病。为例打破这一僵局,涉及一种速度更快的目标检测器是大势所趋。
2016年,Joseph Redmon等人提出了一种单阶段的目标检测网络,它的检测速度非常快,每秒可以处理45帧图片,能够轻松地实时运行。因此,作者将其取名为You Only Look Once。
YOLO的核心思想就是把目标检测转变成一个回归问题,利用整张图作为网络的输入,仅仅经过一个神经网络,得到bounding box(边界框)的位置和所属的类别。
1.2 网络结构
现在看来,YOLOv1的网络结构十分清晰,是一种传统的one-satge的卷积神经网络:
网络输入:448*448*3的彩色图片
中间层:由若干卷积层和最大池化层组成,用于提取图片的抽象特征
全连接层:由两个全连接层组成,用来预测目标的位置和类别的概率值
网络输出:7*7*30的预测结果
1.3 实现细节
(1)检测策略
YOLOv1采用的是"分而治之"的策略,将一张图片平均分为7*7个网络,每个网格分别负责预测中心点落在该网格内的目标。在Faster R-CNN中,是通过一个RPN来获得目标的感兴趣区域,这种方法精度高,但是需要额外再训练一个PRN网络,这无疑增加了训练的负担。在YOLOv1中,通过划分得到了7*7个网格,这49个网络就相当于是目标检测的感兴趣区域。通过这种方式,我们就不需要再额外设计一个PRN网络,这正是YOLOv1作为单阶段网络的简单快捷之处。
具体实现过程如下:
①.将一幅图像分成(S*S)个网格,如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。
②.每个网格都要预测B个bounding box,每个bounding box要预测(x,y,w,h)和confindence共5个值。
③.每个网格还要预测一个类别信息,记为C个类
④.总的来说,S*S个网格,每个网格要预测B个bounding box,还要预测C个类。网络输出就是一个S*S*(5*B+C)的张量。
在实际过程中,YOLOv1把一张图片划分为7*7个网格,并且每个网格预测2个Box(Box1和Box2),20个类别。所以实际上,S=7,B=2,C=20。那么网络输出的shape也就是:7*7*30
(2)目标损失函数
损失由三部分组成,分别是:坐标预测损失、置信度预测损失、类别预测损失。
1、使用的是差方和误差。需要注意的是,w和h在进行误差计算的时候取得是它们的平方根,原因是对不同大小的bounding box预测中,相比于大bounding box预测偏一点,小box预测偏一点更不能忍受。而差方和误差函数中对同样的偏移loss是一样。为了缓和这个问题,作者用了一个比较取巧的办法,就是将bounding box的w和h。
2、定位误差比分类误差更大,所以增加对定位误差的惩罚,使n=0.5
3、在每个图象中,许多网格单元不包含任何标值。训练时就会把这些网格里的框的"置信度"分数推到零,这往往超过了包含目标的框的梯度。从而可能导致模型不稳定,训练早期发散。因此要减少了不包含目标的框的置信度预测的损失,使n=0.5
1.4 性能表现
(1)优点
1、YOLO检测速度非常快。标准版本的YOLO可以每秒处理45张图像;YOLO的极速版本可以处理150帧图像。这就意味着YOLO可以小于25毫秒延迟,实时地处理视频。对于欠实时系统,在准确率保证的情况下,YOLO速度快于其他方法。
2、YOLO实时检测的平均精度是其他实时检测系统的两倍。
3、迁移能力强,能运用到其他新的领域(比如艺术品目标检测)
(2)局限性
1、YOLO对相互靠近的物体,以及很小的群体检测效果不好,这是因为一个网络只预测了2个框,并且都只属于同一类。
2、由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体的处理上,还有待加强。
3、YOLO对不常见的角度的目标泛化性性能偏弱。
2 YOLOv2(论文地址:https://arxiv.org/pdf/16/1612.08242.pdf#page=4.24)
2.1 改进部分
YOLOv2在YOLO的基础上,保持速度的优势同时,检测可到达9000个类别。这些改进有以下几点:
(1)在所有卷积层上的批量归一化改善了收敛性,并作为一个正则器来减少过拟合;
(2)高分辨率分类器在YOLOv1以224*224的分辨率对模型进行了预训练基础上,以分辨率448*448对模型进行了10次微调,调高了网络在高分辨率输入下的性能。
(3)完全卷积。去掉了密集层,采用了全卷积结构。
(4)使用Anchor来预测边界盒。使用一组先验框Anchor,这些Anchor具有预定义的形状,用于匹配物体的原型形状,每个网格单元都定义了多个Anchor,系统预测每个Anchor的坐标和类别。网络输出的大小与每个网格单元的Anchor数量成正比。
(5)维度聚类。挑选好的Anchor有助于网络学习预测更加准确的边界盒。作责对训练中的边界盒进行了k-means聚类,以找到更好的先验。亚目选择了五个Anchor,在召回率和模型复杂性之间进行了良好的权衡。
(6)直接预测位置。预测了相对于网络单元的位置坐标,网络为每个单元预测了五个bounding box,每个bounding box有五个值tx,ty,tw,th,to。
(7)细粒度的特征。YOLOv2去掉了一个池化层,对于416*416的输入图像,得到13*13的特征图。
(8)多尺度训练。由于YOLOv2不使用全连接层,输入可以是不同的尺寸。为了使YOLOv2对不同的输入尺寸具有鲁棒性,作者随机训练模型,每10批改变尺寸。
2.2 网络结构
YOLOv2采用Darknet-19作为特征提取网络,器整体结构如下:
改进后的YOLOv2:Darknet-19,总结如下:
①.与VGG相似,使用了很多3*3卷积核;并且每一次池化后,下一层卷积核的通道数=池化输出的通道*2
②.在每一层卷积后,都增加了BN层进行预处理
③.采用了降维的思想,把1*1的卷积置于3*3之间,用来压缩特征
④.在网络最后的输出上增加了一个global aveage pooling层
⑤.整体上采用了19个卷积层,5个池化层。
为了更好的说明,将Darkent-19与YOLOv1、VGG16网络进行对比:
VGG-16:大多数检测网络框架都是以VGG-16作为基础特征提取器,它功能强大,准确率高,但是计算复杂度较大,所以速度会相对较慢。
YOLOv1:基于GoogLeNet的自定义网络,比VGG-16的速度快,但是精度稍不如VGG-16
Darknet-19:速度方面,处理一张图片仅需要55.8亿次运算,相比于VGG306.9亿次,速度快了近6倍。精度方面,在ImageNet上的测试精度为:top1准确率为72.9%,top2的准确率为91.2%。
2.3 性能表现
在VOC2007数据集上进行测试,YOLOv2在速度为67fps时,精度可以达到76.8mAP;在速度为40fps时,精度可以达到78.6mAP。
相对于YOLOv1而言,不足之处在于,没有进行多尺度特征的结合预测,传递模块的使用在提升细粒度特征的同时也对特征的空间,分布产生了一定影响,以及对小目标的检测能力没有明显提升。
3.YOLOv3(论文地址:https://arxiv.org/pdf/1804.02767.pdf)
3.1 模型介绍
特征提取部分采用Darknet-53网络结构代替原来的Darknet-19,利用特征金字塔网络结构实现了多尺度检测,分类方法使用逻辑回归替代了softmax,在兼顾实用性的同时保证了目标检测的准确性。
从YOLOv1到YOLOv3,每一代性能的提升都与backbone(骨干网络)的改进密切相关。在YOLOv3中,作责不仅提供了darknet-53,还提供了轻量级的tiny-darknet。如果你想检测精度与速度兼备,可以选择darknet-53作为backbone-53;如果你想达到更快的检测速度,精度方面可以妥协。那么tiny-darkent是你很好的选择。
3.2 网络结构
YOLOv3借助残差网络的思想,YOLOv3将原来的darknet-19改进为darknet-53.整体结构如下:
Darknet-53主要由1*1和3*3的卷积层组成,每个卷积层之后包含一个批量归一化和一个Leaky ReLU,加入这两部分的目的是为了防止过拟合。卷积层、BN层以及LeakyReLU共同组成Darknet-53的基本CBL。因为在Darknet-53中包含53个这样的CBL,所以称其为Darknet-53.
为了更好的理解此图,下面对主要单元进行说明:
CBL:一个卷积层、一个BN层和一个Leaky ReLU组成的基本卷积单元。
res unit:输入通过两个CBL后,再与原输入进行add;这是一种常规的残差单元。残差单元的目的是为了让网络可以提取到更深层的特征,同时避免出现梯度消失或爆炸。
ResX:X个残差组件。
concat:将Darknet-53的中间层和后面的某一层的上采样进行张量拼接,达到多尺度特征融合的目的。这与残差层的add操作是不一样的,拼接会扩张张量的维度,而add直接相加不会导致张量维度的改变。
最后面的蓝色立方体表示三种尺度的输出。
与Darknet-19相比,Darknet-53主要做了如下改进:
① 没有采用最大池化层,转而采用步长为2的卷积层进行下采样。
② 为了防止过拟合,在每个卷积层之后加入了一个BN层和一个Leaky ReLU
③ 引入了残差网络的思想,目的是为了让网络可以提取到更深层的特征,同时避免出现梯消失或爆炸
④ 将网络的中间层和后面某一层的上采样进行张量拼接,达到多尺度特征融合的目的
3.3 改进部分
(1)输入部分
Mosaic数据扩增:将四张不同的训练图像随机拼接在一起,形成一张马赛克图像。这种方式可以帮助模型学习并适应不同的场景、目标形状和尺度变化。
自适应锚框计算:引入自适应锚框计算的机制,指在更好地适应各种目标的尺寸和长宽比例变化。
初始锚框定义:首先,根据训练地标注框,选择初始的锚框。可以使用一些聚类算法(k-means)对标注框进行聚类,以确定一组代表性的锚框。
锚框调整: