目标检测算法另一分支的发展(one stage检测算法):YOLO、SSD、YOLOv2/YOLO 9000、YOLOv3

版权声明:站在巨人的肩膀上学习。 https://blog.csdn.net/zgcr654321/article/details/84775331

目标检测可以理解为是物体识别和物体定位的综合,不仅仅要识别出物体属于哪个分类,更重要的是得到物体在图片中的具体位置。

目前的目标检测算法分为两类:

一类是two-stage,two-stage检测算法将检测问题划分为两个阶段,首先产生候选区域(region proposals),然后对候选区域分类(一般还需要对位置精修),这一类的典型代表是R-CNN, Fast R-CNN, Faster R-CNN,Mask R-CNN家族。他们识别错误率低,漏识别率也较低,但速度较慢,不能满足实时检测场景。

另一类方式称为one-stage检测算法,其不需要region proposal阶段,直接产生物体的类别概率和位置坐标值,经过单次检测即可直接得到最终的检测结果,因此有着更快的检测速度,比较典型的算法如YOLO,SSD,YOLOv2,YOLOv3,Retina-Net德等。

YOLO(YOLOv1,you only look once):

论文:You Only Look Once: Unified, Real-Time Object Detection

论文地址:https://arxiv.org/pdf/1506.02640.pdf

YOLO算法的全拼是You Only Look Once,顾名思义就是只看一次,进一步把目标判定和目标识别两个步骤合二为一,所以识别速度有了很大提升,达到每秒45帧,而在快速版YOLO(Fast YOLO,卷积层更少)中,可以达到每秒155帧,这样就完全能满足实时性要求(达到24帧每秒,人眼就认为是连续的)。

YOLO的网络结构:

YOLO网络主要分为三个部分:卷积层,目标检测层,NMS筛选层。

卷积层:

即图上Inference从左边数第二个块,采用Google inceptionV1网络,共20层。这一部分主要是进行特征提取,从而提高模型泛化能力。但作者对inceptionV1进行了改造,他没有使用inception module结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。

目标检测层:

提取出的特征图经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。yolo将一副448x448的原图分割成了7x7=49个网格,每个网格要预测两个bounding box的坐标(x,y,w,h)和box内是否包含物体的置信度confidence,以及物体属于20类别中每一类的概率(yolo的训练数据为voc2012,它是一个20分类的数据集)。所以一个网格对应一个(4x2+2+20) = 30维的向量。

bounding box坐标:如上图,7x7网格内的每个grid(红色框),对应两个大小形状不同的bounding box(黄色框)。每个box的位置坐标为(x,y,w,h), x和y表示box中心点坐标,w和h表示box宽度和高度。通过与训练数据集上标定的物体真实坐标(Gx,Gy,Gw,Gh)进行对比训练,可以计算出初始bounding box平移和伸缩得到最终位置的模型。

bounding box置信度confidence:这个置信度只是为了表达box内有无物体的概率(类似于Faster R-CNN中RPN层的softmax预测anchor是前景还是背景的概率),并不预测box内物体属于哪一类。

置信度:

其中前一项表示有无人工标记的物体落入了网格内,如果有则为1,否则为0。第二项代表bounding box和真实标记的box之间的重合度。它等于两个box面积交集,除以面积并集。值越大则box越接近真实位置。

每个网格还需要预测它属于20分类中每一个类别的概率。分类信息是针对7X7=49个网格中的每个网格,而不是bounding box。故只需要20个,而不是40个。而confidence则是针对bounding box的,它只表示box内是否有物体,而不需要预测物体是20分类中的哪一个,故只需要2个参数。虽然分类信息和confidence都是概率,但表达含义完全不同。

NMS筛选层:

筛选层是为了在多个bounding box中筛选出最合适的几个,这个方法和faster R-CNN 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行NMS非极大值抑制,去除掉重叠度比较高的box(NMS具体算法可以回顾上面faster R-CNN小节)。这样就得到了最终的最合适的几个box和他们的类别。

YOLO的算法过程:

YOLO v1的核心思想在于将目标检测作为回归问题解决 ,YOLO v1首先会把原始图片放缩到448×448的尺寸;

