
论文:Yolo9000: Better, faster, stronger
代码:https://github.com/pjreddie/darknet
出处:CVPR2017
作者:Joseph Redmon
时间:2016.12
YOLOv2 是基础结构,YOLO9000 通过联合分类和检测数据集可以检测 9000 个类别的目标而称为 YOLO9000。
相比 YOLOv1 有以下两种改进:
作者认为,目前分类的数据集数据量很大,但检测数据集数量量相对小一些,所以作者提出了联合训练分类和检测数据集。使用检测数据集来保证定位的准确性,使用分类数据集来提升模型的词汇量和鲁棒性。
作者使用了一系列的方法对原来的YOLO多目标检测框架进行了改进,在保持原有速度的优势之下,精度上得以提升。
本文方法中用到了 kmeans 聚类,这里先介绍一下该聚类方法:K-means 的算法步骤为:
kmeans 的优点:
kmeans 的缺点:
YOLOv1 有很多不足,其中最主要的两点在于:
所以 YOLOv2 也主要在提高这两个问题上下功夫。但 YOLOv2 没有提高模型大小,同时速度更快了,主要从以下方面来让网络效果更好

YOLOv1 和 YOLOv2 输出的变化:
1、Batch Normalization:在 YOLOv1 的所有卷积层后面加 BN,提升了 2mAP
2、High Resolution Classififier:
3、Convolutional with Anchor Boxes:YOLOv1 直接使用 fc 网络预测框的位置坐标,而非像 Faster RCNN 一样预测的是框和预选框的偏移,偏移学习比直接学习位置坐标更简单。
4、Dimension Clusters:
在使用 anchor 时,anchor 的纵横比和尺度需要手动选择,所以如果选择得当,则效果好,如果选择失当,则效果差。
YOLOv2 为了避免手工选择带来的误差,在训练集上使用了 k-means 来自动选择最优的值。由于欧氏距离对尺寸很敏感,所以作者使用 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)=1−IoU(box,centroid) 的方式来度量距离。
如图 2 所示,最终使用 k=5 来平衡模型复杂度和 recall。使用这种在形心聚类的方法和手工选择不同,聚类的方法选择了更多的高瘦框,更少的矮胖框。
如表 1 所示,只有 5 种形心的聚类方法得到的框的效果和 9 种 anchor box 效果类似。使用 9 种形心的聚类方法能够得到更高的 IoU。
YOLOv2 中,在每个 grid 上布置 5 个 anchor(YOLOv1 是每个 grid 检测两个 box,这里每个 grid 增加了 3 个预测框)
论文中说,如果一开始就选择了合适的 anchors,那么网络就更容易去学习如何进行好的预测。
这里是如何使用 kmeans 来实现 anchor 生成的呢?
YOLOv2 中使用 kmeans 聚类方法,是为了得到合适的 anchor 初始化参数(纵横比、尺度等),所以,这里要聚类的也就是 gt 框的 w、h,过程如下:


5、Direct location prediction


6、Fine-Grained Features
7、Multi-scale Training



为了实现又准又快的检测,来支撑如自动驾驶的任务,在耗时小的情况下保持很好的效果。所以 YOLOv2 需要提升速度。
YOLOv1 基于 GoogLeNet,比 VGG-16 快,但准确率低。
1、DarkNet19
YOLOv2 中提出了一个新的分类模型,Darknet-19,共 19 层卷积层,5 层 maxpooling,结构见表 6。

2、Training for classification
训练 ImageNet-1000 共 160 epochs,使用 SGD,训练时使用标准数据增强(crop、rotation、hue、saturation、exposure shifts等)。
先使用 224x224 训练,然后使用 448x448 微调,微调共使用 10 个epochs。
3、Training for detection
检测网络,作者移除了最后一个卷积层,使用 3 个 3x3 conv (1024 个通道)+ 1 个 1x1 conv(通道和类别相关,对于 VOC,5 bbox * 5 coordinates + 5 bbox * 20 cls = 125)。
为了让网络见识更多的类别,增加鲁棒性, YOLOv2 提出了对分类和检测联合训练:
1、Dataset combination with WordTree
当我们要预测一只狗是不是柯基时, Pr(Corgi) 是一系列条件概率的乘积:
P
r
(
C
o
r
g
i
)
=
P
r
(
C
o
r
g
i
∣
d
o
g
)
×
P
r
(
d
o
g
∣
c
a
n
i
n
e
)
×
.
.
.
×
P
r
(
l
i
v
i
n
g
t
h
i
n
g
∣
w
h
o
l
e
)
×
P
r
(
w
h
o
l
e
∣
o
b
j
e
c
t
)
×
P
r
(
o
b
j
e
c
t
)
Pr(Corgi)=Pr(Corgi|dog)×Pr(dog|canine)×...×Pr(living thing|whole)×Pr(whole|object)×Pr(object)
Pr(Corgi)=Pr(Corgi∣dog)×Pr(dog∣canine)×...×Pr(livingthing∣whole)×Pr(whole∣object)×Pr(object)
WordTree的类别数量非常大,基本可以囊括目前所有的检测数据集,只需要在WordTree中标明哪些节点是检测数据集上的即可,图7显示的是COCO数据集合并到WordTree的结果。其中蓝色节点表示COCO中可以检测的类别。


2、混合训练分类和检测
作者将 COCO 和 ImageNet 的 9000 子类进行联合,对应的 WordTree 共 9418 类,通过对 COCO 的过采样来实现和 ImageNet 的平衡,将COCO上采样到和ImageNet的比例为 1:4。
训练 YOLO9000:

YOLOv2 是当时 SOTA 的又快又好的方法,可以使用不同大小的输入图像,并达到效果和速度的平衡。
YOLO9000 是实时检测框架,通过使用 WordTree 来将不同源的数据联合起来,能够弥补不同数据集的 gap。