本文对YOLO系列网络进行了介绍,也是站在了“巨人”的肩膀上,将YOLO系列网络进行了总结。
如上图所示,将一幅图像分成SxS个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。
每个网格要预测B个bounding box,每个bounding box除了要预测位置之外,还要附带预测一个confidence值。每个网格还要预测c个类别的分数。
通过正向传播特征提取网络最后输出7x7、深度为30的特征矩阵,我们可以单独看延深度方向的一行向量(图中浅黄色),由于深度为30,所以这个向量有30个数值,将数值进一步拆分,因为每一个网格需要预测两个bounding box,每个bounding box预测5个数值,每个数值包括四个坐标信息和一个confidence,同时还包括20个类别分数。
YOLOv1的损失包含三部分:bounding box损失、confidence损失和classes损失。在计算损失时主要都是用的误差平方和求解
通过使用Batch Normalization对模型的训练收敛具有很大帮助,同时减少了正则化处理,在MAP值上达到2%的提升,还可以移除dropout操作。
在YOLOv1中训练分类器时使用的是224x244的输入,而在 YOLOv2中作者采用了448x448的尺寸作为输入,论文总表明,采用更大的分辨率作为输入可以得到MAP值4%的提升。
在YOLOv1中时直接预测边界框的中心坐标、宽度和高度,使用这种方式定位效果比较差,所以在YOLOv2中作者采用anchor进行目标框的预测,采用anchor也可以使网络更容易的去学习和收敛。
根据训练集中的标注框采用K-means算法聚类得到先验框。
直接是使用anchor进行预测时发现,在训练模型的时候训练不稳定,通过观察发现大部分不稳定因素来自中心坐标的预测部分导致,所以作者提出采用如下anchor预测方式。
底层的特征信息会包含更多的特征细节,这些细节是在检测小目标时所需要的,所以将高层信息和低层信息进行融合。
为了提高网络的鲁棒性,使用不同的图像尺寸作为输入进行训练。每迭代10个batch就随机选择网络的输入尺寸,由于YOLOv2中的特征图缩放因子为32,所以网络中所用的特征图都是32的整数倍(320、352…609)。
Darknet-19包含19个卷积层,6个池化和一个Softmax。
通过移除最后一个卷积层来修改这个网络进行检测,而是添加三个 3 x 3 卷积层,每个卷积层有 1024 个过滤器,然后是最终的 1 x 1 卷积层,其中包含我们需要检测的输出数量。 对于 VOC,我们预测 5 个框,每个框有 5 个坐标,每个框有 20 个类,因此使用125 个卷积核。 我们还从最后的 3 × 3 × 512 层到倒数第二个卷积层添加了一个特征融合层,以便模型可以使用细粒度特征。
YOLOv3在YOLOv2的基础上改进了backbone,YOLOv3的backbone如图
YOLOv3采用darknet-53作为backbone,其中53表示有53层卷积层,darknet-53并没有卷积层。
YOLOv3结构示意图如图1所示,YOLOv3使用全卷积网络Darknet53作为特征提取网络,Darknet53由5组不同尺度的特征提取层组成,每组特征提取层包括下采样卷积单元和残差结构单元(Residual),下采样卷积单元包括卷积核为3×3、步幅为2的卷积、批量归一化层(bath normalization,BN)和激活函数(Leaky Relu),使用批量归一化和Leak Relu激活函数能加速算法的收敛速度。残差结构单元由两条支路组成,第一条支路将上一层输出的特征图进行卷积核为3×3和1×1的卷积操作,首先使用1×1的卷积对输入特征图进行通道压缩,然后使用3×3的卷积进行特征提取。第二条支路将上一层输出的特征图进行恒等映射,最后将两条支路对应通道上的特征图进行融合,这种残差结构通过卷积核之间跳转相连(skip connection)的方式增加了模型对于特征图的复用程度,同时避免了因网络深度不断增加导致的网络性能退化问题。
随着卷积网络的不断深入,深层卷积得到的特征图语义信息越抽象,从而使小目标的特征信息容易丢失。YOLOv3借鉴特征金字塔网络结构(FPN,feature pyramid networks)实行多尺度检测的方法。将416×416尺寸的图像输入YOLOv3算法中,经过5次下采样后得到13×13、26×26和52×52尺寸的特征图,首先将13×13尺寸的特征图二倍上采样后与26×26尺寸的特征图融合,获得包含浅层特征信息和深层特征信息的特征图,然后将特征图再次二倍上采样与52×52尺寸的特征图融合,最后分别在13×13、26×26和52×52尺寸的特征图上进行目标检测。
YOLOv3中的anchor机制和YOLOv2是一样的,但是与SSD和Faster RCNN不一样的是,SSD和Faster RCNN预测的有关目标中心点的参数是相对于anchor而言的,但是在YOLOv3中预测的有关目标中心点的参数相对于cell左上角点而言。
图中虚线对应的矩形框就是anchor,我们只需要关注anchor的宽度P_w和高度P_h两个参数,蓝色矩形框是网络最终预测的目标位置和大小。需要注意的是由于Sigmoid函数结果是0~1之间,所以最终预测的b_x、b_y也是在0和1之间,所以Sigmoid函数将预测的边界框中心点限制当前cell之间,从而加框网络收敛。
针对每一个bounding box 都会分配一个bounding box prior,即针对每一个ground truth 都会分配一个正样本,一张图像中有几个ground truth就有几个正样本,分配原则其实也很简单,就是将与ground truth重合程度最大的bounding box prior作为正样本,如果与ground truth重合程度不是最大的但是又超过了某个阈值的bounding box prior,就直接丢弃,将最后剩下的样本作为负样本。
YOLOv3的损失包括三部分:置信度损失、分类损失和定位损失。
置信度损失为二值交叉熵损失
其中o_i表示预测目标边界框与真实目标边界框的IOU,c为预测值,c_hat为c通过Sigmoid函数得到的预测置信度,N为正负样本个数。
类别损失同样采用的是二值交叉熵损失
其中o_ij表示预测目标边界框i中是否存在第j类目标,C_ij为预测值,C_ij_hat为C_ij通过Sigmoid函数得到的目标概率,N_pos为正样本个数。
定位损失
YOLOv4使用的CSPDarknet53相比YOLOv3的Darknet53添加了CSP结构,如图
添加CSP可以提高CNN学习的能力,移除计算瓶颈,降低显存的使用。
SPP模块经输入的特征层依次输入kernel为5x5、9x9和13x13的最大池化下采样层,且stride都是1,通过padding操作后输出尺寸和通道数和输出完全一样,然后将三个最大池化后的输出和原输入进行拼接。
(a)中在backbone提取的特征图上构建特征金字塔,即FPN模块,FPN模块将高层的语义信息通过上采样与低层的 语义信息融合,(b)中的过程正好相反,将低层的特征图通过下采样再与高层的特征图融合,而(a)和(b)共同构成了PAN模块。
还要注意的是,原始的PAN模块特征图的融合使用的是add策略,在YOLOv4中使用concate策略,将两个特征图在深度方向进行拼接
首先回忆一下YOLOv3如何进行目标边界框预测的,CNN网络计算每个cell中的每个anchor预测目标边界框回归参数以及针对每个类别的score分数,其中sigmoid函数将anchor中心点的位置限制在一个cell内部,这就会面临一个问题,就是如果目标框的中心点在cell的边界时sigmoid函数将不再适用,为了解决这个问题,YOLOv4在原来公式的基础上加了一个缩放因子scale。
YOLOv4改进后的预测目标边界框回归参数公式如下
在输入网络进行训练时,将四张不同的图片按一定的规则拼接在一起,这样在做具有以下优势:
将每一个GT和anchor temple进行匹配,针对每一个检测层都对应3
个不同的模板AT1、AT2和AT3,将每一个GT和anchor左上角对其计算IoU,并将IoU大于阈值的anchor作为正样本。
YOLOv4用的YOLOv3不同
SPPF中依次将输入串联通过3个5x5的最大池化层,然后再与书瑞进行拼接,为什么要这么做呢,因为将两个5x5的池化层进行串联等价于使用一个9x9的最大池化,而使用3个5x5的最大池化又等价于一个13x13的最大池化,但是使用SPPF比SPP效率更高。
YOLOv5的损失由三部分组成:
本文参考:https://blog.csdn.net/qq_37541097?type=blog
如果本文对您有帮助的话,记得点赞哦!
写作不易,您的支持是对我最大的鼓励!!!