为什么要提出yolov2呢,因为yolov1在目标检测过程中存在很多缺陷,并且在检测性能方面还需要有很大提升,yolov1算法缺点如下:
一个cell单元只能属于一个类,如果一个cell单元里面存在两个物体,只能预测一种类别,下面是以一个cell为中心点生成的红和绿bounding box框,红色框为狗类,绿色框中为一个鸟,如果已经预测该cell为狗了,则无法识别绿色框中的鸟。
YOLOv2相对v1版本,在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测9000种不同对象,称之为YOLO9000。
YOLOv2的提出是尽可能的去解决v1中无法解决的难题。yolov2是在2016年提出来的,发布在CVPR2017上,主要创新点集中在原文中的Better章节里面,原文链接:yolo9000论文
YOLOv2的Better部分主要的创新点可以归纳为以下几项:
下面这个表列出了从 YOLO 到 YOLOv2不同改进方法对mAP值的提升效果。
批量归一化可显着提高收敛性,同时消除对其他形式正则化的需要。通过在 YOLO 中的所有卷积层上添加批量归一化,我们的 mAP 提高了 2% 以上。批量归一化还有助于规范模型。通过批量归一化,我们可以从模型中删除 dropout,而不会过度拟合。
BN的提出最开始是要解决ICS现象,那么什么是ICS现象呢?从下面这幅图理解,我们神经网络是累乘的形式,当中间的乘积出现增加或者减少的情况,会导致梯度爆炸或者梯度消失的现象。
内部协变量偏移(Internal Covariate Shift)是深度学习中一个常见的问题。它指的是在神经网络的训练过程中,网络的每一层输入分布的变化导致模型难以训练的情况。这种现象通常在深度神经网络的训练中出现,尤其是在使用批量归一化(Batch Normalization)等技术之前。
使用BN之后有以下优点:
BN层原理
说通俗点就是将我们的输入的批量数据给归一化到0均值,1标准差,首先计算mini-batch的平均值,再计算方差,然进行normalize(减均值除以标准差操作),完成0均值,1标准差,最后再进行affine transform缩放和位移;
关于批量归一化的详细解释和实验可以参考该博客:正则化(weight_decay、dropout、Batch Normalization)
注意:均值、方差采用指数加权平均计算得来,测试时候采用当前统计值;
γ、β是在模型训练过程中计算出来的,会发生变化;
所有最先进的检测方法都使用在 ImageNet上预训练的分类器。从 AlexNet 开始,大多数分类器对小于 256 × 256 的输入图像进行操作。最初的YOLOV1以224×224训练分类器网络,并将分辨率提高到448进行检测。这意味着网络必须同时切换到学习对象检测并适应新的输入分辨率。由于训练阶段和测试阶段输入图像的尺寸大小不一致,这会对模型产生一定的影响,所以在YOLOV2中,我们的训练阶段和测试阶段的图像大小尺寸保持了一致,都为448x448。
对于 YOLOv2,首先在 ImageNet 上以全 448×448 分辨率微调分类网络训练 10 个 epoch。这使得网络有时间调整其滤波器,让网络逐渐去适应448x448分辨率的图像,以便在更高分辨率的输入上更好地工作。然后我们在检测时使用同样分辨率的图像,这样就能减轻图像分辨率突然切换所带来的影响。这个高分辨率分类网络使mAP值 增加了近 4%。
借鉴Faster RCNN的做法,YOLO2也尝试采用先验框(anchor)。在每个grid预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。这样的方法使得召回率大幅提升到88%,同时mAP轻微下降了0.2。
之前YOLO1并没有采用先验框,并且每个grid只预测两个bounding box,整个图像98个,yolov1生成的2个bounding box是随机尺度,不受限制,生成的bbox可能很大也可能很小,这样会导致很多bbox无法使用;如果bbox太大,预测的物体太小,需要经过多次调整才能达到合适的大小。
yolov1的bbox尺寸没有任何限制,完全就是野蛮生长,会导致很多bbox太大或者太小,YOLOv2使用anchor之后可以指定我们锚框的长宽大小。YOLO2每个grid采用5个先验框,总共有13135=845个先验框,在训练过程中,我们只使用与标注框IOU最大的anchor进行拟合。
YOLOv2中移除了全连接层,并使用锚定框来预测边界框。首先,消除一个池化层,使网络的卷积层的输出具有更高的分辨率。还将网络缩小到416个输入图像,而不是448×448。这样做是因为想要在特征图中有奇数个位置所以只有一个中心单元格。物体,尤其是大的物体,往往占据图像的中心,所以最好在图像中心有一个位置来预测这些物体,而不是四个位置都在附近。YOLO的卷积层对图像进行了32倍的采样,所以通过使用416的输入图像,得到了13 × 13的输出特征图,所以在训练阶段改成了416x416尺寸的图像。
如果没有锚框,YOLOv1模型的 mAP 为 69.5,召回率为 81%。使用锚框,我们的模型获得了 69.2 mAP,召回率为 88%。尽管 mAP 下降,但召回率的增加意味着我们的模型还有更大的改进空间。recall增加了,导致precision降低了(因为预测框的个数大大增加了,无用的框太多了。)
在将锚框与 YOLO 一起使用时,遇到了两个问题。首先,bbox尺寸是手工挑选的。网络可以学习适当地调整框,但如果我们为网络选择更好的先验框,我们可以使网络更容易学习并且预测良好的结果。
之前先验框都是手工设定的,YOLO2尝试统计出更符合样本中对象尺寸的先验框,这样就可以减少网络微调先验框到实际位置的难度。YOLO2的做法是对训练集中标注的边框进行聚类分析,以寻找尽可能匹配样本的边框尺寸。
如果选取anchor的数量和尺寸使用的是k-means聚类方法,聚类算法最重要的是选择如何计算两个边框之间的“距离”,对于常用的欧式距离,大边框会产生更大的误差,但我们关心的是边框的IOU。所以,YOLO2在聚类时采用以下公式来计算两个边框之间的“距离”。
在 VOC 和 COCO 上对框尺寸进行聚类。在边界框的尺寸上运行 k 均值聚类,以获得模型的良好先验。左图显示了在 k 的各种选择下得到的平均 IOU。 k = 5 可以很好地权衡模型的召回率和复杂性。右图显示了 VOC 和 COCO 的相对质心。 COCO 的尺寸变化比 VOC 更大。
通过聚类图可以发现,虽然anchor越多 AVG IOU的值越高,但是这会增加网络训练过程中的负担,无用的框越多会导致模型精度的降低。
当将锚框与 YOLO 一起使用时,遇到第二个问题是:模型不稳定,尤其是在早期迭代期间。大多数不稳定性来自于预测盒子的 (x, y) 位置。在区域提议网络中,网络预测值 tx 和 ty,并且 (x, y) 中心坐标计算如下:
由于tx和ty的取值没有任何约束,因此预测边框的中心可能出现在任何位置,训练早期阶段不容易稳定。YOLOV2调整了预测公式,使用sigmoid激活函数将预测的偏移量规范在0 和 1 之间,将预测边框的中心约束在特定gird网格内,公式如下:
参考上图,由于σ函数将tx和ty
约束在(0,1)范围内,所以根据上面的计算公式,预测边框的蓝色中心点被约束在黄色背景的网格内。约束边框位置使得模型更容易学习,且预测更为稳定。由于限制了位置预测,因此参数化更容易学习,从而使网络更加稳定。使用维度聚类并直接预测边界框中心位置,与使用锚框的版本相比,YOLO 提高了近 5%。
对于目标检测而言,一个常见问题是输入图像中的对象大小各异。在经过多层卷积网络提取特征后,最终输出的特征图(如YOLOv2中的13x13)可能已经无法准确捕捉较小对象的特征,甚至可能忽略它们。为了更好地检测小尺寸的对象,需要在最终输出的特征图中保留更丰富的细节信息。
为了解决这个问题,YOLOv2引入了一种称为"passthrough层"的方法,用于在特征图中保留细节信息。具体而言,在最后一个池化层之前,特征图的尺寸为26x26x512。通过将特征图进行1拆4的操作,将其直接传递(passthrough)到经过池化后(并经过一组卷积操作)的特征图上,然后将两者叠加在一起作为输出的特征图,拼接成为13x13x3072的特征图。
通过这种方式,YOLOv2可以将较低层级的特征信息与较高层级的特征信息相结合,使得输出的特征图能够同时包含更多的上下文信息和细节信息。这样一来,YOLOv2在检测小尺寸对象时会更加准确,因为细粒度的特征得到了保留和利用。这种passthrough层的引入提高了YOLOv2的目标检测性能,尤其是对于小尺寸对象的检测。
具体特征图是如何1拆4的呢,可以参考下面这张图片,假设下面是一个3通道的特征图,尺寸是4X4的,拆分之后变成12通道的2x2特征图,面积变为原来的1/4,通道数变为原来的4倍。
我们先看一下原文是怎么说的:原始YOLO使用的输入分辨率为448×448。通过添加锚框,我们将分辨率更改为416×416。然而,由于我们的模型仅使用卷积层和池化层,因此可以动态调整大小。我们希望 YOLOv2 能够在不同大小的图像上运行,因此我们将其训练到模型中。我们不是固定输入图像的大小,而是每隔几次迭代就改变网络。
我们的网络每 10 个批次随机选择新的图像尺寸。由于我们的模型按 32 倍下采样,因此我们从以下 32 的倍数中提取:{320, 352, …, 608}。因此,最小的选项是 320×320,最大的选项是 608×608。我们将网络大小调整到该尺寸并继续训练。
使用这种方法在低分辨率下,YOLOv2 作为一种廉价且相当准确的检测器运行。在 288×288 分辨率下,它的运行速度超过 90 FPS,mAP 几乎与 Fast R-CNN 一样好。这使得它非常适合较小的 GPU、高帧率视频或多视频流。
注意:为什么yolov1没办法实现多尺度训练,这是由于网络结构导致的,因为yolov1网络中有两个全连接层,导致我们输入的尺寸必须固定为224x224,但是YOLOv2采用全卷积网络结构,没有全连接层。这使得网络能够接受不同尺寸的输入图片,因为卷积层不关心输入图像的维度,而是在整个图像上执行卷积操作。所以输入任何尺寸的图像都能进行训练。 Darknet-19网络结构图如下。
使用不同尺度训练得到的mAP和实时检测FPS如下,使用了多尺度训练YOLOV2mAP值最高,也达到了实时检测的FPS:
VGG-16
大多数检测框架依赖 VGG-16 作为基本特征提取器。 VGG-16 是一个强大、准确的分类网络,但它过于复杂。 VGG-16 的卷积层需要 306.9 亿次浮点运算才能以 224 × 224 分辨率处理单个图像,下图是VGG-16的网络参数图,光三个全连接层所占的参数都将近70M。YOLO 的自定义模型在 ImageNet 上的准确率达到 88.0%,而 VGG-16 的准确率为 90.0%。
Darknet-19
与 VGG 模型类似,我们主要使用 3 × 3 滤波器,并在每个池化步骤后将通道数量加倍 [17]。继 Network in Network (NIN) 的工作之后,我们使用全局平均池化进行预测,并使用 1 × 1 滤波器来压缩 3 × 3 卷积之间的特征表示,最终模型称为 Darknet-19,具有 19 个卷积层和 5 个最大池层。Darknet-19 仅需要 55.8 亿次操作来处理图像,却在 ImageNet 上实现了 72.9% 的 top-1 准确率和 91.2% 的 top-5 准确率。
图像尺寸从4164163 变换到 13135*25,一共划分了13x13个grid cell,每个grid cell设置5个anchor,去掉了全连接层,采用了5个先验框,每个anchor有边框坐标(x,y,w,h)+1个边框置信度+20个类别。
该部分主要是提出了一种对分类和检测数据进行联合训练的机制。该方法使用标记为检测的图像来学习特定于检测的信息,例如边界框坐标预测和对象性以及如何对常见对象进行分类。它使用仅具有类标签的图像来扩展它可以检测的类别数量。
在训练期间,混合来自检测和分类数据集的图像。当网络看到标记为检测的图像时,可以基于完整的 YOLOv2 损失函数进行反向传播。当它看到分类图像时,仅从架构的分类特定部分反向传播损失。也就是不同的数据集用不同的损失函数。
该方法的初衷是非常好的,但是存在以下局限性,所以后面也不使用该方法进行模型训练: