YOLO系列是目标检测的算法,他是一阶段的检测算法。

一阶段(one-stage):检测物体的同时进行分类。(代表论文:yolov1 - yolov5

二阶段(two-stage):先检测出物体,再进行分类。(代表论文:rcnn,fast-rcnn

YOLOv1

在推出 YOLO 目标检测之前,研究人员使用了基于卷积神经网络(CNN) 的方法,如 R-CNN 和Fast R-CNN。这些方法使用两步流程,先预测边界框,然后使用回归对这些框中的物体进行分类。这种方法速度慢且耗资源,但 YOLO 模型彻底改变了目标检测。2016 年,Joseph RedmonAli Farhadi 两位大神开发了第一个 YOLO,它通过新的增强架构克服了传统目标检测算法的大多数问题。

《You Only Look Once》论文地址:You Only Look Once: Unified, Real-Time Object Detection

视频讲解地址:YOLO Object Detection

网络结构图

网络结构图

解读

YOLO 架构由 24 个卷积层和 2 个全连接层组成,灵感来自用于图像分类的GoogLeNet模型。YOLOv1 方法是当时的首创方法。

Conv.Layer表示卷积层

  • 7×7×64-s-2表示该卷积层尺寸为7×7,通道数为64,步长为2

Maxpool Layer表示最大池化层

  • 2×2-s-2表示池化窗口大小为2×2,步长为2

Conn.Layer表示全连接层

整个网络由 24 个卷积层 (受 GoogLeNet 启发,有很多 1 × 1 和 3 × 3 交替的结构) 和 2 个全连接层构成,输入图像尺寸为 448 × 448,输出为 7 × 7 × 30,说一下输出为啥是这个 shape。YOLOv1 会把输入图像划成 7 × 7 的 grid,每个 grid 负责预测 2 个目标,对于每个目标来说又有这些属性:x、y、w、h、p,然后再加上类别数 20,这样就形成了 7 × 7 × (2 × 5 + 20) = 7 × 7 × 30 的输出 tensor 了。

由此可知,每个网格的labels是由长度为30的上述数据组成的;因为我们的图片划分为7*7个网格,所以就是有7*7个长度为30的数据组成整个图片的lables。即整张图片的labels数据形式为:7*7*30。labels数据矩阵如下图所示。

所以,我们输入网络的数据就是图片转为tensor的数据,inputs维度为:[batchsize,3,448,448].

网络的输入labels维度为:[batchsize,30,7,7]. 就是上边的数据矩阵。

网络的输出:[batchsize,30,7,7].

image-20251203132734579

由于 YOLOv1 将图片划分为 7 × 7 个 grid,虽然每个 grid 负责预测两个目标,但最后会通过抑制只保留一个匹配度最高的 bounding box,也就是说一张图我最多就给你预测七七 49 个目标,那么想一下,如果有两个相邻的目标落在了同一个 grid 中,那么势必会漏检一个,所以 YOLOv1 对于邻近目标的检测效果不好。

损失函数

image-20251203133017457

详细讲解见YOLO V1损失函数的理解 - GShang - 博客园

创新点

前人工作

  • DPM:采用滑动窗口策略,在整张图像上均匀地运行分类器
  • R-CNN: 先生成图像中的候选边界框,再在这些候选框上运行分类器

创新性工作

  1. 把目标检测问题直接定义为边界框坐标和类别概率的回归问题,在一张图像上定位和分类是同时做的,如上图左边,人,狗,马的一张图片放到YOLO经过裁剪图片后输入到单一的卷积网络经过最大值抑制之后输出了右边这张图,能够同时预测多个边界框及其对应的类别概率。
  2. YOLO 极其快速: YOLO 可以在不到 25 毫秒的延迟内处理视频流,实现真正的实时检测并且YOLO 的平均精度(mAP)比其他实时检测系统高出一倍以上。
  3. 具有很强的泛化能力:在拿毕加索的抽象艺术画进行预测的效果比前人的系统的性能强
  4. YOLO 在检测精度上仍落后于当时最先进的检测方法,特别是小目标

特别感谢:目标检测入门论文YOLOV1精读以及pytorch源码复现(yolov1) - 小小猿笔记 - 博客园

YOLOv2

论文地址:[1612.08242] YOLO9000: Better, Faster, Stronger]

时隔一年,YOLOv2隆重登场,新的YOLO版本论文叫《YOLO9000: Better, Faster, Stronger》,作者 Joseph Redmon 和 Ali Farhadi 在 YOLOv1 的基础上,进行了大量改进,提出了 YOLOv2 和 YOLO9000,重点解决YOLOv1召回率和定位精度方面的不足。

本文工作 (1)使用联合数据集: 利用已有的分类数据集,来拓展目标检测的范围。利用对象分类的分层视图,使得可以将不同数据集组合到一起

(2)提出联合训练算法: 可以在检测数据集和分类数据集上训练目标分类器,用标记的目标检测数据集优化定位精度,利用分类图像来增加其词汇量鲁棒性

(3)改进YOLOv1提出YOLOv2: 一种最先进的实时检测器

(4)提出YOLO9000: 先将YOLO优化成YOLOv2,再用联合方法训练出YOLO9000

Better

Batch Normalization

目的

CNN在训练过程中网络每层输入的分布一直在改变, 会使训练过程难度加大,对网络的每一层的输入(每个卷积层后)都做了归一化,这样网络就不需要每层都去学数据的分布,收敛会更快。

方法

在YOLO模型的所有卷积层上添加Batch Normalization。

Batch Normalization

效果

mAP获得了2%的提升。Batch Normalization 也有助于规范化模型,可以在舍弃Dropout优化后依然不会过拟合。

High Resolution Classifier

v1中的使用

v1中预训练使用的是分类数据集,大小是224×224 ,然后迁移学习,微调时使用YOLO模型做目标检测的时候才将输入变成448 × 448。这样改变尺寸,网络就要多重新学习一部分,会带来性能损失。

v2中的改进

v2直接在预训练中输入的就是448×448的尺寸,微调的时候也是448 × 448。

效果

使mAP增加了近4%

Convolution With Anchor Boxes

什么是Anchor?

定义: Anchor(先验框) 就是一组预设的边框,在训练时,以真实的边框位置相对于预设边框的偏移来构建训练样本。 这就相当于,预设边框先大致在可能的位置“框”出来目标,然后再在这些预设边框的基础上进行调整。简言之就是在图像上预设好的不同大小,不同长宽比的参照框。

Anchor Box: 一个Anchor Box可以由边框的纵横比和边框的面积(尺度)来定义,相当于一系列预设边框的生成规则,根据Anchor Box,可以在图像的任意位置,生成一系列的边框。由于Anchor Box 通常是以CNN提取到的Feature Map 的点为中心位置,生成边框,所以一个Anchor Box不需要指定中心位置。

Anchor Box的构成

  • 使用CNN提取的Feature Map的点,来定位目标的位置。
  • 使用Anchor Box的Scale来表示目标的大小。
  • 使用Anchor Box的Aspect Ratio来表示目标的形状。

模型将输入图片划分为13×13个grid cell,每个grid cell产生5个anchor。待检测物体的grid truth 的中心点落到哪个grid cell中,就由哪个grid cell中与grid truth IOU 最大的哪个anchor负责预测。相比于yolov1生成两个bounding box来说,这里我们只要生成预测框和anchor的偏移量,然后去调整anchor拟合grid truth就行。至于先验框anchor的形状是我们一开始就决定好了这个anchor要去预测矮胖还是高瘦的物体。

v2的改进

(1)删掉全连接层和最后一个pooling层,使得最后的卷积层可以有更高分辨率的特征

(2)缩小网络操作的输入图像为416×416

Q:为什么是416×416,而不是448×448?

YOLOv2模型下采样的总步长为32,对于416×416大小的图片,最终得到的特征图大小为13×13(416/32=13),特征图中有奇数个位置,所以只有一个中心单元格。物体往往占据图像的中心,所以最好在中心有一个单独的位置来预测这些物体,而不是在附近的四个位置。

(3)使用Anchor Boxes

对比项 YOLOv1 YOLOv2
初始设置 初始生成两个 boxes,加大了学习复杂度。 Anchor 初始是固定的,但在训练过程中会进行微调。使用 Anchor boxes 之后,每个位置的各个 Anchor box 都单独预测一组分类概率值。
输出公式 (框数 × 信息数 + 分类数) 框数 ×(信息数 + 分类数)
公式含义 在 YOLOv1 中,类别概率是由 grid cell 来预测的,每个 cell 都预测 2 个 boxes,每个 box 包含 5 个值;每个 grid cell 携带的是 30 个信息。但是每个 cell 只预测一组分类概率值,供 2 个 boxes 共享。 在 YOLOv2 中,类别概率是属于 box 的,每个 box 对应一个类别概率,而不是由 cell 决定,因此这里每个 box 对应 25 个预测值。每个 grid cell 携带的是 25 × 5 = 125 个信息,25 是 xywh + 置信度 + 分类数,5 就是 5 个 Anchor。
输出框 7 × 7 × 2 = 98 个框 13 × 13 × 5 = 845 个框
输出值 7 × 7 × 30 13 × 13 × 5 × 25

Dimension Clusters

使用Anchor的问题一

Anchor Boxes的尺寸是手工指定了长宽比和尺寸,相当于一个超参数,这违背了YOLO对于目标检测模型的初衷,因为如果指定了Anchor的大小就没办法适应各种各样的物体了。

解决方法

在训练集的边界框上运行K-means聚类训练bounding boxes,可以自动找到更好的boxes宽高维度。由上面分析已知,设置先验Anchor Boxes的主要目的是为了使得预测框与真值的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标

K-means算法步骤:

  1. 选择初始化的K个样本作为初始聚类中心
  2. 针对数据集中每个样本,计算它到K个聚类中心的距离,并将其分到距离最小的聚类中心所对应的类中
  3. 针对每个类别,重新计算它的聚类中心
  4. 重复上面的步骤2、3,直到达到某个终止条件(迭代次数、最小误差变化)

公式:d(box, centroid) = 1 − IOU(box, centroid)(box:其他框, centroid:聚类中心框)

如下图,选取不同的k值(聚类的个数)运行K-means算法,并画出平均IOU和K值的曲线图。当k = 5时,可以很好的权衡模型复杂性和高召回率。与手工挑选的相比,K-means算法挑选的检测框形状多为瘦高型。

Q:为什么不尽量选择大的k值?

因为K越大就生成越多的Anchor,越多的框自然准确率就能上去了,但同时也成倍的增加了模型的复杂度。R-CNN就是因为提取2K个候选框拉跨的。

Direct location prediction

Fine-Grained Features

Multi-Scale Training

Further Experiments

Faster

通常目标检测框架: 大多数检测框架依赖于VGG-16作为基本的特征提取器。VGG-16是一个强大、精确的分类网络,但是它计算复杂。

YOLO框架: 使用基于GoogLeNet架构的自定义网络。虽说整体mAP 表现较VGG-16 差一些,但是却换来更快速、更少的预测运算。

YOLOv2 框架: 使用的是一个全新的架构: Darknet-19

Darknet-19

Training for classification

Training for detection

Stronger

Hierarchical classification

Dataset combination with WordTree

Joint classification and detection

Conclusion

YOLOv2 是最先进的,在各种检测数据集上比其他检测系统更快。此外,它可以在各种图像大小下运行,以在速度和精度之间提供平滑的折中。

对比yolov1所作出的改进:

  • 加了BN(卷积后,激活函数前)
  • 加了高分辨率分类器;加了anchor(聚类得到个数,1个gird cell 生成5个anchor);限制预测框
  • 加入细粒度特征(类似于concat的残差)加入对尺度训练改进骨干网络(GoogleNet 变darknet-19)通过WordTree将不同数据集结合联合训练。
  • 用一种新颖的方法扩充了数据集。

YOLO9000 是一个实时框架,通过联合优化检测和分类,可检测9000多个对象类别。我们使用WordTree合并来自不同来源的数据,并使用我们的联合优化技术在ImageNet和CoCo上同时进行训练。

WordTree 的概念可以让分类标注提供更大的运用空间,并且可以利用来进行弱监督学习,也可以利用这样的概念结合各种不同任务的资料集,对于分类有很大的助益。

特别感谢:【YOLO系列】YOLOv2论文超详细解读(翻译 +学习笔记)-CSDN博客

YOLOv3

YOLOv3(《Yolov3:An incremental improvement》)是Joseph Redmon大佬关于YOLO系列的最后一篇,由于他反对将YOLO用于军事和隐私窥探,2020年2月宣布停止更新YOLO。

论文地址:[1804.02767] YOLOv3: An Incremental Improvement]

