论文泛读 YOLO v2:Better,Faster,Stronger

Posted 风信子的猫Redamancy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论文泛读 YOLO v2:Better,Faster,Stronger相关的知识,希望对你有一定的参考价值。

【论文泛读】 YOLO v2:Better,Faster,Stronger


论文链接: YOLO9000: Better, Faster, Stronger

这次来讲解一下YOLO v2算法(CVPR2016的文章)。之前已经讲解过YOLO v1,YOLO v1以完全端到端的模式实现达到实时水平的目标检测,但是它追求速度而牺牲了部分检测精度,所以原作者在YOLO v1的基础上进行了改进,得到了YOLO9000。相对于YOLO v1来说,在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测9000种不同对象,称之为YOLO9000

摘要 Abstract

我们介绍YOLO9000,一个最先进的,实时目标检测系统,可以检测超过9000个目标类别。首先,我们提出对YOLO检测方法的各种改进方法,包括新颖的和从以前的工作中得出的。改进的模型YOLOv2在如PASCAL VOC和COCO标准检测任务是最先进的。使用一种新颖的多尺度训练方法,相同的YOLOv2模型可以运行在不同的大小的图片上,提供速度和精度之间的轻松权衡。在67 FPS时,YOLOv2在VOC 2007上获得76.8 mAP。在40 FPS时,YOLOv2获得78.6 mAP,性能优于最先进的方法,例如使用ResNet的faster RCNN和SSD,同时运行速度明显更快。最后,我们提出了一种联合训练目标检测和分类的方法。使用这种方法,我们在COCO检测数据集和ImageNet分类数据集上同时训练YOLO9000。我们的联合训练方法允许YOLO9000预测没有标记检测数据的目标类的检测。我们在ImageNet检测数据集上验证我们的方法。YOLO9000在ImageNet检测验证集上获得19.7 mAP,尽管只有200个类中的44类检测数据。在不在COCO的156类中,YOLO9000获得16.0 mAP。但是YOLO可以检测超过200个类;它预测超过9000个不同目标类别的检测。它仍然实时运行。

介绍 Introduction

通用目标检测应该快速,准确,并且能够识别各种各样的目标。与分类和标记等其他任务的数据集相比,当前目标检测数据集是有限的。最常见的检测数据集包含数十到数十万的图像,具有几十到几百个标签。分类数据集具有数百万个具有数十或数十万类别的图像。这也是因为目标检测标注的成本较高。

如此,作者提出了一种新方法来利用我们已经拥有的大量分类数据(ImageNet),并使用它来扩大当前检测系统的范围,并且使用目标分类的层次视图,将不同的数据集合在一起。

除此之外,还提出了一种联合训练的方法,在检测和分类数据上训练目标检测器,利用标记的检测图像来学习精确地定位目标,同时使用分类图像来增加其词汇和鲁棒性。

使用这种方法,我们训练YOLO9000,一个实时目标检测器,可以检测超过9000不同的目标类别。首先,我们改进基本的YOLO检测系统,以产生YOLOv2,一个最先进的,实时检测器。然后我们使用我们的数据集组合方法和联合训练算法来训练来自ImageNet的超过9000个类的模型以及来自COCO的检测数据。

作者的代码和预训练模型都在http://pjreddie.com/yolo9000/

预测更准确(Better)

前面有提过,虽然YOLOv1检测速度很快,但是在精度上却不R-CNN系列的检测方法,YOLOv1在物体定位方面(localization)不够准确,并且召回率(recall)较低。YOLOv2共提出了几种改进策略来提升YOLO模型的定位准确度和召回率,从而提高mAP,YOLOv2在改进中遵循一个原则:保持检测速度,这也是YOLO模型的一大优势。YOLOv2的改进方法如下图所示,可以看到,大部分的改进策略都可以比较显著的提高模型的mAP。

batch normalization 批归一化

批归一化提高了2的mAP

批归一化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个batch分别进行归一化的时候,起到了一定的正则化效果(YOLO2不再使用dropout),从而能够获得更好的收敛速度和收敛效果。

通常,一次训练会输入一批样本(batch)进入神经网络。批规一化在神经网络的每一层,在网络(线性变换)输出后和激活函数(非线性变换)之前增加一个批归一化层(BN),并且有个很重要的点,BN是对每一个神经元进行标准化,我之后会对Batch Normalization论文进行解读和实现。

High Resolution Classifier

提高了大约4的mAP

目前大部分的检测模型都会在先在ImageNet分类数据集上预训练模型的主体部分(CNN特征提取器),而且大部分的ImageNet分类模型基本才用224 x 224的图片进行输入,分辨率比较低,其实是不太适合检测模型的。YOLOv1使用ImageNet的图像分类样本采用 224 x 224作为输入,来训练CNN卷积层。然后在训练对象检测时,检测用的图像样本采用更高分辨率的 448x448 的图像作为输入,但这样切换对模型性能有一定影响。

