YOLO算法的发展历程

一 目标检测问题

目标检测问题是模式识别问题的一种,它主要解决从图像中获取需要的物体类型以及位置的问题,输入一幅图像或者一帧视频,要输出图像中要求物体的类别和位置,其中的位置通常用一个框标记出来。在研究目标检测问题时,通常只考虑感兴趣的物体,比如人脸检测检测人脸,交通检测检测车辆等,而例如建筑物,天空之类的则不在考虑范围之列。

二 设计思想

目标检测有两种实现,一种是one-stage,另一种是two-stage,它们的区别如名称所体现的,two-stage有一个region proposal过程,可以理解为网络会先生成目标候选区域,然后把所有的区域放进分类器分类,而one-stage会先把图片分割成一个个的image patch,然后每个image patch都有M个anchor box,把所有的anchor送进分类器输出分类和检测位置。很明显可以看出,后一种方法的速度会比较快。

YOLO算法是一种典型的one-stage方法,它是You Only Look Once 的缩写,意思是神经网络只需要看一次图片,就能输出结果。

YOLO算法的发展历程_第1张图片

YOLO到目前为止总共发布了五个版本,其中YOLOv1奠定了整个YOLO系列的基础,后面的YOLO算法是对其的不断改进创新。

三 发展历程

1 YOLOv1

YOLOv1发布于2015年,是one-stage detection的开山之作,在此之前的目标检测都是采用two-stage的方法,虽然准确率较高,但是运行速度慢。

1 主要思想

YOLOv1的检测方法如下:

YOLO算法的发展历程_第2张图片

  • 将输入图像划分成S*S的网格,如果物体中心落入某个网格内,就由该网格单元负责检测该目标。
  • 每个网格预测B个边界框和它们的置信度,置信度是预测框和真实物体IOU和网格是否包含物体01值之积
  • 每个边界框都包含5个预测值,x,y,w,h,confidence,分别代表中心坐标,宽高和IOU值,这里的坐标是相对于网格左上角的偏移量,宽高是相对于整幅图像的占比YOLO算法的发展历程_第3张图片

对于单个网格而言,还要预测C个条件概率Pr(Classi|Object),即在一个网格包含一个物体t的前提下,他是某种物体的概率,这个概率属于网格而非预测框。

将YOLO用于PASCAL VOC数据集时,论文使用的 S=7,即将一张图像分为7×7=49个网格每一个栅格预测B=2个bounding boxe(每个box有 x,y,w,h,confidence,5个预测值),同时C=20,也就是说分20个类别。因此,最后的预测结果是7×7×30 的张量。

2 网络结构

YOLO算法的发展历程_第4张图片

YOLO包含了24个卷积层和2个全连接层,通过全连接层来预测图象位置和类别概率,这也导致了YOLO只支持与训练图像相同的输入分辨率。

3 损失函数

YOLO算法的发展历程_第5张图片

损失函数分为框,置信度和分类三个部分,由于三者的重要程度并不相同,同时网格中物体的分布并不均衡,如果采用单纯求和的方式会有很大不足,因此采用了上述方式,更加重视8维的坐标预测,降低没有物体的边界框置信度损失的权重。同时,为了平衡大小框的误差,对大框采用求平方根的方法降低差值,这种方法只能在一定程度上降低误差,但影响依然存在。

2 YOLOv2

由于YOLOv1存在定位不准确以及与two-stage方法相比召回率低的缺点,作者于2017年提出了YOLOv2算法。在论文中作者提出了从更准确,更快,更多识别三个角度对YOLOv1算法进行了改进,其中识别更多对象也就是扩展到能检测9000种不同对象,被称为YOLO9000。

更精确

  • Batch Normalization

批量归一化是一种很有效的正则化手段,加速了收敛速度,提升了收敛效果,加入批归一化之后去除了Dropout,同时提升了精确度。

  • High Resolution Classifier

