YOLO与YOLO2分析

目录

一、YOLO

1.1 YOLO性能

1.2 YOLO说明

 1.3 YOLO的网络结构分析

二、YOLO2

 1.1 YOLO2性能分析

 1.2 YOLO2说明

1.2.1 batch normalization (批处理归一化)

 1.2.2 高分辨率分类器(high resolution classifier) 

1.2.3 Convolutional With Anchor Boxes

1.2.4 细粒度特征 (Fine-Grained Features)

1.2.5  多尺度训练(multi-scale training)

 1.2.6 YOLO2训练


一、YOLO

1.1 YOLO性能

从上表可以看出,YOLO的处理速度是可观的,但是其目标检测的准确性还是有待提高的。究其原因,主要是其bounding box的定位精度比较差。

1.2 YOLO说明

YOLO网络将分类与定位统一成一个模型,在一个网络中实现分类与定位。

如上所示,左图为输入图像,右图为卷积网络输出的feature map。这两张图像都是S\times S的大小。这两张图的网格在位置上具有一定的一一对应的关系。对于整个YOLO网络的输出,每个网格所包含的输出如下所示:

 The final prediction of the model is a 7 × 7 × 30 tensor

滑动窗口:

 从上述的过程我们可以看到,最后输出的2*2的feature map其实与最初输入的16*16*3的图像具有一定的位置关系。YOLO就是参考了这种方法。

Yolo的CNN网络将输入的图片分割成 S\times S 网格,然后每个单元格负责去检测那些中心点落在该格子内的目标,如下所示,可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。 

 对于每个网格产生两个预测的bounding boxes的说明:

这两个bounding boxes是由目标检测模型计算出来的框。一般来说,预测出来的(x,y,w,h)都是在0到1之间的,不同的模型对(x,y,w,h)的设置都是不同的。之所以将其限制在0到1之间,是为了模型在训练初期更加稳定,更容易收敛。

首先要清楚一点,YOLO一共有三个预测:objectness、class、bbox。其中,objectness是一个二分类,即有物体还是无物体,也就是“边界框的置信度”,对应loss函数中的那个“C”,没物体的标签显然就是0而有物体的标签可以直接给1,也可以计算当前预测的bbox与gt之间的IoU作为有物体的标签,注意,这个IoU是objectness预测学习的标签。class就是类别预测,只有正样本处的grid cell才会被训练,也就是Pr(objectness)=1的地方,注意,这个Pr(objectness)=1就是指正样本的地方,和IoU没关,和YOLO没关,只和label有关,因为gt box的中心点落在哪个grid,哪个grid就是正样本,也就是Pr(objectness)=1。训练好的网络会正确的判断这个网格到底是不是目标的中心。也就是objectness的判断。

 1.3 YOLO的网络结构分析

 论文中提到,YOLO模型是基于Darknet framework进行搭建的。一般来说,常见framework比如pytorch,tensorflow等。之所以选择这个framework,最重要的原因就是其计算相对于VGG16来说更简单,计算速度也越快。YOLO的模型基于GoogLeNet mode.

preview

从上图我们其实可以清楚的看出YOLO模型其实是有两个部分的。第一个主干网络其实就是一个分类器,bounding box 位置预测其实是通过后面两个全连接实现的。(如今的object detection 很少再用全连接去进行位置预测,一般还是卷积,但是没有看到过反卷积的) 

YOLO网络模型有24个卷积层和两个全连接层。

卷积层和全连接层:

简单来说卷积层其实就是一个特征提取器,其最大的特征是保留了空间位置信息。

全连接层提取特征最大特点就是利用了全局信息,但它会损失空间信息。一般全连接层会充当网络的最后几层。

对于网络的最后一层,还出现了反卷积,反卷积在某些领域表现良好,比如图像重建等。

网络最后一层的选择还是需要根据实际情况进行验证。

池化层(Pool layer)

池化层一般是用来降低feaature map的维度。

它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效地原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

Example:金字塔型池化层

空间金字塔池化的思想源自 Spatial Pyramid Model,它将一个pooling变成了多个scale的pooling。用不同大小池化窗口作用于上层的卷积特征。也就是说 spatital pyramid pooling layer就是把前一卷积层的feature maps的每一个图片上进行了3个卷积操作,并把结果输出给全连接层。其中每一个pool操作可以看成是一个空间金字塔的一层。

 这样做的好处是,空间金字塔池化可以把任意尺度的图像的卷积特征转化成相同维度,这不仅可以让CNN处理任意尺度的图像,还能避免cropping和warping操作,导致一些信息的丢失,具有非常重要的意义。这对于目标检测以及分类等都具有重要意义。利用这种池化层可以有效的减少模型训练过程中的操作复杂度。