然后将图片划分成SxS个区域,论文中是划分成7X7个区域。注意这里的划分不同于R-CNN类算法,这里的划分区域,只是逻辑上的划分;

如果一个标注的对象的中心落在某个区域上,那么这个区域负责预测这个物体。每个区域需要预测2个bounding box的位置和置信度。每个边界框对应于5个输出,分别是x,y,w,h和置信度。其中x,y代表边界框的中心离开其所在网格单元格边界的偏移。w,h代表边界框真实宽高相对于整幅图像的比例。x,y,w,h这几个参数都已经被限制到了区间[0,1]上;

置信度:

根据上一步得到7X7X2个bounding box,根据置信度的阈值去除可信度比较低的bounding box,最后用NMS算法去除重叠度比较高的bounding box;

最后,对每个区域还要预测它属于20分类中每一个类别的概率。

YOLO的loss函数:

YOLO的loss函数包含三部分:位置误差、confidence误差、分类误差。具体公式如下:

三种误差均采用了均方差算法。其中yolo中位置误差权重为5,类别误差权重为1。由于我们不是特别关心不包含物体的bounding box,故赋予不包含物体的box的置信度confidence误差的权重为0.5,包含物体的权重则为1。

综上,YOLO在训练过程中Loss函数计算如下式所示:

YOLO的优点与缺点:

YOLO将目标检测任务转换成回归问题,大大加快了检测的速度。同时由于网络预测每个目标窗口时使用的是全局信息,使得false positive比例大幅降低(充分利用上下文信息);

YOLO算法的精准性和召回率相对于Fast T-CNN来说比较差,其对于背景的误判率比Fast R-CNN的误判率低很多;

由于YOLO使用整图特征在7*7的粗糙网格内回归,对目标的定位并不是很精准,检测精度不高;

由于YOLO的输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。其它分辨率需要缩放成该分辨率后才可训练或测试。

YOLO对于图像上较小的目标检测效果不好。虽然每个格子可以预测2个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。

SSD(Single Shot MultiBox Detector,单次多盒检测器):

论文:SSD:Single Shot MultiBox Detector

论文地址:https://arxiv.org/pdf/1512.02325.pdf

RCNN系列(R-CNN、SPPnet、Fast R-CNN以及Faster R-CNN)的two stage的方法要预先回归一次边框,然后再进行骨干网络训练,所以精度要高,但速度上比较慢。对了解决速度上的问题,YOLO算法只做一次边框回归和打分,这使得算法的运行速度很快。但是也由于只做一次边框回归并打分,YOLO对于小目标的训练非常不充分,对小目标的检测效果非常差。简而言之,YOLO系列对于目标的尺度比较敏感,而且对于尺度变化较大的物体泛化能力比较差。

针对YOLO和Faster R-CNN的各自不足与优势,WeiLiu等人提出了Single Shot MultiBox Detector,简称为SSD。SSD整个网络采取了one stage的思想,以此提高检测速度。并且网络中融入了Faster R-CNN中的anchors思想,并且做了特征分层提取并依次计算边框回归和分类操作,由此可以适应多种尺度目标的训练和检测任务。

SSD网络主体设计的思想是特征分层提取,并依次进行边框回归和分类。因为不同层次的特征图能代表不同层次的语义信息,低层次的特征图能代表低层语义信息(含有更多的细节),能提高语义分割质量,适合小尺度目标的学习。高层次的特征图能代表高层语义信息,能光滑分割结果,适合对大尺度的目标进行深入学习。所以作者提出的SSD的网络理论上能适合不同尺度的目标检测。SSD基本已经可以满足我们手机端上实时物体检测需求了。

SSD的网络结构:

下图是SSD与YOLO网络结构的对比:

SSD算法的主网络结构是VGG16,虚线框内的是VGG16的前5层网络,后面的Conv6和Conv7是将VGG16的后两层全连接层网络(fc6, fc7)转换而来。在之后并增加了4个卷积层来构造网络结构。

SSD网络结构也分为三部分:卷积层、目标检测层和NMS筛选层

卷积层:

