购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第3章
YOLOv1

本章将详细介绍one-stage流派的开山之作YOLOv1。尽管YOLOv1已经是2015年的工作了,以现在的技术眼光来看,YOLOv1有着太多不完善的地方,但正是这些不完善之处,为后续诸多先进的工作奠定了基础。正所谓“温故知新”,虽然YOLOv1已经过时了,但是它为one-stage架构奠定了重要的基础,其中很多设计理念至今还能够在先进的目标检测框架中有所体现。并且,也正是因为YOLOv1略显久远,它的架构自然也是简单、易于理解的,尚无复杂的模块,这对于初学者来说是极为友好的,就好比在学习高等数学之前,我们也总是要先从简单乘法知识学起,而非一上来就面对牛顿-莱布尼茨公式。充分掌握YOLOv1的基本原理对于我们后续学习YOLOv2、YOLOv3和YOLOv4都会有极大的帮助,所以,希望每一位读者都能够重视本章的内容。

3.1 YOLOv1的网络结构

作为one-stage流派的开山之祖,YOLOv1以其简洁的网络结构和在GPU上的实时检测速度两方面的优势一鸣惊人,开辟了完全不同于R-CNN的新技术路线,引发了目标检测领域的巨大变革。

如果以现在的眼光来看待YOLOv1,不难发现其中有诸多设计上的缺陷,但YOLOv1是这一派系发展之源头,在它被提出的那一年,YOLOv1的特色吸引了诸多研究者的注意,他们看出了其中所蕴含的研究潜力和研究价值,自此之后,大批one-stage框架被提出,一代又一代地、前赴后继地优化这一全新的框架,使其成为了目标检测领域发展的主流,对于这一切的发展,YOLOv1功不可没。

YOLOv1的思想十分简洁: 仅使用一个卷积神经网络来端到端地检测目标 。这一思想是对应当时主流的以R-CNN系列为代表的two-stage流派。从网络结构上来看,YOLOv1仿照GoogLeNet网络 [33] 来设计主干网络,但没有采用GoogLeNet的Inception模块,而是使用串联的 卷积和 卷积所组成的模块,所以它的主干网络的结构非常简单。图3-1展示了YOLOv1的网络结构。

图3-1 YOLOv1的网络结构(摘自论文[1])

在YOLO所处的年代,图像分类网络都会将特征图展平(flatten),得到一个一维特征向量,然后连接全连接层去做预测。YOLOv1 继承了这个思想,将主干网络最后输出的特征图 调整为一维向量 ,其中 。然后,YOLOv1部署若干全连接层(fully connected layer)来处理该特征向量。根据图3-1中的网络结构,这里的 分别是7、7和1024。再连接一层包含4096个神经元的全连接层做进一步处理,得到特征维度为4096的特征向量。最后,部署一个包含1470个神经元的全连接层,输出最终的预测。不过,考虑到目标检测是一个空间任务,YOLOv1又将这个特征维度为1470的输出向量转换为一个三维矩阵 ,其中, 是这个三维矩阵的空间尺寸,30是该三维矩阵的通道数。在深度学习中,通常三维及三维以上的矩阵都称为张量(tensor)。

这里需要做一个简单的计算,从特征图被展平,再到连接4096的全连接层时,可以用以下算式很容易估算出其中的参数量:

(3-1)

显然,仅这一层的参数量就已经达到了十的八次方级,虽然如此之多的参数并不意味着模型推理速度一定会很慢,但必然会对内存产生巨大的压力。从资源占用的角度来看,YOLOv1的这一缺陷是致命的。显然,这一缺陷来自网络结构本身,因此,这一点也为YOLO的后续改进埋下了伏笔。当然,这个问题并不是YOLOv1本身的问题,而是那个时代做图像分类任务的通病。尽管后来这一操作被 全局平均池化 (global average pooling)所取代,但全局平均池化并不太适合目标检测这一类对空间局部信息较为敏感的任务。即便如此,YOLOv1还是以其快速的检测速度与不凡的检测精度而引人注目。

