1. 前言
论文地址:https://arxiv.org/abs/1612.08242
相关代码:https://github.com/yjh0410/yolov2-yolov3_PyTorch
该论文使用一种新颖的多尺度训练方法,YOLOv2可以在不同的尺寸下运行,在速度和精度之间提供了一个简单的权衡。在67 FPS的情况下,YOLOv2在VOC 2007上获得76.8mAP。在40 FPS的情况下,YOLOv2获得78.6mAP。最后提出了一种目标检测与分类的联合训练方法,利用该方法在COCO检测数据集和ImageNet分类数据集上同时训练YOLO9000,它可以预测9000多种不同的物体类别的检测结果。
目标检测之YOLO算法:YOLOv1,YOLOv2,YOLOv3,TinyYOLO,YOLOv4,YOLOv5,YOLObile,YOLOF详解:
2. YOLO V2简介
YOLOv2相对v1版本,在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测9000种不同对象,称之为YOLO9000。
文章提出了一种新的训练方法–联合训练算法,这种算法可以把这两种的数据集混合到一起。使用一种分层的观点对物体进行分类,用巨量的分类数据集数据来扩充检测数据集,从而把两种不同的数据集混合起来。
联合训练算法的基本思路就是:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors ),用检测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升健壮性。
YOLO9000就是使用联合训练算法训练出来的,他拥有9000类的分类信息,这些分类信息学习自ImageNet分类数据集,而物体位置检测则学习自COCO检测数据集。
![](https://i-blog.csdnimg.cn/blog_migrate/dda3935d7bf596036a5ca350b8f48d7a.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/3dd2eda347038ef72f312bb693069765.png)
3. YOLO V2网络改进
3.1 Batch Normalization(批量归一化)
mAP提升2.4%。
批归一化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个batch分别进行归一化的时候,起到了一定的正则化效果(YOLO2不再使用dropout),从而能够获得更好的收敛速度和收敛效果。
通常,一次训练会输入一批样本(batch)进入神经网络。批规一化在神经网络的每一层,在网络(线性变换)输出后和激活函数(非线性变换)之前增加一个批归一化层(BN),BN层进行如下变换:①对该批样本的各特征量(对于中间层来说,就是每一个神经元)分别进行归一化处理,分别使每个特征的数据分布变换为均值0,方差1。从而使得每一批训练样本在每一层都有类似的分布。这一变换不需要引入额外的参数。②对上一步的输出再做一次线性变换,假设上一步的输出为Z,则Z1=γZ + β。这里γ、β是可以训练的参数。增加这一变换是因为上一步骤中强制改变了特征数据的分布,可能影响了原有数据的信息表达能力。增加的线性变换使其有机会恢复其原本的信息。
关于批规一化的更多信息可以参考 Batch Normalization原理与实战。
3.2 High resolution classifier(高分辨率图像分类器)
mAP提升了3.7%。
图像分类的训练样本很多,而标注了边框的用于训练对象检测的样本相比而言就比较少了,因为标注边框的人工成本比较高。所以对象检测模型通常都先用图像分类样本训练卷积层,提取图像特征。但这引出的另一个问题是,图像分类样本的分辨率不是很高。所以YOLO v1使用ImageNet的图像分类样本采用 224*224 作为输入,来训练CNN卷积层。然后在训练对象检测时,检测用的图像样本采用更高分辨率的 448*448 的图像作为输入。但这样切换对模型性能有一定影响。
所以YOLO2在采用 224*224 图像进行分类模型预训练后,再采用 448*448 的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应 448*448 的分辨率。然后再使用 448*448 的检测样本进行训练,缓解了分辨率突然切换造成的影响。
3.3 Convolution with anchor boxes(使用先验框)
召回率大幅提升到88%,同时mAP轻微下降了0.2左右。
YOLOV1包含有全连接层,从而能直接预测Bounding Boxes的坐标值。 Faster R-CNN的方法只用卷积层与Region Proposal Network来预测Anchor Box的偏移值与置信度,而不是直接预测坐标值。作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。
借鉴Faster RCNN的做法,YOLO2也尝试采用先验框(anchor)。在每个grid预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。
之前YOLO1并没有采用先验框,并且每个grid只预测两个bounding box,整个图像98个。YOLO2如果每个grid采用9个先验框,总共有13*13*9=1521个先验框。所以最终YOLO去掉了全连接层,使用Anchor Boxes来预测 Bounding Boxes。作者去掉了网络中一个Pooling层,这让卷积层的输出能有更高的分辨率。收缩网络让其运行在416*416而不是448*448。
由于图片中的物体都倾向于出现在图片的中心位置,特别是那种比较大的物体,所以有一个单独位于物体中心的位置用于预测这些物体。YOLO的卷积层采用32这个值来下采样图片,所以通过选择416*416用作输入尺寸最终能输出一个13*13的Feature Map。 使用Anchor Box会让精度稍微下降,但用了它能让YOLO能预测出大于一千个框,同时recall从81%达到88%,mAP达到69.2%。
召回率升高,mAP轻微下降的原因是:因为YOLOV2不使用anchor boxes时,每个图像仅预测98个边界框。但是使用anchor boxes,YOLOV2模型预测了一千多个框,由于存在很多无用的框,这就导致了mAP值的下降。但是由于预测的框多了,所以能够预测出来的属于ground truth的框就多了,所以召回率就增加了。目标检测不是只以mAP为指标的,有些应用场景下要求召回率高。
3.4 Dimension clusters(聚类提取先验框的尺度信息)
之前Anchor Box的尺寸是手动选择的,所以尺寸还有优化的余地。 YOLO2尝试统计出更符合样本中对象尺寸的先验框,这样就可以减少网络微调先验框到实际位置的难度。YOLO2的做法是对训练集中标注的边框进行K-mean聚类分析,以寻找尽可能匹配样本的边框尺寸。
如果我们用标准的欧式距离的k-means,尺寸大的框比小框产生更多的错误。因为我们的目的是提高IOU分数,这依赖于Box的大小,所以距离度量的使用:
![](https://i-blog.csdnimg.cn/blog_migrate/2611ad817f74ea8464e12f8eb7549e4c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a1d51c34e1d18dd2c044660471950558.png)
centroid是聚类时被选作中心的边框,box就是其它边框,d就是两者间的“距离”。IOU越大,“距离”越近。YOLO2给出的聚类分析结果如下图所示:
通过分析实验结果(Figure 2),左图:在model复杂性与high recall之间权衡之后,选择聚类分类数K=5。右图:是聚类的中心,大多数是高瘦的Box。
Table1是说明用K-means选择Anchor Boxes时,当Cluster IOU选择值为5时,AVG IOU的值是61,这个值要比不用聚类的方法的60.9要高。选择值为9的时候,AVG IOU更有显著提高。总之就是说明用聚类的方法是有效果的。
![](https://i-blog.csdnimg.cn/blog_migrate/7cc6840865ef1bddf60ebdb61b96a8aa.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/db0505f33d065725579b3fa126a0a3ae.png)
3.5 Direct location prediction(约束预测边框的位置)
借鉴于Faster RCNN的先验框方法,在训练的早期阶段,其位置预测容易不稳定。其位置预测公式为: 3*3 卷积之间的特征表示。使用批处理归一化来稳定训练,加快收敛速度,并对模型进行规范化。
![](https://i-blog.csdnimg.cn/blog_migrate/03ac9ff2a2ff000bf694ba5bff61823c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/711332eb85d9baf4db4f64d5cdcf8426.png)
Darknet-19只需要55.8亿次操作就可以处理一张图像,但在ImageNet上却可以达到72.9%的top-1精度和91.2%的top-5精度。
3.9 Hierarchical classification(分层分类)
作者提出了一种在分类数据集和检测数据集上联合训练的机制。使用检测数据集的图片去学习检测相关的信息,例如bounding boxes 坐标预测,是否包含物体以及属于各个物体的概率。使用仅有类别标签的分类数据集图片去扩展可以检测的种类。
作者通过ImageNet训练分类、COCO和VOC数据集来训练检测,这是一个很有价值的思路,可以让我们达到比较优的效果。 通过将两个数据集混合训练,如果遇到来自分类集的图片则只计算分类的Loss,遇到来自检测集的图片则计算完整的Loss。
但是ImageNet对应分类有9000种,而COCO则只提供80种目标检测,作者使用multi-label模型,即假定一张图片可以有多个label,并且不要求label间独立。通过作者Paper里的图来说明,由于ImageNet的类别是从WordNet选取的,作者采用以下策略重建了一个树形结构(称为分层树):
- 遍历Imagenet的label,然后在WordNet中寻找该label到根节点(指向一个物理对象)的路径;
- 如果路径直有一条,那么就将该路径直接加入到分层树结构中;
- 否则,从剩余的路径中选择一条最短路径,加入到分层树。
这个分层树我们称之为 WordTree,作用就在于将两种数据集按照层级进行结合。
![](https://i-blog.csdnimg.cn/blog_migrate/cc36bdd96356e3a662a3dd0f78cd1fc6.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/7264eebe0f6726375cd328c6824baa90.png)
分类时的概率计算借用了决策树思想,某个节点的概率值等于该节点到根节点的所有条件概率之积。最终结果是一颗 WordTree (视觉名词组成的层次结构模型)。用WordTree执行分类时,预测每个节点的条件概率。如果想求得特定节点的绝对概率,只需要沿着路径做连续乘积。例如,如果想知道一张图片是不是“Norfolk terrier ”需要计算:
![](https://i-blog.csdnimg.cn/blog_migrate/da463c0105f0a3724160dad0e1c38ca9.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/47affb8e9e3692afc301ebc52f04b296.png)
另外,为了验证这种方法作者在WordTree(用1000类别的ImageNet创建)上训练了Darknet-19模型。为了创建WordTree1k,作者天添加了很多中间节点,把标签由1000扩展到1369。训练过程中ground truth标签要顺着向根节点的路径传播。例如,如果一张图片被标记为“Norfolk terrier”,它也被标记为“dog” 和“mammal”等。为了计算条件概率,模型预测了一个包含1369个元素的向量,而且基于所有“同义词集”计算softmax,其中“同义词集”是同一概念的下位词。
softmax操作也同时应该采用分组操作,下图上半部分为ImageNet对应的原生Softmax,下半部分对应基于WordTree的Softmax:
![](https://i-blog.csdnimg.cn/blog_migrate/582a1a33e09714f73e9d6e17077bc92e.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/6ba1443517201cbd05a91d2371c96199.png)
通过上述方案构造WordTree,得到对应9418个分类,通过重采样保证Imagenet和COCO的样本数据比例为4:1。
Reference: https://zhuanlan.zhihu.com/p/362759621