SSD论文采用了VGG16的前5层网络,其实这也是几乎所有目标检测神经网络的惯用方法。先用一个CNN网络来提取特征,然后再进行后续的目标定位和目标分类识别。

目标检测层:

这一层由5个卷积层和一个平均池化层组成。去掉了最后的全连接层。SSD认为目标检测中的物体,只与周围信息相关,它的感受野不是全局的,故没必要也不应该做全连接。

多尺度目标检测和分类:

这一层的5个卷积层每一层都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到多尺度检测的目的,可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。而yolo中,只在最后一个卷积层上做目标位置和类别的训练和预测。这是SSD相对于yolo能提高准确率的一个关键所在。

具体来说就是:

对其中5种不同的卷积层的输出(feature map)分别用两个不同的 3×3的卷积核进行卷积,一个输出分类用的confidence,每个default box 生成21个类别confidence;一个输出回归用的 localization,每个 default box生成4个坐标值(x, y, w, h);此外,这5个feature map还经过 PriorBox 层生成 prior box(生成的是坐标)。上述5个feature map中每一层的default box的数量是给定的(8732个)。最后将前面三个计算结果分别合并然后传给loss层。

在5个卷积层上的feature map都会进行目标检测和分类,最后由NMS进行筛选,输出最终的结果。多尺度feature map上做目标检测,就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。

SSD中的anchors:

和faster R-CNN相似,SSD也提出了anchor的概念。SSD网络中作者设置Conv9输出的feature map的每个点(每个点对应为原图的一个区域的中心点)默认生成6个宽高比例不同,大小不同的anchor(SSD中称为default box)。每个anchor对应4个位置参数(x,y,w,h)和21个类别概率(voc训练集为20分类问题,在加上anchor是否为背景,共21分类),那么每个Default Box将生成一个20 + 1 + 4 = 25维的特征向量

如下图:

注意:

论文中提出了一个feature cell 的概念,如下图中有两层的feature map ,大小分别为8*8和4*4,feature cell可以认为是其中的一个方格。在每个feature cell中再进行default box的定义,根据不同的scale和aspectratio来确定defaultbox的形状。如在下图(b)、(c)中,每一个featurecell中有4个defaultbox,并且每个default box的shape是不一样的,但是它们的scale是一样的。除了feature cell的中心有一个比feature cell还要小的default box。

另外,在训练阶段,SSD将正负样本比例定位1:3。训练集给定了输入图像以及每个物体的真实区域(ground true box),将default box和真实box最接近的选为正样本。然后在剩下的default box中选择任意一个与真实box IOU大于0.5的,作为正样本。而其他的则作为负样本。由于绝大部分的box为负样本,会导致正负失衡,故根据每个box类别概率排序,使正负比例保持在1:3。SSD认为这个策略提高了4%的准确率。

此外,SSD采用了数据增强。生成与目标物体真实box间IOU为0.1 0.3 0.5 0.7 0.9的patch,随机选取这些patch参与训练,并对他们进行随机水平翻转等操作。SSD认为这个策略提高了8.8%的准确率。

NMS筛选层:

SSD的NMS筛选层和yolo的筛选层基本一致,同样先过滤掉类别概率低于阈值的default box,再采用NMS非极大值抑制,筛掉重叠度较高的。只不过SSD综合了各个不同feature map上的目标检测输出的default box。

SSD的算法过程:

SSD网络的详细结构:

输入一幅图片(200x200),将其输入到预训练好的分类网络中来获得不同大小的特征映射,这里的分类网络是修改自VGG16的网络。其中将VGG16的FC6和FC7层转化为卷积层,如上图上的Conv6和Conv7,并去掉所有的Dropout层和FC8层。添加了Atrous算法(hole算法),将Pool5从2x2-S2变换到3x3-S1;

然后抽取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2层输出的feature map,分别在这些feature map层上面的每一个点构造6个不同尺度大小的default box,然后分别进行检测和分类,生成多个default box,如上图,一共生成8732个default box;

将不同的feature map获得的default box结合起来,经过NMS(非极大值抑制)方法来抑制掉一部分重叠或者不正确的default box,生成最终的default box集合(即检测结果);

