首页 > 其他分享 >YOLO系列基础(九)YOLOv2论文及原理详解(上)

YOLO系列基础(九)YOLOv2论文及原理详解(上)

时间:2024-11-22 20:14:06浏览次数:3  
标签:预测 YOLOv1 检测 YOLO 网格 详解 YOLOv2

to 公司数据合规同事,本文为在家编写博客后采用定时发送机制发送的博文,没有用到任何公司信息和公司代码

系列文章地址

YOLO系列基础(一)卷积神经网络原理详解与基础层级结构说明-CSDN博客

YOLO系列基础(二)Bottleneck瓶颈层原理详解-CSDN博客

YOLO系列基础(三)从ResNet残差网络到C3层-CSDN博客

YOLO系列基础(四)归一化层(BN层)的前世今生!-CSDN博客

YOLO系列基础(五)从神经元共适应性到模型Dropout层-CSDN博客

YOLO系列基础(六)YOLOv1原理详解原理如此清晰-CSDN博客

YOLO系列基础(七)从数据增强到图像线性变换-CSDN博客

YOLO系列基础(八)从坐标直接预测到锚框偏移量-CSDN博客

YOLO系列基础(九)YOLOv2论文及原理详解(上)-CSDN博客


目录

系列文章地址

背景

YOLOv1的缺陷

1. 定位精度不足

2. 网络单元预测数量存在限制

YOLOv2的原理详解与改进

改进措施一:BN层的加入

改进措施二:高分辨率分类器的预训练

改进措施三:先验锚框的引入

YOLO对锚框机制的改进1:尺寸集群算法的改进

传统Kmean算法

YOLO改进的Kmean

YOLO对锚框机制的改进2:直接位置预测

改进措施四:直通层的引入


 

背景

        随着YOLOv11版本的发布,YOLO算法在视觉检测领域独领风骚,本系列旨在从小白出发,给大家讲解清楚视觉检测算法的前世今生,并讲清楚YOLOv11版本算法的所有模块功能!

        在YOLO(You Only Look Once)系列算法的演进中,YOLOv1作为开山之作,奠定了实时目标检测的基础框架。但是YOLOv1仍然存在诸多缺陷,且同期的其他检测算法也在蒸蒸日上抢夺最强检测算法的宝座,本文从YOLOv1的缺陷出发,详解YOLOv2的原理和改进措施。

YOLOv1的缺陷

有关于YOLOv1的相关原理可以查看此篇博文:

YOLO系列基础(六)YOLOv1原理详解原理如此清晰-CSDN博客

在之前的博文中,我们针对YOLOv1算法的缺陷有了初步的了解,此处我们详细说明一下

1. 定位精度不足

        YOLOv1将输入图像划分为一个7x7的网格(对于448x448的输入图像),每个网格负责预测中心落在该网格内的目标。每个网格预测两个边界框,每个边界框包含5个值:x, y, w, h, 和
confidence。

        其中,x和y是边界框中心相对于网格单元左上角的偏移(归一化到0-1之间),w和h是边界框的宽度和高度相对于整个图像宽度的比例(同样归一化到0-1之间),confidence表示边界框内存在目标的概率以及预测的准确度(即目标的存在性置信度乘以预测框与真实框的IOU)。

        YOLOv1的检测框检测采用的思路为通过最后的两层全连接层来直接预测检测框w和h的归一化坐标值。

        这实际上很不合适,因为物体在不同的距离下大小往往区别甚大,坐标值也大相径庭,而卷积和池化操作本身就是在尽量解耦全局坐标值(每卷积or池化一次,特征图片的size都会大不一样),也就是说针对YOLOv1的网络结构,每一个检测框会输出5个值:x, y, w, h, confidence,其中x,y和confidence都是合理的预测内容,因为随着卷积操作的进行,上诉的3个值都和图片的size和全局坐标脱钩了(x和y是预测的当前cell的偏移量),而问题就在于w和h,这两个值和符号在图像中的大小强相关,而且是直接预测的全局坐标的归一化值。

        这也就造成了,YOLOv1在检测框预测上很不准确,就连YOLOv2的官方论文也提出了此点问题:

翻译如下
2. 更好的措施
与最先进的检测系统相比,YOLO 存在多种缺陷。对 YOLO 与Fast
R-CNN 的误差分析表明,YOLO 存在大量定位误差。