The Deal

Bounding Box Prediction

与YOLOv2相同之处

使用dimension clusters来找到先验anchor boxes,然后通过anchor boxes来预测边界框。

YOLOv3的改进

在YOLOv3 中,利用逻辑回归来预测每个边界框的客观性分数( object score ),也就是YOLOv1 论文中说的confidence :

  • 正样本: 如果当前预测的包围框比之前其他的任何包围框更好的与ground truth对象重合,那它的置信度就是 1。
  • 忽略样本: 如果当前预测的包围框不是最好的,但它和 ground truth对象重合了一定的阈值(这里是0.5)以上,神经网络会忽略这个预测。
  • 负样本: 若bounding box 没有与任一ground truth对象对应,那它的置信度就是 0

Q1:为什么YOLOv3要将正样本confidence score设置为1?

置信度意味着该预测框是或者不是一个真实物体,是一个二分类,所以标签是1、0更加合理。并且在学习小物体时,有很大程度会影响IOU。如果像YOLOv1使用bounding box与ground truth对象的IOU作为confidence,那么confidence score始终很小,无法有效学习,导致检测的Recall不高。

Q2:为什么存在忽略样本?

由于YOLOV3采用了多尺度的特征图进行检测,而不同尺度的特征图之间会有重合检测的部分。例如检测一个物体时,在训练时它被分配到的检测框是第一个特征图的第三个bounding box,IOU为0.98,此时恰好第二个特征图的第一个bounding box与该ground truth对象的IOU为0.95,也检测到了该ground truth对象,如果此时给其confidence score强行打0,网络学习的效果会不理想。

