计算机系统应用教程网站

网站首页 > 技术文章 正文

最全的目标检测入门系列(五)YOLO系列

btikc 2024-09-01 15:29:51 技术文章 14 ℃ 0 评论


引言

常见的一阶段(one-stage)算法包括YOLO系列,SSD系列,RetinaNet等算法。相比于two-stage算法,one-stage算法没有区域候选框提取部分,不需要对区域候选框依次检测,其检测速度更快,但其检测精度一般低于二阶段的目标检测算法。

本篇文章将对YOLO系列算法进行详细介绍,而SSD系列和RetinaNet等算法将在接下来文章进行介绍。

YOLO v1 算法

YOLO(You Only Look Once)算法是一种基于深度神经网络的目标检测算法,You Only Look Once意思是只需要一次CNN运算。

整个系统图1所示:首先将输入图片resize到448x448,然后送入CNN网络,最后处理网络预测结果得到检测的目标。

相比R-CNN这种两阶段的目标检测算法,YOLO是一个统一的框架,其速度更快,且训练过程也是端到端的。

如图2所示,YOLO v1 网络的输入图片尺寸是448*448,经过多层的卷积池化后,得到一个7*7*1024维度的张量,然后再经过两层全连接层,最后输出7*7*30维度的张量信息。

YOLO v1的网络结果与常规的卷积神经网络的区别在于后端任务网络结构不同,具体而言,对于常规的分类神经网络,其最后的全连接成一般连接一个一维度的向量,向量中的不同元素值代表所属对应类别的概率值,而这里YOLO的输出向量是三维的张量。

与R-CNN系列算法使用selective search或者RPN网络获取proposel不同,YOLO v1 算法中直接将CNN网络输出的特征图分割成S*S网格。论文中S=7,也就是YOLO网络结构图中的倒数第三层维度为7*7*30的张量的尺寸。然后每个单元格负责去检测落在该格子内的目标,对于那些没有物体中心点落进来的格子,则不负责预测任何物体。如图3所示,可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。

每个单元格会预测若干个边界框(bounding box)以及边界框的置信度(confidence score)

置信度包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为Pr(object),当该边界框是背景时(即不包含目标),此时Pr(object)=0。而当该边界框包含目标时,Pr(object)=1。边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表征。

YOLO v1 算法中的置信度是两个因子的乘积,预测框的准确度也反映在里面。边界框的大小与位置可以用4个值来表征:(x,y,w,h),其中(x,y)是边界框的中心坐标,而w和h是边界框的宽与高。中心坐标的预测值(x,y)是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的。而边界框的w和h预测值是相对于整个图片的宽与高的比例,因此理论上4个元素的大小应该在[0,1]范围。这样每个边界框的预测值实际上包含5个元素:(x,y,w,h,c),其中前4个表征边界框的大小与位置,而最后一个值是置信度。还有分类问题,对于每一个单元格其还要给出预测出c个类别概率值,其表征的是由该单元格负责预测的边界框其目标属于各个类别的概率。但是这些概率值其实是在各个边界框置信度下的条件概率。

边界框类别置信度表征的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏,一般会根据类别置信度来过滤网络的预测框。每个单元格需要预测(B*5+C)个值。如果将输入图片划分为S*S网格,那么最终预测值为S*S*(B*5+C)大小的张量。对于PASCAL VOC数据共有20个类别,如果使用S=7,B=2,那么最终的预测结果就是7*7*30大小的张量。

以YOLO网络结构图中的倒数第三层维度为7*7*30的张量为例,这里的30=(4+1)*2+10,其中4表示矩形框的中心点坐标x、y以及长度h和宽度w,1是检测物体的置信度c;2是论文中设定的每个格子所回归的两个矩形框,这个参数也可以更改;20表示预测20个类别,因此张量的形状为7*7*30。注意,论文中设定的每个格子回归的矩形框的个数为2,可以更改,但是不管设定回归几个矩形框,最后只会选择置信度更大的矩形框来作为输出,也就是说每个格子只会输出一个预测矩形框,只能预测一个物体。论文中设定的7*7的格子,也就是说该网络最多可以预测49个物体。

优点:

  • 相比于两阶段的检测算法,YOLO的检测速度非常快;

缺点:

  • 存在定位不准以及召回率不如基于区域提名方法的问题;
  • 对距离很近的小物体检测效果不好。

YOLO v2 算法

为了解决YOLO v1 算法检测精度低,小目标检测难度大等问题,在YOLO v1 算法框架的基础上,提出了YOLO v2 算法。YOLO v2 算法采用了一个新的特征提取器,称为Darknet-19,包括19个卷积层和5个maxpooling层,如图4所示。


