系列文章:
死磕YOLO系列,YOLOv1 的大脑、躯干和手脚
演员需要自我修养,程序员也需要。
YOLO 在当时是非常不错的算法,速度极快,但明显的缺陷就是精度问题特别是小尺寸目标检测问题上。
YOLO 的作者有强调的一个事情是 YOLOv2 仍然是实时的,并且在速度和精度方面做了一定的平衡。
YOLOv2 是 YOLO 的进阶版,它没有彻底否定 YOLO,而是在 YOLOv1 的基础上,融合了很多其它论文优秀的思想做了大幅的提升。
YOLO 作者概括了从 3 个方面入手:
- 更好
- 更快
- 更强
1. 如何更好?
YOLO 作者对比了 Fast R-CNN 发现 YOLO 有一些短板,那就是比较低的召回率和比较高的定位误差。
所以,让 YOLO 变得更好指的是保持准确率的情况下:
- 提升召回率
- 降低定位误差
为此,尝试了一些手段。
1. 引入 Batch Normalization
Batch Norm 是一种很有效的正则化手段,所有的卷积层后面引入正则化之后,YOLO 表现如何呢?
- mAP 提升了 2%
- 可以去掉了 Dropout 仍然不出现过拟合
不熟悉 Batch Norm 的同学可以尝试阅读我这篇介绍文章
2. 高分辨率图像分类器
所有比较先进的目标检测网络,它的图像分类器都是在 ImageNet 做预训练的。
但从 AlexNet 开始,大多数分类器接受的图片尺寸都比较小,低于 256 * 256。
YOLOv1 训练图像分类时,图片尺寸是 224224,之后训练检测时,图片尺寸是 448 × 448,这代表模型需要同时应对学习检测和分辨率的变化。
YOLOv2 做了相应的改变。
通过对 YOLOv1 的模型进行 finetune,用 448*448 的图片尺寸训练了 10 epoches,主要目的是想让卷积核适应高分辨率。
这个步骤相当于做了减法,减轻了网络的学习任务,让它忽略图片尺寸的变化,专心应对目标检测任务。
这种尝试,让 mAP 涨了近 4 个点。
2. 引入 Anchor Box
YOLOv1 最终是通过全连接网络直接预测目标位置。
另外一个优秀的目标检测模型 Fast R-CNN 是通过 Anchor Box 的形式。
两种方法相比,Anchor Box 更容易学习,因为它是通过手选的,然后通过 RPN(Region Proposal Network) 全卷积层预测每一个位置相对于 Anchor Box 的偏移和置信度。
所以,YOLO 作者把 YOLOv1 进行了改造:
- 最后的全连接层去掉了
- 用 Anchor Box 预测 b-box
- 移除一个 pool 层,使得卷积层输出更高分辨率
- 缩放网络使其能够接受 416x416 的分辨率,目的是最终生成的 featuremap 只有一个中心 cell,方便定位。
- 将分类和空间检测解耦,跟随 YOLOv1 的思路,预测每一个 anchor box 的对象 objectness 分数,这个是 anchor box 和 groundtruth 的 IOU 分数,也是一个条件概率,针对的是某个 cell 中有无对象时的概率取值。
在论文中,作者花了很长的篇幅讲解 anchor box 相关。
引入 anchor box 后,YOLO 模型的 accuracy 发生了些许下降。
未引入 anchor box 时,YOLO 预测 98 个 bbox,引入后,总共预测的 bbox 能多达 1000 多个
@无anchor box @Acc=69.5 mAP @Recall = 81%
@有anchor box @Acc = 69.2 mAP @Recall = 88%
相比于精度的少许损失,召回率提升明显,文章开头说 YOLOv2 的改良有个目标就是提高召回率,而 Anchor BOX 的引入确实起了很明显的效果。
3. 尺寸聚类
在引入 Anchor BOX 到 YOLO 的过程,遇到了 2 个问题。
第一个问题就是 Anchor BOX 的尺寸是手选的。
虽然网络可以渐进学习,但是如果一开始的时候就分配好合理的先验尺寸,那么这无疑会加快学习的速度。
相比于人为指定 anchor box 的尺寸比例,YOLO 作者想到了一个自动化的手段,那就是选择 k-means 聚类手段。
在数据训练集中运行 k-means 算法,可以得到 k 个尺寸比例。
但 K 如何取值呢?
作者不是乱取的,有做很详细的对比实验。
可以看到,k 从 1 到 15 都有做过测试,最终选择了 k=5,选择 5 的原因是在模型复杂度和召回率之间过一个平衡。
经实验,效果很不错,聚类出来的 anchor box 尺寸如下图所示:
聚类选择出来的尺寸没有很短和宽的尺寸,偏向于高且瘦的尺寸。
最后,作为聚类算法,距离的度量非常重要。
YOLOv2 没有采用标准的欧式距离作为度量。
欧式距离为什么不好呢?
因为 YOLO 作者发现,大尺寸的 bbox 更容易出现定位错误,所以作者想找一个尺寸独立的距离度量,它想到了 IOU, IOU 本身就是一个比例重合的关系。
d ( b b o x , c e n t r o i d ) = 1