与Faster-RCNN 不同,YOLOv3 仅对每一个真实物体分配一个anchor box,若没有分配到anchor box 的真实物体,便不会有坐标误差,仅会具有object score 误差。

Class Prediction

原因

每个框使用多标签分类预测边界框可能包含的类

YOLOv3使用的方法

(1)YOLOv3 使用的是logistic 分类器,而不是之前使用的softmax。

(2)在YOLOv3 的训练中,便使用了Binary Cross Entropy ( BCE, 二元交叉熵) 来进行类别预测。

Q:softmax被替代的原因?

(1)softmax只适用于单目标多分类(甚至类别是互斥的假设),但目标检测任务中可能一个物体有多个标签。(属于多个类并且类别之间有相互关系),比如Person和Women。

(2)logistic激活函数来完成,这样就能预测每一个类别是or不是。

Predictions Across Scales

YOLOv3的改进

灵感来源: YOLOv3借鉴了FPN的方法,采用多尺度的特征图对不同大小的物体进行检测,以提升小物体的预测能力。

(1)YOLOv3采用了3个不同尺度的特征图(三个不同卷积层提取的特征)

YOLOv3通过下采样32倍、16倍和8倍得到3个不同尺度的特征图。

例如输入416X416的图像,则会得到13×13 (416/32),26×26(416/16) 以及52×52(416/8)这3个尺度的特征图。