SSD算法的loss函数:

SSD算法的loss函数分为两部分:计算相应的default box与目标类别的confidence loss以及相应的位置回归。

其中N是match到Ground Truth的default box数量;而alpha参数用于调整confidence loss和location loss之间的权重,默认alpha=1。

位置回归仍采用 Smooth L1 loss:

confidence loss是典型的softmax loss:

SSD算法的优缺点:

SSD算法的运行速度超过YOLO,精度超过Faster-rcnn(在一定条件下,对于稀疏场景的大目标而言);

SSD需要人工设置prior box的min_size,max_size和aspect_ratio值。网络中default box的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层feature使用的default box大小和形状恰好都不一样,导致调试过程非常依赖经验;

SSD虽然采用了pyramdial feature hierarchy的思路,但是对小目标的recall依然一般,相对于Faster RCNN的优势不明显。这可能是因为SSD使用conv4_3的低级feature去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题;

如果场景是密集的包含多个小目标的,建议用Faster-rcnn,针对特定的网络进行优化,也可以继续加速;。果你的应用对速度要求很苛刻,那么肯定首先考虑SSD,至于那些测试集上的评估结果,和真实的数据还是有很大的差距,算法的性能也需要进一步进行评估。

YOLOv2/YOLO 9000:

论文: YOLO9000: Better, Faster, Stronger

论文地址:https://arxiv.org/pdf/1612.08242.pdf

这篇论文一共介绍了YOLO v2和YOLO9000两个模型,二者略有不同。前者主要是YOLO的升级版(关于YOLO v1的介绍可以参考:YOLO v1算法详解),后者的主要检测网络也是YOLO v2,同时对数据集做了融合,使得模型可以检测9000多类物体。而提出YOLO9000的原因主要是目前检测的数据集数据量较小,因此利用数量较大的分类数据集来帮助训练检测模型。

论文主要包括三个部分:Better,Faster,Stronger,其中前面两部分基本上讲的是YOLO v2,最后一部分讲的是YOLO9000。

YOLO有两个缺点:一个缺点在于定位不准确,另一个缺点在于和基于region proposal的方法相比召回率较低。因此YOLOv2主要是要在这两方面做提升。另外YOLOv2并不是通过加深或加宽网络达到效果提升,反而是简化了网络。大概看一下YOLOv2的表现:YOLOv2算法在VOC 2007数据集上的表现为67 FPS时,MAP为76.8,在40FPS时,MAP为78.6。

YOLOv2精度的改进(Better):

Batch Normalization(批标准化):

BN(Batch Normalization)层简单讲就是对网络的每一层的输入都做了归一化,这样网络就不需要每层都去学数据的分布,收敛会快点。原来的YOLO算法(采用的是GoogleNet网络提取特征)是没有BN层的,因此在YOLOv2中作者为每个卷积层都添加了BN层。另外由于BN可以规范模型,所以本文加入BN后就把dropout去掉了。实验证明添加了BN层可以提高2%的mAP。

High Resolution Classifier(高分辨率分类器):

fine-tuning的作用不言而喻,现在基本跑个classification或detection的模型都不会从随机初始化所有参数开始,所以一般都是用预训练的网络来fine-tuning自己的网络,而且预训练的网络基本上都是在ImageNet数据集上跑的,一方面数据量大,另一方面训练时间久,而且这样的网络都可以在相应的github上找到。 

原来的YOLO网络在预训练的时候采用的是224*224的输入(这是因为一般预训练的分类模型都是在ImageNet数据集上进行的),然后在detection的时候采用448*448的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。而YOLOv2则将预训练分成两步:先用224*224的输入从头开始训练网络,大概160个epoch(表示将所有训练数据循环跑160次),然后再将输入调整到448*448,再训练10个epoch。注意这两步都是在ImageNet数据集上操作。最后再在检测的数据集上fine-tuning,也就是detection的时候用448*448的图像作为输入就可以顺利过渡了。作者的实验表明这样可以提高几乎4%的MAP。

Convolutional With Anchor Boxes:

