YOLOv5 是Glenn Jocher等人操刀研发,Ultralytics公司的开源项目,项目地址可点击。2020年6月发布以来,Ultralytics公司一直在对项目进行维护与更新,目前repo的star数目突破44k,YOLOv5的功能在迭代中越发强大与完善,目前支持多平台多框架,以及涵盖语义分割等功能,成为越来越强大的检测工具。
1、理解anchor
想要理解检测神经网络,绕不开的就是anchor的具体设定和来源,所以在第一章节我们就聊一聊anchor的起源。
回忆早先处理的人脸识别算法,使用的是Haar级联+boost分类器的方式来做,如果我们要检测下图中小女孩的人脸位置,一个比较简单暴力的方法就是滑窗,我们使用不同大小、不同长宽比的候选框在整幅图像上进行穷尽式的滑窗,然后提取窗口内的特征(例如Haar、LBP、Hog等特征),再送入分类器(SVM、Adaboost等)判断该窗口内包含的是否为人脸。这种方法简单易理解,但是这类方法受限于手动设计的特征,召回率和准确率通常不是很高。
![](https://i-blog.csdnimg.cn/blog_migrate/23b42b48f12a2548c8a52875670e2cfa.png)
在深度学习时代,大名鼎鼎的RCNN和Fast RCNN依旧依赖滑窗来产生候选框,也就是Selective Search算法,该算法优化了候选框的生成策略,但仍旧会产生大量的候选框,导致即使Fast RCNN算法,在GPU上的速度也只有三、四帧每秒。直到Faster RCNN的出现,提出了RPN网络,使用RPN直接预测出候选框的位置。RPN网络一个最重要的概念就是anchor,启发了后面的SSD和YOLOv2等算法,虽然SSD算法称之为default box,也有算法叫做prior box,其实都是同一个概念,他们都是anchor的别称。
1.1 anchor的概念
Archor就是在图像上预设好的不同大小,不同长宽比的参照框,其实非常类似于上面的滑窗法所设置的窗口大小。举例来说如果我们在38x38、19x19、10x10、5x5的四个特征图上,每张图上分别设置4、6、6、6个不同大小和长宽比的anchor,所以一共有38x38x4+19x19x6+ 10x10x6+5x5x6=8692个anchor。
借助神经网络强大的拟合能力,我们不再需要计算Haar、Hog等特征,直接让神经网络输出,每个anchor是否包含(或者说与物体有较大重叠,也就是IoU较大)物体,以及被检测物体相对本anchor的中心点偏移以及长宽比例。
![](https://i-blog.csdnimg.cn/blog_migrate/56c8ce49f7920f36ac561511e3238662.png)
一般的目标检测网络可能有成千上万个anchor,例如标准SSD在300x300输入下有8732个anchor,在500x500下anchor数量过万。我们拿上图中的三个anchor举例,神经网络的输出,也就是每个anchor认为自己是否含有物体的概率,物体中心点与anchor自身的中心点位置的偏移量,以及相对于anchor宽高的比例。因为anchor的位置都是固定的,所以就可以很容易的换算出来实际物体的位置。以图中的小猫为例,红色的anchor就以99%的概率认为它是一只猫,并同时给出了猫的实际位置相对于该anchor的偏移量,这样,我们将输出解码后就得到了实际猫的位置,如果它能通过NMS(非最大抑制)筛选,它就能顺利的输出来。但是,绿色的anchor就认为它是猫的概率就很小,紫色的anchor虽然与猫有重叠,但是概率只有26%。
1.2 如何科学的设置Anchor
FasterRCNN的RPN网络部分,anchor为三个尺度{128, 256, 512},三个比例{1:1, 1:2, 2:1},所以一共9组anchor。
在SSD论文中,作者使用6组定位层,每个定位层分别有6个anchor(不过第一和最后一个定位层只有4个)。一个尺度,分别有1:1、1:2、2:1、1:3、3:1五个不同宽高比,再加一个与特征图的anchor尺度特异性相关的尺寸,因此共有六个尺寸。
YOLOv3在三个不同尺度,每个尺度三个不同大小的anchor,一共九组。这位退出CV圈的Joseph Redmon大神是在YOLOv2版本开始使用kmeans方法聚类得到合适的anchor。可以得出的是大佬们的anchor数据都是在实际的公开数据集上,都是根据数据的实际分布来设置的,所以,我们在自己的数据集上训练目标检测网络时,也需要针对自身数据分布的特性对Anchor进行针对性的修改,这部分工作在YOLOv5代码仓库中也是有体现的。
本章节参考文献:
新手也能彻底搞懂的目标检测Anchor是什么?
2、网络流程
在理解anchor之后,我们可以理解一下yolo网络架构了。
YOLOv5是对三个尺度的特征图进行目标检测的,即large(大)、medium(中)、small(小)三个尺度。
- 准备工作(Input中进行):图片需要经过数据增强(尤其是Mosaic数据增强),并且初始化一组anchor预设(YOLOv5_v6针对不同参数量的模型给出了不同的通用预设)。
- 特征提取(Backbone中进行):使用了Conv、C3、SPPF基本结构对输入图片进行特征提取。Conv用于对输入进行下采样(共进行了5次下采样);C3用于对输入进行特征提取、融合,丰富特征的语义信息,在这个过程中使用了Boottleneck减少参数量和计算量、借鉴CSPNet思想增强CNN学习能力;SPPF利用池化、特征融合的方式丰富特征的语义信息,使得最深层的特征图拥有极丰富的语义信息。
- 加工特征(Neck中进行):对要进行目标检测的三种尺度的特征图融合浅层特征(浅层特征有利于检测)。v6借鉴了PANet,对提取的特征图融合浅层特征,使得特征图既具有丰富的语义信息又具有物体准确的位置信息。
- 预测目标(Head中进行):对加工后的特征图进行预测,根据损失函数(Classificition Loss和Bounding Box Regeression Loss)和优化器优化参数权重。
![](https://i-blog.csdnimg.cn/blog_migrate/de8221a68e6602decb1fc403428b3f2c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/37b45edc54e71779fdc5cd579cba1f3a.png)
YOLO内部出现比较多的网络结构,在本章节不进行逐一介绍,可以参考下文的参考文献对此部分内容进行了解。
参考文献:
目标检测:新手也能彻底搞懂的YOLOv5详解
深入浅出Yolo系列之Yolov5核心基础知识完整讲解
3、网络输出与LOSS
3.1网络输出
YOLOv5的输出端主要是预测框,每个预测框由以下信息组成:
-
置信度(confidence score):表示该框内是否存在目标的概率,取值范围为0到1。
-
类别概率(class probabilities):表示该框内目标属于各个类别的概率,一般是预先定义好的类别数量。
-
边界框位置(bounding box coordinates):表示目标的位置和大小,一般用矩形框来表示。
grid cell为20x20,输入为640x640的图像下采样32倍得到20x20,对应输入图像的感受野是32x32;grid cell为40x40,输入为640x640的图像下采样16倍得到40x40,对应输入图像的感受野是16x16;grid cell为80x80,输入为640x640的图像下采样8倍得到80x80,对应输入图像的感受野是8x8。
每个gred cell生成三个锚框,每一个锚框对应一个预测框,每一个预测框有 5(x,y,w,h,置信度) + 80(80个类别的条件概率), 3x85=255。
3.2 NMS非极大值抑制
在目标检测任务中,一个物体可能被多个预测框检测出来,为了避免对同一个物体进行多次检测,需要对重复的预测框进行过滤,这个过程就是非极大值抑制(Non-maximum suppression,简称NMS)。
在YOLOv5中,NMS主要是通过以下几个步骤实现的:
首先,对所有预测框按照置信度从高到低进行排序。
然后,从置信度最高的预测框开始,依次遍历每个预测框,判断该预测框与后面所有预测框之间的IOU值是否大于一定的阈值(一般为0.5或0.6)。
如果IOU值大于阈值,则将该预测框从候选框列表中剔除,否则保留该预测框。
继续遍历下一个预测框,重复上述步骤,直到所有预测框都被遍历一遍。
最终,保留下来的预测框就是经过NMS处理后的结果,即每个物体只对应一个预测框。
NMS算法的核心是通过比较重复预测框之间的IOU值,去除冗余的预测框,保留最优的结果。在YOLOv5中,NMS可以避免同一个物体被重复检测的问题,提高了检测的精度和效率。