2. 网络单元预测数量存在限制

        YOLOv1将输入图像划分为S×S的网格,每个网格单元负责预测B个边界框和这些边界框的置信度分数。然而,每个网格单元只能预测一个类别,并且只能生成有限数量的边界框(通常是两个)。这限制了模型在处理多个目标重叠或目标类别多样的情况下的性能。

在YOLOv1的博文中,我也提到此问题:

以cell为检测单位,导致每一个cell仅能针对一个类别进行预测,若两个类别的中心点位同一个cell,那么YOLOv1就会直接开摆~

YOLOv2的原理详解与改进

        YOLOv2在基础原理和YOLOv1大致相同,同样采用S*S的网格分割图像,每一个cell负责预测cell内的物体中心点、检测框的宽高。检测和分类任务看成回归问题,一次性输出,依旧是(you only look once!)

改进措施一:BN层的加入

        有关于BN层的原理详解内容,可以查看以下博客:

YOLO系列基础(四)归一化层(BN层)的前世今生!-CSDN博客

BN层主要就是通过归一化特征输入以消除内部协变量位移,以解决过拟合问题。

YOLOv2论文对BN层的阐述如下

翻译如下:
批量归一化可以显著提高收敛性,同时消除对其他形式正则化的需求。YOLOv2通过在 YOLO 的所有卷积层上添加批量归一化,使得YOLOv2的mAP 提高了 2% 以上。通过增设BN层,YOLOv2可以在不过度拟合的情况下消除模型中的Dropout层。

各位读者,Dropout层是YOLOv1版本中的一个内容,位于两层全连接层中间,主要内容是通过消除神经元共适应性来消除过拟合,的相关内容可以查看:

YOLO系列基础(五)从神经元共适应性到模型Dropout层-CSDN博客

实际上,Dropout层和BN层的效果存在一定的重叠,故YOLOv2在加入BN层之后果断删除了Dropout层

改进措施二:高分辨率分类器的预训练

        YOLO算法把检测和分类任务视作回归问题,在单次运行中一次性输出。但是我们依旧需要针对分类数据集进行预训练。

需要使用分类数据集进行预训练的原因如下:

  • 检测数据集实在是太少了……:人为标注的检测数据集过于稀缺,且耗时耗力,在很长一段时间内都没有成型的足够多的检测数据集,当然现在依旧存在该问题,但是已经缓解很多了。所以用分类数据集进行预训练成为了主流
  • 分类训练可以获取优质的先验信息:也许很多人会有疑惑,这有啥用啊?实际上神经网络的训练效果很大程度上和神经网络的初始化参数有关,在以前,神经网络的参数的随机的,有时候运气好,初始化参数很接近最终目标,那么就只需要少数epoch就能达到良好效果,而初始化参数和目标差距很大,就需要很多epoch来达成目标。所以当时的检测算法团队往往会先进行分类训练,从而预训练处特征提取的部分,最终可以获取很好的初始化参数。那么模型对检测数据集的规模和质量的依赖就会缓解。

        那这就会带来一个问题,分类数据集和检测数据集的图片size不同的问题,如果我们在一个低分辨率的数据集上进行分类器的预训练,然后迁移到高分辨率的数据集上进行正式训练,那这个初始化参数,真的有用吗?

结论:有用是有用的,但是不多

        所以这里新功能的引入就很好理解了,简单来说就是直接在高分辨率的数据集下训练,然后用同样高分辨率的检测数据集进行正式训练。

以下是YOLOv2论文中的描述:

High Resolution Classifier.

All state-of-the-art detec tion methods use classifier pre-trained on ImageNet [16]. Starting with AlexNet most classifiers operate on input im ages smaller than 256 256 [8]. The original YOLO trains the classifier network at 224 224 and increases the reso lution to 448 for detection. This means the network has to simultaneously switch to learning object detection and ad just to the new input resolution. For YOLOv2wefirstfinetunethe classification network at the full 448 448 resolution for 10 epochs on ImageNet. This gives the network time to adjust its filters to work better on higher resolution input. We then fine tune the resulting network on detection. This high resolution classification network gives us an increase of almost 4% mAP.

翻译如下:
高分辨率分类器
所有先进的检测方法都使用在 ImageNet 上预先训练好的分类器 [16]。 从 AlexNet 开始,大多数分类器都在小于 256 × 256 的输入图像上运行 [8]。最初的 YOLO 以 224 × 224 的分辨率训练分类器网络,并将检测分辨率提高到 448。这意味着网络必须同时切换到学习对象检测,并适应新的输入分辨率。
对于 YOLOv2,我们首先在 ImageNet 上以完整的 448 × 448 分辨率对分类网络进行 10 次微调。 这样,网络就有时间调整其过滤器,以便在更高分辨率的输入上更好地工作。然后,我们在检测时对由此产生的网络进行微调。这种高分辨率分类网络使我们的 mAP 提高了近 4%。