YOLOv1中,输入图片最终被划分为7x7的gird cell,每个单元格预测2个边界框。YOLOv1最后采用的是全连接层直接对边界框进行预测,其中边界框的宽与高是相对整张图片大小的,而由于各个图片中存在不同尺度和长宽比(scales and ratios)的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的。

作者在YOLOv2中借鉴了Faster R-CNN中的anchor思想,引入了anchor。 

Faster R-CNN中的anchor:

首先将原网络的全连接层和最后一个pooling层去掉,使得最后的卷积层可以有更高分辨率的特征。通过缩减网络,让图片输入分辨率为416 * 416,这一步的目的是为了让后面产生的卷积特征图宽高都为奇数,奇数大小的宽和高会使得每个特征图在划分cell的时候就只有一个center cell(比如可以划分成7*7或9*9个cell,center cell只有一个,如果划分成8*8或10*10的,center cell就有4个)。

为什么希望只有一个center cell呢?因为大的object一般会占据图像的中心,所以希望用一个center cell去预测,而不是4个center cell去预测。最后,YOLOv2使用了卷积层降采样(factor为32),使得输入卷积网络的416 * 416图片最终得到13 * 13的卷积特征图(416/32=13,也就是缩小比例为32)。

加入了anchor boxes后,可以预料到的结果是召回率上升,准确率下降。我们来计算一下,假设每个cell预测9个建议框,那么总共会预测13 * 13 * 9 = 1521个boxes,而之前的网络仅仅预测7 * 7 * 2 = 98个boxes。具体数据为:没有anchor boxes,模型recall为81%,mAP为69.5%;加入anchor boxes,模型recall为88%,mAP为69.2%。这样看来,准确率只有小幅度的下降,而召回率则提升了7%,说明可以通过进一步的工作来加强准确率,的确有改进空间。

Dimension Clusters(维度聚类):

我们知道在Faster R-CNN中anchor box的大小和比例是按经验设定的,然后网络会在训练过程中调整anchor box的尺寸。但是如果一开始就能选择到合适尺寸的anchor box,那肯定可以帮助网络越好地预测detection。所以作者采用k-means的方式对训练集的bounding boxes做聚类,试图找到合适的anchor box。 

和以前的精选boxes维度不同,作者使用了K-means聚类方法类训练bounding boxes,可以自动找到更好的boxes宽高维度。传统的K-means聚类方法使用的是欧氏距离函数,也就意味着较大的boxes会比较小的boxes产生更多的error,聚类结果可能会偏离。为此,作者采用的评判标准是IOU得分(也就是boxes之间的交集除以并集),这样的话,error就和box的尺度无关了。

最终的距离函数为:

作者通过改进的K-means对训练集中的boxes进行了聚类,判别标准是平均IOU得分,聚类结果如下图:

上图中我们可以看到,平衡复杂度和IOU之后,最终得到k值为5,意味着作者选择了5种大小的box维度来进行定位预测,这与手动精选的box维度不同。结果中扁长的框较少,而瘦高的框更多(这符合行人的特征),这种结论如不通过聚类实验恐怕是发现不了的。

当然,作者也做了实验来对比两种策略的优劣,如下图,使用聚类方法,仅仅5种boxes的召回率就和Faster R-CNN的9种相当。说明K-means方法的引入使得生成的boxes更具有代表性,为后面的检测任务提供了便利。

Direct Location prediction(直接位置预测):

作者在引入anchor box的时候遇到的第二个问题:模型不稳定,尤其是在训练刚开始的时候。作者认为这种不稳定主要来自预测box的(x,y)值。我们知道在基于region proposal的object detection算法(比如Faster R-CNN)中,是通过预测下图中的tx和ty来得到(x,y)值,也就是预测的是offset。该公式没有任何约束,中心点可能会出现在图像任何位置,这就有可能导致回归过程震荡,甚至无法收敛。

tx=1时,box将向右偏移一个anchor box的宽度;当tx=-1时,box将向左偏移一个anchor box的宽度。

关于上面的这个公式,论文中是减号,实际上应该是“+”号,上图已经更正过。依据是Faster R-CNN中的公式:

