Python----目标检测(《YOLO9000: Better, Faster, Stronger》和YOLO-V2的原理与网络结构)

发布于:2025-06-03 ⋅ 阅读:(29) ⋅ 点赞:(0)

一、YOLO9000: Better, Faster, Stronger

1.1、基本信息

  • 标题: YOLO9000: Better, Faster, Stronger

  • 作者: Joseph Redmon, Ali Farhadi

  • 机构: 华盛顿大学1, 艾伦人工智能研究所2

  • 发布时间: 2016年(根据arXiv编号1612.08242推断)

  • 论文链接[1612.08242] YOLO9000: Better, Faster, Stronger

1.2、摘要

        我们提出了YOLO9000,一种先进的实时物体检测系统,能够检测超过9000种物体类别。首先,我们对YOLO检测方法进行了多项改进(包括创新和借鉴前人工作)。改进后的模型YOLOv2在Pascal VOC和COCO等标准检测任务中达到领先水平。通过多尺度训练方法,同一YOLOv2模型可适应不同尺寸输入,实现速度与精度的灵活权衡。在67 FPS下,YOLOv2在VOC 2007上获得76.8 mAP;在40 FPS下达到78.6 mAP,优于Faster R-CNN和SSD,同时速度显著更快。此外,我们提出了一种联合训练方法,结合COCO检测数据和ImageNet分类数据训练YOLO9000。这种联合训练使YOLO9000能够预测未标注检测数据的物体类别。在ImageNet检测任务中,YOLO9000的验证集mAP为19.7,其中156个未见类别的mAP为16.0。YOLO9000不仅能检测200类物体,还能实时预测超过9000种不同类别的物体。 

1.3、主要内容

YOLOv2的改进

        批归一化(Batch Normalization): 提升收敛速度,减少过拟合。

        高分辨率分类器(High Resolution Classifier): 在448×448分辨率下预训练分类网络,提升检测精度。

        锚框(Anchor Boxes): 引入锚框机制,提高召回率。

        维度聚类(Dimension Clusters): 使用k-means聚类生成锚框尺寸,优于手工选择。

        直接位置预测(Direct Location Prediction): 约束边界框中心预测,提升稳定性。

        多尺度训练(Multi-Scale Training): 动态调整输入图像尺寸(320×320到608×608),平衡速度与精度。

YOLO9000的创新

        联合训练(Joint Training): 结合检测(COCO)和分类(ImageNet)数据,扩展检测类别至9000种。

        WordTree层级分类: 通过WordNet构建类别层次结构,解决多数据集标签冲突问题。

        实时性能: 在保持实时检测速度的同时,覆盖更广泛的物体类别。

性能表现

        YOLOv2在Pascal VOC 2007上达到78.6 mAP,速度达40 FPS,优于Faster R-CNN和SSD。

        YOLO9000在ImageNet检测任务中实现19.7 mAP,其中156个未见类别的mAP为16.0。

1.4、影响作用

        速度与精度的平衡: YOLOv2通过多尺度训练和网络优化,成为当时最快的高精度检测模型之一。

        大规模检测: YOLO9000首次实现实时检测9000类物体,推动了通用物体检测的发展。

        方法论贡献: WordTree和联合训练策略为多数据集融合和弱监督学习提供了新思路。

二、YOLOV2简介 

        YOLO9000主要在COCO和ImageNet数据集上进行训练,首先在检测数据集上训练一定的epoch来让模型 学习定位和检测目标的能力;再使用分类数据集进行训练,从而扩展模型对目标的识别能力。

        在训练的过程中,混合目标检测和分类的数据集。当输入是检测数据集时,对整个Loss函数计算Loss;当 输入是分类数据集时,Loss函数只计算分类Loss,其余部分Loss设为零。

        YOLO9000使用的联合训练不同于将Backbone在ImageNet上进行预训练,联合训练可以扩充检测识别的 目标类别。例如,当模型检测出车的位置后,更进一步将其细分类别轿车、卡车、客车、自行车、三轮车 等。

二、针对于YOLOV1的优化

2.1、输入处理(Input)