改进措施三:先验锚框的引入

有关于锚框的问题可以查看下面的博文:

YOLO系列基础(八)从坐标直接预测到锚框偏移量-CSDN博客

简单来说就是通过锚框来降低定位不精确的问题,同时加快模型的拟合过程。
但是Fast CNN的锚框定义和YOLO的锚框定义还不太一样用于YOLO算法本身的特殊性,锚框机制需要进行YOLO版本的移植

YOLO对锚框机制的改进1:尺寸集群算法的改进

传统Kmean算法

        传统的Kmean集群算法采用的是欧氏距离的集群,针对锚框的大小w和h,我们将其认定为二维平面上的x,y。那么我们就能针对该部分进行欧氏距离的集群算法,并分出K类。

但是这样的做法并不精确,因为锚框的分类应该使用IoU(交并比)来进行描述。

        有何区别?w和h越接近的锚框,其交并比难道不是更近吗?实际上,还是有细微的区别的,尤其体现在锚框尺寸上,锚框的大小会给欧氏距离带来极大的影响。

        例如:假设有两类锚框记为A、B两类,A类锚框尺寸小,B类锚框尺寸大。针对A类锚框有a1这个具体的锚框,B类有b1这个具体的锚框,其中a1和A类平均锚框之间的交并比和b1和B类平均锚框之间的交并比数值上是一致的。也就是说下方这个图片的比例是一致的。但是针对w和h的数值却大为不同。

也就是说,如果使用欧氏距离来进行聚类,会造成这样的现象:锚框越小的类,类内间距越小,锚框越大的类,类内间距越大。

如下图,w和h越小的类,类内间距越小,w和h越大的类,类内间距越大:

这样的分布实际上和我们理想的分布差异很大,Kmean的结果自然也不理想。

YOLO改进的Kmean

所以YOLO改进了Kmean的公式,采用了如下的公式来计算:

d(boxcentroid) = 1 - IOU(boxcentroid)

至此,YOLO的先验锚框的设定也完成了。通过修改后的Kmean进行labels的K聚类,并设定了K个先验锚框。

YOLO论文中对Kmean的原文如下:

Dimension Clusters.

We encounter two issues with an chor boxes when using them with YOLO. The first is that the box dimensions are hand picked. The network can learn to adjust the boxes appropriately but if we pick better priors for the network to start with we can make it easier for the network to learn to predict good detections. Instead of choosing priors by hand, we run k-means clustering on the training set bounding boxes to automatically find good priors. If we use standard k-means with Euclidean distance larger boxes generate more error than smaller boxes. However, what we really want are priors that lead to good IOU scores, which is independent of the size of the box. Thus for our distance metric we use:

d(boxcentroid) = 1 - IOU(boxcentroid)

We run k-means for various values of k and plot the av erage IOU with closest centroid, see Figure 2. We choose k = 5as a good tradeoff between model complexity and high recall. 

翻译如下:

尺寸集群

在将锚框与 YOLO 一起使用时,我们会遇到两个问题。首先,锚点框的尺寸是人工挑选的。网络可以通过学习来适当调整方框,但如果我们一开始就为网络选择更好的先验值,就能让网络更容易学会预测良好的检测结果。

与手工选择先验值不同,我们对训练集的边界框进行 k-means 聚类。
图2:VOC 和 COCO 的聚类框尺寸。我们对边界框的维度进行 k-means 聚类,以便为我们的模型获得良好的先验。左图显示了我们在选择不同 k 时得到的平均 IOU。我们发现,k = 5 在模型的召回率与复杂度之间做出了很好的权衡。右图显示了 VOC 和 COCO 的相对中心点。两组先验都偏向于更薄、更高的方框,而 COCO 的尺寸变化比 VOC 更大。

如果我们使用欧氏距离的标准 K-均值法,较大的方框比较小的方框产生的误差更大。然而,我们真正需要的是能带来良好IOU 分数的先验值,这与方格的大小无关。因此,我们在距离度量中使用:

d(boxcentroid) = 1 - IOU(boxcentroid)

我们对不同的 k 值运行 k-means,并绘制出最接近中心点的平均 IOU,见图 2。我们选择 k = 5
作为模型复杂度与最近中心点的平均 IOU 值之间的良好权衡。

