Yolo学习笔记
yolo是一阶段目标检测方法,一阶段网络的速度更快,适合于实时监测任务。
指标分析
IOU指标:
为了判断检测质量我们可以看预选框(prediction box)与实际真实框(ground truth box)的贴合度。 因为我们可以知道的是各个框的坐标位置以及长宽,所以使用交集的概念即可看两个框重复的程度,显然两个框贴合度越高,预测越准确。 IOU即两个框相交的面积除以两个框面积的并起来的面积。 在实际过程中,我们会设置一个阈值,只有IOU大于阈值的预选框才会被保留,IOU低于阈值的候选框则淘汰。
map指标:综合衡量检测效果(在不同的置信度阈值下综合考虑精度和召回率)。
通常是有mAP来判断一个检测器的好坏,AP指的是一个类别的检测精度,mAP则是多个类别的平均精度。
- 评测需要每张图片的prediction和target,对于某一个实例,我们首先将所有的prediction box按照得分从高到底进行排序(因为得分越高的box对于ground truth的概率往往越大),然后从高到低遍历prediction box。
- 对于遍历中的某一个prediction box,计算其与该图中同一类别的所有ground truth box的IoU,并选取拥有最大IoU的ground truth作为当前prediction box的匹配对象,如果该IoU小于阈值,则将当前prediction box标记为误检框。
- 如果IoU大于阈值,还要看对应的ground truth box是否被访问过,如果前面已经有得分更高的prediction box与该ground truth对应了,即使现在的IoU大于阈值,也会被标记为误检框,如果没有被访问过,则将当前prediction box标记为正检框,并将该ground truth box标记为访问过,以防止后面还有prediction box与其对应。在遍历完所有的prediction box之后,我们会得到每一个prediction box的属性,即正检框和误检框。
- 遍历过程中,我们可以通过当前正检框的数量来计算模型的召回率(Recall),即当前一共检测出的ground truth与所有ground truth的比值。除了召回率,还有一个重要指标是准确率(Precision),即当前遍历过的预测框中,属于正检框的比值。
- 遍历到每一个prediction box的时候,都可以生成一个对应的Precision和Recall,这两个值可以组成一个点(P,R),将所有的点绘制成曲线,就形成了P-R曲线。
- 得到了P-R曲线之后,使用积分计算出P-R曲线与坐标轴为出的面积来综合考量不同召回率下的准确率,不会对Precision和Recall有偏好,每个类别是相互独立的,将每个类别的AP进行平均,就得到了mAP。
非极大值抑制(NMS)
在画边界框时,可能出现同一个目标上出现较多相似的边界框的情况,所以我们使用非极大值抑制来移除相似的预测边界框。 非极大值抑制原理: 对于一个预测边界框B,模型会计算各个类别的预测概率。设其中最大的预测概率为p,该概率所对应的类别即B的预测类别。我们也将p称为预测边界框B的置信度。 在同一图像上,我们将预测类别非背景的预测边界框按置信度从高到低排序,得到列表L。从L中选取置信度最高的预测边界框B1作为基准,将所有与B1的交并比大于某阈值的非基准预测边界框从L中移除。这里的阈值是预先设定的超参数。此时,L保留了置信度最高的预测边界框并移除了与其相似的其他预测边界框。 接下来,从L中选取置信度第二高的预测边界框B2作为基准,将所有与B2的交并比大于某阈值的非基准预测边界框从L中移除。重复这一过程,直到L中所有的预测边界框都曾作为基准。此时L中任意一对预测边界框的交并比都小于阈值。最终,输出列表L中的所有预测边界框。
Yolov1(you only look once)
YOLO将输入的图像划分成S*S的网格,每个格子负责对落入其中的目标进行检测,每个网格都要预测B个bounding box,除了要预测bounding box的位置之外还要预测置信度以及所有类别的概率向量。 一个格子只能预测一个物体,通过两个预选框,每个框包含五个元素:(x, y, w, h)和置信度(confidence),还会得到一个类别概率向量,其大小根据不同的数据集而不同。 YOLO V1使用 7×7 的网格(S×S),每个单元格回归2个边界框 和 20个条件类别概率。条件类别概率 (conditional class probability) 是检测到的目标属于特定类别的概率(每个单元对每个类别有一个概率)。 一个cell预测的两个边界框共用一个类别预测, 在训练时会选取与标签IoU更大的一个边框负责回归该真实物体框,在测试时会选取置信度更高的一个边框,另一个会被舍弃,因此整张图最多检测出49个物体。
Yolo v1网络结构
Yolo v1 要求输入的图像大小为448448,然后图像经过24个卷积层,2个全连接层,最后reshape输出77*30的特征图。
- YOLO主要是建立一个CNN网络生成预测 7×7×1024 的张量
- 然后使用两个全连接层执行线性回归,以进行 7 × 7 × 2边界框预测。将具有高置信度得分(大于0.25)的结果作为最终预测。
- 在 3 × 3 的卷积后通常会接一个通道数更低 1 × 1 的卷积,这种方式既降低了计算量,同时也提升了模型的非线性能力。
- 除了最后一层使用了线性激活函数外,其余层的激活函数为 Leaky ReLU ;
- 在训练中使用了 Dropout 与数据增强的方法来防止过拟合。
- 对于最后一个卷积层,它输出一个形状为 (7, 7, 1024) 的张量。 然后张量展开。使用2个全连接的层作为一种线性回归的形式,它输出1.4*108 个参数,然后重新塑形为 (7, 7, 30) 。
损失函数
Yolo v1的损失函数包含三部分:坐标损失,置信度损失,类别损失 在计算位置损失时加上根号有利于模型对小物体的检测更敏感。
Yolov2
Yolo v1 存在着定位不准以及无法检测重叠物体等问题,所以v2在v1的基础上进行相关的改进
batch Normalization
舍弃Dropout,在每个卷积之后都加入batch normalization(类似一个归一化的操作,更易收敛)。 卷积之后加入batch normalization会使得收敛更加容易,提升模型收敛速度,放纸模型过拟合。
更大的分辨率
在v2训练的时候额外加多了十次448*448的训练。 在训练物体检测任务时,会使用ImageNet上预训练的模型作为特征提取器,而其训练时,输入图像分辨率通常在224x224左右,而训练物体检测任务时,需要分辨率更大的图像(因为图像越大,越清晰,越容易检测上面的物体),这样就会造成两者在输入图像分辨率上的不一致。 为了更好的适应分辨率的差异,YOLO V2选择先在ImageNet上Finetune高分辨率(448x448)的模型(10 epochs),然后再训练检测模型,可以理解为分类迎合了检测需要的高分辨率输入,这样就“弱化”了分类模型和检测模型在输入图像分辨率上的“不一致”
网络结构
Yolov2提出DarkNet19,包含19个卷积层。实际输入为416416 取消全连接层,全连接层会导致过拟合。 卷积只包括33(VGG), 1*1(节省参数加快速度),总共进行了5次下采样,目的是扩大最终的feature map的大小,最终映射到原图上的cell更多。v1中是进行了6次下采样的,最后只有7×7,而v2可以达到13×13(对于输入416×416而言)
聚类提取先验框
YOLO V2为了选择更合理的候选框,使用了聚类(K-means)的策略,选出最具有代表性的5个尺寸作为Anchor候选框的尺寸。
K-means是聚类的方法,最后得到K个聚类中心以及每个样本属于哪个中心,其中K是聚类的个数,需要人为指定,其中使用“距离”来衡量每个样本与聚类中心的关系,通常使用欧式距离,但是对YOLO V2来说,需要选取框的尺寸,衡量的标准应该是“覆盖率”,所以YOLO V2利用IOU来计算,所以距离公式如下:
d(box, centroid) = 1 – IOU(box, centroid) 经过实验证明,K=5刚刚好,再大精度可能退化。
Anchor Box
增加Anchor Box可使得召回率提升,使得预测的box数量更多,提升检测能力。 一个Anchor Box会产生9个候选框。 YOLO v1利用全连接层直接对边界框进行预测,导致丢失较多空间信息,定位不准。 YOLO v2去掉了 YOLO v1中的全连接层,使用Anchor Boxes预测边界框,同时为了得到更高分辨率的特征图, YOLO v2还去掉了一个池化层。由于图片中的物体都倾向于出现在图片的中心位置,若特征图恰好有一个中心位置,利用这个中心位置预测中心点落入该位置的物体,对这些物体的检测会更容易。所以总希望得到的特征图的宽高都为奇数。 YOLO v2通过缩减网络,使用 416 × 416 的输入,模型下采样的总步长为 32 ,最后得到 13 × 13 的特征图,然后对 13 × 13的特征图的每个cell预测 5 个anchor boxes,对每个anchor box预测边界框的位置信息、置信度和一套分类概率值。使用anchorboxes之后, YOLO v2可以预测 13 × 13 × 5 = 845 个边界框。
Directed Location Prediction 直接预测相对位置
(x,y,w,h)是预选框,预测偏移值(tx,ty,tw,ty) 并不是直接的偏移量,选择的是相对grid cell的偏移量,无论这么偏移,中心点都在同一个网格之中。 YOLO v2沿用 YOLO v1的方法,根据所在网格单元的位置来预测坐标,则Ground Truth的值介于0到1之间。网络中将得到的网络预测结果再输入sigmoid函数中,让输出结果介于0到1之间。设一个网格相对于图片左上角的偏移量是 c x , c y cx,cy cx,cy。先验框的宽度和高度分别是 p w 和 p h pw和ph pw和ph,则预测的边界框相对于特征图的中心坐标 ( b x , b y ) (bx,by) (bx,by)和宽高 b w 、 b h bw、bh bw、bh的计算公式如下图所示。
感受野
最后的特征图上的点能看到原始图像多大区域
堆叠3个33的卷积层,并且保持活动窗口步长为1,其感受野就是77 其实使用一个7*7的卷基层也可以完成,但卷积核所需的参数就会更多。 堆叠小的卷积核所需的参数更少一些,并且卷积过程越多,特征提取也会越细致,加入的非线性变换也随着增多,还不会增大权重参数个数,这就是VGG网络的基本出发点,用小的卷积核来完成特征提取操作。
最后一层感受野太大,会导致小目标丢失,所以需要融合之前的特征。
多尺度
YOLO v2中使用的Darknet-19网络结构中只有卷积层和池化层,所以其对输入图片的大小没有限制。 YOLO v2采用多尺度输入的方式训练,在训练过程中每隔10个batches,重新随机选择输入图片的尺寸,由于Darknet-19下采样总步长为32,输入图片的尺寸一般选择 32 32 32的倍数{320,352,…,608}。采用Multi-Scale Training, 可以适应不同大小的图片输入,当采用低分辨率的图片输入时,mAP值略有下降,但速度更快,当采用高分辨率的图片输入时,能得到较高mAP值,但速度有所下降。
Yolov3
v3最大的改进是网络结构上的改进,使其更适合小目标检测。特征做的更细致,融入多持续特征图 来预测不同规格物体。
多scale方法改进
Yolo v3采用了3个不同尺度的特征图来进行对象检测,通过不同尺度来对大小不同的物体进行检测,这样一来提升来Yolo模型对小物体的检测能力。 YOLOv3通过下采样32倍 16倍和8倍得到3个不同尺度的特征图,例如输入416X416的图像,则会得到13X13(416/32),26X26(416/16) 以及52X52(416/8) 每个尺度的特征图会预测出3个Anchor prior, 而Anchor prior的大小则采用K-means进行聚类分析(YOLOv3延续了YOLOv2的作法). 在COCO数据集上,按照输入图像的尺寸为416X416,得到9种聚类结果(Anchor prior的wxh): (10X13),(16X30),(33X23),(30X61),(62X45),(59X119),(116X90),(156X198),(373X326)
类别检测
在Yolo v3之前使用的是softmax来对bounding box进行分类,但是softmax只适用于单目标多分类,所以v3采用多个独立的Logistic regression分类器,可以对多标识进行多分类预测。
残差连接 -为了更好的特征
v3中使用了resnet思想。 卷积层数越多并不一定可以带来更好的效果,所以在堆叠更多卷基层之前我们需要判断一下加多卷积层是否可以导致更好的结果。最后得到的结果肯定不会比原来的差。
网络架构
Yolo v3提出DarkNet53,一共包含53层卷积层和多个Resnet层。 没有池化和全连接层,全部卷积。 Darknet-53去除了所有的maxpooling层,增加了更多的1X1和3X3的卷积层,但因为加深网络层数很容易导致梯度消失或爆炸,所以Darknet-53加入了ResNet中的Residual 块来解决梯度的问题。
Yolo v4
输入端
Yolov4训练时对输入端进行了改进,主要包括:Mosaic数据增强,cmBN,SAT自对抗训练
Mosaic数据增强:利用四张图片,对四张图片进行随意地缩放,裁剪,排布,获得一张新的图片,同时也获得了这张图片对应的框,然后将这样一张拼接后的图片送进神经网络,相当于一下完成四张图片的学习,这几大丰富了检测物体的背景,且在标准化BN计算的时候一下子会计算四张图片的数据。 在训练时,数据集中的小目标往往是数量多且分布不均匀的,所以使用mosaic数据增强的优点是:丰富了检测数据集,特别是随机缩放增加了很多小目标,增强了网络的鲁棒性。
BackBone主干网络
主干网络CSPDarkent53是在Yolo v3的Darkent53的基础上融合CSP的经验所产生的,其中包含了5个CSP模块。 每个CSP模块前面的卷积核的大小都是3x3,stride=2,因此可以起到下采样的作用。 因为Backbone有5个CSP模块,输入图像是608x608,所以特征图变化的规律是:608->304->152->76->38->19;经过5次CSP模块后得到19*19大小的特征图。 只在Backbone中采用了Mish激活函数,网络后面仍然采用Leaky_relu激活函数。
Neck
在BackBone和最后的输出层之间插入一些层,比如:SPP模块,FPN+PAN结构。
Prediction
改进训练时的损失函数CIOU_Loss,以及预测框筛选的NMS变为DIOU_nms
|