使用了多尺度训练(Multi-Scale Training)

        原文中描述:的那个网络只使用某一个固定大小的图片输入进行训练后,整个网络的鲁棒性并不是很强, 所以提出了一种多尺度训练,它就是在模型每训练一定的batch,就改变输入图片的尺寸,使得模型对不 同的输入尺寸更鲁棒,能够从容地对不同尺寸的图像进行检测。

        在文章中时每迭代10个batch,就改变网络的输入尺寸,具体使用了320、352、384、416、448、480、 512、544、576、608这10种尺寸,可以发现它们都是32的倍数,原因是YOLOV2采用的骨干网络输入与 输出的缩放比是32,即做了5次池化。

        那输入图像大小变了,网络模型不用调整吗?所以骨干网络用了一个全局平均池化层来替换全连接层,所 以它是一个全卷积神经网络。

        在精度提升图中可以看到,加入Multi-Scale Training比不加涨了1.4%。

高分辨率分类器(High Resolution Classifier)

        YOLOv2首先基于图像分类数据集ImageNet来训练一个较好的特征图检测器,再用目标检测数据集VOC进 行模型微调,实现目标检测功能。

        这个思路是正确的,但ImageNet数据集中的图像尺寸为224x224,VOC数据集中的图像尺寸为 448x448;从一个由224x224尺寸图像训练的模型硬过渡到448x448图像的目标检测任务,模型适应不了 输入图像尺寸上的巨大变化,必然影响检测效果。

        高分辨率分类器的思路如下:

                高分辨率分类器的思路是首先在低分辨率(224x224)的ImageNet分类数据集上预训练模型的主体部 分,以获得较好的分类效果;

                再将ImgeNet分类数据集Resize成高分辨率(448x448)图像,使用该高分辨率数据集微调(微调训 练了10个epoches)上一步骤中的预训练模型;

                最后用VOC目标检测数据集对YOLOv2进行微调。

        在精度提升图中可以看到,加入High Resolution Classifier比不加涨了3.7%。

2.2、骨干网络(Backbone)

         Darknet-19。我们提出一种新的分类模型,用作YOLOv2的基础。我们的模型基于先前在网络设计方面的工作以及该领域的常识。与VGG模型类似,我们主要使用3x3的卷积核,并在每次池化步骤后将通道数加倍[17]。根据网络内网络(NIN)的工作,我们使用全局平均池化进行预测,并使用1x1的卷积核在3x3卷积之间压缩特征表示[9]。我们使用批量归一化来稳定训练,加速收敛,并规范化模型[7]。我们的最终模型称为Darknet-19,具有19个卷积层和5个最大池化层。完整描述请参见表6。Darknet-19仅需5.58亿次操作即可处理一张图片,但在ImageNet上达到了72.9%的Top-1准确率和91.2%的Top-5准确率。

修改了骨干网络为darknet19

         darknet19(224x224)的运算量为55.8亿,在ImageNet数据集上,top-1的准确率为72.9,top-5的准确率 为91.2。

        Darknet-19网络包含19个卷积层和5个max pooling层,用了一个全局平均池化层来替换全连接层,所以 它是一个全卷积神经网络。 在精度提升图中可以看到,替换新的网络涨了0.4%,但是新的网络的运算量更小,速度更快。

使用了Batch Normalization

        BN层对于网络的收敛和优化过程都有很大的提 升,在YOLOV2中,加入BN层之后,提升了2%的mAP。 在论文中,提出了使用了BN层之后,就不需要使用dropout来减轻过拟合问题了。 在精度提升图中可以看到,加入BN层比不加涨了2.4%。

