本专栏将从论文的角度解读一下CV方向的一些经典神经网络模型及其贡献与意义,以期加深自己的印象,后续可以随时翻看并且学习其中好的tricks。上一期介绍了YOLO v1,这一期来介绍一下改进的YOLO v2(YOLO9000)。
论文相关信息
论文全名为《YOLO9000: Better, Faster, Stronger》(链接),题目很有趣,更好更快更强,搁这模仿奥林匹克口号呢?
值得强调的一点是,为什么模型叫 YOLO9000 呢?因为作者说其可以检测9000多种目标类别。论文使用的数据集为 PASCAL VOC 和 COCO 目标检测数据集,但是目标检测数据集由于需要标出GT框,人工成本是很高的(在我们实验室的项目中我也标过框,标一会眼睛就花了…)。因此目标检测数据集还是比较少的,但是分类数据集多啊,比如 ImageNet 分类数据集,于是作者们提出一种联合训练目标检测和分类的方法——WordTree(详解见这里)。使用这种方法,在 COCO 检测数据集和 ImageNet 分类数据集上同时训练 YOLO9000 ,在 ImageNet 检测任务上进行验证,虽然效果比较勉强,但这种方法使得 YOLO9000 能够预测未标注检测数据的目标类别的检测结果,相当于利用目标检测图像来学习精确定位目标,用分类图像来增加 “词汇量” 和鲁棒性,类似迁移的想法,很强。
网络架构
YOLO v2 的 backbone 部分网络是改进的 DarkNet-19,主要改进思路就是用 1×1 卷积层代替全连接层,让特征图每个位置共享参数,然后利用卷积核个数弥补参数组合的多样性。由于其中有19个卷积层和5个 max pooling 层,所以称其为 DarkNet-19。与 YOLO v1 中的 backbone 网络相比,参数量更少,计算速度更快,效果更好。
tricks
接下来根据下图来看看 YOLO v1 是如何一步一步变成 v2 的:
1、使用 Batch Normalization 批标准化
有关BN在我之前的博客里也介绍过了,不再赘述,它可以显著改善收敛性,而且不再需要其他形式的正则化,因此也去掉了dropout。
2、High Resolution Classifier (高分辨率分类器)
由于几乎所有的检测方法都会使用在 ImageNet 上预先训练好的分类模型,但是大多数都用小于 256×256 的图像作为输入去训练,对于目标检测任务来说这样的分辨率显得有点不够,使用这样的卷积层再去训练目标检测任务时,直接输入更高分辨率的 448×448 图像,分辨率的改变对模型性能肯定有影响。
因此 YOLO v2 在用 224×224 图像预训练好的分类模型的基础上,再用 448×448 的高分辨率图像对分类模型进行参数微调,使网络特征逐渐适应 448×448 的分辨率,然后再训练目标检测任务,通过这样的方式缓解分辨率突然切换造成的影响。
3、使用Anchor Boxes先验框并去掉全连接层改为卷积层
这一点显然是借鉴了 Faster R-CNN 的做法,也考虑使用 anchor boxes。对得到 S x S 的特征图每个位置预测 N 个 anchor boxes(这里的数量是如何确定的看下面第4点),对每个 anchor box 都预测一套框位置信息、置信度和各类别分类概率值,但是可以看到,直接用 Faster R-CNN 的方法产生 anchor 框反而使得精度下降,因此 YOLO v2 没有生搬硬套,而是做出了改变,如下面第4点和第5点所叙述。
4、使用 K-means 聚类确定先验框尺寸
正如 Faster R-CNN 中提到的,anchor先验框先给定了框大小,后续再调整,带有一些主观性,因此在加入 YOLO v2 时,做出了一定的改进:对训练集中标注的框进行聚类分析,以寻找尽可能匹配样本的框尺寸。但是如果基于欧几里得距离使用 K-means 显然会使得较大的框产生更大的误差,因此作者基于 IOU 作为度量:
其中 centroid 是聚类时被选作中心的框,box 是其它框,d就是两者间的“距离”。聚类分析结果如下图所示:
上左图是选择不同的聚类k值情况下,计算样本中标注的 box 与最接近的 centroid 的 Avg IOU。很显然,centroid 数量 k 越多那 Avg IOU 肯定越大。对比 Faster R-CNN 那样确定的 9 个 anchor 框,使用 5 个聚类框即可达到同样的效果(下图)。上右图显示了在 VOC 和 COCO 数据集上聚类得到的 5 个框。
5、约束框的位置偏移量
在 Faster R-CNN 中,预测 bbox 相对 anchor 的平移缩放并没有对参数进行约束,因此每个位置预测的框可以落在图片任何位置,会导致模型不稳定,导致模型训练时间变长。YOLO v1 的思路是目标中心落在哪个网格块上就由哪个网格块负责预测,并且只预测相对网格块坐标的位移量,这样就不会偏离的太离谱,但是想法很美好现实很骨感,我猜测作者在实验中应该发现了一个问题,YOLO v1 预测输出中的(x , y , w , h)只是理论属于区间 [0,1],但网络开始阶段也有可能大于1,让有的参数失去了意义。因此 v2 沿用了 v1 的思路但是加上了一些约束性的映射(sigmoid、ex),我认为作用应该就是加速收敛:
其中, bx、by、bw、bh 是预测框的中心坐标和宽高,cx、cy 是当前网格块的坐标,pw、ph 是先验的聚类框的宽高,tx、ty、tw、th 、to是网络需要学习的参数,σ是sigmoid函数。
6、使用passthrough层捕捉细粒度特征
这部分转自这里:
至于为什么输入变成了 416×416 ,这是因为 YOLO v2 将输入图片下采样到原来大小的 1/32,输入 448×448 的图像下采样后为 14×14,是偶数,没有一个中心单元格。而目标往往很有可能就在图像的中间部位,所以在中心只有一个网格块比四个网格块都在中心附近做预测会更好,所以通过输入 416×416 图像,得到 13×13 的输出特征图。
7、使用多尺度的图像训练
应该很好理解,由于 YOLO v2 中用卷积层代替掉了全连接层,所以对图片输入没有限制。每10个批次作者们就会随机选择一个新的图像尺寸大小继续训练,由于模型尺寸缩减了32倍,所以从32的倍数中抽取:{320,352,…,608}。
这个策略迫使网络学习如何在各种输入维度上做预测,这意味着相同的网络可以预测不同分辨率下的检测结果。网络在较小的尺寸下运行速度更快,因此YOLOv2在速度和准确性之间提供了一个简单的权衡:
8、使用高分辨率图像进行检测
由于使用了第7点叙述的多尺度图像去训练,并且对输入图像没有尺寸限制,因此如果用更高分辨率的输入图像,比如544×544,则mAP还能再一步提升。
总结
YOLO v2 中有很多值得学习的地方,首先其借鉴了很多其它目标检测方法中的 tricks ,如 Faster R-CNN 的 anchor 先验框,SSD 中的多尺度方法。并且 YOLO v2 有很多巧思,使它能在保证速度的同时尽量提高检测准确率,其中很多参数的设置可以让使用者根据不同问题的实际情况在速度和精度上进行自由权衡。
YOLO v2做出了很多有效的改进,但是它仍然没有解决 YOLO v1 中重叠目标和特别小的目标的检测问题,下一篇继续看看 YOLO系列。