(2)YOLOv3每个尺度的特征图上使用3个anchor box。

使用dimension clusters得到9个聚类中心(anchor boxes),并将这些anchor boxes划分到3个尺度特征图上,尺度更大的特征图使用更小的先验框。

(3)YOLOv3对每个尺度下的特征图都进行边界框的预测。

每种尺度的特征图上可以得到N × N × [3 ∗ (4 + 1 + 80)] 的结果(分别是N x N个 gird cell ,3种尺度的anchor boxes,4个边界框偏移值、1个目标预测置信度以及80种类别的预测概率。)

该方法允许从上采样的特征中获取更有意义的语义信息,从早期的特征图中获取更细粒度的信息。

不同尺度下的预测方法

(1)第一种尺度:

特征图: 对原图下采样32x得到(13 x 13)特征图

预测: 在上述特征图后添加几个卷积层,最后输出一个 N × N × [3 ∗ (4 + 1 + 80)] 的张量表示预测。——图中第3个红色部分

最终输出: [13, 13, 255]

(2)第二种尺度:

特征图: 来源于两种计算

  1. 对原图下采样16x得到 (26 x 26)特征图
  2. 对第一种尺度得到的(13 x 13)特征图进行上采样,得到(26 x 26)特征图。

两种计算得到的(26 x 26)特征图通过连接合并在一起。

