• 概括:本文提出了流行的实时目标检测算法系列YOLO(You Only Look Once)的首个版本,具有如下特点
  1. 端到端的单阶段检测:将目标检测任务视为一个回归问题,同时预测边界框的位置和类别
  2. 全图预测:将整个图像作为输入,一次性输出所有目标的位置和类别,因此只需单次前向传播
  3. 网格分割:图像被分割成网格,每个网格单元负责预测包含其中心的目标
  4. 损失函数:使用复合 mse loss 来同时衡量目标位置误差、置信度误差和类别预测误差
  5. 高速度:由于预测过程只需一次前向传播,速度遥遥领先,适合需要实时目标检测的应用场景
  6. 缺点:在小目标检测和定位精度上有所不足
  • 摘要:我们提出了 YOLO,一种新的目标检测方法。以前的目标检测工作重复利用分类器来完成检测任务。相反,我们将目标检测框架看作回归问题,从空间上分割边界框和相关的类别概率。单个神经网络在一次评估中直接从整个图像上预测边界框和类别概率。由于整个检测流水线是单一网络,因此可以直接对检测性能进行端到端的优化。我们的统一架构非常快。基础 YOLO 模型以 45 帧/秒的速度实时处理图像;Fast YOLO 是 YOLO 的一个较小版本,每秒能处理惊人的 155 帧图像,同时实现其它实时检测器两倍的 mAP。与最先进的检测系统相比,YOLO 虽然存在较多的定位错误,但很少将背景预测成假阳性(译者注:其它先进的目标检测算法将背景预测成目标的概率较大)。最后,YOLO 能学习到目标非常通用的表示。当从自然图像到艺术品等其它领域泛化时,它都优于其它检测方法,包括 DPM 和 R-CNN


文章目录
  • 1. 计算机视觉背景知识
  • 1.1 各种经典 CV 任务
  • 1.2 目标检测方法
  • 2. YOLO-V1
  • 2.1 二阶段方法的问题
  • 2.2 本文方法
  • 2.2.1 模型结构
  • 2.2.2 后处理方法
  • 2.2.3 训练方法
  • 2.2.4 训练细节
  • 2.3 性能对比
  • 3. 总结


1. 计算机视觉背景知识

1.1 各种经典 CV 任务

  • 目标识别目标检测图像分割 和是计算机视觉领域的三大经典任务,其中图像分割又分为 语义分割实例分割,它们都是基于图像数据的
  • 目标识别/图像分类:输入图像后,模型要基于整张图预测其中显示的目标的类型,通常输出图中所有对象的类别标签。应用于图像搜索、内容识别、安防监控等任务场景。这类任务的难点在于区分前景和背景
  • 目标检测:在目标识别的基础上,进一步检测图片中目标的具体位置和尺寸。一般以 bonding box(包围框)的形式描述目标位置。应用于智能交通、人脸识别、物体追踪等需要准确定位目标的任务。YOLO 是当今最流行的目标检测系列算法
  • 图像分割输入图像后,模型要将目标对应的部分分割出来,即分出前景并把背景去除。这意味着模型要进行逐像素分类,将涉及各个目标的每个像素都标注出来,从而获得每个像素的语义信息。应用于医学图像分析、自动驾驶、遥感图像分析等领域(例如车道线标注)
  1. 语义分割:仅区分不同对象类型,不区分同类对象内部的多个实例
  2. 实例分割:不仅区分对象类型,还要区分同类对象的不同实例
  • 以上各类任务中,只有目标检测和实例分割实现了实例级别的识别,以这二者为基础进一步发展出了基于视频数据的 目标追踪 任务
  • 目标追踪:指对视频序列中的目标进行持续追踪,保持目标的标识在不同帧之间的连续性。利用图像帧之间的时序相关性,模型要对一些简单的旋转、遮盖、缩放等线性或非线性变换具有鲁棒性。应用于视频监控、行为识别、自动驾驶系统等需要实时跟踪目标的场景。目标追踪一般建立在目标检测和目标识别的基础上,但不等于在每一帧图像上进行目标检测,因为在目标追踪中,模型要能够持续地区分多个同类目标