YOLO对锚框机制的改进2:直接位置预测

实际上我更愿意称其为,偏移量归一化预测。

这一步是什么意思呢?我们需要从Fast CNN开始说起……

在Fast CNN算法中的检测框具体坐标针对锚框偏移量的计算公式如下:

x = t_{x} \times w_{a}-x_{a}

y = t_{y} \times h_{a}-y_{a}

其中w_{a}h_{a}指的是锚框的宽和高,x_{a}y_{a}zh指的是锚框的x和y坐标。

例如,预测 tx = 1 将使方框向右移动锚点方框的宽度,预测 tx = 1 将使方框向左移动相同的宽度。

YOLO论文认为这种方法不受约束,因为任何锚点框都可以在图像中的任何一点出现,而不管锚点框的预测位置是什么。在随机初始化的情况下,模型需要很长时间才能稳定下来,预测出合理的偏移量。

        啥意思呢?实际上原因是,在YOLO算法看来,图像已经被分成了S*S的网格,网格会负责预测网格内的中心点和对应的锚框和类别概率。也就是说这个中心点再怎么偏移,最多最多也不会超出这个网格。若是超出网格自然也就归别的网格负责,所有YOLO看来,锚框原来的公式给检测框中心点的范围太大了,中心点可以偏移到图像的任意一个位置,显然这耗费很多资源。

所以YOLOv2的每个边界框预测 5 个坐标:tx、ty、tw、th 和 to。如果当前网格左上角坐标为 (cx cy),且锚框的宽度和高度分别为 pw、ph,则预测结果对应于

  • b_{x} = \sigma (t_{x})+c_{x}
  • b_{y} = \sigma (t_{y})+c_{y}
  • b_{w}=P_{w}e^{t_{w}}
  • b_{h}=P_{h}e^{t_{h}}
  • Pr(object) IOU(bobject) = (t_{o})

图解如下:

也就是说YOLO采用的sigmoid函数来使得tx和ty归一化到0,1的范围,使得中心点的范围大大减少从而减少很多不必要的训练。

YOLOv2原文:

       

由于我们对位置预测进行了限制,因此参数化更容易学习,从而使网络更加稳定。与使用锚点框的版本相比,使用维度集群和直接预测边界框中心位置的方法将 YOLO 提高了近 5%。

改进措施四:直通层的引入

其实我更愿意称其为残差层的引入,因为和残差层实在是太像了。虽然目的不同,但是手段却近乎一致。

 基础背景

         YOLO模型在13x13的特征图上进行预测。这对于检测大物体是足够的,因为大物体在特征图上占据较多的像素,因此容易检测。 然而,对于小物体来说,它们在特征图上占据的像素较少,这可能导致检测困难。因此,需要更精细的特征(fine-grained features)来帮助定位这些小物体。

        在深层卷积过程中,图像信息一直在不断丢失,这导致13*13的格子对这些小物体来说还是太大了,没办法保留过多的有效信息,更别说还存在池化层这种瞬间少75%信息的信息丢失大杀器……。是的,大家马上想到了残差网络,信息丢失?把之前的特征图暴力concat不就完了?

        但是这里稍微有些不同,在残差网络中,输入和输出特征的size是一样的,而在YOLOv2中我们要concat的是26*26*512的特征图和13*13*1024的特征图。size都不一样,这如何concat?

         所以YOLO添加一个直通层(passthrough layer)。这个直通层从较早的26x26分辨率的层中提取特征,并将这些特征与后面的深层特征结合起来。 这个过程将26x26x512的特征图转换成了13x13x2048的特征图,这个特征图再与后续13*13*1024的特征图进行拼接成一个大的13*13*3072的特征图。

这是怎么做到的呢?

借用一下示意图,源自:【yolov2模型】-CSDN博客 

 直通层通过将相邻的特征堆叠到不同的通道中(而不是空间位置),来实现高分辨率特征与低分辨率特征的结合。这与ResNet中的恒等映射(identity mappings)相似。也就是说通过降低size增多通道数的方法适应低size的特征图,通过增多通道数的方式不丢失信息。边长除二,通道数直接乘四。

 这个过程将26x26x512的特征图转换成了13x13x2048的特征图,这个特征图可以与后面的特征图进行拼接。

YOLO9000原文如下:

我们的检测器在扩展后的特征图上运行,可以获得更精细的特征。这种改进带来了1%的性能提升

到此为止,我们先休息休息,本篇主要讲解了YOLOv2的一些改进点,虽然还没讲完……