预测: 在合并后的特征图后添加几个卷积层,最后输出一个 N × N × [3 ∗ (4 + 1 + 80)] 的张量表示预测。这个张量的大小是尺度一输出张量大小的两倍。——图中第2个红色部分

最终输出: [26, 26, 255]

(3)第三种尺度

特征图: 来源于两种计算

  1. 对原图下采样8x得到 (52 x 52)特征图
  2. 对第二种尺度得到的(26 x 26)特征图进行上采样,得到(52 x 52)特征图。

两种方式得到的(52 x 52)的特征图通过连接合并在一起。

预测: 在合并后的特征图后添加几个卷积层,最后输出一个 N × N × [3 ∗ (4 + 1 + 80)] 的张量表示预测。这个张量的大小是尺度二输出的两倍—-图中第1个红色部分。

对第三尺度的预测受益于所有的先验计算以及网络早期的细粒度特性。

最终输出: [52, 52, 255]

Q:合并(加入残差啊思想)的目的:

在每一种维度输出之前还有一个分支就是和下一路进行concat拼接(上一层进行上采样后拼接)。这样加入残差思想,保留各种维度特征(底层像素+高层语义)。三个尺度就可以预测各种不同大小的物体了。

结构模型示意图

Feature Extractor

作者是将darknet-19里加入了ResNet残差连接,改进之后的模型叫Darknet-53

Darknet-53主要做了如下改进:

(1)没有采用最大池化层,转而采用步长为2的卷积层进行下采样。

(2)为了防止过拟合,在每个卷积层之后加入了一个BN层和一个Leaky ReLU。

(3)引入了残差网络的思想,目的是为了让网络可以提取到更深层的特征,同时避免出现梯度消失或爆炸。

(4)将网络的中间层和后面某一层的上采样进行张量拼接,达到多尺度特征融合的目的。

Darknet-53的性能与最先进的分类器相当,但浮点运算更少,速度更快。Darknet-53还实现了每秒最高的浮点运算。这意味着网络结构更好地利用了GPU,使其评估更高效,从而更快。

Training

翻译

我们仍然在完整的图像上进行训练,没有硬性的负面挖掘或任何这些东西。我们使用多尺度训练,大量的数据增强,批量归一化,所有标准的东西。我们使用Darknet神经网络框架进行训练和测试[14]。

精读

(1)训练完整的图像,没有硬负面挖掘。

(2)使用多尺度的训练,大量的数据扩充,批量标准化。

(3)使用Darknet神经网络框架来训练和测试。

How We Do

APs: 小目标(area(框大小)<32×32)的AP

APm: 中目标(32×32<area<96×96)的AP

APl: 大目标(96×96<area)的AP

结论

  • YOLOv3 擅于预测出「合适」,但无法预测出非常精准的边界框。
  • YOLOv3 小目标预测能力提升,但中大目标的预测反而相对较差。
  • 若将速度考量进来,YOLOv3 整体来说表现非常出色。

YOLOv3在小目标/密集目标的改进

  1. grid cell个数增加,YOLOv1(7×7),YOLOv2(13×13),YOLOv3(13×13+26×26+52×52)
  2. YOLOv2和YOLOv3可以输入任意大小的图片,输入图片越大,产生的grid cell越多,产生的预测框也就越多
  3. 专门小目标预先设置了一些固定长宽比的anchor,直接生成小目标的预测框是比较难的,但是在小预测框基础上再生成小目标的预测框是比较容易的
  4. 多尺度预测(借鉴了FPN),既发挥了深层网络的特化语义特征,又整合了浅层网络的细腻度的像素结构信息
  5. 对于小目标而言,边缘轮廓是非常重要的,即浅层网络的边缘信息。在损失函数中有着惩罚小框项
  6. 网络结构:网络加了跨层连接和残差连接(shortcut connection),这样可以整合各个层的特征,这样使得网络本身的特征提取能力提升了

Things We Tried That Didn’t Work

