0.简介
在前一篇文章目标检测 | 让YOLOv1算法告诉你回归网络的能力中我们见证了回归网络的能力,本文就利用YOLOv2的整体实现,来告诉大家一些在目标检测领域中的Trick的力量。YOLOv2论文中其实讲到了两个算法:YOLOv2和YOLO9000。本文因为主要介绍的是检测领域的Trick,因此着重介绍YOLOv2算法原理,及其在YOLOv1基础下的各个改进点。本文先介绍YOLOv2的各种改进点,最后再介绍YOLOv2的训练过程(不具体介绍网络的测试过程,因为其和YOLOv1中的前向测试类似)。
1.改进点
YOLOv2的整体结构和YOLOv1是类似的,都是用回归网络解决目标检测问题,由于YOLOv1过于在意网络的速度,因此其网络召回率很一般。当然这主要原因是YOLOv1算法中每个cell只能预测两个bounding box,不像类Faster Rcnn系列算法有很多的anchor可以用来预测目标,导致YOLOv1算法在这方面存在缺陷,基于此YOLOv2提出了如下几个改进点。
不会改变网络结构
- High Resolution Classifier(高分辨率的预训练)
- Multi-Scale Training(不同size训练策略)
- Dimension Clusters(引入聚类策略)
- Direct location prediction(坐标直接预测)
会改变网络结构
- Batch Normalization(加入BN层)
- Convolutional With Anchor Boxes(将v1中的bounding box替换为anchor box)
- Fine-Grained Features(多尺度检测,reorg层)
- Darknet-19(更轻量级的特征提取网络)
2.改进点详解
(1)引入多尺度策略,预训练和训练
在引入多尺度策略上,YOLOv2一共用了三种trick,分别在预训练参数产生过程中,训练检测网络过程中,训练网络结构的调整这三个过程中进行多尺度的尝试。
- High Resolution Classifier(高分辨率的预训练)
- Multi-Scale Training(不同size训练策略)
这两个策略在这种一起介绍了,省的大家会搞混,因为这两个策略有点类似。
High Resolution 主要是针对于预训练的,用High Resolution策略可以得到更加适应于检测任务的预训练参数。作者先用将ImageNet数据集中的图片resize成224*224并在网络对应的backbone(特征提取器)上进行训练,大概迭代160代后(表示将所有训练数据循环跑160次),然后再将输入调整到448*448,再训练10代。至此就得到了YOLOv2网络会用到的预训练参数。这样的策略相比于直接拿网络用单一尺度的预训练参数,可以提高大约4%的MAP。
Multi-Scale主要针对于YOLOv2的训练过程,用该策略可以使得网络在最终应用的时候对于不同尺度的输入能够有较好的鲁棒性。作者每训练10个batch,随机改变一种网络的输入size,这些size从{320, 352, …, 608}这几个值中选择,原因是YOLOv2网络的整体降采样倍数为32,所以输入分辨率最好为32的倍数。
- Fine-Grained Features(多尺度检测,reorg层)
该部分的多尺度策略和上述的两种略有不一样,正如SSD网络会将不同层级也就是不同大小的特征图用于最后的detect,YOLOv2中以相同的思想但不完全一致的策略实现这个过程。