但是敬请期待,YOLOv2论文详解的下篇! 

标签:预测,YOLOv1,检测,YOLO,网格,详解,YOLOv2
From: https://blog.csdn.net/qiantianye/article/details/143956202

相关文章

  • YOLOv11融合针对去雾场景的DEA-Net中的细节增强注意力模块及相关改进思路
     YOLOv11v10v8使用教程:  YOLOv11入门到入土使用教程YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《DEA-Net:Singleimagedehazingbasedondetail-enhancedconvolutionandcontent-guidedattention》一、模块介绍    论文链接:https://arxiv.org......
  • (超级详细!!!)解决“com.mysql.jdbc.Driver is deprecated”警告:详解与优化
    目录引言1.问题分析1.1警告内容解析1.2产生原因2.解决方案2.1更新驱动类2.2更新JDBCURL2.3升级MySQLConnector/J依赖2.4清理缓存和重建项目3.示例代码4.注意事项总结引言在使用MySQL数据库时,许多开发者会遇到以下警告:Loadingclass`com.my......
  • 如何使用yolov8深度学习目标检测模型训练——芯片缺陷数据集/芯片表面缺陷数据集 1600
    如何使用YOLOv8模型训练芯片表面缺陷识别检测数据集。我们将从数据集的准备、模型的加载、训练配置和训练过程等方面进行详细说明。1.数据集准备数据集概述数据集名称:芯片表面缺陷识别检测数据集数据集来源:自制数据集内容:包含1600张图像,每张图像都有对应的标签......
  • Java Stream流以及常用方法详解
    目录一、Stream流是什么?二、stream的操作一、Stream流是什么?Stream流是Java8中的一个新特性,它提供了一种处理集合和数组的方式。Stream流可以让我们以一种更加简洁、高效、可读性更强的方式来处理数据。,这个版本新增的Stream,配合同版本出现的Lambda,给我们操作集合(Coll......
  • SAP S/4HANA Cloud模块功能详解:开启企业数字化转型新篇章
    在数字化转型浪潮的推动下,企业纷纷寻求高效、灵活且可扩展的解决方案,以应对日益复杂的市场环境。SAPS/4HANACloud作为SAP公司推出的云端ERP(企业资源规划)解决方案,凭借其强大的功能和云技术的结合,成为了众多企业数字化转型的首选。本文将深入探讨SAPS/4HANACloud的几大核心模块......
  • 数字孪生如何赋能智慧工厂?核心作用详解
    近年来,随着智能制造的发展,数字孪生技术逐渐成为智慧工厂的核心技术之一。它通过将物理世界的生产设备、流程和环境实时映射到虚拟空间,实现了物理与数字的无缝连接。这种融合不仅提升了工厂运营效率,还为企业实现更高层次的智能化转型奠定了基础。那么,数字孪生在智慧工厂中究竟能够......
  • 【数据集】【YOLO】【目标检测】无人机行人识别数据集 1394 张,YOLO航拍行人识别算法实
     一、数据集介绍【数据集】无人机行人识别数据集1394张,目标检测,包含YOLO/VOC格式标注。数据集中包含1种分类:names:['person'],表示"人"。数据集来自无人机采集数据;可用于无人机行人识别。检测场景为街道、商城、园区等有行人走动的区域,可用于公共安全监控、智能交通管......
  • GET、POST、PUT 的区别与使用场景详解
    大家好,我是小黄。在现代Web开发中,GET、POST和PUT是常用的HTTP请求方法,每种方法都对应不同的用途。理解它们的作用和使用场景,不仅能让接口设计更加清晰,还能提升系统的可维护性。本文将以简洁易懂的方式带你了解这些HTTP方法。1.什么是HTTP方法?HTTP方法是客户端与服务......
  • glibc 内存分配与释放机制详解
    本文以一次线上故障为基础介绍了使用glibc进行内存管理可能碰到问题,进而对库中内存分配与释放机制进行分析,最后提供了相应问题的解决方案。一、引言内存对象的分配与释放一直是后端开发人员代码设计中需要考虑的问题,考虑不周极易造成内存泄漏、内存访问越界等问题。在发生......
  • SpringBoot的Jackson最全使用详解
    SpringBoot的Jackson最全使用详解在SpringBoot项目中,Jackson是默认的JSON处理库,用于对象与JSON之间的序列化和反序列化。本文将详细介绍Jackson在SpringBoot下的各种使用方法,包括基本配置、注解使用、自定义序列化器和反序列化器、以及处理复杂数据类型等。1.导入依赖......