# YOLO发展史综述

By [Untitled](https://paragraph.com/@0x5e299dcbcfeade126f47127b81ce4e055bf1094a) · 2022-08-13

---

目录：

*   目标检测的核心任务
    
*   目标检测的核心问题
    
    *   目标检测算法分类
        
    *   目标检应用场景
        
*   One Stage目标检测算法
    
*   YOLOv1
    
    *   YOLOv2
        
    *   \[YOLO9000\]([http://pjreddie.com/yolo9000/](https://link.zhihu.com/?target=http%3A//pjreddie.com/yolo9000/))
        
    *   YOLOv3
        
    *   YOLOv5 TODO
        

![](https://storage.googleapis.com/papyrus_images/87130b26cc1b2a475a10a16aa9bed44d6599793ad0fdcba46735e18ec92916d7.jpg)

目标检测的核心任务
---------

计算机视觉中关于图像识别有四大类任务：

1.  分类-Classification：解决“是什么？”的问题，即给定一张图片或一段视频判断里面包含什么类别的目标。
    
2.  定位-Location：解决“在哪里？”的问题，即定位出这个目标的的位置。
    
3.  检测-Detection：解决“是什么？在哪里？”的问题，即定位出这个目标的的位置并且知道目标物是什么。
    
4.  分割-Segmentation：分为实例的分割（Instance-level）和场景分割（Scene-level），解决“每一个像素属于哪个目标物或场景”的问题。
    

![](https://storage.googleapis.com/papyrus_images/ab2141b38c6ee3bf3102c5a39a6dcebb53415577ba43a88e6c5e89a468b96dd6.png)

目标检测(Object Detection) 的任务是找出图像中所有感兴趣的目标（物体），确定它们的类别和位置，他是计算机视觉领域的核心问题之一。但由于各类物体有不同的外观、形状和姿态，加上成像时光照、遮挡等因素的干扰，目标检测任务是计算机视觉领域最具有挑战性的问题。

### 目标检测的核心问题

除了图像分类之外，目标检测要解决的核心问题是：

> “
> 
> 1.  目标可能出现在图像的位置。
>     
> 2.  目标有各种不同的大小。
>     
> 3.  目标可能有各种不同的形状。
>     
> 
> ”

### 目标检测算法分类

![](https://storage.googleapis.com/papyrus_images/8bb7bca5459efb24c843fcc8fd75085ada10477731953ba1b1bbf167cd0e122e.jpg)

基于深度学习的目标检测算法主要分为两类：

#### Two stage目标检测算

先进行区域生成（region proposal，RP）（一个有可能包含待检物体的预选框），再通过卷积神经网络进行样本分类。 任务：特征提取—>生成RP—>分类/定位回归。 常见的two stage目标检测算法有：R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN和R-FCN等。

#### One stage目标检测算法

不用RP，直接在网络中提取特征来预测物体分类和位置。任务：特征提取—>分类/定位回归。

常见的one stage目标检测算法有：OverFeat、YOLOv1、YOLOv2、YOLOv3、SSD和RetinaNet等。

### 目标检应用场景

目标检测具有巨大的实用价值和应用前景。应用领域包括人脸检测、行人检测、车辆检测、飞机航拍或卫星图像中道路的检测、车载摄像机图像中的障碍物检测、医学影像在的病灶检测等。还有在安防领域中，可以实现比如安全帽、安全带等动态检测，移动侦测、区域入侵检测、物品看护等功能。

One Stage目标检测算法
---------------

将对单次目标检测器（包括SSD系列和YOLO系列等算法）。将分析FPN以理解多尺度特征图如何提高准确率，特别是小目标的检测，其在单次检测器中的检测效果通常很差。然后将分析Focal loss和RetinaNet，看看它们是如何解决训练过程中的类别不平衡问题的。

### YOLOv1

#### YOLOv1的创新点

> “
> 
> 1.  将整张图作为网络的输入，直接在输出层回归bounding box的位置和所属的类别
>     
> 2.  速度快，one stage detection的开山之作
>     
> 
> ”

#### YOLOv1简述

`YOLO《You Only Look Once: Unified, Real-Time Object Detection》`是one-stage detection的开山之作。之前的物体检测方法首先需要产生大量可能包含待检测物体的先验框, 然后用分类器判断每个先验框对应的边界框里是否包含待检测物体，以及物体所属类别的概率或者置信度，同时需要后处理修正边界框，最后基于一些准则过滤掉置信度不高和重叠度较高的边界框，进而得到检测结果。这种基于先产生候选区再检测的方法虽然有相对较高的检测准确率，但运行速度较慢。

YOLO创造性的将物体检测任务直接当作回归问题（regression problem）来处理，将候选区和检测两个阶段合二为一。只需一眼就能知道每张图像中有哪些物体以及物体的位置。下图展示了各物体检测系统的流程图。

![](https://storage.googleapis.com/papyrus_images/cdf512c2eac03baac47368c31e31e902d8f95e03a72673330c62e455cee541d4.png)

事实上，YOLO也并没有真正的去掉候选区，而是直接将输入图片划分成7x7=49个网格，每个网格预测两个边界框，一共预测49x2=98个边界框。可以近似理解为在输入图片上粗略的选取98个候选区，这98个候选区覆盖了图片的整个区域，进而用回归预测这98个候选框对应的边界框。

#### YOLOv1网络结构

YOLO网络借鉴了GoogLeNet分类网络结构，不同的是YOLO使用1x1卷积层和3x3卷积层替代inception module。如下图所示，整个检测网络包括24个卷积层和2个全连接层。其中，卷积层用来提取图像特征，全连接层用来预测图像位置和类别概率值。

![](https://storage.googleapis.com/papyrus_images/8dd38b05f18e7c31731573b4dd89eca60cebeb4066772702ee7cb7cfe1127bd2.jpg)

#### YOLO的输入、输出、损失函数

前面说到YOLO将输入图像分成7x7的网格，最后输出是7x7xk的张量。YOLO网络最后接了两个全连接层，全连接层要求输入是固定大小的，所以YOLO要求输入图像有固定大小，论文中作者设计的输入尺寸是448x448。

YOLO将输入图像分成7x7的网格，每个网格预测2个边界框。若某物体的ground truth的中心落在该网格，则该网格中与这个ground truth IOU最大的边界框负责预测该物体。对每个边界框会预测5个值，分别是边界框的中心x,y（相对于所属网格的边界），边界框的宽高w,h（相对于原始输入图像的宽高的比例），以及这些边界框的confidencescores（边界框与ground truth box的IOU值）。同时每个网格还需要预测c个类条件概率 （是一个c维向量，表示某个物体object在这个网格中，且该object分别属于各个类别的概率，这里的c类物体不包含背景）。论文中的c=20，则每个网格需要预测2x5+20=30个值，这些值被映射到一个30维的向量。为了让边界框坐标损失、分类损失达到很好的平衡，损失函数设计如下图所示。

![](https://storage.googleapis.com/papyrus_images/56096bfc29193707a6a619cca506aea13e64a264e7cb292689a6475d4185ab8d.png)

如上图所示，损失函数分为坐标预测（蓝色框）、含有物体的边界框的confidence预测（红色框）、不含有物体的边界框的confidence预测（黄色框）、分类预测（紫色框）四个部分。

由于不同大小的边界框对预测偏差的敏感度不同，小的边界框对预测偏差的敏感度更大。为了均衡不同尺寸边界框对预测偏差的敏感度的差异。作者巧妙的对边界框的w,h取均值再求L2 loss. YOLO中更重视坐标预测，赋予坐标损失更大的权重，记为 coord，在pascal voc训练中coodd=5 ，classification error部分的权重取1。

某边界框的置信度定义为：某边界框的confidence = 该边界框存在某类对象的概率pr(object)\*该边界框与该对象的ground truth的IOU值 ，若该边界框存在某个对象pr(object)=1 ，否则pr(object)=0 。由于一幅图中大部分网格中是没有物体的，这些网格中的边界框的confidence置为0，相比于有物体的网格，这些不包含物体的网格更多，对梯度更新的贡献更大，会导致网络不稳定。为了平衡上述问题，YOLO损失函数中对没有物体的边界框的confidence error赋予较小的权重，记为 noobj，对有物体的边界框的confidence error赋予较大的权重。在pascal VOC训练中noobj=0.5 ，有物体的边界框的confidence error的权重设为1.

#### YOLO预测推理

YOLO最后采用非极大值抑制（NMS）算法从输出结果中提取最有可能的对象和其对应的边界框。

输入一张图片到YOLO网络将输出一个7_7_30的张量表示图片中每个网格对应的可能的两个边界框以及每个边界框的置信度和包含的对象属于各个类别的概率。由此可以计算某对象i属于类别 同时在第j个边界框中的得分：

![](https://storage.googleapis.com/papyrus_images/0ed643e47082e6563ab7420cf135013494f9b1d38a22ee35be47ce1f0f2a79ff.png)

每个网格有20个类条件概率，2个边界框置信度，相当于每个网格有40个得分，7x7个网格有1960个得分，每类对象有1960/20=98个得分，即98个候选框。

#### NMS步骤

1.  设置一个Score的阈值，一个IOU的阈值；
    
2.  对于每类对象，遍历属于该类的所有候选框，
    
3.  过滤掉Score低于Score阈值的候选框；
    
    *   找到剩下的候选框中最大Score对应的候选框，添加到输出列表
        
    *     
        
    *   进一步计算剩下的候选框与②中输出列表中每个候选框的IOU，若该IOU大于设置的IOU阈值，将该候选框过滤掉，否则加入输出列表中
        
    *   最后输出列表中的候选框即为图片中该类对象预测的所有边界框
        
4.  返回步骤2继续处理下一类对象。
    

YOLO将识别与定位合二为一，结构简便，检测速度快，更快的Fast YOLO可以达到155FPS。相对于R-CNN系列, YOLO的整个流程中都能看到整张图像的信息，因此它在检测物体时能很好的利用上下文信息，从而不容易在背景上预测出错误的物体信息。同时YOLO可以学习到高度泛化的特征，能将一个域上学到的特征迁移到不同但相关的域上，如在自然图像上做训练的YOLO，在艺术图片上可以得到较好的测试结果。

由于YOLO网格设置比较稀疏，且每个网格只预测2个边界框，其总体预测精度不高，略低于Fast RCNN。其对小物体的检测效果较差，尤其是对密集的小物体表现比较差。

### YOLOv2

#### YOLOv2的创新点

YOLOv1虽然检测速度快，但在定位方面不够准确，并且召回率较低。为了提升定位准确度，改善召回率，YOLOv2在YOLOv1的基础上提出了几种改进策略，如下图所示，可以看到，一些改进方法能有效提高模型的mAP。

1.  大尺度预训练分类
    
2.  New Network：Darknet-19
    
3.  加入anchor
    
    ![](https://storage.googleapis.com/papyrus_images/32ee8e0a454aebf68b36b3a82cc2f752d6e0d027e08bf47ba8118467fd2c63f8.jpg)
    

#### YOLOv2简述

Batch Normalization

YOLOv2中在每个卷积层后加Batch Normalization(BN)层，去掉dropout. BN层可以起到一定的正则化效果，能提升模型收敛速度，防止模型过拟合。YOLOv2通过使用BN层使得mAP提高了2%。

High Resolution Classifier

目前的大部分检测模型都会使用主流分类网络（如vgg、resnet）在ImageNet上的预训练模型作为特征提取器, 而这些分类网络大部分都是以小于256x256的图片作为输入进行训练的，低分辨率会影响模型检测能力。YOLOv2将输入图片的分辨率提升至448x448，为了使网络适应新的分辨率，YOLOv2先在ImageNet上以448x448的分辨率对网络进行10个epoch的微调，让网络适应高分辨率的输入。通过使用高分辨率的输入，YOLOv2的mAP提升了约4%。

Convolutional With Anchor Boxes

YOLOv1利用全连接层直接对边界框进行预测，导致丢失较多空间信息，定位不准。YOLOv2去掉了YOLOv1中的全连接层，使用Anchor Boxes预测边界框，同时为了得到更高分辨率的特征图，YOLOv2还去掉了一个池化层。由于图片中的物体都倾向于出现在图片的中心位置，若特征图恰好有一个中心位置，利用这个中心位置预测中心点落入该位置的物体，对这些物体的检测会更容易。所以总希望得到的特征图的宽高都为奇数。YOLOv2通过缩减网络，使用416x416的输入，模型下采样的总步长为32，最后得到13x13的特征图，然后对13x13的特征图的每个cell预测5个anchor boxes，对每个anchor box预测边界框的位置信息、置信度和一套分类概率值。使用anchor boxes之后，YOLOv2可以预测13x13x5=845个边界框，模型的召回率由原来的81%提升到88%，mAP由原来的69.5%降低到69.2%.召回率提升了7%，准确率下降了0.3%。

Dimension Clusters

在Faster R-CNN和SSD中，先验框都是手动设定的，带有一定的主观性。YOLOv2采用k-means聚类算法对训练集中的边界框做了聚类分析，选用boxes之间的IOU值作为聚类指标。综合考虑模型复杂度和召回率，最终选择5个聚类中心，得到5个先验框，发现其中中扁长的框较少，而瘦高的框更多，更符合行人特征。通过对比实验，发现用聚类分析得到的先验框比手动选择的先验框有更高的平均IOU值，这使得模型更容易训练学习。

New Network：Darknet-19

YOLOv2采用Darknet-19，其网络结构如下图所示，包括19个卷积层和5个max pooling层，主要采用3x3卷积和1x1卷积，这里1x1卷积可以压缩特征图通道数以降低模型计算量和参数，每个卷积层后使用BN层以加快模型收敛同时防止过拟合。最终采用global avg pool 做预测。采用YOLOv2，模型的mAP值没有显著提升，但计算量减少了。

![](https://storage.googleapis.com/papyrus_images/44cd7eb1be82bcc08f9377d570640c003c56e867b4285c611c99acebf51790a4.jpg)

Direct location prediction

Faster R-CNN使用anchor boxes预测边界框相对先验框的偏移量，由于没有对偏移量进行约束，每个位置预测的边界框可以落在图片任何位置，会导致模型不稳定，加长训练时间。YOLOv2沿用YOLOv1的方法，根据所在网格单元的位置来预测坐标,则Ground Truth的值介于0到1之间。网络中将得到的网络预测结果再输入sigmoid函数中，让输出结果介于0到1之间。设一个网格相对于图片左上角的偏移量是cx，cy。先验框的宽度和高度分别是pw和ph，则预测的边界框相对于特征图的中心坐标(bx，by)和宽高bw、bh的计算公式如下图所示。

![](https://storage.googleapis.com/papyrus_images/d0f1f3ade6be18014ff6e7e1b46180711e90e37cfcda9c0fefcac38492c930fd.jpg)

YOLOv2结合Dimention Clusters, 通过对边界框的位置预测进行约束，使模型更容易稳定训练，这种方式使得模型的mAP值提升了约5%。

Fine-Grained Features

YOLOv2借鉴SSD使用多尺度的特征图做检测，提出pass through层将高分辨率的特征图与低分辨率的特征图联系在一起，从而实现多尺度检测。YOLOv2提取Darknet-19最后一个max pool层的输入，得到26x26x512的特征图。经过1x1x64的卷积以降低特征图的维度，得到26x26x64的特征图，然后经过pass through层的处理变成13x13x256的特征图（抽取原特征图每个2x2的局部区域组成新的channel，即原特征图大小降低4倍，channel增加4倍），再与13x13x1024大小的特征图连接，变成13x13x1280的特征图，最后在这些特征图上做预测。使用Fine-Grained Features，YOLOv2的性能提升了1%.

Multi-Scale Training

YOLOv2中使用的Darknet-19网络结构中只有卷积层和池化层，所以其对输入图片的大小没有限制。YOLOv2采用多尺度输入的方式训练，在训练过程中每隔10个batches,重新随机选择输入图片的尺寸，由于Darknet-19下采样总步长为32，输入图片的尺寸一般选择32的倍数{320,352,…,608}。采用Multi-Scale Training, 可以适应不同大小的图片输入，当采用低分辨率的图片输入时，mAP值略有下降，但速度更快，当采用高分辨率的图片输入时，能得到较高mAP值，但速度有所下降。

YOLOv2借鉴了很多其它目标检测方法的一些技巧，如Faster R-CNN的anchor boxes, SSD中的多尺度检测。除此之外，YOLOv2在网络设计上做了很多tricks,使它能在保证速度的同时提高检测准确率，Multi-Scale Training更使得同一个模型适应不同大小的输入，从而可以在速度和精度上进行自由权衡。

#### YOLOv2的训练

YOLOv2的训练主要包括三个阶段。

> “
> 
> 第一阶段：先在ImageNet分类数据集上预训练Darknet-19，此时模型输入为,共训练160个epochs。第二阶段：将网络的输入调整为,继续在ImageNet数据集上finetune分类模型，训练10个epochs，此时分类模型的top-1准确度为76.5%，而top-5准确度为93.3%。第三个阶段：修改Darknet-19分类模型为检测模型，并在检测数据集上继续finetune网络。网络修改包括（网路结构可视化）：移除最后一个卷积层、global avgpooling层以及softmax层，并且新增了三个卷积层，同时增加了一个passthrough层，最后使用卷积层输出预测结果。
> 
> ”

### YOLO9000

YOLO9000是在YOLOv2的基础上提出的一种联合训练方法，可以检测超过9000个类别的模型。YOLOv2混合目标检测数据集和分类数据集，用目标检测数据集及其类别标记信息和位置标注信息训练模型学习预测目标定位和分类，用分类数据集及其类别标记信息进一步扩充模型所能识别的物体类别同时能增强模型鲁棒性。

#### YOLO9000数据输入

YOLO9000根据各个类别之间的从属关系建立一种树结WordTree, 将COCO数据集和ImageNet数据集组织起来。

WordTree的生成方式如下：

> “
> 
> 1.  首先遍历ImageNet中的类别名词。
>     
> 2.  对每个名词，在WordNet(一种结构化概念及概念之间关系的语言数据库)上找到从它所在位置到根节点（设根节点为实体对象physical object）的最短路径，由于在WordNet中大多数同义词只有一个路径，所以先把将该路径上的词全都加到树中。
>     
> 3.  迭代地检查剩下的名词，取它到根节点的最短路径，将该最短路径上的还没出现在层次树中的词加入到树中。混合后的数据集形成一个有9418类的WordTree.生成的WordTree模型如下图所示。另外考虑到COCO数据集相对于ImageNet数据集数据量太少了，为了平衡两个数据集，作者进一步对COCO数据集过采样，使COCO数据集与ImageNet数据集的数据量比例接近1：4。
>     
>     ![](https://storage.googleapis.com/papyrus_images/14c442ddd4e94b19f47cd369ed19560ccdf36a3a24a910513728b0d526f4ecd5.png)
>     
> 
> ”

对于物体的标签，采用one-hot编码的形式，数据集中的每个物体的类别标签被组织成1个长度为9418的向量，向量中除在WordTree中从该物体对应的名词到根节点的路径上出现的词对应的类别标号处为1，其余位置为0。

#### YOLO9000联合训练

YOLO9000采用YOLOv2的结构，anchorbox由原来的5调整到3，对每个anchorbox预测其对应的边界框的位置信息x,y,w,h和置信度以及所包含的物体分别属于9418类的概率，所以每个anchorbox需要预测4+1+9418=9423个值。每个网格需要预测3x9423=28269个值。在训练的过程中，当网络遇到来自检测数据集的图片时，用完整的YOLOv2loss进行反向传播计算，当网络遇到来自分类数据集的图片时，只用分类部分的loss进行反向传播。

#### YOLO9000推理预测

WordTree中每个节点的子节点都属于同一个子类，分层次的对每个子类中的节点进行一次softmax处理，以得到同义词集合中的每个词的下义词的概率。当需要预测属于某个类别的概率时，需要预测该类别节点的条件概率。即在WordTree上找到该类别名词到根节点的路径，计算路径上每个节点的概率之积。预测时，YOLOv2得到置信度，同时会给出边界框位置以及一个树状概率图，沿着根节点向下，沿着置信度最高的分支向下，直到达到某个阈值，最后到达的节点类别即为预测物体的类别。

YOLO9000使用WordTree混合目标检测数据集和分类数据集，并在其上进行联合训练，使之能实时检测出超过9000个类别的物体，其强大令人赞叹不已。YOLO9000尤其对动物的识别效果很好，但是对衣服或者设备等类别的识别效果不是很好，可能的原因是与目标检测数据集中的数据偏向有关。

### YOLOv3

YOLOv3总结了自己在YOLOv2的基础上做的一些尝试性改进，有的尝试取得了成功，而有的尝试并没有提升模型性能。其中有两个值得一提的亮点，一个是使用残差模型，进一步加深了网络结构；另一个是使用FPN架构实现多尺度检测。

#### YOLOv3的创新点

> “
> 
> 1.  新网络结构：DarkNet-53
>     
> 2.  融合FPN
>     
> 3.  用逻辑回归替代softmax作为分类器
>     
> 
> ”

#### YOLOv3网络结构的改进

YOLOv3在之前Darknet-19的基础上引入了残差块，并进一步加深了网络，改进后的网络有53个卷积层，取名为Darknet-53，网络结构如下图所示（以256\*256的输入为例）。

![](https://storage.googleapis.com/papyrus_images/08847183e6bbe9a4eb735b76a2988cccaa06ece102e88e4fbf0a04cfb317b23a.jpg)

为了比较Darknet-53与其它网络结构的性能，作者在TitanX上，采用相同的实验设置，将256x256的图片分别输入以`Darknet-19，ResNet-101，ResNet-152和Darknet-53`为基础网络的分类模型中，实验得到的结果如下图所示。可以看到Darknet-53比ResNet-101的性能更好，而且速度是其1.5倍，Darknet-53与ResNet-152性能相似但速度几乎是其2倍。注意到，Darknet-53相比于其它网络结构实现了每秒最高的浮点计算量，说明其网络结构能更好的利用GPU。

![](https://storage.googleapis.com/papyrus_images/ef5cc4092af2c0fe2f76dc4e59d244f049d1f24d133b719a108993a69ba4fee4.png)

#### YOLOv3中多尺度检测实现方法

YOLOv3借鉴了FPN的思想，从不同尺度提取特征。相比YOLOv2，YOLOv3提取最后3层特征图，不仅在每个特征图上分别独立做预测，同时通过将小特征图上采样到与大的特征图相同大小，然后与大的特征图拼接做进一步预测。用维度聚类的思想聚类出9种尺度的anchor box，将9种尺度的anchor box均匀的分配给3种尺度的特征图.如下图是在网络结构图的基础上加上多尺度特征提取部分的示意图（以在COCO数据集(80类)上256x256的输入为例）：

![](https://storage.googleapis.com/papyrus_images/f5a6309fe9fcec756a0122c36cd06e39c75bba14d08bf385dc3a784aa82758a7.jpg)

从YOLOv1到YOLOv2再到YOLO9000、YOLOv3, YOLO经历三代变革，在保持速度优势的同时，不断改进网络结构，同时汲取其它优秀的目标检测算法的各种trick，先后引入anchor box机制、引入FPN实现多尺度检测等。

![](https://storage.googleapis.com/papyrus_images/923956c913a1b834b41fe7fc60c65883a28370597cc285661912d0ad01079f03.png)

### YOLOv5 TODO

> “欢迎关注：【未来现相】微信公众号！！！”  
> “
> 
> 未来现相WX公众号主要以下服务：
> 
> 1.  提供专业的AI解决方案及相关产品落地；
>     
> 2.  项目互助，科技创业；
>     
> 3.  每日更新AI算法研究等精品内容；
>     
> 4.  为IT从业者提供完备的职业发展规划，解决人生不同阶段的难题；
>     
> 
> ”

---

*Originally published on [Untitled](https://paragraph.com/@0x5e299dcbcfeade126f47127b81ce4e055bf1094a/yolo)*
