在论文中,作者提出了很多点v2相比较v1的改进。
我们先来了解一下什么啊MAP以及recall,precision,fine tune
召回率 (Recall):正样本有多少被找出来了(召回了多少)。
准确率 (Precision):你认为的正样本,有多少猜对了(猜的准确性如何)。
我们当然希望检索的结果P越高越好,R也越高越好,但事实上这两者在某些情况下是矛盾的
MAP: Mean Average Precision 的缩写,即均值平均精度。
作为 object dection 中衡量检测精度的指标。
计算公式为: 所有类别的平均精度求和除以所有类别。
fine tune 微调:省去了大量计算资源和计算时间,提高准确率,魔性的泛化能力和过拟合情况减少
1、Batch Normalization(批正则化)
通常在神经网络训练开始前,都要对输入数据做一个归一化处理, 那么具体为什么需要归一化呢?归一化后有什么好处呢?
因为神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度深度网络的训练是一个复杂的过程,只要网络的前面几层发生微小的改变,那么后面几层就会被累积放大下去。
所以我们一般会对输入数据进行**“白化”处理,使得它的均值是0,方差是1。但是之后的层就很难保证了,因为随着前面层参数的调整,后面的层的输入是很难保证的。比较坏的情况是,比如最后一层,经过一个mini-batch**,把参数调整好的比之前好一些了,但是它之前的所有层的参数也都变了,从而导致下一轮训练的时候输入的范围都发生变化了,那么它肯定就很难正确的分类了。
什么是mini-batch? 批梯度下降每一轮迭代需要所有样本参与,对于大规模的机器学习应用,经常有billion级别的训练集,计算复杂度非常高。因此,有学者就提出,反正训练集只是数据分布的一个采样集合,我们能不能在每次迭代只利用部分训练集样本呢?这就是mini-batch算法。假设训练集有m个样本,每个mini-batch(训练集的一个子集)有b个样本,那么,整个训练集可以分成m/b个mini-batch
什么是Batch Normalization呢? 说白了就是对神经网络的每一个卷积层输出结果进行一下归一化,而不是在池化与激活函数之后。但是这样也带来一个问题,把某个层的输出限制在均值为0方差为1的分布会使得网络的表达能力变弱。因此作者又给batch normalization层进行一些限制的放松,给它增加两个可学习的参数 β 和 γ ,对数据进行缩放和平移,平移参数 β 和缩放参数 γ 是学习出来的。极端的情况这两个参数等于mini-batch的均值和方差,那么经过batch normalization之后的数据和输入完全一样,当然一般的情况是不同的。
论文中使用了类似z-score的归一化方式:每一维度减去自身均值,再除以自身标准差,由于使用的是随机梯度下降法,这些均值和方差也只能在当前迭代的batch中计算,故作者给这个算法命名为Batch Normalization。
BN优缺点: (批正则化) BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度
emmm,我了解到 最直观的梯度消失带来的影响就是: 网络无法更新
(当越靠近输入层时,由于梯度消失现象,会导致靠近输入层的隐藏层权值更新缓慢或者更新停滞。这就导致在训练时,只等价于后面几层的浅层网络的学习)
2.高分辨率
相比较v1:从分类数据集上先获得较好的分类效果,再在训练网络时将网络的输入从224224直接增加到448448,模型的适应性显扬是不好的
所以在v2下,作者直接在分类数据集上使用高分辨率448*448来输入,并进行微调 fune tune;那么模型在检测数据集上的特征之前就适应高分辨率了。
3.Convolutional With Anchor Boxes(使用预设框)
为什么提出anchor box?
1.一个窗口只能检测一个目标
2.无法解决多尺度问题。
v2中,借鉴了faster rcnn中的anchor思想。anchor也是rpn网络的一个很重要的步骤。
详细就不讲了,大家可以去这篇文章里看看哟rpn网络介绍
论文中,作者为了引入anchor boxes来预测bounding boxes,去掉了全连接层,并去掉了后面的一个池化层以确保输出的卷积特征可以得到更高的分辨率。并且通过缩减网络,将图片的分辨率缩减为416*416,是的卷积特征图的宽高变为奇数,那么就可以指利用中间的一个cell便可以判断物体的类别。(如果是偶数的花,则需要中间的四个cell来预测效率就低了)
anchor boxes是根据预测形状来设计的;bbox是根据预测分类来设计的
anchor box 怎么使用的? 在训练阶段,是把anchor box作为训练样本,为了训练样本我们需要为每个锚框标注两类标签:一是锚框所含目标的类别,简称类别;二是真实边界框相对锚框的偏移量,简称偏移量(offset)。在目标检测时,我们首先生成多个锚框,然后为每个锚框预测类别以及偏移量,接着根据预测的偏移量调整锚框位置从而得到预测边界框,最后筛选需要输出的预测边界框。
anchor box的尺寸该怎么选择?
anchor一般都是通过人工设计的。例如,在SSD、Faster-RCNN中,设计了9个不同大小和宽高比的anchor。然而,通过人工设计的anchor存在一个弊端,就是并不能保证它们一定能很好的适合数据集,如果anchor的尺寸和目标的尺寸差异较大,则会影响模型的检测效果。目前anchor box的选择主要有三种方式:
*
人为经验选取
*
k-means聚类 (维度聚类)
*
作为超参数进行学习
我们可以看到使用abox之后,模型的map是下降了的;但模型的recall是达到了88%,有了很大的提升,锁门模型还是有很多提升空间。所以作者使用了k-means维度聚类和直接位置预测来对模型进行改进
4、Dimension Clusters(维度聚类)
在论文YOLOv2中作者建议使用K-means聚类来代替人工设计,通过对训练集的bounding box进行聚类,自动生成一组更加适合数据集的anchor,可以使网络的检测效果更好。 K-means是非监督学习中的聚类方法。它需要事先确定常数 K,K表示最终的聚类类别数。
**这里为什么使用聚类呢?(优势在于在达到相同的iou结果是需要的abox数量较少)**我们知道 Faster RCNN 和 SSD 中的 Anchor box 的大小和比例是按照经验设定的,然后网络会在训练过程中调整 Anchor boxes 的尺寸。但是如果一开始就找到合适尺寸的 Anchor boxes ,那么肯定可以帮助网络更好预测。作者使用了 K-means的方式对训练集的 bounding boxes 做聚类,试图找到合适的 Anchor boxes。最后作者发现k=5的时候和人工设置的9给abox的效果是一样的。
在论文中,作者发现如果采用标准的 K-means (即采用欧氏距离来衡量差异),在 box 的尺寸比较大的时候其误差也更大。而作者希望的是误差和 box 的尺寸没有太大关系。所以距离函数重新定义,这里使用了 IOU 参与距离计算,使得通过这些 Anchor boxes 获得好的 IOU 分值。到聚类中心的距离越小越好,但IOU值是越大越好,所以使用 1 - IOU,这样就保证距离越小,IOU值越大。
5,Direct location prediction
作者在引入anchor box的时候遇到的第二个问题:模型不稳定,尤其是在训练刚开始的时候。作者认为这种不稳定主要来自预测box的中心坐标(x,y)值。
作者想到之前region proposal(区域建议网络)的目标检测算法中,是通过预测tx和ty来得到(x,y)值,也就是预测的是offsets。 这个公式的理解为:当预测tx=1,就会把box向右边移动一定距离(具体为anchor box的宽度),预测tx=-1,就会把box向左边移动相同的距离
所以YOLOv2中没有采用这种预测方式,而是沿用了YOLOv1的方法, 预测位置参数时采用了强约束方法,直接预测出b-box中心点相对于网格单元左上角的相对坐标
yolo v2直接predict出(tx, ty, tw, th, to),并不像RPN(Faster RCNN中的RPN)中anchor机制那样去遍历每一个pixel。可以从上面的公式看出,b-box的位置大小和confidence都可以通过(tx ty, tw, th, to)计算得来,v2相当直接predict出了b-box的位置大小和confidence。
这只是其中一部分的改进,哭唧唧。下一部分下一次在写出来吧。
参考文章:
添加链接描述
添加链接描述
添加链接描述