目标检测 YOLO 系列: 更快更准 YOLO v2
- 目标检测 YOLO 系列: 开篇
- 目标检测 YOLO 系列: 开宗立派 YOLO v1
- 目标检测 YOLO 系列: 更快更准 YOLO v2
- 目标检测 YOLO 系列: 持续改进 YOLO v3
- 目标检测 YOLO 系列: 你有我有 YOLO v4
- 目标检测 YOLO 系列: 快速迭代 YOLO v5
- 目标检测 YOLO 系列:你有我无 YOLOX
作者:Joseph Redmon, Ali Farhadi
发表时间:2016
Paper 原文: YOLO9000: Better, Faster, Stronger
Joseph Redmon 等于 2016 年在 YOLO9000: Better, Faster, Stronger 中提出了 YOLO 的改进版本 YOLO V2 和 YOLO9000,其中 YOLO9000 是在 YOLO V2 的基础上采用联合训练的方式,使其可以检测超过 9000 个种类的物体的检测模型。这里重点介绍 YOLO V2。
YOLO V2 出来的时候 SSD 已经提出来了,Faster RCNN 就更早了,所以 V2 论文中以 Faster RCNN 和 SSD 作为 benchmark。
1 网络结构
首先是 backbone, V2 的 backbone 不再是 GoogLeNet v1,而是作者自己设计的一个网络,叫做 Darknet-19,这个网络的特点是网络结构小巧,但是性能表现却很不错。更多关于 Darknet-19 的介绍可以参考 CV 经典主干网络 (Backbone) 系列: Darknet-19。
先来看一下 YOLO v2 的网络结构图。如下所示。
从上图可以发现,v2 的整体结构依然清爽。和 v1 相比除了 backbone 从 GoogLeNet v1 变为了 Darknet-19 之外,还有如下两点变化:
- 网络中没有 fc 层了
- 多了一条类似 ResNet 中的 shortcut(图中红色的连接),作者表示这一操作提升了1%的成绩。
更详细的网络结构如下。v2 总共有 22 个 conv. 层,没有 fc 层。相比 v1 的 24 个 conv. ,2 个 fc 层相比, v2 网络更小,这也是为什么v2 的速度能够更快的原因。
从下表可以发现,网络的输入图片尺寸发生了变化,v1 的输入尺寸是 448x448,但是 v2 这里是 416×416,这主要是为了让网络最后得到一个奇数的 feature map(13x13)。
此外和 v1 相比 stride 变为 32(v1 为 64),可以得到更大的 feature map(13x13, v1 为 7x7),这样将有利于检测小目标。
更进一步的,以 Convolution-22 层为例,可以看到作者引入了 BN 操作。作者在论文中表示这一改进提升了2%的成绩。
[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky
除了上面在网络结构中体现的涨分点之外,作者还采用了如下的训练技巧。
- High Resolution Classifier,训练分类预训练模型时采用 224x224,但是在训练检测模型的时候用的是 448x448,但是这种直接切换分辨率的做法,检测模型可能难以快速适应高分辨率,所以作者在训练完预训练分类模型后,采用 448x448 的输入再 finetune 10 个 epoch,这样有助于改善这一状况。使用高分辨率分类器后,YOLOv2 的 mAP 提升了约 4%。
- Multi-Scale Training,由于 YOLOv2 模型中只有卷积层和池化层,所以 YOLOv2 的输入可以不限于 416x416 大小的图片。为了增强模型的鲁棒性,YOLOv2 采用了多尺度输入训练策略,具体来说就是在训练过程中每间隔一定的 iterations(作者取 10) 之后改变模型的输入图片大小。由于 YOLOv2 的下采样总步长为 32,输入图片大小选择一系列为32倍数的值: 320 , 352 , . . . 608 {320,352,...608}