通常检测模型会先在ImageNet分类数据集上预训练CNN特征提取器,但是这个模型基本上采取大小为224*224的图片输入,分辨率较低,在检验模型时如果采用448*448,所以YOLOv1采用224*224的输入预训练160个epoch后将输入调整到448*448并继续训练,在得到预训练模型后再进行fine-tuning

  • Anchor Boxes

原来的YOLOv1直接回归预测框的坐标,由于不同物体的尺寸不同,导致YOLOv1在精确定位方面表现较差,在YOLOv2中放弃了全连接层预测边界框而采用了anchor boxes机制来预测边界框,同时去掉了一个池化层,使卷积层输出更高的分辨率。

在检测模型中,输入尺寸不再是预训练中的448*448,而是416*416,由于YOLOv2下采样的总步长是32,对于416*416大小的图片,最终会得到13*13的特征图。

从上图可以看出,最终得到的特征图是13*13的,也就是存在一个中心网点,如果在预测一些大物体的时候,就可以让他们的中心点落在这个位置,更容易预测这些物体的边界框。

区别于YOLOv1只为每个网格提供一套分类概率值,YOLOv2为每个网格的每个anchor box都保存一套分类概率值。

  • Dimension Clusters

在使用anchor box后,其尺寸会随着训练不断自我调节,但是如果一开始就选择了合适的尺寸,会帮助网络更好的训练,因此作者采用了k-means的方式对训练集的bounding boxes做聚类,试图找到合适的anchor box。在这里要注意的是,由于框的大小不一,所以不采用标准的欧氏距离而是box和聚类中心box之间的iou作为距离指标:

下图展示了聚类个数与IOU之间的关系,在分析了之后作为选择了K=5,可以看出,聚类结果中多是高瘦的box。

YOLO算法的发展历程_第6张图片

  •  Direct Location prediction

 YOLOv2虽然引入了anchor box来预测box,但是所用的方法还是YOLOv1中的直接预测相对于网格坐标位置的方式。

YOLO算法的发展历程_第7张图片

通过以上方式成功的将边界框约束在网格内部,同时通过预测出的偏移量可以很容易的计算出最终边界框的位置和大小。

YOLO算法的发展历程_第8张图片

  • Fine-Grained Features 

添加了一个passthrough layer,这个层的作用类似于ResNet,将前一层的26*26的feature map和当前层的13*13的feature map连接,从而更好地检测小物体。

  • Multi-Scale Training

为了让YOLOv2更具鲁棒性,作者引入了Multi-Scale Training,也就是说在训练时,每训练10个epoch,网络会选择另一种size的输入,这些输入以32为倍数递增,这种方式让相同网络可以对不同分辨率的图像进行预测,同时在效率和准确率上取得了平衡。

更快

  • Darknet-19

在YOLOv2中,作者将分类网络换成了Darknet-19

YOLO算法的发展历程_第9张图片

其网络结构如上所示,19个卷积层少于YOLOV1的24个,这减少了运算量。

  • Training for Classification 

 在预训练部分,数据集是ImageNet,训练160个epoch,输入图像的大小是224*224,初始学习率为0.1,同时还采用了标准的数据增强方式,比如随机裁剪,旋转以及色度亮度的调整,以及采用了fine-funing,从而使高分辨率的图片448*448也可以有良好的检测性能,此部分参数的除了epoch和learning rate改变外,其他都没变,这里learning rate改为0.001,并训练10个epoch。

  • Training for Detection

在预训练后,就可以把网络移植到detection部分,由于Darknet-19是一个分类模型,用于目标检测需要进行一些改造,首先把最后一个卷积层去掉,然后添加3个3*3的卷积层,每个卷积层有1024个filter,而且每个后面都连接一个1*1的卷积层,1*1卷积的filter个数根据需要检测的类来定。此外还采取了迁移学习的方法,添加 passthrough 层,这样可以帮助检测更小的物体。

损失函数

YOLO算法的发展历程_第10张图片

YOLOv2的损失函数在论文中没有提及,参考了别人的博客和官方的代码有了一些体会,类似于YOLOv1,但是考虑到anchor box的特点,做了一些优化。

3 YOLOv3