显然Faster R-CNN里面的公式,和论文中这个公式将减号变成加号是一致的。

YOLOv2中没有采用这种预测方式,而是沿用了YOLOv1的方法,就是预测边界框中心点相对于对应cell左上角位置的相对偏移值。

网络在最后一个卷积层输出13*13的feature map,有13*13个cell,每个cell有5个anchor box来预测5个bounding box,每个bounding box预测得到5个值,分别为:tx、ty、tw、th和to(类似YOLOv1的confidence)。

为了将bounding box的中心点约束在当前cell中,使用sigmoid函数将tx、ty归一化处理,将值约束在0~1,这使得模型训练更稳定。

如上图,cx和cy,表示cell与图像左上角的横纵坐标距离,黑色虚线框是bounding box,蓝色矩形框就是预测的结果。

Fine-Grained Features(细粒度特征)

这里主要是添加了一个转移层( passthrough layer)。这个层的作用就是将前面一层的26*26的feature map和本层的13*13的feature map进行连接,有点像ResNet。

这样做的原因在于虽然13*13的feature map对于预测大的object以及足够了,但是对于预测小的object就不一定有效。也容易理解,越小的object,经过层层卷积和pooling,可能到最后都不见了,所以通过合并前一层的size大一点的feature map,可以有效检测小的object。

Multi-Scale Training(多尺度训练):

原来的YOLO网络使用固定的448 * 448的图片作为输入,现在加入anchor boxes后,输入变成了416 * 416。目前的网络只用到了卷积层和池化层,那么就可以进行动态调整(意思是可检测任意大小图片)。为了让YOLOv2模型更加robust,作者引入了Muinti-Scale Training,简单讲就是在训练时输入图像的size是动态变化的。

作者在训练时每经过几次迭代后就会微调网络。每经过10次训练(10 epoch),就会随机选择新的图片尺寸。YOLO网络使用的降采样参数为32,那么可以选择的图片尺寸就是{320,352,…,608}。从中随机挑一个尺寸,接着按照这个尺寸调整网络进行训练。

这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务,在小尺寸图片上YOLOv2运行更快,在速度和精度上达到了平衡。

在小尺寸图片检测中,YOLOv2成绩很好,输入为228 * 228的时候,帧率达到90FPS,mAP几乎和Faster R-CNN的水准相同。使得其在低性能GPU、高帧率视频、多路视频场景中更加适用。

在大尺寸图片检测中,YOLOv2达到了先进水平,VOC2007 上mAP为78.6%,仍然高于平均水准,下图是YOLOv2和其他网络的成绩对比:

YOLOv2速度的改进(Faster):

在YOLO v1中,作者采用的训练网络是基于GooleNet,这里作者将GooleNet和VGG16做了简单的对比,GooleNet在计算复杂度上要优于VGG16(8.25 billion operation VS 30.69 billion operation),但是前者在ImageNet上的top-5准确率要稍低于后者(88% VS 90%)。而在YOLO v2中,作者采用了新的分类模型作为基础网络,那就是Darknet-19。

Darknet-19:

YOLOv2使用了一个新的分类网络作为特征提取部分,参考了前人的先进经验,比如类似于VGG,作者使用了较多的3 * 3卷积核,在每一次池化操作后把通道数翻倍。借鉴了network in network的思想,网络使用了全局平均池化(global average pooling),把1 * 1的卷积核置于3 * 3的卷积核之间,用来压缩特征。也用了batch normalization(前面介绍过)稳定模型训练。

最终得出的基础模型就是Darknet-19,如下图,包含19个卷积层、5个最大值池化层(maxpooling layers )。Darknet-19运算次数为55.8亿次,imagenet图片分类top-1准确率72.9%,top-5准确率91.2%。

Training for Classification:

这部分前面有提到,就是训练处理的小trick。这里的Training for Classification都是在ImageNet上进行预训练。

YOLOv2的训练主要包括三个阶段:

第一阶段:在ImageNet分类数据集上从头开始预训练Darknet-19,训练160个epoch。输入图像的大小是224*224,用的随机梯度下降法,starting learning rate 为0.1,polynomial rate decay 为4,weight decay为0.0005 ,momentum 为0.9。训练的时候仍然使用了很多常见的数据扩充方法(data augmentation),包括random crops, rotations, and hue, saturation, and exposure shifts。