2.3、检测头(Head)

        卷积与锚框。YOLO通过在卷积特征提取器上方使用全连接层直接预测边界框的坐标。Faster R-CNN则不直接预测坐标,而是使用手工选择的先验框预测边界框。Faster R-CNN中的区域提议网络(RPN)仅使用卷积层来预测锚框的偏移量和置信度。由于预测层是卷积的,RPN在特征图上的每个位置预测这些偏移量。预测偏移量而不是坐标简化了问题,使网络更容易学习。

        我们从YOLO中移除全连接层,使用锚框来预测边界框。首先,我们消除一个池化层,以使网络卷积层的输出分辨率更高。我们还缩小网络,以处理416的输入图像,而不是448x448。我们这样做是因为我们希望特征图中有一个奇数的位置,所以有一个中心单元。物体,尤其是大型物体,往往占据图像的中心,因此在中心有一个位置来预测这些物体是好的,而不是四个都在附近的位置。YOLO的卷积层将图像以32的因子下采样,因此通过使用416的输入图像,我们得到了13x13的输出特征图。

        当我们转向锚框时,我们还将类别预测机制与空间位置信息解耦,改为对每个锚框预测类别和物体性。遵循YOLO,物体性预测仍然预测真实值和建议框的IOU,而类别预测则预测给定有物体的情况下该类的条件概率。

        使用锚框,我们的准确率略有下降。YOLO每张图像只预测98个框,但使用锚框,我们的模型预测的框数量超过一千个。在没有锚框的情况下,我们的中间模型得到了695 mAP和81%的召回率。使用锚框,我们的模型得到了692 mAP和88%的召回率。尽管mAP有所下降,但召回率的提高意味着我们的模型还有更多提升的空间。

引入Convolutional With Anchor Boxes

        YOLOv1中每个网格预测两个检测框,并让最合适的检测框向ground truth框进行回归修正。在YOLOv2 中,将检测框与Anchor Box的偏差(offset)进行回归,并且每个网格指定 5 个Anchor Box。在训练 时,只有最接近ground truth的检测框进行损失的计算。在引入Anchor Box后,mAP由69.5下降至 69.2,原因在于每个网格预测的物体变多之后,召回率大幅上升,准确率有所下降,总体mAP略有下降。

        precision: 预测框中包含目标的比例。 recall: 真正目标被检测出来的比例。

        所以recall的提升的意义重大,意味着能更好的找到真正的目标了。 论文中说:将最终的直接预测框的坐标改为偏移的预测能够简化位置预测问题同时使网络更容易收敛。

        在精度提升图中可以看到,加入Anchor Box比不加mAP降低了0.3%,但是召回率从81%提升到了 88%,召回率的提升意味着模型有更高的提升空间。

        Faster-RCNN是128/256/512的大小和长宽比,是经验所得,SSD采用的是 DefaultBox,但也是经验所得(网络的特征层的选择)。YOLOV2的Anchor Box则是通过聚类产生的。

使用Dimension Clusters

        维度聚类。在将框式结构与 YOLO 结合使用时,我们遇到了两个问题。第一个问题是框的尺寸是人工设定的。网络可以学会相应地调整框的大小,但如果我们一开始就为网络选择更好的先验框,就能让网络更容易学会预测准确的检测结果。
        我们不再手动选择先验框,而是对训练集的边界框进行 k 均值聚类,以自动找到好的先验框。如果使用标准的 k 均值算法并采用欧几里得距离,较大的框产生的误差会比较小的框更大。然而,我们真正想要的是能产生良好交并比得分的先验框,这与框的大小无关。因此,对于我们的距离度量,我们使用:

        我们针对不同的 k 值运行 k 均值算法,并绘制出与最近质心对应的平均 IOU 值,如图 2 所示。我们选择 k = 5 作为模型复杂度和高召回率之间的良好平衡点。聚类中心与人工挑选的锚框有很大的不同。短而宽的框较少,而高而细的框较多。
        我们将平均 IOU 与我们聚类策略的最近先验以及人工挑选的锚框在表 1 中进行了比较。