图3-2展示了YOLOv1在VOC数据集上与其他模型的性能对比。我们主要关注其中的两个指标,一个是衡量模型检测性能的平均精度(mean average precision,mAP),另一个是衡量模型检测速度的每秒帧数(frames per second,FPS)。迄今为止,mAP是目标检测领域常用的性能评价指标,其数值越高,意味着模型的检测性能越好。简单地说,mAP的计算思路是先计算每个类别的AP,然后把所有类别的AP加和并求平均值。至于计算AP 的具体操作,读者暂不必关注,本书会提供相关的计算代码供读者使用,在入门阶段,我们只需关注技术本身,不要陷入细节的漩涡之中。FPS是指网络每秒可以处理多少张图像(从输入一张图像到输出图像中的目标的检测结果)。FPS的数值越大,意味着模型的检测速度越快。

图3-2 YOLOv1在VOC数据集上与其他模型的性能对比(摘自论文 [1]

尽管YOLOv1在mAP上略逊于Faster R-CNN,但YOLOv1的速度更快。从实用性的角度来说,速度有时是一个重要的指标,它往往会决定该算法能否被部署到实际场景中去满足实际的需求。毕竟,不是所有情况下都有高算力的GPU来支持超大模型的计算。在作者看来,一个良好的科研思路就是辩证地看待每一项技术的优劣点,而非固守着“唯SOTA(state-of-the-art)论”的极端理念,那样只会让学术研究误入歧途。在那个时候,正是因为有很多研究者看到了YOLOv1所蕴含的研究价值和研究潜力,才有了后来的one-stage框架的蓬勃发展。如今,one-stage框架的相关工作已经在速度和精度之间取得了良好的平衡,成为了目标检测领域的主流技术路线。对此,YOLOv1的作者团队功不可没。

3.2 YOLOv1的检测原理

现在,我们从网络结构的角度来研究一下YOLOv1到底是如何工作的。

从整体上来看,YOLOv1网络接收一张空间尺寸为 的RGB图像,经由主干网络处理后输出一个空间大小被降采样64倍的特征图,记作 。该特征图 是一个三维张量, 与输入图像的一般数学关系如下。

(3-2)

其中, 是网络的输出步长,其值通常等于网络的降采样倍数。依据YOLOv1论文所给出的配置,这里的 均为448, 为64,那么就可以很容易地算出来 均为7,即主干网络输出的特征图的高和宽均为7。而 是输出特征图的通道数,依据YOLOv1 的设置, 为1024。

随后,特征图 再由若干全连接层处理以及一些必要的维度转换的操作后,得到最终的输出 。我们可以把 想象成一个大小为 的立方体, 这个维度可以想象成一个 网格 (grid),每一个网格 都是一个特征维度为30的向量,YOLOv1的输入与输出如图3-3所示。

图3-3 YOLOv1的输入与输出

在每一个网格 处,这个长度为30的向量都包含了两个边界框的参数以及 总数为20的类别数量 (VOC数据集上的类别数量),其中每一个边界框都包括一个 置信度 (confidence)、 边界框位置参数 表示边界框的中心点 相较于网格左上角点的偏移量 以及 边界框的宽和高 。将这些参数的数量加起来便可以得到前面所说的“30”这个数字。更一般地,我们可以用公式 来计算输出张量的通道数量,其中, 是每个网格 处预测的边界框的数量, 是所要检测的目标类别的总数,对于VOC数据集来说, ;对于COCO数据集来说,

总体来看,一张大小为 的RGB图像输入网络,经过一系列的卷积和池化操作后,得到一个经过64倍降采样的特征图 ,随后,该特征图被展平为一个一维的特征向量,再由若干全连接层处理,最后做一些必要的维度转换操作,得到最终的输出 。之前,我们已经把 想象成一个大小为 的立方体,而网格 包含了物体的信息,即边界框的位置参数和置信度。这里就充分体现了YOLOv1的核心检测思想: 逐网格找物体 。图3-4展示了YOLOv1的“网格划分”思想的实例。

具体来说,YOLOv1输出的 的空间维度 相当于将输入的 的图像进行了 的网格划分。更进一步地说,YOLOv1的主干网络将原图像处理成 的特征图,其实就相当于是在划分网格,每一网格处都包含了长度为1024的特征向量,该特征向量包含了该网格处的某种高级特征信息。YOLOv1通过遍历这些网格、处理其中的特征信息来预测每个网格处是否有目标的中心点坐标,以及相应的目标类别。每个网格都会输出 个边界框和 个类别置信度,而每个边界框包含5个参数(边界框的置信度和边界框的位置参数),因此,每个网格都会输出 个预测参数。后来,随着时代的发展,YOLOv1的这种思想逐渐演变为后来常说的“anchor-based”理念,每个网格就是“anchor”。

图3-4 YOLOv1的“网格划分”思想的实例

当然,严格来讲,其实YOLOv1的这一检测理念也是从Faster R-CNN中的区域候选网络(region proposal network,RPN)继承来的,只不过,Faster R-CNN只用于确定每个网格里是否有目标,不关心目标类别,而YOLOv1则进一步将目标分类也整合进来,使得定位和分类一步到位,从而进一步发展了“anchor-based”的思想。

由于YOLOv1所接受的图像是正方形的,即宽和高是相等的,因此输出的网格也是正方形的。为了和论文对应,我们不妨用 表示输出的 。综上,YOLOv1的最终输出为 。YOLOv1的整体处理流程如图3-5所示,以现在的技术视角来看,其网络结构十分简洁。

图3-5 YOLOv1的处理流程

综上所述,YOLOv1的检测理念就是将输入图像划分成 的网格,然后在网格上做预测。理想情况下,依据YOLOv1的设定,包含目标中心点的网格输出的边界框置信度很高,而不包含目标中心点的网格则输出的边界框置信度很低甚至为0。从这里我们也可以看出来,边界框的置信度的本质就是用来判断有无目标的。

至此,我们介绍了YOLOv1的网络结构。那么,在3.3节,我们就要深入且详细地了解YOLOv1是如何检测目标的,以及为了使得YOLOv1学习到这一能力,应该如何为其制作训练正样本。

3.3 YOLOv1的制作训练正样本的方法

在3.1节和3.2节,我们已经了解了YOLOv1的网络结构和检测思想,但如何让网络尽可能充分地领会其检测思想是至关重要的,换言之,如何来训练这样的网络是重中之重。因此,本节将深入介绍YOLOv1的检测方法和训练正样本的制作方法。

在3.2节我们已经了解到,对于YOLOv1最后输出的 ,可以将其理解为一个 的网格,且每个网格包含30个参数—两个预测边界框的置信度和位置参数(共10个)以及20个VOC数据集的类别的置信度。下面,我们详细介绍YOLOv1的这30个参数的定义和学习策略,以及如何为每一个参数制作用于训练的正样本。

3.3.1 边界框的位置参数

由于YOLOv1是通过检测图像中的目标中心点来达到检测目标的目的,因此,只有包含目标中心点的网格才会被认为是有物体的。为此,YOLOv1定义了一个“objectness”概念,表示此处是否有物体,即 表示此网格处有物体,反之,
表示此网格处没有物体。

图3-6展示了正样本候选区域概念的示例,其中,黄颜色网格表示这个网格是有物体的,也就是图中的犬的边界框中心点(图中的红点)落在了这个网格内。在训练过程中,该网格内所要预测的边界框,其置信度会尽可能接近1。而对于其他没有物体的网格,其边界框的置信度就会尽可能接近0。有物体的网格会被标记为 正样本候选区域 ,也就是说,在训练过程中,训练的正样本(positive sample)只会从此网格处的预测中得到,而其他区域的预测都是该目标的负样本。

图3-6 YOLOv1的正样本候选区域概念的示例

另外,在图3-6中,我们会发现目标的中心点相对于它所在的网格的四边是有一定偏移量的,这是网格划分的必然结果。因此,虽然包含中心点的网格可以近似代表目标的中心点位置,但仅靠网格的位置信息还不足以精准描述目标在图像中的位置。为了解决此问题,我们必须要让YOLOv1去学习这个偏移量,从而获得更加精准的目标中心点的位置。那么,YOLOv1是如何计算出这个中心点偏移量的呢?

首先,对于给定的边界框,其左上角点坐标记作 ,右下角点坐标记作 ,显然,边界框的宽和高分别是 。随后,我们计算边界框的中心点坐标

(3-3)

通常,中心点坐标不会恰好是一个整数,而网格的坐标又显然是离散的整数值。假定用网格的左上角点的坐标来表示该网格的位置,那么,就需要对中心点坐标做一个向下取整的操作来得到该中心点所在的网格坐标

(3-4)

其中, 为网络的输出步长或降采样倍数,在YOLOv1中,该值为64。于是,这个中心点偏移量就可以被计算出来:

(3-5)

在YOLOv1的论文中,这一偏移量是用符号 表示的,但 的含义不清晰,会被误以为某个坐标,无法让人一目了然地理解其物理含义,因此,为了避免不必要的歧义,我们将其换成 。显然,两个偏移量 的值域都是 。在训练过程中,计算出的 就将作为此网格处的正样本的学习标签。图3-7直观地展示了YOLOv1中的中心点偏移量的概念。

在推理阶段,YOLOv1先用预测的边界框置信度来找出包含目标中心点的网格,再通过这一网格所预测出的中心点偏移量得到最终的中心点坐标,计算方法很简单,只需将公式(3-5)做逆运算:

(3-6)

图3-7 YOLOv1中的中心点偏移量的概念

除了边界框的中心点,YOLOv1还要输出边界框的宽和高,以确定边界框大小。这里,我们可以直接将目标的真实边界框的宽和高作为学习目标。但是,这么做的话就会带来一个问题:边界框的宽和高的值通常都比较大,数量级普遍为1或2,甚至3,这使得在训练期间很容易出现不稳定甚至发散的问题,同时,也会因为这部分所计算出的损失较大,从而影响其他参数的学习。因此,YOLOv1会先对真实的边界框的宽和高做归一化处理:

(3-7)

其中, 分别是目标的边界框的宽和高, W H 分别是输入图像的宽和高。如此一来,由于边界框的尺寸不会超出图像的边界(超出的部分通常会被剪裁掉),归一化后的边界框的尺寸就在0~1范围内,与边界框的中心点偏移量的值域相同,这样既避免了损失过大所导致的训练发散问题,又和其他部分的损失取得了较好的平衡。

至此,我们确定了YOLOv1中有关边界框的4个位置参数的学习策略。

3.3.2 边界框的置信度

在3.3.1节中,我们已经了解了YOLOv1如何学习边界框的位置参数。但有一个遗留问题: 如何让网络确定中心点的位置 ,即我们应如何让网络在训练过程中去学习边界框的置信度,因为置信度直接决定一个网格是否包含目标的中心点,如图3-8所示。

图3-8 YOLOv1的边界框置信度概念图示

只有确定了中心点所在的网格坐标 ,才能去计算边界框的中心点坐标 和大小 。我们已经知道,YOLOv1的 网格中,只有包含了目标中心点的网格才是正样本候选区域,因此,一个训练好的YOLOv1检测器就应该在包含目标中心点的网格所预测的 个边界框中,其中至少有一个边界框的置信度会很高,接近于1,以表明它检测到了此处的目标。

那么,问题就在于如何给置信度的标签赋值呢?一个很简单的想法是,将有目标中心点的网格处的边界框置信度的学习标签设置为1,反之为0,这是一个典型的“二分类”思想,正如Faster-RCNN中的RPN所做的那样。但是,YOLOv1并没有采取如此简单自然的做法,而是将这种二分类做了进一步的发展。

YOLOv1不仅希望边界框的置信度表征网格是否有目标中心点,同时也希望 边界框的置信度能表征所预测的边界框的定位精度 。因为边界框不仅要表征有无物体,它自身也要去定位物体,所以定位得是否准确同样是至关重要的。而对于边界框的定位精度,通常使用 交并比 (intersection of union,IoU)来衡量。IoU的计算原理十分简单,分别计算出两个矩形框的 交集 (intersection)和 并集 (union),它们的 比值 即为IoU。显然,IoU是一个0~1的数,且IoU越接近1,表明两个矩形框的重合度越高。图3-9直观地展示了IoU的计算原理。

图3-9 IoU的计算原理

巧的是,边界框的置信度也是一个0~1的数,并且我们希望预测框尽可能地接近真实框,即IoU尽可能地接近于1。同时,我们希望置信度尽可能地接近于1。不难想象,一个理想的情况就是有物体的网格的置信度为1,预测框和真实框的IoU也为1,反之均为0。于是,YOLOv1就把 预测的边界框(预测框)和目标的边界框(目标框)的 IoU 作为置信度的学习标签 。由此,如何学习边界框的置信度这一问题也就明确了一些。接下来,详细地介绍一下YOLOv1到底是怎么把IoU作为边界框置信度的学习标签的。

我们知道,YOLOv1最终输出包含检测目标信息的张量 ,其中共有 个预测的边界框,但我们不必考虑所有的边界框,因为很多网格并没有包含目标中心点,只需要关注那些有目标中心点的网格,即正样本候选区域( )。我们以某一个正样本候选区域为例,如图3-10所示,不妨假设 ,其中一个是图中的蓝框 ,另一个是绿框 ,红色的边界框则是目标的真实边界框。我们计算所有预测框与目标框的IoU,一共得到 个IoU值,假设分别是

图3-10 正样本候选区域的边界框 (蓝框)和 (绿框)与此处的目标边界框(红框)

由于预测框 和真实边界框的IoU最大,即该预测框更加精确,因此我们就理所当然地希望这个预测框能作为正样本去学习目标的信息,即只保留IoU最大的蓝框 作为训练的正样本,去参与计算 边界框的置信度损失 边界框的位置参数损失 以及 类别损失 ,并做 反向传播 ,同时,它与目标框的 将作为这个边界框的置信度学习标签。至于另一个预测框 ,则将其标记为负样本,它不参与类别损失和边界框的位置参数损失的计算, 只计算边界框的置信度损失,且置信度的学习标签为 0。而对于正样本候选区域之外的所有预测框,都被标记为该目标的负样本,均不参与这个目标的位置参数损失和类别损失的计算,而只计算边界框的置信度损失,且边界框置信度的学习标签也为0。

在理想情况下,预测框与目标框的IoU十分接近1,同时网络预测的置信度也接近1。因此,YOLOv1预测的置信度在表征此网格处是否有目标中心点的同时,也衡量了预测框与目标框的接近程度,即边界框定位的准确性。

可以看到,一个正样本的标记是由预测本身决定的,即我们是直接构建预测框与目标框之间的关联,而没有借助某种先验。倘若我们以现在的技术视角来看待这一点,会发现YOLOv1一共蕴含了后来被着重发展的3个技术点:

(1)不使用先验框(anchor box)的anchor-free技术。

(2)将IoU引入类别置信度中的IoU-aware技术 [34,35]

(3)动态标签分配(dynamic label assignment)技术。

在以上3个技术点中,尤其是第3点的动态标签分配研究最具有革新性,在2022年之后几乎成为了先进的目标检测框架的标准配置之一。由此可见,YOLOv1这一早期工作的确蕴含了许多研究潜力和研究价值。正如古人所说:“温故而知新”,这也说明我们学习YOLOv1的必要性。

3.3.3 类别置信度

对于类别置信度,YOLOv1采用了较为简单的处理手段:每一网格都只预测一个目标。同边界框的学习一样,类别的学习也只考虑正样本网格,而不考虑其他不包含目标中心点的网格。类别的标签是图像分类任务中常用的one-hot格式。对于one-hot格式的类别学习,通常会使用Softmax 函数来处理网络的类别预测,得到每个类别的置信度,再配合交叉熵(cross entropy)函数去计算类别损失,这在图像分类任务中是再常见不过了。然而,YOLOv1却另辟蹊径,使用线性函数输出类别置信度预测,并用L2损失来计算每个类别的损失,所以,在训练过程中,YOLOv1预测的类别置信度可能会是一个负数,这也使得YOLOv1在训练的早期可能会出现训练不稳定的问题。同样,对于边界框的置信度和位置参数,YOLOv1也是采用线性函数来输出的,虽然我们知道边界框的置信度的值域应该在0~1范围内,中心点偏移量也在0~1范围内,但YOLOv1自身没有对输出做这样的约束,这一点也是 YOLOv1在后续的工作中被改进的不合理之处之一。

最后,我们总结一下YOLOv1的制作正样本的流程。对于一个给定的目标框,其左上角点坐标为 ,右下角点坐标为 ,我们按照以下3个步骤来制作正样本和计算训练损失:

(1)计算目标框的中心点坐标 以及宽和高 ,然后用公式(3-4)计算中心点所在的网格坐标,从而确定正样本候选区域的位置;

(2)使用公式(3-5)计算中心点偏移量 ,并对目标框的宽和高做归一化,得到归一化后的坐标

(3)使用one-hot格式准备类别的学习标签。

而置信度的学习标签需要 在训练过程中确定 ,步骤如下:

(1)计算中心点所在的网格的每一个预测框与目标框的IoU;

(2)保留IoU最大的预测框,标记为正样本,将其设置为置信度的学习标签,然后计算边界框的置信度损失、位置参数损失以及类别置信度损失;

(3)对于其他预测框只计算置信度损失,且置信度的学习标签为0。

在了解了制作正样本的流程后,我们就可以着手计算训练损失了,下面我们将介绍如何计算训练过程中的损失。

3.4 YOLOv1的损失函数

在深度学习领域中,损失函数设计的好坏对模型的性能有着至关重要的影响,倘若损失函数设计不当,那么原本一个好的模型结构可能会表现得十分糟糕,而一个简单朴素的模型结构在一个好的损失函数的训练下,往往会表现出不俗的性能。在前面几节,我们已经了解了YOLOv1的工作原理、输出的参数组成以及制作训练正样本的方法,掌握了这些必要的知识后,学习YOLOv1的损失函数也就十分容易了。

YOLOv1的损失函数整体如公式(3-8)所示。

(3-8)

公式(3-8)中第一行和第二行表示的是 边界框的位置参数的损失 ,其中带 的表示学习标签, 则是指示函数,分别用于标记正样本和负样本。 是位置参数损失的权重,论文中取

第三行和第四行表示的是 边界框的置信度的损失 。第三行对应的是正样本的置信度损失,其置信度学习标签 为最大的IoU值,第四行对应的是负样本的置信度损失,其置信度学习标签就是0。

最后一行就是 正样本处的类别的损失 ,每个类别的损失都是L2损失,而不是交叉熵。

整体上看,YOLOv1的损失函数较为简洁,理解起来也较为容易。在掌握了制作正样本的策略和计算损失的方法后,就可以去训练YOLOv1,并在训练后去做推理,预测输入图像中的目标。下面我们就来了解YOLOv1是如何在测试阶段做前向推理的。

3.5 YOLOv1的前向推理

当我们训练完YOLOv1后,对于给定的一张大小为 的输入图像,YOLOv1输出 ,其中每个网格位置都包含两个边界框的置信度输出 、两个边界框的位置参数输出 以及20个类别置信度输出 。显然,这么多的预测不全是我们想要的,我们只关心那些包含目标的网格所给出的预测,因此,在得到最终的检测结果之前,我们需要再按照以下4个步骤去做滤除和筛选。

(1) 计算所有预测的边界框的得分 。在YOLOv1中,每个边界框的得分score被定义为该边界框的 置信度 与类别的最高置信度 的乘积 ,其中, 。具体来说,对于 处的网格,边界框 的得分计算公式如下:

(3-9)

(2) 得分阈值筛选 。计算了所有边界框的得分后,我们设定一个阈值去滤除那些得分低的边界框。显然,得分低的边界框通常都是背景框,不包含目标的中心点。比如,我们设置得分阈值为0.3,滤除那些得分低于该阈值的低质量的边界框,如图3-11所示。

图3-11 滤除得分低的边界框

(3) 计算边界框的中心点坐标以及宽和高 。筛选完后,我们即可计算余下的边界框的中心点坐标以及宽和高。

(4) 使用非极大值抑制进行第二次筛选 。由于YOLOv1可能对同一个目标给出多个得分较高的边界框,如图3-12所示,因此,我们需要对这种冗余检测进行抑制,以剔除那些不必要的重复检测。为了达到这一目的,常用的手段之一便是 非极大值抑制 (non-maximal suppression,NMS)。非极大值抑制的思想很简单,对于某一类别目标的所有边界框,先挑选出得分最高的边界框,再依次计算其他边界框与这个得分最高的边界框的IoU,超过设定的IoU阈值的边界框则被认为是重复检测,将其剔除。对所有类别的边界框都进行上述操作,直到无边界框可剔除为止,如图3-12所示。

图3-12 滤除冗余的边界框

通过上面4个步骤,我们就获得了YOLOv1的最终检测结果。

3.6 小结

至此,对于经典的YOLOv1工作,从模型结构到推理方法,再到损失函数,我们都进行了详细的讲解。关于YOLOv1是怎么工作的,相信读者已经有了较为清晰的认识,而其中的优势和劣势也都在讲解的过程中一一体现。然而,老话说得好,纸上得来终觉浅,绝知此事要躬行,唯有亲自动手去实践才能更好地加深对YOLOv1的认识,进一步地了解如何去搭建一个目标检测的网络,从而构建一个较为完整的目标检测项目。通过必要的代码实现环节,将理论与实践结合起来,我们才能够真正地掌握所学到的知识。因此,在第4章,我们将会在YOLOv1工作的基础上去搭建本书的第一个目标检测网络:YOLOv1。我们会在YOLOv1的基础上做必要的改进和优化,在不脱离YOLOv1框架的范畴的前提下,将会得到一个性能更好的YOLOv1检测器。 JwjMoMiQj4hGw+kO0tFcf7tSzYyXPjPB1JC1extrt/UQnNqVXSdiu5GWpII0AUEe

点击中间区域
呼出菜单
上一章
目录
下一章
×