Yolo 2
1.引言
YOLO2的论文《YOLO9000: Better, Faster, Stronger》
正如其名,它在YOLO1的基础上,使网络准确率更高、更快、能识别的类别更多。
YOLO1的缺点:
- 定位性能差
- recall低:把全部目标全部检出的能力差
- mAP低
2.Better
2.1 Batch Normalization
批归一化处理,这个操作使mAP有2%的提升。
- 有了BN操作,就没有dropout操作了。
- BN操作在卷积操作后,在激活层前。(也就是在线性变换后,非线性变换前)。该操作把输出压缩到了非饱和区,大大加快收敛速度,防止过拟合、梯度消失,加快训练速度。
BN层进行如下变换:
①对该批样本的各特征量(对于中间层来说,就是每一个神经元)分别进行归一化处理,分别使每个特征的数据分布变换为均值0,方差1。从而使得每一批训练样本在每一层都有类似的分布。这一变换不需要引入额外的参数。
②对上一步的输出再做一次线性变换,假设上一步的输出为Z,则Z1=γZ + β。这里γ、β是可以训练的参数。增加这一变换是因为上一步骤中强制改变了特征数据的分布,可能影响了原有数据的信息表达能力。增加的线性变换使其有机会恢复其原本的信息。
2.2 High Resolution Classifier
高分辨率分类器,使mAP提升4%。
在目标检测模型训练前,会使用图像分类的数据集预训练模型。图像分类的训练样本很多,而标注了边框的用于训练对象检测的样本相比而言就比较少了,因为标注边框的人工成本比较高。所以对象检测模型通常都先用图像分类样本训练卷积层,提取图像特征。
但这引出的另一个问题是,图像分类样本的分辨率不是很高。所以YOLO v1使用ImageNet的图像分类样本采用 224 * 224 作为输入,来训练CNN卷积层。然后在训练对象检测时,检测用的图像样本采用更高分辨率的 448 * 448 的图像作为输入。但这样切换对模型性能有一定影响。
所以YOLO2在采用 224 * 224 图像进行分类模型预训练后,再采用 448*448 的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应 448 * 448 的分辨率。然后再使用 448 * 448 的检测样本进行训练,缓解了分辨率突然切换造成的影响。
2.3 Convolutional With Anchor Boxes
使用先验框(Anchor Box),召回率(recall)大幅提升到88%,同时mAP轻微下降了0.2。
借鉴Faster RCNN的做法,YOLO2也尝试采用先验框(anchor)。在每个grid预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。
同时YOLO2移除了全连接层。另外去掉了一个池化层,使网络卷积层输出具有更高的分辨率。
之前YOLO1并没有采用先验框,并且每个grid只预测两个bounding box,整个图像98个。YOLO2如果每个grid采用9个先验框,总共有13 * 13 * 9=1521个先验框。所以,相对YOLO1的81%的召回率,YOLO2的召回率大幅提升到88%。同时mAP有0.2%的轻微下降。
不过YOLO2接着进一步对先验框进行了改良。
2.4 Dimension Clusters
使用聚类方法提取先验框尺度,结合下面的约束预测边框的位置,使得mAP提升4.8%。
之前先验框都是手工设定的,YOLO2尝试统计出更符合样本中对象尺寸的先验框,这样就可以减少网络微调先验框到实际位置的难度。
YOLO2的做法是对训练集中标注的边框进行聚类分析,以寻找尽可能匹配样本的边框尺寸。
使用k-means聚类方法。
聚类算法最重要的是选择如何计算两个边框之间的“距离”,对于常用的欧式距离,大边框会产生更大的误差,但我们关心的是边框的IOU。所以,YOLO2在聚类时采用以下公式来计算两个边框之间的“距离”。
centroid是聚类时被选作中心的边框,box就是其它边框,d就是两者间的“距离”。IOU越大,“距离”越近。YOLO2给出的聚类分析结果如下图所示:
上图左边是选择不同的聚类k值情况下,得到的k个centroid边框,计算样本中标注的边框与各centroid的Avg IOU。显然,边框数k越多,Avg IOU越大。YOLO2选择k=5作为边框数量与IOU的折中。
对比手工选择的先验框,使用5个聚类框即可达到61 Avg IOU,相当于9个手工设置的先验框60.9 Avg IOU。
上图右边显示了5种聚类得到的先验框,VOC和COCO数据集略有差异,不过都有较多的瘦高形边框。
2.5 Direct location prediction
对产生的候选框位置进行约束,mAP提升了5%。
对于每个grid cell产生的候选框有位置上的约束,而不是像YOLO1时,野蛮生长,会出现模型不稳定,尤其是在早期。这个不稳定来源于预测x和y。
所以要对偏移量进行一些约束设置。
t x 和 t y t_x和t_y tx和ty是要学习的参数。由于 t x 和 t y t_x和t_y tx和ty的取值没有任何约束,因此预测边框的中心可能出现在任何位置,训练早期阶段不容易稳定。YOLO2调整了预测公式,将预测边框的中心约束在特定gird网格内。公式如下:
c x 和 c y c_x 和c_y cx和cy是当前网格左上角到图片左上角的距离,网格的大小要归一化为 1 * 1
限制函数都是sigmoid函数,
t
t
t 都是要学习的参数。所以根据上面的计算公式,预测边框的蓝色中心点被约束在蓝色背景的网格内。约束边框位置使得模型更容易学习,且预测更为稳定。
2.6 Fine-Grained Features
使用passthrough层检测细粒度特征,mAP提升了1%。
- 对象检测面临的一个问题:图像中对象有大有小,输入图像经过多层网络提取特征,最后输出的特征图中(比如YOLO2中输入416 * 416经过卷积网络下采样最后输出是13 * 13),较小的对象可能特征已经不明显甚至被忽略掉了。
- 为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。
YOLO2引入一种称为passthrough层的方法在特征图中保留一些细节信息。在最后一个pooling之前,特征图的大小是26 * 26 * 512,将其1拆4,直接传递(passthrough)到pooling后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。
但根据YOLO2的代码,和论文中不一样,特征图先用1 * 1卷积从 26 * 26 * 512 降维到 26 * 26 * 64,再做1拆4并passthrough。
2.7 Multi-Scale Training
多尺度训练,使mAP提升了1.4%。
- YOLO1是在448 * 448的输入图片尺度上训练的,希望对多尺度输入图片具有鲁棒性。
- 因为去掉了全连接层,YOLO2可以输入任何尺寸的图像。因为整个网络下采样倍数是32,作者采用了{320,352,…,608}等10种输入图像的尺寸,这些尺寸的输入图像对应输出的特征图宽和高是{10,11,…19}。训练时每10个batch就随机更换一种尺寸,使网络能够适应各种大小的对象检测。
- 在小尺寸上更快,大尺寸上更准。
2.8 high resolution
在高分辨率图像上,544 * 544分辨率图像上,达到78.6%的mAP。使mAP提高了1.8%。
3.Faster
为了进一步提升速度,YOLO2提出了Darknet-19(有19个卷积层和5个MaxPooling层)网络结构。DarkNet-19比VGG-16小一些,精度不弱于VGG-16,但浮点运算量减少到约1/5,以保证更快的运算速度。
3.1 Darknet-19
和VGG类似,大部分卷积核都是3 * 3,每次池化操作后卷积核数量都加倍。1 *1 卷积核置于3 * 3卷积核之间,可以达到压缩特征的目的。去掉了全连接层,使用GAP层(global average pooling)。使用BN层加快收敛、保证训练稳定、正则化模型。
3.2 训练分类模型
- 用Darknet-19在标准1000类的ImageNet上训练,在224×224的图片上训练160轮
- 微调输入为448×448,训练10轮,微调这个模型
3.3 训练检测模型
在以上训练所得分类模型的基础上:
- 去掉最后一个卷积层、GAP和Softmax
- 加3个卷积层,每层1024个卷积核
- 增加一个passthrough层
- 最后一个1 * 1卷积层,输出的channels数为:num_anchors * (5+num_classes)
结构图如下
-
22、23、24是增加的3层;
-
25层将16层输出作为输入,也就是细粒度,经过26层的64个卷积核卷积,输出38 * 38 * 64;
-
27层将38 * 38 * 64划分为4份并拼接,得到19 * 19 * 256
-
28层将27层输出与24层输出拼接,得到19 * 19 * 1280
-
经过3 * 3 卷积和1 * 1卷积,得到19 * 19 * 425
或者看这个图
-
综上所述,虽然YOLO2做出了一些改进,但总的来说网络结构依然很简单,就是一些卷积+pooling,从4164163 变换到 13135*25。稍微大一点的变化是增加了batch normalization,增加了一个passthrough层,去掉了全连接层,以及采用了5个先验框。
-
对比YOLO1的输出张量,YOLO2的主要变化就是会输出5个先验框,且每个先验框都会尝试预测一个对象。输出的 13 * 13 * 5 * 25 张量中,25维向量包含 20个对象的分类概率+4个边框坐标+1个边框置信度。
-
训练160轮,最开始学习率是 1 0 − 3 10^{-3} 10−3,60轮和90轮时,又除以10.
4. Stronger
这个部分就是说通过一些手段,融合了分类数据集和检测数据集,使得种类更多,可以检测9000类。没有深入学习,这里就不再讨论。
5.损失函数
误差包含3个部分:
- 置信度误差
- 位置误差
- 分类误差
- 第一行:置信度误差。与GT框的IOU小于某阈值的置信度误差。这里需要计算各个预测框和所有的ground truth之间的IOU值,并且取最大值记作MaxIOU,如果该值小于一定的阈值,YOLOv2论文取了0.6,那么这个预测框就标记为background。此处的IOU计算是将中心点重合。因此只看形状,不看位置。
- 第二行:前12800次迭代,预测框与anchor的位置误差,使模型更快学会预测anchor位置,t的四个参数就会更加稳定。这一项应该是促进网络学习到Anchor的形状。
- 第三、四、五行:计算与GT的IOU最大的Anchor。
(1)标注框与预测框的定位误差:首先要计算其中心点落在哪个cell上,然后计算这个cell的5个先验框和grond truth的IOU值,计算IOU值的时候不考虑坐标只考虑形状,所以先将Anchor boxes和ground truth的中心都偏移到同一位置,然后计算出对应的IOU值,IOU值最大的先验框和ground truth匹配,对应的预测框用来预测这个ground truth。
(2)Anchor和标注框的IOU 与 预测置信度误差
(3)标注框类别与预测类别的分类误差。
参考:
https://zhuanlan.zhihu.com/p/93632171
https://zhuanlan.zhihu.com/p/47575929