仅使用 5 个先验,聚类中心的表现与 9 个锚框相当,平均 IOU 分别为 61.0 和 60.9。如果我们使用 9 个聚类中心后,发现平均 IOU 值有了显著提高。这表明使用 K 均值算法来生成我们的边界框能使模型具有更好的初始表示,并使学习任务变得更容易。 

         YOLOV2使用了Dimension Clusters操作,即K-means算法(K-NN算法),使得anchor box的宽高由聚 类算法产生。

        每个grid将产生5个Anchor Box,当然,产生10个也可以,只不过没必要,太浪费,导致网络参数太多。 作者通过聚类的方法对PASCAL VOC和COCO数据集的长宽比进行了聚类操作,黑色框表示VOC数据集, 紫色框表示COCO数据集。通过观察左图可以发现,聚类的长宽比种类越多,所覆盖的IoU也越大,但是 模型也会变的更复杂,作者在此取了个折中,直接取值为5,兼顾了准确度效率。长宽度如下图的右图所 示。通过聚类的方法确定Anchor Box数目。比双阶段的目标检测,如Faster RCNN手动去选择anchor要 科学很多,聚类产生anchor一直到YOLOV5还在用,后面就开始使用anchor free了。

        VOC和COCO上的聚类框尺寸。我们使用k均值聚类来获得边界框的尺寸,以为我们的模型提供良好的先验信息。左侧图像显示了我们在不同k值选择下获得的平均IOU。我们发现k = 5在召回率和模型复杂性之间提供了良好的平衡。右侧图像显示了VOC和COCO的相对中心。两个先验集都偏向于较细、更高的框,而COCO的尺寸变化大于VOC。 

流程:

        1. 数据准备:首先,从训练数据集中收集所有真实边界框的宽度和高度。

        2. 距离度量:在标准的 K-means 聚类算法中,通常使用欧几里得距离作为距离度量。然而,对于边界框 的聚类,YOLOv2采用了一种不同的距离度量方法——IoU距离。IoU度量了两个边界框之间的重叠程 度,这对于评估边界框的相似性比单纯的欧几里得距离更有意义。

        3. 执行K-means聚类:使用IoU作为距离度量,对收集到的边界框尺寸(宽度和高度)执行K-means聚类 算法。聚类的数量(即K的值,论文中是5)通常是根据实验或对特定数据集的理解来选择的。聚类过 程的目标是找到一组聚类中心,这些中心代表了数据中最常见的边界框形状和尺寸。

        4. 确定锚点框尺寸:聚类完成后,每个聚类中心的宽度和高度代表了一个推荐的锚点框尺寸。这些由聚 类过程自动确定的尺寸被用作YOLOv2中锚点框的初始尺寸和比例。

Direct Location Prediction 

         直接位置预测。在使用带有锚框的 YOLO 模型时,我们还会遇到另一个问题:模型不稳定,尤其是在早期迭代阶段。这种不稳定主要源于对框的(xy)位置的预测。在
区域提议网络 中,该网络会预测值 tx 和 ty ,而(xy)中心坐标则计算如下:

        例如,对于 tx = 1 的预测,会将框向右移动锚框的宽度;而对于 tx = 1 的预测,则会将其向左移动相同的距离。
        这种表述是无约束的,因此任何锚框都可能出现在图像中的任何位置,而不管预测框位于何处。通过随机初始化,模型需要很长时间才能稳定下来并预测出合理的偏移量。
        我们不再预测偏移量,而是采用与 YOLO 相同的方法,预测相对于网格单元位置的定位坐标。这将真实值限制在 0 到 1 之间。我们使用逻辑激活函数来约束网络的预测值落在这个范围内。
        网络在输出特征图的每个单元格中预测 5 个边界框。网络为每个边界框预测 5 个坐标,即 tx、ty、tw、th 和 to。如果单元格相对于图像的左上角偏移了 (cx cy),且边界框的先验宽度和高度分别为 pw、ph,那么预测结果对应于: 

         由于我们对位置预测进行了限制,参数化过程变得更容易学习,从而使网络更加稳定。结合维度聚类以及直接预测边界框中心位置的方法,与使用锚框的版本相比,YOLO 的性能提高了近 5%。

        由于这个公式中的 t_x、t_y 值并没有任何的限制,所以Anchor Box可能出现在任意位置,例如我们将 Anchor Box设置在每个grid cell的左上角,通过网络预测,可以得到x和y坐标的回归参数,由于回归参数 的大小并没有限制,在Anchor Box的中心坐标加上回归参数之后,获得的矫正后的Anchor Box可能出现 在图中的任意位置,例如可能左上角的grid cell对应的Anchor Box就可能出现在右下角,但是右下角如果 有目标的话,那么右下角的grid cell有自己的Anchor Box来预测,轮不到左上角的Anchor Box来预测, 所以就出现了不稳定,例如当上方公式中的t_x=1时,那么边界框将向右移动一个锚框的宽度,这个移动量是非常大的。     

        在YOLOV2中,为了减缓这种不稳定,YOLOv2设计了Direct location prediction操作来支持检测框与 Anchor框的偏差(offset)回归逻辑。与YOLOv1相比,YOLOv2中每个检测框输出5个偏差参数 tx,ty,tw,th,to,为了将预测框的中心点约束在当前grid cell中,使用sigmoid函数 σ(·) 将 和tx和ty 归一 化处理,将值约束在 [0,1] 之间,这使得模型训练更稳定,同时置信度 也做了sigmoid。

 