1.2 目标检测方法

  • 论文  Object Detection in 20 Years: A Survey 对目标检测方法进行了较好的综述,近年来发展脉络如下

    可见,现代目标识别方法可以分为一阶段方法和二阶段方法两条路线
  1. 二阶段方法:以 R-CNN 为代表,先从图像中回归出若干候选框,再对生成的候选区域进行目标分类和边界框细化。这类方法在较为复杂的场景中具有更好的准确性,容易对不同尺寸的目标进行检测;但需要额外的候选框生成步骤,计算量较大,延迟高,不适合实时应用
  2. 一阶段方法:以 YOLO 系列为代表,使用单个深度神经网络直接从图像中检测目标,无需显式的提取候选区域。这些方法通常在一次前向推理过程中同时预测边界框和类别,训练和推理流程都更简单,运行速度快,适用于实时应用;但精度通常不如二阶段方法,对小目标和遮挡情况不够稳健(现在新版本的 YOLO 已经基本解决了这些问题)
  • 总体而言,一阶段方法更适合要求速度和简洁性的场景,而二阶段方法在需要更高准确性和对复杂场景的处理时更为合适,YOLO 系列不但是一阶段方法的开山之作,而且是当今最主流、应用最广泛的目标检测方法

2. YOLO-V1

2.1 二阶段方法的问题

  • YOLO-V1 是一阶段方法的开山之作,以识别图中单一目标为例(这时多分类简化为二分类),当时二阶段方法 DPM 的基本思想是 滑动窗口分类
  1. 训练一个二分类目标识别模型,输入一张图片,输出此图片中是否存在目标
  2. 设置一个滑动窗口,在测试图片中从上到下从左到右滑动,将截取的部分图像归一化到二分类模型输入尺寸后,利用目标识别模型检查其中是否存在目标。以一定的 x, y 步进值扫描整张测试图像,检测各个位置是否存在目标
  3. 多次缩放滑动窗口的尺寸,重复步骤 2,保留所有识别到的目标位置和窗口尺寸
  4. 以 bounding box 形式输出目标位置
  • 这类方法的问题在于
  1. 检测精度和计算成本之间存在 trade-off,要提高检测精度,就必须缩小滑动步进值和窗口尺寸步进值,导致检测成本成倍提升
  2. 训练二分类目标识别模型时,需要手动构造训练集图像各位置各尺寸裁剪框的图像,数据处理繁琐
  3. 二分类目标识别模型训练集中,目标(前景)样本少,不存在目标(背景)的样本多,样本不均匀导致二分类模型容易过拟合前景而欠拟合背景,这有两个后果
  • 在第二阶段的滑动窗口过程中,由于二分类模型只能获取局部信息,容易把背景误检测为目标
  • 由于过拟合训练集目标(前景),这类方法的泛化能力较差(比如用实物照片训练,在艺术作品上评估)

2.2 本文方法

  • 针对传统方法的三个问题,YOLO 提出把以上二阶段流程改成一阶段的端到端模型,即输入原始图像后,直接输出目标的类型和位置,如下
  • 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别

  • 其中 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLOV1_02 表示目标中心位置,论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_二分类_03 表示目标尺寸,论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLOV1_04 表示存在目标的概率。构造训练集时,将数据集构造成 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_二分类_05 形式,其中 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLO_06 为输入图像,带 * 的表示真实标记值;模型使用卷积网络提取特征并输出五元组,分别接五个 mes loss 优化即可。这种方案无需复杂的数据裁切预处理、无需训练单独的目标识别模型、无需二阶段的滑动窗口机制、利用全局信息一次前向传播生成结果,速度快,泛化性好,不易误识别背景,已经有潜力解决二阶段方案的所有问题
  • 以上思路局限是其仅能识别单一目标和单一类型,即仅能在图中检测出一个葫芦娃头像及其所在位置,不能检测多个目标,也不能检测火焰、石头等其他类型。为了解决这个问题,YOLO-V1 做两点改动
  1. 为识别多个目标,YOLO 将原始输入图像划分成 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标检测_07 的网格,每个网格看作一个局部检测器,它会生成 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_08 个检测框,每个检测框的中心点位于该格子内,用于识别中心点落入此格内的多个目标,每个检测框具有以上 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_09 五个参数。模型要为此输出 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标检测_10 个值
  • 这种方式的合理性在于conv操作是位置强相关的,即原来的目标在哪里,conv之后的feature map上还在哪里,所以图片划分为16个区域,结果也应该分布在16个区域上
  • 论文中将这里的 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLOV1_11 称为为置信度(confidence),它不仅描述目标存在的概率,还同时描述预测检测框 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_二分类_12,定义为
    论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLO_13 其中 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_14 表示目标存在的概率,论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLO_15 表示预测框 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标检测_16
  1. 为了识别多个类型,YOLO 不止预测一个二分类置信度,而是要预测目标属于所有 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_二分类_17 个类别的的概率分布。结合 1 中的划分网格设计,每个网格都要进行一次预测,代表该网络中存在目标中心点时,目标属于某个类别的条件概率,模型要为此输出 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_18
  • 综上,模型输入是原始图像,输出是 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标检测_19 尺寸的张量。在 YOLO-V1 的原始设计中 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLO_20,输出结果如下所示
  • 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_21

  • 注意,为了得到某个网格中某个检测框预测的各目标概率 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_22,需要把该检测框存在目标的置信度 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标检测_23 和该网格预测的类别条件概率 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLOV1_24
  • 可视化例子如下,首先把原始输入划分成 7x7 的网格,一方面 YOLO-V1 对每个网格预测两个检测框(如中上图所示,共有 49 个框,用框线粗细表示其中存在目标的置信度大小);另一方面 YOLO-V1 对每个网络预测其中目标属于 20 个候选类别的分布律(如中下图所示,用颜色区别类别,绘制各个网格中最大概率类别),这两组信息通过后处理得到最终的检测结果
  • 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLO_25

  • 具体的后处理方法详见 3.1.2 节