所以在YOLO v2中,先采用224x224的图片进行预训练,再采用448x448的高分辨率的样本对分类模型信息微调 10 个 epoch,给时间给网络逐渐适应高分辨率。

Convolutional With Anchor Boxes

召回率从81%提高到88%,但是mAP轻微下降0.3。

借鉴Faster RCNN的做法,YOLO2也尝试采用先验框(anchor)。在每个grid预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。

同时YOLO2移除了全连接层,另外去掉了一个池化层,使网络卷积层输出具有更高的分辨率。除此之外,还对图像进行收缩,使得我们的特征图为奇数,因为这样每一个特征图就存在一个中心点。最后在池化层之前,与原图像大约是32倍,所以如果输入416x416的图像,我们会得到(batch,13,13,5,25)

之前YOLO1并没有采用先验框,并且每个grid只预测两个bounding box,整个图像98(7x7x2)个。YOLO2如果每个grid采用9个先验框,总共有13x13x9=1521个先验框。所以,相对YOLO1的81%的召回率,YOLO2的召回率大幅提升到88%。同时mAP有0.3%的轻微下降。

Dimension Clusters

提高了4.8的mAP

在之前的Faster R-CNN中,先验框都是手工选取的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。

聚类算法最重要的是选择如何计算两个边框之间的“距离”,对于常用的欧式距离,大边框会产生更大的误差,但我们关心的是边框的IOU。所以,YOLO2在聚类时采用以下公式来计算两个边框之间的“距离”。
d ( b o x , c e n t r o i d ) = 1 − I O U ( b o x , c e n t r o i d ) d(box,centroid)=1−IOU(box,centroid) d(box,centroid)=1IOU(box,centroid)
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数据集略有差异,不过都有较多的瘦高形边框。

Direct location prediction

借鉴于Faster RCNN的先验框方法,在训练的早期阶段,其位置预测容易不稳定。其位置预测公式为:
x = ( t x ∗ w a ) + x a y = ( t y ∗ h a ) + y a \\begin{aligned} x &= (t_x * w_a) + x_a\\\\ y &= (t_y * h_a) + y_a \\end{aligned} xy=(txwa)+xa=(tyha)+ya
其中,
x , y x,y x,y是预测边框的中心,
x a , y a x_a,y_a xa,ya是先验框(anchor)的中心点坐标,
w a , h a w_a,h_a wa,ha是先验框(anchor)的宽和高,
t x , t y t_x,t_y tx,ty是要学习的参数。
注意,YOLO论文中写的是 x = ( t x ∗ w a ) − x a x=(t_x∗w_a)-x_a x=(txwa)xa​,根据Faster RCNN,应该是"+"。

由于 t x , t y t_x,t_y tx,ty的取值没有任何约束,因此预测边框的中心可能出现在任何位置,训练早期阶段不容易稳定。YOLO调整了预测公式,将预测边框的中心约束在特定gird网格内。
b x = σ ( t x ) + c x b y = σ ( t y ) + x y b w = p w e t w b h = p h e t h P r ( o b j e c t ) ∗ I O U ( b . o b j e c t ) = σ ( t o ) \\begin{aligned} b_x &= σ(t_x) + c_x\\\\ b_y &= σ(t_y) + x_y \\\\ b_w &= p_we^{t^w} \\\\ b_h &= p_he^{t^h} \\\\ Pr(object)*IOU(b.object) &= σ(t_o) \\end{aligned} bxbybwbhPr(object)IOU(b.object)=σ(tx)+cx=σ(ty)+xy=pwetw=pheth=σ(to)
其中,
b x , b y , b w , b h b_x,b_y,b_w,b_h bx,by,bw,bh是预测边框的中心和宽高。
P r ( o b j e c t ) ∗ I O U ( b , o b j e c t ) Pr(object)∗IOU(b,object) Pr(object)IOU(b,object)是预测边框的置信度,YOLO1是直接预测置信度的值,这里对预测参数 t o t_o to进行σ变换后作为置信度的值。
c x , c y c_x,c_y cx,cy是当前网格左上角到图像左上角的距离,要先将网格大小归一化,即令一个网格的宽=1,高=1。
p w , p h p_w,p_h pw,ph是先验框的宽和高。
σ是sigmoid函数。
t x , t y , t w , t h , t o t_x,t_y,t_w,t_h,t_o tx,ty,tw,th以上是关于论文泛读 YOLO v2:Better,Faster,Stronger的主要内容,如果未能解决你的问题,请参考以下文章

论文泛读 YOLO v3:An Incremental Improvement

论文泛读 YOLO v1:统一实时的目标检测框架

目标检测论文解读7——YOLO v2

YOLOv2(YOLO9000)

YOLO 论文阅读

yolo v2 损失函数源码解读