Darknet-19与VGG16模型设计原则是一致的,主要采用 3*3卷积,采用2*2的maxpooling层之后,特征图维度降低2倍,而同时将特征图的channles增加两倍。与NIN(Network in Network)类似,Darknet-19最终采用global avgpooling做预测,并且在3*3卷积之间使用1*1卷积来压缩特征图channles以降低模型计算量和参数。Darknet-19每个卷积层后面同样使用了batch norm层以加快收敛速度,降低模型过拟合。

在ImageNet分类数据集上,Darknet-19的top-1准确度为72.9%,top-5准确度为91.2%,但是模型参数相对小一些。使用Darknet-19之后,YOLOv2的mAP值没有显著提升,但是计算量却可以减少约33%。

相比于YOLO v1 算法,YOLO v2 算法改进点如下:

1) 加入BN层

在所有的卷积层后加入BN操作,去掉所有dropout层。使用高分辨率训练得到的分类模型预训练检测网络。YOLOv1在ImageNet数据集上进行预训练,它使用224x224尺寸的图片,而YOLOv2直接使用448x448尺寸的图片进行预训练。

2) 使用卷积层预测anchor box位置

YOLOv1基于输入图像的物理空间划分成7x7的网格空间,每个网格最多对应两个候选预测框,因此每张图像最多有98个预测框,最后接入全连接层预测物体框位置。而YOLOv2借鉴了Faster R-CNN的思想,移除全连接层,引入了anchor box,每个小格子制定n个anchor box,神经网络不对预测矩形框的宽度和高度绝对值进行预测,而是预测与anchor box的偏差offset,训练的时候最接近groundtruth的框会产生损失,而其余框不产生损失,这样做大大增加了每张图片的候选框个数。这个改进将召回率由81%提高到88%,但是mAP由69.5%稍微降低到69.2%。同时,由于去掉了全连接层,YOLOv2可以支持检测时不同分辨率的图像输入。

3) kmeans聚类确定候选框形状

使用k-means对训练数据集中的物体框的分辨率和比例进行聚类,从而确定anchor box的高度和宽度。为避免物体大小引起的统计误差,YOLOv2使用(1-IOU)数值作为距离度量方式。加入了聚类操作之后,引入Anchor Box之后,mAP上升。

4) 预测“候选框相对于图像的内部偏移”

RPN网络是通过回归候选框相对于当前anchor box的偏移来定位候选框的位置,由于偏移相对于anchor box外部,所以取值范围是不受限的,导致训练的时候难以收敛。因此YOLOv2采用与YOLOv1类似的方式,预测候选框相对于图像左上角的位置偏移,并将偏移量归一化到[0,1]区间,解决了训练难收敛问题。

5) 使用更加精细的特征

YOLOv1提取13x13的特征层进行后续物体检测,但是对于小物体的检测效果不好。YOLOv2将前一层26x26的特征与13x13层的特征进行通道拼接,如26x26x512的feature map被拆分成13x13x2048,然后同后面的13x13特征层进行拼接,这个方法使得mAP提升1%。

6) 多尺度图像训练

YOLOv2移除了全连接层,因此对于网络的输入大小,并没有限制,可以采用不同分辨率的图像进行模型迭代训练,增强模型对多尺度图像的预测鲁棒性。

YOLO v3 算法

YOLO v3基于YOLO v2做出了一定的改进,它调整了网络结构,使用了特征提取网络为darknet-53,如图5所示,Darknet-53的网络结构含有53个卷积层,并借鉴了残差网络residual network的做法,在一些层之间设置了快捷链路(shortcut connections);利用多尺度特征进行对象检测;对象分类用Logistic取代了softmax。

如图6所示,为 YOLO v3网络结构图。其中Darknet-53网络作为骨干网络用于特征提取,采用256*256*3作为输入,最左侧那一列的数字如1、2、8等表示多少个重复的残差组件。YOLOv3中没有全连接层,因此对输入图片的尺寸没有限制;YOLO v3借鉴了特征金字塔的思想,让含有高语义信息的小尺寸特征图来检测大尺寸的物体,而高分辨率的大尺寸特征图来检测小尺寸物体,特征图的输出维度是N*N*[3*(4+1+80)],其中N*N表示输出特征图的格子数量,3表示anchor框的数量,4表示每个框有4个预测框数值tx,ty,tw,th,1表示预测框置信度,80表示物体类别的数量。YOLO v3总共输出3个特征图,第一个特征图下采样32倍,第二个特征图下采样16倍,第三个下采样8倍。输入图像经过Darknet-53(无全连接层),再经过Yoloblock生成的特征图被当作两用,第一用为经过3*3卷积层、1*1卷积之后生成特征图一,第二用为经过1*1卷积层加上采样层,与Darnet-53网络的中间层输出结果进行拼接,产生特征图二。同样的循环之后产生特征图三。