1\times 1的卷积层:

对于一个通道的 1\times 1卷积(作用不大):

preview

 但是对于多个通道的卷积:

相当于

 作用:

1.降维 (这在GoogLeNet 中有所表现)。运用1\times 1卷积核可以降低输入的feature map的通道数。

2. 跨通道信息交互(channal)

例子:使用1x1卷积核,实现降维和升维的操作其实就是channel间信息的线性组合变化,3x3,64channels的卷积核后面添加一个1x1,28channels的卷积核,就变成了3x3,28channels的卷积核,原来的64个channels就可以理解为跨通道线性组合变成了28channels,这就是通道间的信息交互。

 YOLO的缺点:

1.每个网格只能预测一个类别。如果有两个物体的中心都在同一个网格上时,这个网格也只能预测一个物体。

2.输入图像的分辨率收到限制448*448.

二、YOLO2

 1.1 YOLO2性能分析

从上图我们可以看到,相较于YOLO1,YOLO2的性能得到了大幅度的提升。

上图展示的是YOLO2相对于YOLO的改进部分。

 1.2 YOLO2说明

相较于YOLO,YOLO2模型多了许多细节部分。

1.2.1 batch normalization (批处理归一化)

在模型训练时,在应用激活函数之前,先对一个层的输出进行归一化,将所有批数据强制在统一的数据分布下,然后再将其输入到下一层,使整个神经网络在各层的中间输出的数值更稳定。从而使深层神经网络更容易收敛而且降低模型过拟合的风险。应用批处理归一化使得YOLO的性能提高了2%

如今,除了批处理归一化外,还存在其他各种归一化处理的方法。

参考链接:BN,LN,IN,GN都是什么?不同归一化方法的比较 (baidu.com)

 1.2.2 高分辨率分类器(high resolution classifier) 

     目前大部分的检测模型都会在先在ImageNet分类数据集上预训练模型的主体部分(CNN特征提取器),ImageNet分类模型基本采用大小为 224*224 的图片作为输入,分辨率相对较低,不利于检测模型。

      YOLOv1在采用 224*224 分类模型预训练后,将分辨率增加至 448*448 ,并使用这个较高分辨率在检测数据集上finetune。但是直接切换分辨率,检测模型可能难以快速适应高分辨率。

       因此,YOLOv2增加了在ImageNet数据集上使用 448*448 输入来finetune分类网络这一中间过程(10 epochs),这可以使得模型在检测数据集上finetune之前已经适用高分辨率输入。使用高分辨率分类器后,YOLOv2的mAP提升了约4%。 

1.2.3 Convolutional With Anchor Boxes

在YOLO中,每个网格预测两个bounding boxes,这两个bounding boxes的大小,形状是模型自己计算处理出来的,但是这就限制了每个网格能够预测对象的数目。如果有两个目标的中心都在一个网格上,YOLO也只能预测一个。但是在YOLO2中运用了锚框(anchor boxes)的思想。

preview

 首先,锚框的大小,形状是人为设定的。在YOLO2中,通过聚类分析得到了锚框的数量,大小,形状。具体可参考:锚框:Anchor box综述 - 知乎 (zhihu.com)

首先,对每一个边界框,YOLO仍旧去学习中心点偏移量t_{x}t_{y}  。我们知道,这个中心点偏移量是介于0到1范围之间的数,在YOLOv1时,作者没有在意这一点,直接使用线性函数输出,这显然是有问题的,在训练初期,模型很有可能会输出数值极大的中心点偏移量,导致训练不稳定甚至发散。于是,作者使用sigmoid函数使得网络对偏移量的预测是处在0到1范围中。我们的YOLOv1+正是借鉴了这一点。

x=(t_{x}\ast w_{a})-x_{a}

y=(t_{y}\ast h_{a})-y_{a}

其中(x,y)是box的中心坐标,(t_{x},t_{y})是预测得到的参数。

其次,对每一个边界框,由于有了边界框的尺寸先验信息,故网络不必再去学习整个边界框的宽高了。假设某个先验框的宽和高分别为p_{w}p_{h},网络输出宽高的偏移量为t_{w}t_{h}

我们可以得到的预测输出:

 其中\sigma ()是在通过sigmoid函数的操作。(c_{x},c_{y})是指网格左上角处相对于整张图像的坐标。