2.2.1 模型结构
  • 了解模型的输入输出后,弄懂模型结构设计就很简单了,如下所示

    一共用了 24 个卷积层,其中大量使用 1x1 卷积调节通道数(特征维数),并使用最大池化层进行下采样,最后一个卷积层输出尺寸为 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLOV1_26,使用一个中间尺寸为 4096 的 MLP 调整输出维度,该 MLP 输入为 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_二分类_27 维的拉平张量,输出为 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_28 维张量,再 reshape 成 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_二分类_29
  • 所有网络层的输入输出尺寸如下,注意这里所有卷积层都使用了same padding,即调整padding尺寸以保持输出特征图的长宽尺寸和输入一致
  • 复现代码参考  YOLOv1-from-scratch,一下是其定义的模型结构节选,该作者使用 resnet 替代了部分卷积层,这种做法是明智的,因为 YOLO-V1 的核心是一阶段思想和输出设计,网络结构本身不是重点,使用近年来新出现的高质量结构可以优化性能,而且还可以利用预训练 resnet 进行初始化
class YOLOV1(nn.Module):
    def __init__(self):
        super(MyNet, self).__init__()
        resnet = tvmodel.resnet34(pretrained=True)  # 调用torchvision里的resnet34预训练模型
        resnet_out_channel = resnet.fc.in_features  # 记录resnet全连接层之前的网络输出通道数,方便连入后续卷积网络中
        self.resnet = nn.Sequential(*list(resnet.children())[:-2])  # 去除resnet的最后两层
        
        # 以下是YOLOv1的最后四个卷积层
        self.Conv_layers = nn.Sequential(
            nn.Conv2d(resnet_out_channel, 1024, 3, padding=1),
            nn.BatchNorm2d(1024),  # 为了加快训练,这里增加了BN层,原论文里YOLOv1是没有的
            nn.LeakyReLU(inplace=True),
            nn.Conv2d(1024, 1024, 3, stride=2, padding=1),
            nn.BatchNorm2d(1024),
            nn.LeakyReLU(inplace=True),
            nn.Conv2d(1024, 1024, 3, padding=1),
            nn.BatchNorm2d(1024),
            nn.LeakyReLU(inplace=True),
            nn.Conv2d(1024, 1024, 3, padding=1),
            nn.BatchNorm2d(1024),
            nn.LeakyReLU(inplace=True),
        )
        
        # 以下是YOLOv1的最后2个全连接层
        self.Conn_layers = nn.Sequential(
            nn.Linear(GL_NUMGRID * GL_NUMGRID * 1024, 4096),
            nn.LeakyReLU(inplace=True),
            nn.Linear(4096, GL_NUMGRID * GL_NUMGRID * (5*GL_NUMBBOX+len(GL_CLASSES))),
            nn.Sigmoid()  # 增加sigmoid函数是为了将输出全部映射到(0,1)之间,因为如果出现负数或太大的数,后续计算loss会很麻烦
        )


    def forward(self, inputs):
        x = self.resnet(inputs)
        x = self.Conv_layers(x)
        x = x.view(x.size()[0], -1)
        x = self.Conn_layers(x)
        self.pred = x.reshape(-1, (5 * GL_NUMBBOX + len(GL_CLASSES)), GL_NUMGRID, GL_NUMGRID)  # 记住最后要reshape一下输出数据
        return self.pred
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
2.2.2 后处理方法
  • 本节进一步说明本章开头提到的后处理方法,注意这仅仅是用于推断阶段的。现在我们把某张图像输入了训练好的 YOLO-V1 模型,得到了 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_二分类_29 的网络输出,其中 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_31 代表 49 个网格划分,对于其中第 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_32 个格子,论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标检测_33 中前 10 维代表该格子预测的两个目标边界框的目标存在置信度 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLOV1_34 和位置信息,后 20 维代表该格子预测的 20 个候选类别的条件概率分布律。将分布律分别与 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLOV1_34 相乘,可以计算两组候选类别分布律,一共 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_36 个候选框及其候选类别分布律,可视化为以下中图。后处理方法就是从这个中间图得等最终结果的方法
  • 首先,把中间结果处理为尺寸为 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_二分类_37 的张量,每行代表一个候选类别在所有预测边界框的预测概率,以其中 “向日葵” 类别为例,考察其对应的 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLO_38 尺寸张量
  1. 设置一个最小概率阈值,把小于该阈值的框概率清零,排除掉图中不存在的候选类别
  2. 如果还存在非零框概率,说明图中至少存在一个 “向日葵” 目标,将剩下的框概率从大到小排序
  3. 使用 非极大值抑制 方法去掉重叠的边界框
  1. 保留最高预测概率的边界框
  2. 按概率从大到小顺序考察其他边界框,计算两个框之间的 IOU,如果IOU大于某个阈值,则认为两个框重复识别了相同目标,把低概率的框(绿框)概率清零。阈值可以设为 0,这样所有和最大概率框重叠的框都被去掉了
  3. 清零了若干边界框位置后,可能出现某个边界框和最大值框的 IOU 小于阈值,这意味着图图中可能存在另一个 “向日葵” 目标,将它设为新的最高概率边框,重复步骤 2
  4. 重复步骤 3,直到剩下边界框的最大概率为 0 为止
  • 对每个候选类别对应的行向量进行以上处理后,最后 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_二分类_37 的中间张量会变得很稀疏,其中很多行是全零的,代表该候选类别未出现在图中;也有很多列是全零的,代表该检测框中没有检测出任何候选类别目标。而每个非零元素,代表在对应框中检测出了对应候选目标,置信概率为元素值,将所有非零元素可视化即得等最终结果