YOLOV2的结构也和YOLOV1有很大的不同:

        在YOLOv1里面没有用anchor,而是直接划分成7 × 7个grid,每个grid输出两个bounding box,每个 bounding box有两个未知参数和一个置信度,以及每个grid还预测出了20个类别的条件类别概率。 在YOLOv2里面模型就变得稍微复杂一些,YOLOv1里面的类别是由grid负责,在YOLOv2里面类别变成由 anchor负责了,每个grid产生5个anchor,每个anchor除了产生4个定位参数和一个置信度参数之外还有 20个类别的条件类别概率,所以在YOLOv2里面每个anchor都会产生25个数,总共输出5 × 25 = 125 个 数。即YOLOv2总共输出13 × 13 × 125 = 21125 个数。最终的目标检测结果就是从这21125个数里面提取出来的。 

passthrough layer结构 

        精细特征。这种修改后的 YOLO 在一个 13×13 的特征图上进行检测预测。虽然这对于大型物体来说已经足够了,但对于定位较小的物体来说,可能需要更精细的特征。Faster R-CNN 和 SSD 都在其网络中的不同特征图上运行提议网络以获得不同分辨率的结果。我们采取了一种不同的方法,只是简单地添加了一个直通层,该层将来自 26×26 分辨率早期层的特征带过来。
        直通层将更高分辨率的特征与低分辨率的特征通过将相邻特征堆叠到不同的通道中(而不是空间位置)的方式连接起来,类似于 ResNet 中的恒等映射。这将 26×26 的 512 个特征图转换为一个 13×13 的 2048 个特征图,可以与原始特征图进行连接。特点。我们的探测器运行在这些扩展特征图的上方,从而能够获取精细的特征信息。这使得性能有了约 1% 的提升。

         在网络中,底层的特征层会包含更多的图像细节,但是使用卷积对特征图进行下采样会使很多细粒度特征 (Fine-Grained Features)的损失,这些图像细节在检测小目标时是必要的,例如SSD前几层特征层。在YOLOV2中,为了解决这个问题,在YOLOv2Head侧中引入了passthrough layer结构,将特征图一分 为四,并进行concat操作,保存了珍贵的细粒度特征。 具体的做法就是将输出的13x13的特征图融合了中间的26x26的特征图,类似于ResNet。

        例如一张4x4的图,通道为1,那么将他们在中间进行分开,对应位置颜色标记为一致的,然后将颜色一致 的位置重新拼接,拼接后把它们摞起来,那么就得到2x2x4的张量,也就是宽和高变成原来的一半,通道 变为原来的4倍。

        即26x26x64变成13x13x256。 接下来Concatenate操作就将深度的1024+256=1280。 

        在精度提升图中可以看到,加入passthrough layer结构比不加涨了1%。

三、损失函数

        原文中没有详细的给出,这里根据源码给出:

3.1、定位损失(Localization Loss):

        YOLOv2使用均方差损失(Mean Squared Error, MSE)来衡量预测框(bounding box)的位置精 度。对于每个预测框,均方差损失计算预测框的中心点坐标和宽高的预测值与真实标签之间的差异。 具体来说,对于每个边界框(bounding box),预测其中心坐标 ((x, y)),宽度 (w) 和高度 (h),与实 际标签的差异。

3.2、Confidence 回归损失(Confidence Regression Loss):

3.3、分类损失(Classification Loss):

3.4、anchor boxes和检测框进行坐标回归:

        在训练前期(iter < 12800),YOLOv2还会进行对anchor boxes和检测框进行坐标回归,促进网络学 习到anchor的形状。


网站公告

今日签到

点亮在社区的每一天
去签到