1.2.4 细粒度特征 (Fine-Grained Features)

YOLOv2的输入图片大小为 416*416 ,经过5次maxpooling之后得到13*13大小的特征图,并以此特征图采用卷积做预测。 13*13 大小的特征图对检测大物体是足够了,但是对于小物体还需要更精细的特征图(Fine-Grained Features)。因此SSD使用了多尺度的特征图来分别检测不同大小的物体,前面更精细的特征图可以用来预测小物体。YOLOv2提出了一种passthrough层来利用更精细的特征图。YOLOv2所利用的Fine-Grained Features是 26*26大小的特征图(最后一个maxpooling层的输入)

 YOLOv2所利用的Fine-Grained Features是 26*26 大小的特征图(最后一个maxpooling层的输入),对于Darknet-19模型来说就是大小为 26\times 26\times 512 的特征图。passthrough层与ResNet网络的shortcut类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍,passthrough层抽取前面层的每个 2\times 2 的局部区域,然后将其转化为channel维度,对于 26\times 26\times 512 的特征图,经passthrough层处理之后就变成了 13\times 13\times 2048 的新特征图(特征图大小降低4倍,而channles增加4倍,图6为一个实例),这样就可以与后面的 13\times 13\times 1024 特征图连接在一起形成 13\times 13\times 3072 大小的特征图,然后在此特征图基础上卷积做预测。

1.2.5  多尺度训练(multi-scale training)

 由于YOLOv2模型中只有卷积层和池化层(全卷积模型),所以YOLOv2的输入可以不限于 416*4146 大小的图片。为了增强模型的鲁棒性,YOLOv2采用了多尺度输入训练策略,具体来说就是在训练过程中每间隔一定的iterations之后改变模型的输入图片大小。由于YOLOv2的下采样总步长为32,输入图片大小选择一系列为32倍数的值: {320,352,...,608} ,输入图片最小为 320 \times 320 ,此时对应的特征图大小为 10\times 10 (不是奇数了,确实有点尴尬),而输入图片最大为 608\times 608 ,对应的特征图大小为 19\times 19 。在训练过程,每隔10个iterations随机选择一种输入图片大小,然后只需要修改对最后检测层的处理就可以重新训练。 (是否可以用金字塔型池化层来替代这种方式的多尺度训练)。

preview

多尺度训练:对于不同尺度的输入图像,如果我们resize其分辨率,可能会导致其特征发生变化,影响最终的结果。如果对模型进行了多尺度训练则可以大大增强其鲁棒性。

图像增强(Image Augmentation):在训练过程中,YOLO2使用标准的数据增强技巧,包括随机作物、旋转、色调、饱和度和曝光转移。参考链接:Tensorflow实现图像数据增强(Data Augmentation) - Geeksongs - 博客园 (cnblogs.com)

 1.2.6 YOLO2训练

YOLOv2的训练主要包括三个阶段。第一阶段就是先在ImageNet分类数据集上预训练Darknet-19,此时模型输入为 224\times 224 ,共训练160个epochs。然后第二阶段将网络的输入调整为 448\times 448 ,继续在ImageNet数据集上finetune分类模型,训练10个epochs,此时分类模型的top-1准确度为76.5%,而top-5准确度为93.3%。第三个阶段就是修改Darknet-19分类模型为检测模型,并在检测数据集上继续finetune网络。网络修改包括(网路结构可视化):移除最后一个卷积层、global avgpooling层以及softmax层,并且新增了三个 3\times 3\times 2048卷积层,同时增加了一个passthrough层,最后使用 1\times 1 卷积层输出预测结果,输出的channels数为:  num\; anchors \times (5+num\; classes),和训练采用的数据集有关系。由于anchors数为5,对于VOC数据集输出的channels数就是125,而对于COCO数据集则为425。这里以VOC数据集为例,最终的预测矩阵为 T (shape为 (batch\; size,13,13,125) ),可以先将其reshape为  (batch\; size,13,13,5,25),其中  T[:,:,:,:,0:4]为边界框的位置和大小  (t_{x},t_{y},t_{w},t_{h}),  T[:,:,:,:,4]为边界框的置信度,而  T[:,:,:,:,5:]为类别预测值 

preview

 YOLO2的loss函数相对于YOLO1也发生了很大的变化:

太过复杂,不解释。参考解释:目标检测|YOLOv2原理与实现(附YOLOv3) - 知乎 (zhihu.com) 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值