2.2.3 训练方法
  • 在 YOLO-V1 的设计中,一个网格会预测两个边界框,当确实有 label 的目标中心点落入该格内时,两个边界框中仅有一个会用来拟合label,这个选择是根据模型预测边界框和 label 边界框的 IOU 来确定的,IOU 较大的在该轮优化过程中胜出,另一个则被淘汰
  • 下面给出训练使用的损失函数

    这个损失写得很复杂,原文中解释也比较模糊,所以不容易看懂。首先解释一下符号
    论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标检测_40 这意味着
  1. 只要有label中心落入网格论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_二分类_41论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLO_42
  2. 仅对于 “存在label中心落入的网格论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标检测_43中,和label边框IOU较大的预测边框论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLO_44 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_45
  3. 对于 “无label中心落入网格的所有预测框,或是有label落入但被淘汰的边界框” 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_46
  • 回到之前的 loss,其实它本质就是五个 mse loss 的加权求和,所有带 hat 上标的为来自 label 的 ground truth。我们拆开来看,总体可以分成三部分
  1. 边界框定位误差:损失中的前两行分别描述边界框的位置误差和尺寸误差,需要注意的是这些数据都是被标准化到 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_二分类_47,具体而言

    对于 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLO_48论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_49,如下进行标准化
    论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_50 此外,注意到计算损失的时候 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_49 都被开了根号,这是因为对于取值 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_52 之间的数,开根号后数值变大了,这相当于提高了 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标检测_53 的损失权值,且 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标检测_53,这是有道理的,因为相同的偏差数值,对于小边框来说偏差的比例是更大的。最后,在所有 98 个预测框中,真实存在目标的框其实很少,即只有少数框 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_45,为此作者使用 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLOV1_56
  2. 负责预测物体的bbox置信度误差:损失中的第三行,这一行也是仅针对 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_45 的少数存在真实 label 中心且 IOU 胜出的边界框计算的。其中 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLO_58 直接从网络输出中获取,论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_59 如下计算
    论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标检测_60 这意味着训练过程中每一步迭代时,都要从模型该轮预测中取出胜出边界框的 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标检测_61,实时计算其与真实边界框 ground truth 的 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLOV1_62
  3. 不负责预测物体的bbox误差:损失中第四行,和上一个基本一致,只是由于不预测真实目标的边界框存在两个来源,论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_目标识别_59 应如下计算
    论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLO_64 由于不负责预测物体的边界框占大多数,所以它的损失权重要调低,作者在此设置 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_二分类_65
  4. 网格预测的物体分类误差:损失中最后一行,这里分类误差简单地使用 MSEloss 来处理,而不是像常规的分类问题那样使用交叉熵损失函数来处理
  • 下图对损失函数的各项进行了注释