2018年YOLO的作者提出了YOLOv3,它是前作的改进,最大的改进特点包括使用了残差模型Darknet-53,以及为了实现多尺度检测采用了FPN架构。

1 网络结构

YOLO算法的发展历程_第11张图片

 YOLOv3中只有卷积层,控制特征图的尺寸这一任务由调节卷积步长来实现,同时由于采用了FPN架构,因此总共会输出三个特征图,第一个下采样32倍,第二个下采样16倍,第三个下采样8倍,小尺寸的特征图检测大尺寸物体,大尺寸特征图检测小尺寸物体。

类似于YOLOv2,每种特征图对应了多种特征框,这里作者为每种特征图定义了3个先验框,总共有9个先验框,每个框预测五元组(即坐标和置信度)以及80个one-hot向量。这9个先验框同样是根据K-means算法求出来的。

2 训练策略与损失函数

YOLOv3中由于使用了FPN机制,可能会有多个特征图重复检测某个物体的情况,这是如果粗暴的给IOU不够高的置信度置为零,学习效果会走向极端,为此提出了忽略样例,所以将样例总共分成了三个部分:正例,反例,忽略样例。

正例:取一个gt,和所有的4032个框计算IOU值,取最大的为正例,每个预测框只分配一个gt,一旦被分配,以后的分配过程将其忽略,正例对于置信度,检测框以及类别都会产生损失,其置信度设为1,对应分类向量设为1

负例:正例除外后与所有gt的IOU都小于阈值,设为负例,只产生置信度损失,其置信度设为0。

忽略样例:整理除外,存在一个gt与其IOU大于阈值。

YOLO算法的发展历程_第12张图片

 需要注意的是,除了检测框外,对于分类误差和置信度误差都是用二元交叉熵误差,此外,由于三个特征图,预测时会出现物体中心重合的现象,因此不严格指定哪个特征图中心点,而是根据IOU来判断。

4 YOLOv4

YOLOv4在原来的YOLO目标检测架构的基础上,采用了很多优化策略,在数据处理,主干网络,网络训练,激活函数,损失函数等方面都有不同程度的优化。

1 backone

 YOLOv4的网络结构如上所示,可以看出,他是在YOLOv3的主干网络Darknet-53的基础上增加了backbone结构,其中包含了5个CSP模块,可以有效增强网络的学习能力,降低成本。同时增加了Droblock,缓解过拟合现象。

此外很重要的一点是,使用了Mish激活函数

根据实验,这种激活函数可以增加精度。

2 Neck

YOLOv4中的Neck结构主要采用了SPP模块,FPN+PAN的方式,SPP模块指的是用不同尺度的最大池化方式连接不同尺寸的特征图,可以显著分离上下文的特征,此外FPN和PAN起到了特征聚合的作用。

3 输出和预测的创新

输入部分采用了Mosaic数据增强,随机采用四张图片随即缩放后随机凭借,丰富了数据集,增强了模型的鲁棒性。预测部份采用了CIOU_Loss替换了IOU_Loss,DIOU_nms替换了nms,充分考虑了边框不重合,中心点距离,以及边框宽高比的问题。

5 YOLOv5

YOLOv5实际上也是在YOLOv4的基础上进行了一定程度的优化。

1 网络结构

在YOLOv5中新加入了一个focus框架,其最大的特点是原始608×608×3的图像输入Focus结构采用切片操作,先变成304×304×12的特征图,再经过一次32个卷积核的卷积操作,最终变成304×304×32的特征图,加速了训练速度。 另外在YOLOv4中使用的CSP模块现在在backone和neck中都有应用。

2 输入和预测

输入部分依然采用了YOLOv4中采用的Mosaic数据增强技术,另外对于anchor box的设置采用了每次训练时自适应生成的方式,以及为了保持正常的长宽比,在填充增强环节自适应增添最少的黑边。预测部份同样采用了CIOU_Loss替换了IOU_Loss,DIOU_nms替换了nms.

你可能感兴趣的:(算法,深度学习,神经网络)