YOLO 系列算法是目标检测 one-stage 类的表明算法,本文将从 问题背景,创新点等方面比较,了解它们的的发展历程。
1、任务描述
目标检测是为了解决图像里的物体是什么,在哪里的问题。输入一幅图像,输出的是图像里每一个物体的类别和位置,其中位置用一个包含物体的框表示。
算法
须要注意,咱们的目标,同时也是论文中常说的感兴趣的物体,指咱们关心的类别(行人检测只检测人,交通检测只关心交通工具等),或者数据集包含的类别,并非图像里全部的物体都是目标,好比建筑,草坪也是物体,但他们经常是背景。网络
从计算机视觉的角度看,目标检测是分类+定位,从机器学习的角度看,目标检测是分类+回归。架构
2、设计思想
目标检测架构分为两种,一种是two-stage,一种是one-stage,区别就在于 two-stage 有region proposal 过程,相似于一种海选过程,网络会根据候选区域生成位置和类别,而 one-stage 直接从图片生成位置和类别。框架
今天提到的 YOLO 就是一种 one-stage 方法。机器学习
YOLO 是 You Only Look Once 的缩写,意思是神经网络只须要看一次图片,就能输出结果。ide

YOLO 一共发布了四个版本,其中 YOLOv1 奠基了整个系列的基础,后面的系列就是在初版基础上的改进,只为提高性能。函数
YOLO的检测方法以下:工具
- 将输入图像划分为 S×S 网格(grid),好比这里划分红 7×7=49 个 grid,若是目标的中心落入网格单元,则该网格单元负责检测该目标。注意不是整个物体落入单元格,只须要物体中心在便可。

- 每一个网格单元预测 B(文中 B=2) 个边界框和这些框的置信度得分。这个分数反映这个框包含物体的几率 Pr(Object) 以及预测框的位置准确性 IOU,因此置信分数也由这两部分定义:
- 每一个 bounding box 都要包含 5 个预测值,x, y, w, h, confidence。(x,y)框中心是相对于网格单元的坐标,w 和 h 是框至关于整幅图的宽和高,confidence 表明该框与 ground truth 之间的 IOU(框里没有物体分数直接为 0 )

- 由于位置和类别须要同时预测,因此每一个单元格除了输出 bounding box 也输出物体的条件几率(该物体属于某一类的几率,固然这些几率以包含对象的网格单元为条件)。每一个网格单元输出一个几率集合,不考虑这个 grid 预测几个 bounding box。