2.2.4 训练细节
  1. 预训练+微调:作者先将前 20 层卷积层拿出来,后面连接一个池化层和全连接层,在 ImageNet 数据集上进行图像分类任务的训练,训练了一周左右。目的是为了让 YOLO 网络的前 20 层具备很好的特征提取能力。然后将预训练好的 20 层网络的参数导入 3.1.1 节描述的 YOLO-V1 网络中,再用 VOC2007 和 VOC2012 数据集进行完整网络的目标检测训练
  2. 防止过拟合:在两个全连接层之间采用 p=0.5 的 dropout 层防止过拟合
  3. 数据增广:作者使用两种数据增广方案:最高达到原始图像尺寸 20% 的随机缩放和转换;在 0.5~1.5 的比例之间随机调整图像的饱和度。在增广数据的同时,要注意对应调整样本标签的边界框信息
  4. 训练参数:作者目标检测的任务训练了 135 个 epoch,batch_size=64,momentum=0.9,decay=0.0005。使用了动态调度的学习率,从 0.001 开始,在第一个 epoch 训练的过程中慢慢提升到 0.01,这么做是因为网络训练如果一开始学习率太大很容易发散。之后稳定使用 0.01 训练 75 个epoch,再用 0.001 训练 30 个epoch,最后用 0.0001 训练最后 30 个epoch

2.3 性能对比

  • 本文的对比方法都是 R-CNN、DPM 等经典二阶段方法,指标主要有两个
  1. mAP:结合了准确率(Precision)和召回率(Recall)的概念,可以综合评估模型检测出目标、准确地定位目标和预测其类别的能力
  2. FPS:每秒可以检测多少张图像,用于评估模型的求解速度
  • 实验发现,YOLO-V1 在速度和准确性之间取得了很好的权衡

    YOLO-V1 的准确度介于 R-CNN 和 Fast R-CNN 之间,但是速度快非常多
  • 作者对比了 YOLO 和 Fast R-CNN 的预测错误类型 & 比例
  1. R-CNN 作为两阶段方法,整体准确率较高
  2. R-CNN 背景误识别问题比较严重,这是因为其预测时只能获取局部信息;YOLO 则可以综合全局信息综合判断,不太容易出现背景假阳性错误
  3. YOLO 在定位方面错误更多,这是因为 YOLO 在用一个阶段内完成定位和识别两件事,相比两阶段把定位和识别拆开处理肯定是较差的。不过现在新版本的 YOLO 已经解决了这些问题

作者注意到 Fast R-CNN 和 YOLO 的优势是互补的,同时使用两者进行集成学习,取得了很好的效果

  • 由于 YOLO 使用全局信息进行预测,它的迁移泛化能力更强。使用自然图像数据训练 YOLO 模型,然后在艺术作品数据上进行评估,YOLO 的性能下降最少
  • YOLO-V1 的缺点是其每个网格点只能预测一个目标,对于小目标或者密集目标表现不佳。另外,由于标准 CNN 骨干仅满足平移不变性,要想训练好 YOLO,就要保证其输出边界框的 论文理解【CV-目标检测】——【YOLO-V1】You Only Look Once: Unified, Real-Time Object Detection_YOLOV1_66

3. 总结

  • YOLO-V1 作为一阶段目标检测方法的开山之作,最大的优点就是快,虽然精度差了一些,但是速度快到让事实目标检测称为可能,这就是量变到质变了
  • YOLO-V1 的网络设计没有什么特别的,所有精华都在于输入输出的设置上,或者说映射关系的设计上,这再次说明了神经网络作为万能函数拟合器的强大之处,这个思路也可以用到我们的研究中去,如果某个任务原来的流程很复杂,可以考虑下能不能用神经网络直接端到端训练(当然这里也要考虑好模型的归纳偏置),现在流行的端到端自动驾驶也可以看作这个范畴
  • 参考:
  1. 经典论文解析——YOLOv1——目标检测
  2.  【精读AI论文】YOLO V1目标检测,看我就够了
  3.  你一定从未看过如此通俗易懂的YOLO系列(从v1到v5)模型解读