这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3

YOLO

YOLO是与SSD齐名的one_stage目标检测算法代表。SSD系列有比较多的变体,大部分都不是SSD作者做的工作。而YOLO目前已经进化到V3,据我所知都是yolo作者自己做的工作。

网络结构

由于yolo属于one_stage的目标检测算法,所以网络结构比较简单。固定输入448x448大小的图片,最后输出7x7x30大小的特征图。

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第1张图片

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第2张图片

作者的主干网络受GoogLeNet的启发,共有24个卷积层。在ImageNet的1000类竞赛数据集上预训练了前20层卷积层,接着是平均池化层和全连接层。训练分类时添加了四个卷积层和两个全连接层,这些层的权重都用随机值初始化。预训练时图片输入时224x224,训练检测时改为448x448。

模型的最后一层使用线性激活函数,而所有其它的层使用下面的leaky rectified activation。

预测输出

上面说了,yolo最后输出的是一个7x7x30大小的特征图。

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第3张图片

7x7x30大小的特征图把图片分成7x7个格子,每个1x1x30负责预测两个box和这个格子对应的20个分类。每个box包含5个值:在这里插入图片描述。前两个值表示anchor中心相对于本格子左上角的偏移值(用格子大小归一化),范围在0到1之间。中间两个值表示预测的box的宽高,用图片大小归一化,范围也是0到1。最后一个值是对于这个box包含目标的信心。

可以看到yolo也是有anchor的,不过只有中心点坐标有anchor,长宽没有。作者论文里说“如果目标的中心落入某个网格单元中,那么该网格单元就负责检测该目标”,之前看这句车轱辘话看了好多遍没看明白,其实把每个方格的左上角坐标看做anchor点的话就超容易理解了。

每个box需要5个值,每个方格上预测两个box, 外加20个分类,刚好是30。

借用《图解YOLO》里的一张图,表示如下:

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第4张图片

LOSS设计

本节内容主要来自《图解YOLO》。

yolo的预测如下图所示:

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第5张图片

损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第6张图片

更正一下,上图是有错误的,蓝框内的内容应该是:

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第7张图片

简单的全部采用了sum-squared error loss来做这件事会有以下不足: a) 8维的localization error和20维的classification error同等重要显然是不合理的; b) 如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。 解决方案如下:

  • 更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 在这里插入图片描述,在pascal VOC训练中取5。(上图蓝色框)

  • 对没有object的bbox的confidence loss,赋予小的loss weight,记为 在这里插入图片描述,在pascal VOC训练中取0.5。(上图橙色框)

  • 有object的bbox的confidence loss (上图红色框) 和类别的loss (上图紫色框)的loss weight正常取1。

  • 对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受。而sum-square error loss中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。 如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第8张图片

测试结果

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第9张图片
这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第10张图片
看上图中的错误分析,相对于FAST RCNN,定位错误稍多,但是把背景分为物体的假阳性很少,作者认为这是因为YOLO在训练期间和测试时都会顾及到整个图像(最后又全连接,每个输出都是由整个计算图得到的,这一点和语义分割的GCN网络有异曲同工之妙),所以它隐式地包含了关于类的上下文信息以及它们的外观。

整体上看的话,bbox包裹的不是很严密,空隙较大。而且作者自己也说了,对于小的、密集的物体识别不好。毕竟每个方格只预测两个bbox,这种机制对密集物体无能为力。

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第11张图片

总结

优点:

  • 快,效果够用

缺点:

  • 当同一类物体出现的不常见的长宽比和其他情况时泛化能力偏弱
  • YOLO对相互靠的很近的物体(挨在一起且中点都落在同一个格子上的情况),还有很小的群体 检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类
  • 定位误差是影响检测效果的主要原因(没有先验anchor框,直接回归,这样还是比较粗糙)

每个格子预测的两个bbox,分类是在一起的,没有分开,这也一定程度影响了分类的准确率。

而且由于预测的位置偏移和长宽都太直接,没有类似Faster-RCNN那样的偏移系数变换保证长宽大于0,偏移也没有用框大小做归一化,这一定程度影响了bbox的准确性。我个人认为参考Faster-RCNN的坐标偏移系数变换方式,yolo可以定位更精准。

当然,本论文是16年的,比SSD早(比Faster-RCNN迟一点,可能当时没来得及参考),具有一定的开创性,某些方面粗糙也是可以原谅的。

YOLOv2

YOLOv2的论文其实介绍了两个分类网络:YOLOv2和YOLO9000。其中后一个在前一个基础上扩展出来的,可以支持多达9000个分类。我主要关注基础的YOLOv2。