这部分不用深入研究,因为这是作者也没有捣鼓清楚的内容~

(1)预测相对于初始anchor宽高倍数的偏移量 ,使用线性激活预测x, y偏移为的anchor box的宽度或高度的倍数。这种方法降低了模型的稳定性,效果不是很好

(2)使用线性激活来直接预测x, y偏移量,而不是逻辑逻辑激活。这导致了一些mAP的下降。

(3)Focal loss (用于图像领域解决数据不平衡造成的模型性能问题,也就是正负样本不均衡,正样本少的问题)。mAPx下降2个点。YOLOv3可能已经对focal loss试图解决的问题很健壮,因为它有独立的目标预测和条件类预测。

(4)Faster RCNN在训练中使用两个IOU阈值。如果预测框与真值 IOU大于0.7的,则边界框作为正样本。如果IOU在0.3-0.7之间它被忽略,小于0.3阈值时,它是一个负样本。我们尝试了类似的策略,但没有得到好的结果。

What This All Means

翻译

YOLOv3是一个好的检测器。它的速度很快,很准确。它在0.5和0.95 IOU之间的COCO平均AP指标上不那么好。但它在旧的检测指标0.5 IOU上是非常好的。

我们到底为什么要转换指标?最初的COCO论文中只有这样一句话:“关于评估指标的全面讨论。“一旦评估服务器完成,将增加对评估指标的全面讨论”。Russakovsky等人报告说,人类很难区分0.3和0.5的IOU! “训练人类目测一个IOU为0.3的边界框并将其与一个IOU为0.5的边界框区分开来是非常困难的。” [18] 如果人类很难区分,那么这又有多大关系呢?但也许一个更好的问题是:“既然我们有了这些探测器,我们要用它们做什么?” 很多做这项研究的人都在谷歌和Facebook。

我想至少我们知道这项技术是在良好的手中,绝对不会被用来收集你的个人信息并出售给…,等等,你是说这正是它将被用来做什么?哦。

好吧,其他大量资助视觉研究的人是军方,他们从来没有做过任何可怕的事情,比如用新技术杀死很多人,哦,等等…1,我很希望大多数使用计算机视觉的人只是在用它做快乐的好事,比如计算国家公园里斑马的数量[13],或者跟踪他们的猫在家里徘徊[19]。但是,计算机视觉已经被用于可疑的用途,作为研究人员,我们有责任至少考虑我们的工作可能造成的伤害,并想办法减轻它。我们欠世界这么多。

最后,请不要@我。(因为我终于退出了Twitter)。

其实这一段也就是作者表达了自己的三观:

作者希望计算机视觉可以用在好的、对的事情上面。Love&Peace~

总结

对比项 YOLOv1 YOLOv2 YOLOv3
输入图像尺寸 输入的是 448×448 的三通道图像 输入的是 416×416 的三通道图像 输入的是 416×416 的三通道图像
grid cell 每张图像划分为 7×7 = 49 个 grid cell 每张图像划分为 13×13 = 169 个 grid cell YOLOv3 产生三个尺度:13×13、26×26、52×52,也对应着 grid cell 个数
bbox / anchor 每个 grid cell 生成 2 个 bbox(没有 anchor),与真实框 IOU 最大的那个框负责拟合真实框 每个 grid cell 生成 5 个 anchor 框,通过 IOU 计算选一个 anchor 产生预测框去拟合真实框 每个 grid cell 生成 3 个 anchor 框,通过与 gt 的 IOU 计算选一个 anchor 产生预测框去拟合真实框
输出张量 输出 7×7×30 维的张量(30 的含义:两组 bbox 的 xywh 和置信度 + 20 个类别) 输出 13×13×125 维张量(125 的含义:5 组 anchor 的 xywh 和置信度 + 20 个类别) 输出三个不同尺度的张量,但最后维度都是 255,例如 S×S×255(255 的含义:3 组 anchor 的 xywh + 置信度 + 分类数;COCO 数据集 80 类,因此为 3×(80+5))
预测框数量 7×7×2 = 98 个预测框 13×13×5 = 845 个预测框 (52×52 + 26×26 + 13×13) × 3 = 10647 个预测框

YOLOv4

论文地址:[2004.10934] YOLOv4: Optimal Speed and Accuracy of Object Detection]