10. YOLOv2

328 阅读4分钟

1. YOLOv2的训练步骤

YOLOv2的训练主要包括三个阶段。

第一阶段就是先在ImageNet分类数据集上预训练Darknet-19,此时模型输入为224×224,共训练160个epochs。

第二阶段将网络的输入调整为448*448,继续在ImageNet数据集上finetune分类模型,训练10个epochs,此时分类模型的top-1准确度为76.5%,而top-5准确度为93.3%。

第三个阶段就是修改Darknet-19分类模型为检测模型,并在检测数据集上继续finetune网络。

2. YOLOv2添加的7个trick:

Batch Normalization

每个卷积层后添加BN层。批标准化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数的敏感性,并且每个batch分别进行归一化的时候,起到了一定的正则化效果,从而能够获得更好的收敛速度和收敛效果。在yolov2中卷积后全部加入Batch Normalization,网络会提升2%的mAP。

High Resolution Classifier

YOLOv1中训练backbone时,用224×224的ImageNet的分类图片进行训练;然后在训练检测时,用448×448的检测图像进行训练。但这样的切换对模型有一定的影响。

于是在YOLOv2训练backbone时,用224×224的ImageNet的分类图片进行训练,用448×448的分类图片进行微调。在训练检测时,用448×448的检测图像进行训练。这样就缓解了分辨率突然切换造成的影响。

Convolutional With Anchor Boxes

采用基于Anchor/priors的预测。

图片.png

Dimension Clusters

采用k-means聚类获得priors的宽高。

Direct lacation predict

在学习Faster RCNN时,通常有一个误区,总是认为Anchor就是Region based中预测框。但实际上在Anchor-based中,Anchor和预测框还是不同的,Anchor一生成数量很多且Anchor的位置是固定的,Anchor与目标的大小,位置极可能是匹配不上的,那么就需要不断微调Anchor的大小位置,不断向目标靠近,预测框就是Anchor的微调结果。

图片.png

在Faster RCNN中,RPN就是将Anchor微调成预测框,计算的是Anchor和GT的损失,而到了最后softmax和bbox regression中则是计算预测框和GT的损失。

在Faster RCNN的目标检测算法中,微调Anchor通过预测偏移量(tx,ty)(t_x,t_y)来得到预测框(x,y)(x,y)坐标。(回顾一下Faster RCNN中的RPN结构,回归参数的损失函数是计算偏移量(tx,ty)(t_x,t_y)的损失,详见《3. Fast RCNN》)

图片.png

这个公式是无约束的,预测的边界框很容易向任何方向偏移。因此,每个位置预测的边界框可以落在图片任何位置,这导致模型的不稳定性,在训练时需要很长时间来预测出正确的偏移参数。

在YOLOv1进行了Anchor微调公式的改进:

改进:网络在最后一个卷积层输出13×13的feature map,对应着原图上有13×13个grid,每个grid有5个anchor box来预测5个bounding box。

每个bounding box预测得到5个值,分别为:(txtxtyty)是关于中心坐标的偏移参数,(twtwthth)是关于目标宽高的缩放因子,toto类似YOLOv1的confidence。

为了将bounding box的中心点约束在当前cell中,使用σ\sigma函数将txtxtyty归一化处理,将值约束在0~1,这使得模型训练更稳定。

CxC_xCyC_y)是该点所在grid左上角相对于原图左上角的距离。(pwp_wphp_h)是Anchor的宽高。

图片.png

Fine-Grained Features

为了提高检测小目标的精度,使用pass-through layer进行深层特征和浅层特征的融合。

图片.png

PassThrough Layer

(W,H,C)经过PassThrough Layer变成(W/2,H/2,4C)。

下图为yolov2的整体架构: (26,26,64)经过PassThrough Layer变成(13,13,256)。

图片.png

yolov2的整体架构

Multi-Scale Training

若深度神经网络最后一层是全连接层,那么输入就需要固定。 我们固定尺寸的图片输入flattern后变成了(800,1),全连接层(500,800),类别为500。那么(500,800)×(800,1)=(500,1)。

那么如果输入是不固定的,那么输入flattern后假如变成了(10086,1),全连接层仍然(500,800),最终无法进行全连接。

YOLOv2中只有卷积层和池化层,因此不需要固定的输入图片的大小。
为了让模型更有鲁棒性,作者引入了多尺度训练。就是在训练过程中,每迭代一定的次数,改变模型的输入图片大小。

注:Multi-Scale Training是YOLOv2步骤中第三步检测数据集fine-tuning时采用的。

输入输出

YOLOv1→YOLOv2输入:由448×448×3→416×416×3

YOLOv1→YOLOv2输出:由13×13×30→13×13×(5*(20+5)) YOLOv1是2个先验框,YOLOv2是5个Anchor。

图片.png

YOLOv2损失函数

图片.png

图片.png