- 测试阶段,在测试时,咱们将条件分类几率与各个框的置信度预测相乘,做为每一个框特定于每一个类的置信分数(这个分数编码了类别和位置两部分信息)。
与 R-CNN 系列方法相比:性能
- R-CNN 及其变体采用 region proposals 而不是滑动窗口法找物体,是一种多阶段方法。调网络的时候须要分开调,运行慢。
- YOLO 与 R-CNN 类似的地方是在网格单元找可能的边界框,用 CNN 提取特征。不一样的是,加在网格单元的空间限制有助于防止同一个目标的重复检测,预测的边界框也少(98 个),还有把多个阶段结合成一个阶段。
3、发展历程
1. YOLOv1
问题背景学习
以前 two-stage 方法如 R-CNN 把检测问题分红两部分,先生成候选区域(region proposal),再用分类器对区域分类,多阶段训练致使不易优化。
创新点
把检测看成回归问题,用一个网络输出位置和类别,实现了一个 unified system,从检测的角度是 one-stage的
训练流程
和 R-CNN 差很少
- 首先 ImageNet 1000类 竞赛数据集上对卷积层进行预训练
- 而后再把网络根据检测任务微调
检测流程
- 输入一幅多目标图像
- 将图像划分红多个网格
- 经过网络获得每一个网格的分类几率,以及各网格预测的框+置信度
- 针对每一个框,把几率与置信分数相乘,做为每一个框特定于每一个类的置信分数
- 输出位置和类别信息
优势
- 快。由于回归问题没有复杂的流程(pipeline)。
- 能够基于整幅图像预测(看全貌而不是只看部分)。与基于滑动窗口和区域提议的技术不一样,YOLO在训练和测试期间会看到整个图像,所以它隐式地编码有关类及其外观的上下文信息。由于能看到图像全貌,与 Fast R-CNN 相比,YOLO 预测背景出错的次数少了一半。
- 学习到物体的通用表示(generalizable representations),泛化能力好。所以,当训练集和测试集类型不一样时,YOLO 的表现比 DPM 和 R-CNN 好得多,应用于新领域也不多出现崩溃的状况。
缺点
- 空间限制:一个单元格只能预测两个框和一个类别,这种空间约束必然会限制预测的数量;
- 难扩展:模型根据数据预测边界框,很难将其推广到具备新的或不一样寻常的宽高比或配置的对象。因为输出层为全链接层,所以在检测时,YOLO 训练模型只支持与训练图像相同的输入分辨率。
- 网络损失不具体:不管边界框的大小都用损失函数近似为检测性能,物体 IOU 偏差和小物体 IOU 偏差对网络训练中 loss 贡献值接近,但对于大边界框来讲,小损失影响不大,对于小边界框,小错误对 IOU 影响较大,从而下降了物体检测的定位准确性。
2. YOLOv2
问题背景
- YOLOv1 检测性能低
- 当前的检测任务受数据集标签的限制(数据集必须有标签或经过分类赋予标签)。可是,标记检测图像比标记分类图像昂贵得多,因此检测数据和分类数据不是一个规模。
创新点
- 针对第一个问题,使用一些方法提高 YOLOv1 的性能,获得 YOLOv2。
- 针对第二个问题,提出了 ImageNet 和 COCO 数据集的结合方法,以及联合训练方法,训练 YOLOv2 后获得的模型叫 YOLO9000。
提高性能的方法
- Accuracy: Batch Normalization, High Resolution Classifier, Convolutional With Anchor Boxes, , Direct location prediction, Fine-Grained Features, Multi-Scale Training
- Speed: 提出一个新网络 Darknet-19
训练流程
论文提出了一种联合训练算法,该算法能够在检测和分类数据上训练目标检测器。 利用标记的检测图像来学习精准定位,同时使用分类图像来增长其“词汇量”和健壮性。
- 分类检测数据集结合方法:
检测数据集的标签少且普通,分类数据集的标签多且具体,若是咱们想在两个数据集上训练,就得把它们的标签合并起来。不少分类方法都用一个 softmax layer ,但它的前提是假设全部类互斥,但咱们的数据集类别是不都是互斥的(有多是包含关系,例如狗和金毛犬),因此咱们使用了一个多标签模型来组合数据集(无互斥的要求),及使用多个 softmax 。
大多数分类方法都假定标签采用扁平结构,可是对于组合数据集咱们须要层次化的结构。
ImageNet 标签采用有向图结构。在这里,做者把数据集的结构简化为结构树(hierarchical tree)。
经过改造图,最后获得一个 WordTree,这样每一个节点/标签都有本身的几率,解决了类别之间不互斥的问题,就能在检测集和分类集上联合训练。
- 联合训练方法:
把检测和分类数据混合,训练过程当中遇到带标签的检测图像,就基于 YOLOv2 整个损失函数进行反向传播,遇到分类图像,只反向传播网络的分类损失。
3. YOLOv3
问题背景
- YOLOv3 的提出不是为了解决什么问题,整篇论文实际上是技术报告。
- YOLOv3 在 YOLOv2 基础上作了一些小改进,文章篇幅不长,核心思想和 YOLOv二、YOLO9000差很少。
模型改进
- 边界框预测:定位任务采用 anchor box 预测边界框的方法,YOLOv3 使用逻辑回归为每一个边界框都预测了一个分数 objectness score,打分依据是预测框与物体的重叠度。若是某个框的重叠度比其余框都高,它的分数就是 1,忽略那些不是最好的框且重叠度大于某一阈值(0.5)的框
- 类别预测:和 YOLOv2 同样,YOLOv3 仍然采起多标签分类
- 多尺度预测
- 使用新网络 Darknet-53 提取特征
4. YOLOv4
问题背景
- YOLO 原做者以前宣布退出CV界,YOLOv4 的做者其实不是前三篇 YOLO 的一做
- YOLOv4 是对 YOLOv3 的一个改进。它的改进方法就是总结了几乎全部的检测技巧,又提出一点儿技巧,而后通过筛选,排列组合,挨个实验(ablation study)哪些方法有效。
- 值得注意的是文章第二部分相关工做,简直就是目标检测的一个简单综述,阅读该部分,你就能了解模型及方法,若是它提到的每一个方法你都了解,说明你在这个方向的研究较全面深刻(我没达到)。
框架方法
下面这幅论文中的图介绍了 YOLOv4 检测器的构成及使用的训练方法,这些是通过大量实验选出的性能最好的组合
4、总结
回顾 YOLO 系列的发展,咱们能够看出 YOLO 后期没有提出新颖的想法,更重视应用落地。