第二阶段:将网络的输入调整为448*448,继续在ImageNet数据集上fine-tuning分类模型,训练10个epoch。参数的除了epoch和learning rate改变外,其他都没变,这里learning rate改为0.001。高分辨率下训练的分类网络在top-1准确率76.5%,top-5准确率93.3%。

Training for Detection:

在前面Training for Classification之后,就该训练detection网络了,作者去掉了原网络最后一个卷积层,转而增加了三个3 * 3 * 1024的卷积层(可参考darknet中cfg文件),并且在每一个上述卷积层后面跟一个1 * 1的卷积层,输出维度是检测所需的数量。对于VOC数据集,预测5种boxes大小,每个box包含5个坐标值和20个类别,所以总共是5 * (5+20)= 125个输出维度。同时也添加了转移层(passthrough layer ),从最后那个3 * 3 * 512的卷积层连到倒数第二层,使模型有了细粒度特征。最后作者在检测数据集上fine tune这个预训练模型160个epoch,学习率采用0.001,并且在第60和90epoch的时候将学习率除以10,weight decay采用0.0005。

YOLOv2分类的改进(Stronger):

带标注的检测数据集量比较少,而带标注的分类数据集量比较大,因此YOLO9000主要通过结合分类和检测数据集使得训练得到的检测模型可以检测约9000类物体。

如何做到呢?

一方面要构造数据集,另一方面要解决模型训练问题,前者采用WordTree解决,后者采用Joint classification and detection。

如何做数据集的融合:

大家都知道,不同的数据集有不同的作用,通常我们采用一个数据集进行训练,而作者提出了新的思路:

通过ImageNet训练分类,COCO和VOC数据集来训练检测,这是一个很有价值的思路,可以让我们在公网上达到比较优的效果。 通过将两个数据集混合训练,如果遇到来自分类集的图片则只计算分类的Loss,遇到来自检测集的图片则计算完整的Loss。

这里面是有问题的,ImageNet对应分类有9000种,而COCO则只提供80种目标检测,这中间如何Match?答案就是multi-label模型,即假定一张图片可以有多个label,并且不要求label间独立。

由于ImageNet的类别是从WordNet选取的,作者采用以下策略重建了一个树形结构(称为分层树):

遍历Imagenet的label,然后在WordNet中寻找该label到根节点(指向一个物理对象)的路径;

如果路径只有一条,那么就将该路径直接加入到分层树结构中;

否则,从剩余的路径中选择一条最短路径,加入到分层树。

这个分层树我们称之为 Word Tree,作用就在于将两种数据集按照层级进行结合。

下图是COCO和ImageNet数据集以及WordTree的示意图。在WordTree中用颜色区分了COCO数据集和ImageNet数据集的label节点。

分类时的概率计算借用了决策树思想,某个节点的概率值等于该节点到根节点的所有条件概率之积。

另外,softmax操作也同时应该采用分组操作,下图上半部分为ImageNet对应的原生Softmax,下半部分对应基于Word Tree的Softmax:

通过上述方案构造WordTree,得到对应9418个分类,通过重采样保证Imagenet和COCO的样本数据比例为4:1。

如何给模型训练?

文中采用的是Joint classification and detection(联合分类和检测),即在训练期间,我们混合来自检测和分类数据集的图像。 当我们的网络看到标记为检测的图像时,我们可以基于完整的YOLOv2丢失功能进行反向传播。 当它看到分类图像时,我们只反向传播体系结构的分类特定部分的损失。

也就是说,通过这种联合训练,YOLO9000学习使用COCO中的检测数据在图像中查找对象,并学习使用来自ImageNet的数据对各种对象进行分类。YOLO9000的主网络基本和YOLOv2类似,只不过每个grid cell只采用3个box prior。

最终效果:

1)低分辨率 - 228 * 228,帧率达到90FPS,mAP几乎与Faster媲美;

2)高分辨率,在VOC2007 上mAP达到78.6%,同时FPS=40;

