目录
3.全卷积网络与先验框机制(Convolutional+anchor)
5.基于k均值聚类算法的先验框聚类(dimension priors)
6.使用sigmoid函数处理位置预测值(location prediction)
一、Yolov2目标检测背景
在2016年IEEE主办的计算机视觉与模式识别(CVPR)会议上,继在YOLOv1工作获得了瞩目的成功之后,YOLO的作者团队立即推出了第二代YOLO检测器:YOLOv2(1)。新提出的YOLOv2在YOLOv1基础之上做了大量的改进和优化,如使用新的网络结构、引入由Faster R-CNN(2)工作提出的先验框机制、提出基于k均值聚类算法的先验框聚类算法,以及采用新的边界框回归方法等。在VOC2007数据集上,凭借着这一系列的改进,YOLOv2不仅大幅度超越了上一代的YOLOv1,同时也超越了同年发表在欧洲计算机视觉国际会议(ECCV)上的新型one-stage检测器:SSD(3),成为了那个年代当之无愧的最强目标检测器之一。YOLOv2 在 YOLOv1的基础上做了许多改进,其中在 VOC2007 资料集上的mAP 由 63.4% 提 升到 78.6%,并且保持检测速度。从预测更准确(Better),速度更快(Faster),识别物体更多(Stronger)这三个方面进行了改进。其中识别更多目标物体也就是扩展到能够检测9000种不同物体,称之为YOLO9000。
二、Yolov2模型改进点
1.引入批归一化层(batch norm)
在上一代的YOLOv1中,每一层卷积结构都是由普通的线性卷积和非线性激活函数构成,其中并没有使用到后来十分流行的归一化层,如批归一化(batch normalization,BN)、层归一化(layer normalization,LN)和实例归一化(instance normalization,IN)等。因此,YOLO的作者团队便在这一次的改进中也引入了被广泛验证的BN层。具体来说,卷积层的结构从原先的线性卷积与非线性激活函数的组合变为后来YOLO系列常用的“卷积三件套”:线性卷积、BN层和非线性激活函数,如下图所示。
(1)为什么要归一化
我们知道网络一旦train起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。
以网络第二层为例:网络的第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。BN的提出,就是要解决在训练过程中,中间层数据分布发生改变的情况。
(2)BN怎么做
如下图所示,BN步骤主要分为4步:
(1)求每一个训练批次数据的均值
(2)求每一个训练批次数据的方差
(3)使用求得的均值和方差对该批次的训练数据做归一化,获得0-1分布。其中ε是为了避免除数
为0时所使用的微小正数。
(4)尺度变换和偏移:将xi乘以γ调整数值大小,再加上β增加偏移后得到yi,这里的γ是尺度因子,β是平移因子。这一步是BN的精髓,由于归一化后的xi基本会被限制在正态分布下,使得网络的表达能力下降。为解决该问题,我们引入两个新的参数: γ,β。γ和β是在训练时网络自己学习得到的。
(3)BN解决的问题
(1)减均值除方差后,数据就被移到中心区域,对于大多数激活函数而言,这个区域的梯度都是最大的或者是有梯度的这可以看做是一种对抗梯度消失的有效手段。如果对于每一层数据都那么做的话,数据的分布总是在随着变化敏感的区域,相当于不用考虑数据分布变化了,这样训练起来更有效率。
(2)那么为什么要有第4步,不是仅使用减均值除方差操作就能获得目的效果吗?我们思考一个问题,减均值除方差得到的分布是正态分布,我们能否认为正态分布就是最好或最能体现我们训练样本的特征分布呢?
(3)不能,比如数据本身就很不对称,或者激活函数未必是对方差为1的数据最好的效果,比如 Sigmoid激活函数,在-1~1之间的梯度变化(注意是变化,而不是这块的值大不大,线性一次函数的梯度是一个定值)不大,那么非线性变换的作用就不能很好的体现,换言之就是,减均值除方差操作后可能会削弱网络的性能!针对该情况,在前面三步之后加入第4步完成真正的batch normalization 。
(4)BN的本质就是利用优化变一下方差大小和均值位置,使得新的分布更切合数据的真实分布,
保证模型的非线性表达能力。BN的极端的情况就是这两个参数等于mini-batch的均值和方差,那么经过batch normalization之后的数据和输入完全一样,当然一般的情况是不同的。
在加入了BN层之后,YOLOv1的性能得到了第一次提升。在VOC2007测试集上,其mAP性能从原本的63.4%提升到65.8%。
2.高分辨率主干网络(Hi-res classifier)
在上一代的YOLOv1中,作者团队先基于GoogLeNet的网络结构设计了合适的主干网络,并将其放到ImageNet数据集上进行一次预训练,随后,再将这一预训练的权重作为YOLOv1的主干网络的初始参数,这就是我们前文提到过的“ImageNet pretrained”技术。但是,作者团队认为这当中存在一个细节上的缺陷。在预训练阶段,主干网络接受的图像的空间尺寸是224 *224,而在执行目标检测任务时,YOLOv1接受的图像的空间尺寸则是448 * 448,不难想象,不同尺寸的图像所包含的信息量是完全不同的,那么在训练YOLOv1时,由预训练权重初始化的主干网络就必须先解决由图像分辨率的变化所带来的某些问题。
为了解决这一问题,作者团队采用了“二次微调”的策略,即当主干网络在完成常规的预训练之后,再使用448 * 448的图像继续训练主干网络,对其参数进行一次微调(fine-tune),使之适应高分辨率的图像。由于第二次训练建立在第一次训练的基础上,因此不需要太多的训练。依据论文的设定,第二次训练仅设置10个epoch。当微调完毕后,用这一次训练的权重去初始化YOLOv1的主干网络。在这样的策略之下,YOLOv1的性能又一次得到了提升:mAP从65.8%提升到69.5%。由此可见,这一技巧确实有明显的作用。不过,似乎这一技巧只有YOLO工作在用,并未成为主流训练技巧,鲜在其他工作中用到,而随着YOLO系列的发展,“从头训练”的策略逐渐取代了“ImageNet pretrained”技术,这一技巧不再在YOLO中被使用。
hi-res detector中Yolov2训练三阶段:
- 修改Darknet-19分类模型为检测模型,并在检测数据集上继续 finetune网络(160轮)。网络修改包括:移除最后一个卷积层、global avgpooling层以及softmax层,并且新增了三个3x3x1024卷积层,同时 增加了一个passthrough层,最后使用1x1卷积层输出预测结果。
- 输出的channels数为:num_anchors x (5 + num_classes),和训练采用的数据集有关系。由于anchors数为5,对于VOC数据集输出的channels数就是125,而对于COCO数据集则为425。以VOC为例,同时采用多尺度数据训练,采用从{320,352,…,608}的输入尺寸每10个batch随机选取一个尺寸送入网络中,模型的输出为大小为{10,11 ,…,19},最终的预测矩阵为( {10,11 ,…,19}^2, 125)
3.全卷积网络与先验框机制(Convolutional+anchor)
YOLOv1 最终是通过全连接网络直接预测目标位置。YOLO 作者把 YOLOv1 进行了改造:
- 最后的全连接层去掉。
- 移除最后一个 pool 层,使得卷积层输出更高分辨率。
- 用416*416大小的输入代替原来448*448。(奇数的话中心点会落在网格的中间,偶数的话会落在网格的线的交界上,避免中心点落在交界线上,只是减小概率,不能避免)
- 将分类和空间检测解耦,利用anchor box来预测目标的空间位置和类别。
此时结构如下图所示
(1 + 4 + 20)中:1是 c; 4是 x,y, w, h; 20是p, 因为v2中每一个框都有自己的p
k:是有K先验框
同时Yolov2借鉴了Faster R-CNN和SSD的做法利用anchor框进行预测。在Yolov1中是直接预测出物体的检测框大小和坐标,由于物体的大小不一,直接根据主干网络提取的信息进行矩形框和坐标的预测是一件较难的事情。如果现在有一个合理的box,让你基于这个box来预测真实检测框,相比较直接预测检测框要简单一些。
先验框的意思其实就是在每个网格处都固定放置一些大小不同的边界框,通常情况下,所有网格处所放置的先验框都是相同的,以便后续的处理。下图展示了先验框的实例,注意,为了便于观察,图中的先验框是每两个网格才绘制一次,避免绘制出的先验框过于密集,导致不够直观。
先验框的本质是提供边界框的尺寸先验,使用网络预测出来的偏移量在这些先验值上进行调整,从而得到最终的边界框尺寸。
设计先验框的一个难点在于设计多少个先验框,且每个先验框的尺寸(宽高比和面积)又该是多少。对于宽高比,研究者们通常采用的配置是设置三种尺寸分别是小(蓝128)中(绿256)大 (红512),三个比例分别是1:1,1:2,2:1。3×3的组合总共有9种anchor。如下图所示
注意,在YOLOv1中,每个网格处会预测个边界框,每个边界框都附带一个置信度预测,但是类别置信度则是共享的,即每个网格只会预测1个类别的物体,而不是
个。这显然有一个弊病,倘若一个网格包含了两个类别以上的物体,必然会出现漏检问题。而在加入先验框后,YOLOv1则让每一个预测的边界框都附带表示有无物体的置信度和类别的置信度,即网络的最终输出是
,每个边界框的预测都包含1个置信度、边界框的4个位置参数和
个类别置信度。经过这种改进后,每个网格就最多可以检测
个类别的物体。但训练策略没有改变,依旧是从
个预测的边界框中选择出与目标框的IoU最大的边界框作为正样本,其表示有无物体的置信度标签还是最大的IoU,其余的边界框则是负样本。
改进后,YOLOv1的性能却并未得到提升,反而略有下降:mAP从69.5%降为69.2%。不过,作者团队注意到此时YOLOv1的召回率却从81%提升到了88%,召回率的提升意味着YOLOv1可以检测出更多的目标,尽管精度略有下降,但是作者团队并没有因精度的微小损失而放弃这一改进。
上面这个图有15个先验框
4.使用新的主干网络(new network)
随后,作者团队又设计了新的主干网络来取代原先的GoogLeNet风格的主干网络。新的主干网络被命名为“DarkNet-19”,其中共包含19层由前文所提到的“卷积三件套”所组成的卷积层。具体来说,每一个卷积层都包含一个线性卷积、BN层以及LeakyReLU激活函数。按照惯例,作者团队首先用ImageNet数据集去训练DarkNet-19网络,获得了72.9%的top 1准确率和91.2%的top 5准确率。在精度上,DarkNet-19网络达到了VGG网络的水平,但模型更小。在预训练完毕后,去掉DarkNet-19中的用于分类任务的最后一层卷积、平均池化层和Softmax层等,将其用作YOLOv1的新主干网络。
(1)DarkNet-19 分类模型
(2) DarkNet-19 检测模型(非完整版本)
- 输入数据由448×448改为416×416
- 出去分类模型中的最后一层卷积层和池化层。
- 添加一层1×1×N卷积层,N视输出结果而定,这里选择125(5个anchor和20类结果)
5.基于k均值聚类算法的先验框聚类(dimension priors)
- 第1个问题就是 Anchor BOX 的尺寸是手选的,如果一开始的时候就分配好合理的先验尺寸,那么这无疑会加快学习的速度。相比于人为指定 anchor box 的尺寸比例,YOLO 作者想到了一个自动化的手段,那就是选择 k-means 聚类手段,在数据训练集中运行 k-means 算法,可以得到 k 个尺寸比例。
- 第2个问题就是模型不稳定,尤其是在训练刚开始的时候。作者认为这种不稳定主要来自预测box的(x,y)值。
(1)K-mean 算法解决第1个问题
- 先定义总共有多少个簇类,随机选取K个簇中⼼。
- 分别计算所有样本到随机选取的K个簇中⼼的距离。
- 样本离哪个中⼼近就被分到哪个簇中⼼。
- 计算各个中⼼样本的均值(最简单的方法就是求样本每个点的平均值)作为新的簇⼼。
- 重复2、3、4直到新的中⼼和原来的中⼼基本不变化的时候,算法结束。
- 当每个簇的质⼼,不再改变时就可以停止k-menas。
- 当循环次数达到事先规定的次数时,停止k-means
下图是K-mean算法进行真实框聚类:
聚类就是求两个框中心点的距离。
(2)聚类利用欧式距离问题及其及其改进
6.使用sigmoid函数处理位置预测值(location prediction)
因为上面的不合理,因此YOLOv2弃用了这种RPN网络预测方式,而是沿用YOLOv1的方法,就是预测边界框中⼼点相对于对应cell左上角位置的相对偏移值,为了将边界框中⼼点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度看做1)
其次,由于有了边界框的先验尺寸信息,因此网络不必再去学习整个目标框的宽高了。假设某个先验框的宽和高分别为和
,网络输出宽和高的偏移量分别为
和
,YOLOv2使用下图公式来算出边界框的中心点坐标
和宽高
,
:
在YOLOv2的论文中,这一改进后的边界框解算策略被命名为location prediction。这里需要注意的一点是,YOLOv2的先验框尺寸都是相对于网格尺度的,而非相对于输入图像,所以求解出来的数值也是相对于网格的。 若要得到相对于输入图像尺寸的坐标,我们还需要使坐标值乘以网络的输出步长stride。下图是该方法的示例:
使用k均值聚类算法获得先验框,再配合location prediction的边界框预测方法,YOLOv1的性能得到了显著的提升:mAP从69.6%提升到74.4%。不难想象,性能提升的主要来源是k均值聚类算法,更好的先验信息自然会有效提升网络的检测性能。由此可知,先前加入先验框并没有提升YOLOv1性能的原因可能仅是因为使用的边界框预测方法不当。
7.passthrough网络模型的连接
(1)Passthrough解决的问题:
通常,不同的特征图的分辨率不同,越是浅层的特征图,越被较少地做降采样处理,因而分辨率就越高,所划分的网格就越精细,这显然有助于去提取更多的细节信息。