看完论文我的感觉是,这个YOLOv2真的很SSD,让人傻傻分不清了。都是one-stage目标检测,真是殊途同归了。作者从SSD、Faster-RCNN和VGG等论文中借用了不少技巧过来。

动机和主要思想

作者在论文里说,YOLO与Fast R-CNN的误差比较分析表明,YOLO产生了大量的定位错误。与生成候选区域方法相比,YOLO召回率相对较低。 因此,我们主要关注改善召回率和定位,同时保持分类准确性。

改进的思路并不是简单的加深、加宽网络,而是简化网络,然后让表征更易于学习,保持很快的速度。

YOLOv2的主要改进思路都在一个表格里了:

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第12张图片

下面来一个个分解。

batch normalization(批归一化)

这个是参考InceptionV2的做法,目前(2019)已经是深度卷积的常规操作,没什么可说的了。

High Resolution Classifier(训练分类器使用高分辨率图片)

作者先使用224x224的大小在coco上训练分类网络,然后使用448x448的分辨率进行10轮的分类训练,让分类器适应高分辨率的图片。

convolutional

我理解作者说的是全卷积。

YOLO直接使用卷积特征提取器顶部的全连接层来预测边界框的坐标。作者把全连接拿掉,完全使用卷积来生成坐标和分类的结果。

使用416X416的输入图像,卷积层将图像下采样32倍,我们得到13×13的输出特征图。

anchor boxes(使用锚框)

参考Faster-RCNN的思路,引入锚框。

YOLOv1在每个位置只有一个分类,引入锚框以后,每个位置预测对个锚框,每个锚框都有单独的分类。

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第13张图片

这个图反应了YOLOv2相对于v1的改动。但是注意YOLOv2并不是每个位置预测两个锚框,下面会讲原因。(剧透:其实是5个锚框啦)

使用锚框,精确度会小幅下降。因为原始的YOLO仅为每个图片预测98个框,但使用锚框后,我们的模型预测的框数超过一千个。 如果没有锚框,我们的中等模型将获得69.5 的mAP,召回率为81%。 使用锚框,我们的模型获得了69.2 的mAP,召回率为88%。尽管mAP减少,但召回率的增加意味着我们的模型有更大的改进空间。

new network(新网络结构)

作者提出了一个新的分类模型作为YOLOv2的基础。新的模型建立在网络设计的先前工作以及该领域的常识上。与VGG模型类似,大多使用3×3滤波器,并且在池化层步骤后使用两倍的通道数。按照Network in Network(NIN)的方法,使用全局平均池化来做预测,并使用1×1滤波器来压缩3×3卷积的特征表示。使用批量归一化来稳定训练,加速收敛。

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第14张图片

最终的模型叫做Darknet-19,它有19个卷积层和5个Maxpool层。 Darknet-19只需要55.8亿次操作来处理图像,但在ImageNet上实现了72.9%的top-1精度和91.2%的top-5精度。

相比较,VGG-16的卷积层在一个224×224分辨率单个图像上运行一次需要306.90亿浮点运算。YOLO的backbone一次前向传播要85.2亿次运行。在Imagenet上,用224×224的单张裁剪图像,YOLO的自定义模型的精度为88.0%而VGG-16则为90.0%。

dimension priors(维度聚类)

当把锚框与YOLO一起使用时,我们会遇到两个问题。 首先是框的尺寸是手工挑选的。虽然网络可以通过学习适当地调整方框,但是如果我们从一开始就为网络选择更好的先验,就可以让网络更容易学习到更好的检测结果。

我们不用手工选择先验,而是在训练集的边界框上运行k-means,自动找到良好的先验。

下图是在coco和voc上聚类得到的5个anchor框:

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第15张图片

通过对比作者发现聚类能获得比手工设置的锚框更好的检测结果。下图表明仅5个先验中心的平均IOU为61.0,其性能类似于9个锚框的60.9。 使用9个质心会得到更高的平均IOU。

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第16张图片

Direct location prediction(直接预测位置)

当在YOLO中使用锚框时,我们会遇到第二个问题:模型不稳定,尤其是在早期迭代的过程中。 大多数不稳定来自于预测框的(x,y)位置。预测的x、y的偏移系数是不受约束的,所以任何锚框都可以在图像中的任何一点结束,而不管这个框是在哪个位置预测的。随机初始化模型需要很长时间才能稳定以预测合理的偏移。

YOLOv2没有预测偏移,而是遵循YOLO的方法,预测相对于网格单元位置的位置坐标。这使得真实值的界限在0到1之间。我们使用逻辑激活来限制网络的预测落在这个范围内。(应该是一个sigmod激活函数做的约束,而且w、h部分和Faster-RCNN是一致的)

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第17张图片

passthrough(使用一个直通层传递细粒度特征Fine-Grained Features)

直通层将高分辨率特征与低分辨率特征连接起来,将相邻特征叠加到不同的通道中,而不是空间位置上,类似于ResNet中的恒等映射。将26×26×512的特征图变为13×13×2048的特征图,然后就可以与原来的特征连接。

相当于语义分割里的底层特征和高层特征的融合。

还记得前面说的Darknet-19吧, 分类网络训练好以后,去除最后一个卷积层,然后添加三个具有1024个滤波器的3X3的卷积层,然后在最后添加1×1卷积层,该层的滤波器数量是检测需要的输出数量。 对于VOC,我们预测5个边界框,每个边界框有5个坐标和20个类别,所以有125个滤波器。还添加了从最后的3×3×512层到倒数第二层卷积层的直通层,以便我们的模型可以使用细粒度特征。

Multi-Scale Training(多尺度训练)

YOLOv2是一个全卷积网络,可以使用不同的图片输入大小。每10个批次我们的网络会随机选择一个新的图像尺寸大小。由于我们的模型缩减了32倍,所以我们从32的倍数中抽取:{320,352,…,608}。因此,最小的选项是320×320,最大的是608×608。

这个技巧基本就是VGG论文里说的尺度抖动。

在低分辨率下,YOLOv2作为一种便宜但相当准确的检测器工作。 在288×288情况下,它的运行速度超过90 FPS,而mAp几乎与Fast R-CNN一样好。这使其成为小型GPU,高帧率视频或多视频流的理想选择。

在高分辨率下,YOLOv2是一款先进的检测器,在VOC2007上获得了78.6的mAP,同时仍以高于实时速度运行。

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第18张图片
这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第19张图片

测试结果

快的不要不要的,指标也很好。

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第20张图片

总结

YOLOv2的论文就像一个大的trick串烧,最后烧的味道还不错,就是味道越来越像SSD。

YOLOv3

YOLOv3的论文只有6页,作者在论文里保持了一贯的2B口吻,很不严肃呀。

看来看去我恍惚看到DSSD和YOLOv2合体,生出了一个叫YOLOv3的玩意(大误?!)。

主干网络

作者对Darknet进行了改进,将网络深度扩展到53层,并在Imagenet上进行了预训练。新的网络称为Darknet-53。

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第21张图片

除了网络层数比较深,还借鉴Resnet思想加入了残差短路连接。

检测

此外,作者还借鉴DSSD的做法,加入了跳跃连接和上采样,实现了高层特征和底层特征的融合。和DSSD一样,使用多尺度的特征图来预测结果。这带来两个结果:1.新的网络结构预测更多的anchor框;2.由于使用了更底层的特征,YOLOv3对小物体的效果更好。(这里借用知乎上的一张图)

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第22张图片

使用416x416输出的情况下,YOLOv2预测输出13x13x5=845个anchor框。通用的图片输入情况下,每个cell预测3个anchor框,共有13x13x3+26x26x3+52x52x3=10647,是原来的12.6倍。

其它改动

  • YOLOv2损失函数的后三项是平方误差,而YOLOv3则更改为交叉熵误差项
  • 采用了多标签分类的方法进行目标检测。作者举的例子是man和woman。

效果

这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第23张图片
这就是神经网络 14:深度学习-目标检测-YOLOv1、YOLOv2、YOLOv3_第24张图片

总结

YOLOv3可写的东西不多,主要是主干网络的更新和对DSSD的借鉴。但是作者在论文里没怎么写DSSD。

从V1到V3,我感觉作者的创新可能只剩下回归x、y偏移量时限制在cell方格内这一点了,其它好多都是借鉴过来的。

论文

YOLO系列论文原文: https://pjreddie.com/publications/

YOLO v1 论文翻译:https://zhuanlan.zhihu.com/p/35416826

YOLO9000(v2)论文翻译:https://zhuanlan.zhihu.com/p/35953382

YOLO v3 论文翻译:https://zhuanlan.zhihu.com/p/37201615

参考资料

论文精读|5th|YOLO v3的新特性|目标检测|附下载

目标检测|YOLO原理与实现

图解YOLO

YOLO升级版:YOLOv2和YOLO9000解析

YOLO2

你可能感兴趣的:(目标检测,深度学习论文笔记和实践)