根据YOLO v3 的网络结构可知,它有三种尺度的检测结果,也就是图中红色的部分。它包含8倍下采样,16倍下采样和32倍下采样,其中32倍下采样的倍数最高,其特征图的感受野比较大,因此适合检测图像中尺寸比较大的对象,8倍下采样的倍数最低,其特征图的感受野比较小,因此适合检测图像中尺寸比较小的对象。为了实现细粒度的检测,第79层的特征图又开始作上采样(从79层往右开始上采样卷积),然后与第61层特征图融合(Concatenation),这样得到第91层较细粒度的特征图,同样经过几个卷积层后得到相对输入图像16倍下采样的特征图。它具有中等尺度的感受野,适合检测中等尺度的对象。然后第91层特征图再次上采样,并与第36层特征图融合(Concatenation),最后得到相对输入图像8倍下采样的特征图。它的感受野最小,适合检测小尺寸的对象。

总体而言,对于一个输入图像,YOLO v3将其映射到3个尺度的输出张量,代表图像各个位置存在各种对象的概率。对于一个416*416的输入图像,在每个尺度的特征图的每个网格设置3个先验框,总共有 13*13*3 + 26*26*3 + 52*52*3 = 10647 个预测。每一个预测是一个(4+1+80)=85维向量,这个85维向量包含边框坐标(4个数值),边框置信度(1个数值),对象类别的概率(对于COCO数据集,有80种对象)。而YOLO v2采用13*13*5 = 845个预测,YOLO3的尝试预测边框数量增加了10多倍,而且是在不同分辨率上进行,所以mAP以及对小物体的检测效果有一定的提升。YOLO v3 借鉴了残差网络结构,形成更深的网络层次,以及多尺度检测,提升了mAP及小物体检测效果。YOLO v3采用的模型为darknet53,比YOLOv2的darknet-19更大,进一步提高了检测准确率,但速度比YOLO9000稍慢。相比其他检测算法,RetinaNet,SSD,DSSD等算法,YOLOv3的综合性能比如准确率和速度依旧很是最好的。

YOLO v3算法相比于YOLO v2算法改进点总结如下:

1) 候选框预测时增加‘物体性’的预测,即增加对候选框是否包含物体的判断

这条改进借鉴Faster R-CNN的做法。区别在于,Faster R-CNN一个ground truth框可能对应多个检测候选框,而YOLO9000每个ground truth object最多对应到一个检测候选框。那么这会使得很多候选框对应不到ground truth box,这种候选框在训练时不会计算坐标或分类误差,而只会加入对‘物体性’的检测误差。

2) 多标签分类

每个候选框可以预测多个分类,使用逻辑回归二分类器进行分类。

3) 多尺度预测

借鉴FPN思想,在3个尺度上进行预测,每个尺度对应3个候选框,每个候选框输出‘位置偏移’,是否包含物体以及分类结果。YOLOv3对小物体的检测效果比YOLO9000有提升,但是对中大物体的检测准确率却有降低。

4) 提出新的basenet

YOLOv3采用一个53层卷积的网络结构,称darknet-53,网络设计只采用3x3,1x1的卷积层,借鉴了ResNet的残差网络思想。该basenet在ImageNet上对256x256的Top-5分类准确率为93.5%,与ResNet-152相同,Top-1准确率为77.2%,只比ResNet-152低0.4%。与此同时,darknet-53的计算复杂度仅为ResNet-152的75%, 实际检测速度(FPS)是ResNet-152的2倍。

参考文献

文章链接:

  • YOLO v1:https://arxiv.org/pdf/1506.02640.pdf
  • YOLO v2:https://arxiv.org/pdf/1612.08242.pdf
  • YOLO v3:https://pjreddie.com/media/files/papers/YOLOv3.pdf

代码链接:

  • YOLO v1:https://pjreddie.com/darknet/yolo/
  • YOLO v2:https://github.com/nilboy/tensorflow-yolo
  • YOLO v3:https://github.com/eriklindernoren/PyTorch-YOLOv3

前期回顾

最全的目标检测入门系列(一)概述

最全的目标检测入门系列(二)评价指标

最全的目标检测入门系列(三)数据集

最全的目标检测入门系列(四)传统目标检测方法

后期预告

欢迎点、藏、关三连

有共同兴趣的同学,可以私信探讨

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表