YOLO v2 在大尺寸图片上能够实现高精度,在小尺寸图片上运行更快,可以说在速度和精度上达到了平衡。

    

YOLOv3:

论文:YOLOv3: An Incremental Improvement

论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf

YOLOv3是到目前为止,速度和精度最均衡的目标检测网络。通过多种先进方法的融合,将YOLO系列的短板(速度很快,不擅长检测小物体等)全部补齐。达到了令人惊艳的效果和拔群的速度。

                                                      图:YOLOv3与其他网络的mAP与运行时间对比

多标签分类预测:

在YOLO9000之后,我们的系统使用维度聚类(dimension clusters )作为anchor boxes来预测边界框,网络为每个边界框预测4个坐标。

在YOLOv3中使用逻辑回归预测每个边界框(bounding box)的对象分数。 如果先前的边界框比之前的任何其他边界框重叠ground truth对象,则该值应该为1。如果以前的边界框不是最好的,但是确实将ground truth对象重叠了一定的阈值以上,我们会忽略这个预测,按照进行。我们使用阈值0.5。与YOLOv2不同,我们的系统只为每个ground truth对象分配一个边界框。如果先前的边界框未分配给grounding box对象,则不会对坐标或类别预测造成损失。

在YOLOv3中,每个框使用多标签分类来预测边界框可能包含的类。该算法不使用softmax,因为它对于高性能没有必要,因此YOLOv3使用独立的逻辑分类器。在训练过程中,我们使用二元交叉熵损失来进行类别预测。对于重叠的标签,多标签方法可以更好地模拟数据。

跨尺度预测:

YOLOv3采用多个尺度融合的方式做预测。原来的YOLO v2有一个转移层( passthrough layer),假设最后提取的feature map的size是13*13,那么这个层的作用就是将前面一层的26*26的feature map和本层的13*13的feature map进行连接,有点像ResNet。这样的操作也是为了加强YOLO算法对小目标检测的精确度。

这个思想在YOLO v3中得到了进一步加强,在YOLO v3中采用类似FPN的上采样(upsample)和融合做法(最后融合了3个scale,其他两个scale的大小分别是26*26和52*52),在多个scale的feature map上做检测,对于小目标的检测效果提升还是比较明显的。

尺度1: 在基础网络之后添加一些卷积层再输出box信息;

尺度2: 从尺度1中的倒数第二层的卷积层上采样(x2)再与最后一个16x16大小的特征图相加,再次通过多个卷积后输出box信息.相比尺度1变大两倍;

尺度3: 与尺度2类似,使用了32x32大小的特征图。

虽然在YOLO v3中每个网格预测3个边界框,看起来比YOLO v2中每个grid cell预测5个边界框要少,但因为YOLO v3采用了多个尺度的特征融合,所以边界框的数量要比之前多很多。

网络结构的改变:

YOLO v3使用新的网络来实现特征提取。在Darknet-19中添加残差网络的混合方式,使用连续的3×3和1×1卷积层,但现在也有一些shortcut连接,YOLO v3将其扩充为53层并称之为Darknet-53。

这个新网络比Darknet-19功能强大得多,而且比ResNet-101或ResNet-152更有效。

 

上图是不同的网络在ImageNet上的表现。每个网络都使用相同的设置进行训练,并以256×256的单精度测试进行测试。运行时间是在Titan X上以256×256进行测量的。因此,Darknet-53可与state-of-the-art的分类器相媲美,但浮点运算更少,速度更快。Darknet-53比ResNet-101更好,速度更快1:5倍。 Darknet-53与ResNet-152具有相似的性能,速度提高2倍。

Darknet-53也可以实现每秒最高的测量浮点运算。这意味着网络结构可以更好地利用GPU,从而使其评估效率更高,速度更快。

总结:

YOLO检测算法进行目标检测,取得了较高的检测速度和检测准确率。该算法不仅对于实物有着很好的效果,对于其他目标,如艺术作品等同样具有很好的兼容性。YOLO算法相比其他算法更符合工业界对目标检测算法实时性的要求,简单易实现,对于嵌入式很友好。

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/84775331